X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/393cf1d9803c3dfda0fbb8add9bc5cb9b1f6f07b..3bc429127d05ea3c84e3c151d53ad3546bea5e9b:/crc-mktab.c diff --git a/crc-mktab.c b/crc-mktab.c index a3ba430..9b61ac8 100644 --- a/crc-mktab.c +++ b/crc-mktab.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: crc-mktab.c,v 1.3 2001/01/20 12:06:01 mdw Exp $ + * $Id: crc-mktab.c,v 1.6 2004/04/08 01:36:11 mdw Exp $ * * Build CRC tables * @@ -27,21 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: crc-mktab.c,v $ - * Revision 1.3 2001/01/20 12:06:01 mdw - * Define flags with macros, to ensure unsignedness. - * - * Revision 1.2 2000/10/08 11:07:21 mdw - * With no arguments, give an error rather than spewing a big table at the - * user. - * - * Revision 1.1 2000/07/21 19:01:33 mdw - * Generate the CRC table rather than hardcoding it. - * - */ - /*----- Header files ------------------------------------------------------*/ #include @@ -94,7 +79,8 @@ static void version(FILE *fp) static void usage(FILE *fp) { - pquis(fp, "Usage: $ [-cr] [-g guard] [-o file] [-b bits] [-p poly]\n"); + pquis(fp, "Usage: $ [-cr] [-o FILE] [-g GUARD] [-s SYM] [-i HEADER]\n\ + [-t TYPE] [-b BITS] [-B BITS] [-p POLY]\n"); } static void help(FILE *fp) @@ -116,7 +102,8 @@ of options are provided:\n\ -p, --polynomial=POLY Use the POLY as the dividing polynomial.\n\ -r, --reverse Create a `reversed' CRC table.\n\ -g, --guard=GUARD Use GUARD as a multiple-inclusion guard constant.\n\ --s, --symbol=SYM Name the generated table SYM\n\ +-i, --include=HEADER Include HEADER at top of C source file.\n\ +-s, --symbol=SYM Name the generated table SYM.\n\ -t, --type=TYPE Give the table entries type TYPE in C source.\n\ -o, --output=FILE Write the output to FILE.\n\ ", stdout); @@ -256,7 +243,7 @@ int main(int argc, char *argv[]) bits += 8; } } - nw = bits/4; + nw = (bits + 3)/4; if ((flags & f_ctab) && !type) type = bits > 16 ? "unsigned long" : "unsigned short"; @@ -274,7 +261,7 @@ int main(int argc, char *argv[]) guard = p; for (q = file; *q; p++, q++) { if (isalnum((unsigned char)*q)) - *p = *q; + *p = toupper((unsigned char)*q); else *p = '_'; } @@ -319,23 +306,36 @@ int main(int argc, char *argv[]) while (2 + n * (nw + 4) < BSCOL) n <<= 1; n >>= 1; + max = 1 << chunk; + if (n > max) + n = max; t = 0; while (((1 + n * (nw + 4)) & ~7) + 8 * t < BSCOL) t++; /* --- Start grinding --- */ - max = 1 << chunk; mask = 0xffffffff >> (32 - bits); fputc(' ', fp); for (i = 0; i < max; i++) { - unsigned long x; + unsigned long x, y, z; unsigned j; - - x = reflect(i, chunk) << (bits - chunk); - for (j = 0; j < chunk; j++) - x = ((x << 1) ^ (x & (1 << (bits - 1)) ? poly : 0)) & mask; - x = reflect(x, bits); + unsigned ni, nn; + + x = reflect(i, chunk); + y = 0; + nn = chunk; + while (nn) { + ni = bits; + if (ni > nn) + ni = nn; + z = (x >> (nn - ni)) & (0xffffffff >> (32 - ni)); + y ^= z << (bits - ni); + for (j = 0; j < ni; j++) + y = ((y << 1) ^ (y & (1 << (bits - 1)) ? poly : 0)) & mask; + nn -= ni; + } + x = reflect(y, bits); fprintf(fp, " 0x%0*lx", nw, x); if (i == max - 1) {