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

footprint.cc

Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 #include "footprint.h"
00010 
00011 #include <sys/types.h>
00012 #include <string.h>
00013 #include <assert.h>
00014 
00015 static const u_int32_t crctab[] = {
00016    0x0,
00017    0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
00018    0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
00019    0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
00020    0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
00021    0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
00022    0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
00023    0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
00024    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
00025    0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
00026    0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
00027    0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
00028    0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
00029    0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
00030    0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
00031    0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
00032    0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
00033    0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
00034    0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
00035    0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
00036    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
00037    0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
00038    0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
00039    0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
00040    0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
00041    0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
00042    0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
00043    0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
00044    0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
00045    0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
00046    0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
00047    0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
00048    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
00049    0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
00050    0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
00051    0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
00052    0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
00053    0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
00054    0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
00055    0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
00056    0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
00057    0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
00058    0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
00059    0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
00060    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
00061    0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
00062    0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
00063    0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
00064    0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
00065    0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
00066    0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
00067    0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
00068 };
00069 
00070 #define  COMPUTE(var, ch)  (var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)]
00071 
00073 long crc(char* s)
00074 {
00075   u_int32_t scrc=~0;
00076   while(*s) COMPUTE(scrc,*(s++));
00077   return scrc;
00078 }
00079 
00081 long crc(char *s, int len)
00082 {
00083   u_int32_t scrc=~0;
00084   while(len--) COMPUTE(scrc,*(s++));
00085   return scrc;
00086 }
00087 
00089 void cksumblock(FILE* file, u_int32_t& crc)
00090 {
00091   char buf[512]; memset(buf,0,sizeof(char)*512);
00092   fread(buf, sizeof(char), 512, file);
00093   for (int i=0; i<512; ++i) COMPUTE(crc, buf[i]);
00094 }
00095 
00096 static char basis_64[] =
00097    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
00098 
00100 char* encode(u_int32_t v)
00101 {
00102   int i;
00103   char* cod = new char[7]; // minor memory leak. I don't care.
00104   for( i=0; i<6; ++i) {
00105     cod[i]=basis_64[v%64];
00106     v = v/64;
00107   }
00108   cod[i]=0;
00109   return cod;
00110 }
00111 
00118 
00119 char* footprint(FILE* file)
00120 {
00121   int i;
00122   char* res = new char[128]; // minor memory leak - I don't care to reclaim.
00123   u_int32_t crca=~0;
00124   fseek(file, 0, SEEK_SET);
00125   cksumblock(file,crca); cksumblock(file,crca); cksumblock(file,crca);
00126   cksumblock(file,crca); cksumblock(file,crca);
00127   fseek(file, 0, SEEK_END); long flen=ftell(file);
00128   if (0 == (flen%512) ) fseek(file, -5*512, SEEK_END);
00129   else fseek(file, -(flen%512)-4*512, SEEK_END);
00130   u_int32_t crce=~0;
00131   cksumblock(file,crce); cksumblock(file,crce); cksumblock(file,crce);
00132   cksumblock(file,crce); cksumblock(file,crce);
00133   long fblocks=flen/512;
00134   long skip=fblocks/16;
00135   long crcblock=skip;
00136   u_int32_t crc1=~0,crc2=~0,crc3=~0;
00137   for (i=0; i<5; ++i) {
00138     fseek(file, 512*crcblock, SEEK_SET);
00139     cksumblock(file,crc1); 
00140     crcblock += skip;
00141   }
00142   for (i=0; i<5; ++i) {
00143     fseek(file, 512*crcblock, SEEK_SET);
00144     cksumblock(file,crc2);
00145     crcblock += skip;
00146   }
00147   for (i=0; i<5; ++i) {
00148     fseek(file, 512*crcblock, SEEK_SET);
00149     cksumblock(file,crc3);
00150     crcblock += skip;
00151   }
00152   snprintf(res,128,"*%s%s%s%s%s*",encode(crca),encode(crc1),
00153            encode(crc2),encode(crc3),encode(crce));
00154   return res;
00155 }
00156 
00158 double footPrintDiff(const char* f1, const char* f2)
00159 {
00160   int count=0;
00161   int equalchars=0;
00162   while (*f1) {
00163     assert(*f2);
00164     if (*f1 == *f2) ++equalchars;
00165     ++count;
00166     ++f1;
00167     ++f2;
00168   }
00169   return 1-double(equalchars)/count;
00170 }
00171 

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