chiark
/
gitweb
/
~mdw
/
mLib
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Various manual fixes.
[mLib]
/
crc-mktab.c
diff --git
a/crc-mktab.c
b/crc-mktab.c
index 887315b67f7355a47503afdb821627b66f987237..9b61ac88ef69357d12b746dbe676e61f83dfbcf2 100644
(file)
--- a/
crc-mktab.c
+++ b/
crc-mktab.c
@@
-1,6
+1,6
@@
/* -*-c-*-
*
/* -*-c-*-
*
- * $Id: crc-mktab.c,v 1.
1 2000/07/21 19:01:33
mdw Exp $
+ * $Id: crc-mktab.c,v 1.
6 2004/04/08 01:36:11
mdw Exp $
*
* Build CRC tables
*
*
* Build CRC tables
*
@@
-27,14
+27,6
@@
* MA 02111-1307, USA.
*/
* MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: crc-mktab.c,v $
- * Revision 1.1 2000/07/21 19:01:33 mdw
- * Generate the CRC table rather than hardcoding it.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#include <ctype.h>
/*----- Header files ------------------------------------------------------*/
#include <ctype.h>
@@
-62,11
+54,9
@@
static const char *type = 0;
static const char *inc = 0;
static FILE *fp;
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
#define BSCOL 72
@@
-89,7
+79,8
@@
static void version(FILE *fp)
static void usage(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)
}
static void help(FILE *fp)
@@
-111,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\
-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);
-t, --type=TYPE Give the table entries type TYPE in C source.\n\
-o, --output=FILE Write the output to FILE.\n\
", stdout);
@@
-231,11
+223,13
@@
int main(int argc, char *argv[])
poly = 0x1021;
break;
case 32:
poly = 0x1021;
break;
case 32:
- case 0:
poly = 0x04c11db7;
flags |= f_reverse;
bits = 32;
break;
poly = 0x04c11db7;
flags |= f_reverse;
bits = 32;
break;
+ case 0:
+ die(EXIT_FAILURE, "no polynomial or bit width set");
+ break;
default:
die(EXIT_FAILURE, "no standard polynomials for %u bits", bits);
break;
default:
die(EXIT_FAILURE, "no standard polynomials for %u bits", bits);
break;
@@
-249,7
+243,7
@@
int main(int argc, char *argv[])
bits += 8;
}
}
bits += 8;
}
}
- nw =
bits
/4;
+ nw =
(bits + 3)
/4;
if ((flags & f_ctab) && !type)
type = bits > 16 ? "unsigned long" : "unsigned short";
if ((flags & f_ctab) && !type)
type = bits > 16 ? "unsigned long" : "unsigned short";
@@
-267,7
+261,7
@@
int main(int argc, char *argv[])
guard = p;
for (q = file; *q; p++, q++) {
if (isalnum((unsigned char)*q))
guard = p;
for (q = file; *q; p++, q++) {
if (isalnum((unsigned char)*q))
- *p =
*q
;
+ *p =
toupper((unsigned char)*q)
;
else
*p = '_';
}
else
*p = '_';
}
@@
-312,23
+306,36
@@
int main(int argc, char *argv[])
while (2 + n * (nw + 4) < BSCOL)
n <<= 1;
n >>= 1;
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 --- */
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++) {
mask = 0xffffffff >> (32 - bits);
fputc(' ', fp);
for (i = 0; i < max; i++) {
- unsigned long x;
+ unsigned long x
, y, z
;
unsigned j;
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) {
fprintf(fp, " 0x%0*lx", nw, x);
if (i == max - 1) {