/* ** tablecrc - table lookup crc routines */ #include "a:stdio.h" #define TRUE 1 #define FALSE 0 char Crctbl[512]; main(argc,argv) int argc; char **argv; { extern crcgen(); extern unsigned updcrc(); unsigned crcval; int c,i; char ch; char *crcptr, *xptr; FILE *fdi; crcgen(); /* generate the crc table */ if(argc < 2) { puts("TABLECRC - calculate crc of a file using table-driven crc"); printf("Usage: tablecrc infile"); exit(); } if((fdi = fopen(*++argv,"r")) == NULL) { printf("? can't open file %s\n", *argv); exit(); } crcval = 0; while((c = getc(fdi)) != EOF) { ch = c; crcval = updcrc(ch, crcval); } printf("crc = %x Hex\n", crcval); } crcgen() { register char *crcptr; register int crcval; register int c; int b; crcptr = &Crctbl[0]; for(c=0; c<256; c++) { crcval = (c << 8); for(b=0; b<8; b++) { if(crcval & 0x8000) { crcval = crcval << 1; crcval ^= 0x1021; } else crcval = crcval << 1; } *crcptr = crcval >> 8; *(crcptr+256) = crcval & 0xff; crcptr++; } } unsigned updcrc(ch, crcval) char ch; unsigned crcval; { register int indx; register unsigned msbcrc, lsbcrc; indx = ch ^ ((crcval >> 8) & 0xff); msbcrc = Crctbl[indx] ^ (crcval & 0xff); lsbcrc = Crctbl[indx+256]; return (unsigned) ((msbcrc << 8) | lsbcrc); }