Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

header.cc

Go to the documentation of this file.
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 

Generated on Tue Dec 30 12:07:35 2003 for ErrorProtect by doxygen 1.3.2