You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
1.9 KiB
101 lines
1.9 KiB
/* |
|
* 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]; |
|
|
|
static int loadhex(FILE *inf, unsigned char *buf) |
|
{ |
|
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; |
|
}
|
|
|