home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************
- Copyright 1990 by AT&T Bell Laboratories and Bellcore.
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, provided that the above copyright notice appear in all
- copies and that both that the copyright notice and this
- permission notice and warranty disclaimer appear in supporting
- documentation, and that the names of AT&T Bell Laboratories or
- Bellcore or any of their entities not be used in advertising or
- publicity pertaining to distribution of the software without
- specific, written prior permission.
-
- AT&T and Bellcore disclaim all warranties with regard to this
- software, including all implied warranties of merchantability
- and fitness. In no event shall AT&T or Bellcore be liable for
- any special, indirect or consequential damages or any damages
- whatsoever resulting from loss of use, data or profits, whether
- in an action of contract, negligence or other tortious action,
- arising out of or in connection with the use or performance of
- this software.
- ****************************************************************/
-
- #include "stdio.h"
-
- char *progname;
-
- void
- usage(rc)
- {
- fprintf(stderr, "usage: %s [file [file...]]\n", progname);
- exit(rc);
- }
-
- main(argc, argv)
- char **argv;
- {
- int x;
- char *s;
- static int rc;
-
- progname = *argv;
- s = *++argv;
- if (s && *s == '-') {
- switch(s[1]) {
- case '?':
- usage(0);
- case '-':
- break;
- default:
- fprintf(stderr, "invalid option %s\n", s);
- usage(1);
- }
- s = *++argv;
- }
- if (s) do {
- x = open(s,0);
- if (x < 0) {
- fprintf(stderr, "%s: can't open %s\n", progname, s);
- rc |= 1;
- }
- else
- process(s, x);
- }
- while(s = *++argv);
- else {
- process("/dev/stdin", fileno(stdin));
- }
- exit(rc);
- }
-
- typedef unsigned char uchar;
-
- long
- sum32(sum, x, n)
- register long sum;
- register uchar *x;
- int n;
- {
- register uchar *xe;
- static long crc_table[256] = {
- 0, 151466134, 302932268, 453595578,
- -9583591, -160762737, -312236747, -463170141,
- -19167182, -136529756, -321525474, -439166584,
- 28724267, 145849533, 330837255, 448732561,
- -38334364, -189783822, -273059512, -423738914,
- 47895677, 199091435, 282375505, 433292743,
- 57448534, 174827712, 291699066, 409324012,
- -67019697, -184128295, -300991133, -418902539,
- -76668728, -227995554, -379567644, -530091662,
- 67364049, 218420295, 369985021, 520795499,
- 95791354, 213031020, 398182870, 515701056,
- -86479645, -203465611, -388624945, -506380967,
- 114897068, 266207290, 349655424, 500195606,
- -105581387, -256654301, -340093543, -490887921,
- -134039394, -251295736, -368256590, -485758684,
- 124746887, 241716241, 358686123, 476458301,
- -153337456, -2395898, -455991108, -304803798,
- 162629001, 11973919, 465560741, 314102835,
- 134728098, 16841012, 436840590, 319723544,
- -144044613, -26395347, -446403433, -329032703,
- 191582708, 40657250, 426062040, 274858062,
- -200894995, -50223749, -435620671, -284179369,
- -172959290, -55056048, -406931222, -289830788,
- 182263263, 64630089, 416513267, 299125861,
- 229794136, 78991822, 532414580, 381366498,
- -220224191, -69691945, -523123603, -371788549,
- -211162774, -93398532, -513308602, -396314416,
- 201600371, 84090341, 503991391, 386759881,
- -268078788, -117292630, -502591472, -351526778,
- 258520357, 107972019, 493278217, 341959839,
- 249493774, 131713432, 483432482, 366454964,
- -239911657, -122417791, -474129349, -356881235,
- -306674912, -457198666, -4791796, -156118374,
- 315967289, 466778031, 14362133, 165418627,
- 325258002, 442776452, 23947838, 141187752,
- -334573813, -452329571, -33509849, -150495567,
- 269456196, 419996626, 33682024, 184992510,
- -278767779, -429561909, -43239823, -194312473,
- -288089226, -405591072, -52790694, -170046772,
- 297394031, 415166457, 62373443, 179343061,
- 383165416, 533828478, 81314500, 232780370,
- -373594127, -524527769, -72022307, -223201717,
- -401789990, -519431348, -100447498, -217810336,
- 392228803, 510123861, 91131631, 208256633,
- -345918580, -496598246, -110112096, -261561802,
- 336361365, 487278339, 100800185, 251995695,
- 364526526, 482151208, 129260178, 246639108,
- -354943065, -472854735, -119955829, -237064675,
- 459588272, 308539942, 157983644, 7181066,
- -469170519, -317835713, -167286907, -16754925,
- -440448382, -323454444, -139383890, -21619912,
- 450006683, 332774925, 148697015, 31186721,
- -422325548, -271261118, -186797064, -36011154,
- 431888077, 280569435, 196114401, 45565815,
- 403200742, 286222960, 168180682, 50400092,
- -412770561, -295522711, -177471533, -59977915,
- -536157576, -384970002, -234585260, -83643454,
- 526853729, 375396087, 225003341, 74348507,
- 517040714, 399923932, 215944038, 98057200,
- -507728301, -390357307, -206385281, -88735767,
- 498987548, 347783818, 263426864, 112501670,
- -489671163, -338229613, -253864151, -103192641,
- -479823314, -362722632, -244835582, -126932076,
- 470531639, 353144481, 235265819, 117632909
- };
-
- xe = x + n;
- while(x < xe)
- sum = crc_table[(sum ^ *x++) & 0xff] ^ (sum >> 8 & 0xffffff);
- return sum;
- }
-
- process(s, x)
- char *s;
- int x;
- {
- register int n;
- uchar buf[16*1024];
- long fsize, sum;
-
- sum = 0;
- fsize = 0;
- while((n = read(x, (char *)buf, sizeof(buf))) > 0) {
- fsize += n;
- sum = sum32(sum, buf, n);
- }
- sum &= 0xffffffff;
- if (n==0)
- printf("%s\t%lx\t%ld\n", s, sum & 0xffffffff, fsize);
- else { perror(s); }
- close(x);
- return(0);
- }
-