X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/000ba0def6e1f9f2bb89aad53f7c72d9e0c0e41f..29de6d3989296bfe751b7518d6de4b7c4106fa72:/crc-mktab.c diff --git a/crc-mktab.c b/crc-mktab.c index def5361..9b61ac8 100644 --- a/crc-mktab.c +++ b/crc-mktab.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: crc-mktab.c,v 1.2 2000/10/08 11:07:21 mdw Exp $ + * $Id: crc-mktab.c,v 1.6 2004/04/08 01:36:11 mdw Exp $ * * Build CRC tables * @@ -27,18 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: crc-mktab.c,v $ - * 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 @@ -66,11 +54,9 @@ static const char *type = 0; static const char *inc = 0; static FILE *fp; -enum { - f_bogus = 1, - f_ctab = 2, - f_reverse = 4 -}; +#define f_bogus 1u +#define f_ctab 2u +#define f_reverse 4u #define BSCOL 72 @@ -93,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) @@ -115,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); @@ -255,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"; @@ -273,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 = '_'; } @@ -318,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) {