/* $Id: hex2tty.c,v 1.5 2005/05/31 07:37:10 runner Exp $ intel hex format to monitor key-type converter */ #include union { char buf[256]; struct { char colon; char datasize[2]; char address[4]; char datatype[2]; } header; } buf; #define STRZ(n) strz(n,sizeof(n)) char *strz(char *ptr, int len) { static char buf[32]; memcpy(buf, ptr, len); buf[len] = '\0'; return buf; } int main(int argc, char **argv) { FILE *fp; unsigned int start,cur_adr = 0; if( argc < 2 ) { printf("Usage:%s file-name\n", argv[0]); return -1; } fp=fopen(argv[1],"r"); if( fp == NULL ) { perror(argv[1]); return 1; } if( ! fgets(buf.buf,sizeof(buf.buf),fp) ) { puts("file empty"); return 2; } if(buf.header.colon!=':') { puts("not intex hex(8) format"); return 3; } if(strcmp(STRZ(buf.header.datatype),"00")) { puts("top line must data record"); return 4; } sscanf(STRZ(buf.header.address),"%x", &cur_adr); start = cur_adr; printf("W%X\n", cur_adr); do { int i,len,ptr; unsigned int adr; if(buf.header.colon!=':') break; if(!strcmp(STRZ(buf.header.datatype),"01")) { puts("."); printf("G%04X",start); break; } sscanf(STRZ(buf.header.address),"%x", &adr); if( cur_adr != adr ) { puts("."); cur_adr = adr; if( start > adr ) start = adr; printf("W%X\n", cur_adr); } sscanf(STRZ(buf.header.datasize),"%x",&len); for(ptr=9,i=0; i