From 0521f473fe8624322a4956516fcb5335b34fa080 Mon Sep 17 00:00:00 2001 Message-Id: <0521f473fe8624322a4956516fcb5335b34fa080.1715461512.git.mdw@distorted.org.uk> From: Mark Wooding Date: Sat, 10 Mar 2001 10:59:21 +0000 Subject: [PATCH] Fix generating tables where the chunk size is longer than the polynomial. Also fix output formatting when there aren't enough entries to fill a line. Organization: Straylight/Edgeware From: mdw --- crc-mktab.c | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/crc-mktab.c b/crc-mktab.c index a3ba430..2439e20 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.4 2001/03/10 10:59:21 mdw Exp $ * * Build CRC tables * @@ -30,6 +30,11 @@ /*----- Revision history --------------------------------------------------* * * $Log: crc-mktab.c,v $ + * Revision 1.4 2001/03/10 10:59:21 mdw + * Fix generating tables where the chunk size is longer than the + * polynomial. Also fix output formatting when there aren't enough entries + * to fill a line. + * * Revision 1.3 2001/01/20 12:06:01 mdw * Define flags with macros, to ensure unsignedness. * @@ -256,7 +261,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 +279,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 +324,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) { -- [mdw]