00001 00002 00003 00004 #include "header.h" 00005 #include "options.h" 00006 #include "footprint.h" 00007 #include <string.h> 00008 #include <stdlib.h> 00009 #include <iostream> 00010 00011 char eprotmagic1[]="HPS."; 00012 char eprotmagic2[]="ErrorProtect"; 00013 char eprotversion[]="(1.0,ecc-1.3.5)"; 00014 00015 char* theheader=NULL; 00016 00017 void initheader() 00018 { 00019 if (NULL!=theheader) return; 00020 theheader=new char[headerlen]; 00021 for(int i=0; i<headerlen; ++i) theheader[i]=0; 00022 snprintf(theheader,headerlen, "%s%s%s;", 00023 eprotmagic1,eprotmagic2,eprotversion); 00024 addheaderitem("headersize",headerlen); 00025 } 00026 00028 void addheaderitem(const char* descr, const char* value) 00029 { 00030 initheader(); 00031 char buf[headerlen+1]; 00032 snprintf(buf,headerlen, "%s%s=%s;", theheader,descr,value); 00033 strncpy(theheader,buf,headerlen); 00034 } 00035 00037 void addheaderitem(const char* descr, const long value) 00038 { 00039 initheader(); 00040 char buf[headerlen+1]; 00041 snprintf(buf,headerlen, "%s%s=%ld;", theheader,descr,value); 00042 strncpy(theheader,buf,headerlen); 00043 } 00044 00046 void writeheader(FILE* outfile) 00047 { 00048 if (NULL == strstr(theheader,";crc=")) 00049 addheaderitem("crc",crc(theheader)); 00050 fprintf(outfile,"%s",theheader); 00051 for(int i=strlen(theheader); i<headerlen; ++i) fputc(0,outfile); 00052 } 00053 00055 char* readheader(FILE* infile) 00056 { 00057 theheader=new char[headerlen]; 00058 for(int i=0; i<headerlen; ++i) theheader[i]=0; 00059 rewind(infile); 00060 int readbytes = fread(theheader, sizeof(char), headerlen, infile); 00061 if ( ferror(infile) ) 00062 { perror("readheader"); abort(); } 00063 if (readbytes < headerlen) { 00064 std::cerr << progname << ": ecc file " << eccfname << " is too short.\n"; 00065 abort(); 00066 } 00067 char fullmagicetc[128]; 00068 snprintf(fullmagicetc,128, "%s%s%s;headersize=512;", 00069 eprotmagic1,eprotmagic2,eprotversion); 00070 if ( strstr(theheader, fullmagicetc) != theheader ) { 00071 std::cerr << progname << ": error correction info is from a different " 00072 << "version of the program. I can't handle that so far.\n"; 00073 abort(); 00074 } 00075 char* crcpos = strrchr(theheader,';'); *crcpos = 0; 00076 crcpos = strrchr(theheader,';')+1; 00077 assert( strstr(crcpos,"crc=") == crcpos ); 00078 *crcpos = 0; crcpos += 4; 00079 long readcrc = atol(crcpos); 00080 if ( crc(theheader) != readcrc ) { 00081 std::cerr << progname << ": crc problem in the eccfile." 00082 << "I can't handle that so far.\n"; 00083 abort(); 00084 } 00085 return theheader+strlen(fullmagicetc); 00086 } 00087