2005-04-17 02:20:36 +04:00
/*
* hex2hex reads stdin in Intel HEX format and produces an
* ( unsigned char ) array which contains the bytes and writes it
* to stdout using C syntax
*/
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# define ABANDON(why) { fprintf(stderr, "%s\n", why); exit(1); }
# define MAX_SIZE (256*1024)
unsigned char buf [ MAX_SIZE ] ;
2009-10-17 03:03:49 +04:00
static int loadhex ( FILE * inf , unsigned char * buf )
2005-04-17 02:20:36 +04:00
{
int l = 0 , c , i ;
while ( ( c = getc ( inf ) ) ! = EOF )
{
if ( c = = ' : ' ) /* Sync with beginning of line */
{
int n , check ;
unsigned char sum ;
int addr ;
int linetype ;
if ( fscanf ( inf , " %02x " , & n ) ! = 1 )
ABANDON ( " File format error " ) ;
sum = n ;
if ( fscanf ( inf , " %04x " , & addr ) ! = 1 )
ABANDON ( " File format error " ) ;
sum + = addr / 256 ;
sum + = addr % 256 ;
if ( fscanf ( inf , " %02x " , & linetype ) ! = 1 )
ABANDON ( " File format error " ) ;
sum + = linetype ;
if ( linetype ! = 0 )
continue ;
for ( i = 0 ; i < n ; i + + )
{
if ( fscanf ( inf , " %02x " , & c ) ! = 1 )
ABANDON ( " File format error " ) ;
if ( addr > = MAX_SIZE )
ABANDON ( " File too large " ) ;
buf [ addr + + ] = c ;
if ( addr > l )
l = addr ;
sum + = c ;
}
if ( fscanf ( inf , " %02x " , & check ) ! = 1 )
ABANDON ( " File format error " ) ;
sum = ~ sum + 1 ;
if ( check ! = sum )
ABANDON ( " Line checksum error " ) ;
}
}
return l ;
}
int main ( int argc , const char * argv [ ] )
{
const char * varline ;
int i , l ;
int id = 0 ;
if ( argv [ 1 ] & & strcmp ( argv [ 1 ] , " -i " ) = = 0 )
{
argv + + ;
argc - - ;
id = 1 ;
}
if ( argv [ 1 ] = = NULL )
{
fprintf ( stderr , " hex2hex: [-i] filename \n " ) ;
exit ( 1 ) ;
}
varline = argv [ 1 ] ;
l = loadhex ( stdin , buf ) ;
printf ( " /* \n * \t Computer generated file. Do not edit. \n */ \n " ) ;
printf ( " static int %s_len = %d; \n " , varline , l ) ;
printf ( " static unsigned char %s[] %s = { \n " , varline , id ? " __initdata " : " " ) ;
for ( i = 0 ; i < l ; i + + )
{
if ( i ) printf ( " , " ) ;
if ( i & & ! ( i % 16 ) ) printf ( " \n " ) ;
printf ( " 0x%02x " , buf [ i ] ) ;
}
printf ( " \n }; \n \n " ) ;
return 0 ;
}