|
|
1.1 root 1: /****************************************************************
2: Copyright 1990, 1993 by AT&T Bell Laboratories and Bellcore.
3:
4: Permission to use, copy, modify, and distribute this software
5: and its documentation for any purpose and without fee is hereby
6: granted, provided that the above copyright notice appear in all
7: copies and that both that the copyright notice and this
8: permission notice and warranty disclaimer appear in supporting
9: documentation, and that the names of AT&T Bell Laboratories or
10: Bellcore or any of their entities not be used in advertising or
11: publicity pertaining to distribution of the software without
12: specific, written prior permission.
13:
14: AT&T and Bellcore disclaim all warranties with regard to this
15: software, including all implied warranties of merchantability
16: and fitness. In no event shall AT&T or Bellcore be liable for
17: any special, indirect or consequential damages or any damages
18: whatsoever resulting from loss of use, data or profits, whether
19: in an action of contract, negligence or other tortious action,
20: arising out of or in connection with the use or performance of
21: this software.
22: ****************************************************************/
23:
24: #include "stdio.h"
25: #ifndef KR_headers
26: #include "stdlib.h"
27: #include "fcntl.h" /* for declaration of open, O_RDONLY */
28: #endif
29: #ifdef MSDOS
30: #include "io.h"
31: #endif
32: #ifndef O_RDONLY
33: #define O_RDONLY 0
34: #endif
35: #ifndef O_BINARY
36: #define O_BINARY O_RDONLY
37: #endif
38:
39: char *progname;
40: static int ignore_cr;
41:
42: void
43: #ifdef KR_headers
44: usage(rc)
45: #else
46: usage(int rc)
47: #endif
48: {
49: fprintf(stderr, "usage: %s [-r] [file [file...]]\n\
50: option -r ignores carriage return characters\n", progname);
51: exit(rc);
52: }
53:
54: typedef unsigned char Uchar;
55:
56: long
57: #ifdef KR_headers
58: sum32(sum, x, n)
59: register long sum;
60: register Uchar *x;
61: int n;
62: #else
63: sum32(register long sum, register Uchar *x, int n)
64: #endif
65: {
66: register Uchar *xe;
67: static long crc_table[256] = {
68: 0, 151466134, 302932268, 453595578,
69: -9583591, -160762737, -312236747, -463170141,
70: -19167182, -136529756, -321525474, -439166584,
71: 28724267, 145849533, 330837255, 448732561,
72: -38334364, -189783822, -273059512, -423738914,
73: 47895677, 199091435, 282375505, 433292743,
74: 57448534, 174827712, 291699066, 409324012,
75: -67019697, -184128295, -300991133, -418902539,
76: -76668728, -227995554, -379567644, -530091662,
77: 67364049, 218420295, 369985021, 520795499,
78: 95791354, 213031020, 398182870, 515701056,
79: -86479645, -203465611, -388624945, -506380967,
80: 114897068, 266207290, 349655424, 500195606,
81: -105581387, -256654301, -340093543, -490887921,
82: -134039394, -251295736, -368256590, -485758684,
83: 124746887, 241716241, 358686123, 476458301,
84: -153337456, -2395898, -455991108, -304803798,
85: 162629001, 11973919, 465560741, 314102835,
86: 134728098, 16841012, 436840590, 319723544,
87: -144044613, -26395347, -446403433, -329032703,
88: 191582708, 40657250, 426062040, 274858062,
89: -200894995, -50223749, -435620671, -284179369,
90: -172959290, -55056048, -406931222, -289830788,
91: 182263263, 64630089, 416513267, 299125861,
92: 229794136, 78991822, 532414580, 381366498,
93: -220224191, -69691945, -523123603, -371788549,
94: -211162774, -93398532, -513308602, -396314416,
95: 201600371, 84090341, 503991391, 386759881,
96: -268078788, -117292630, -502591472, -351526778,
97: 258520357, 107972019, 493278217, 341959839,
98: 249493774, 131713432, 483432482, 366454964,
99: -239911657, -122417791, -474129349, -356881235,
100: -306674912, -457198666, -4791796, -156118374,
101: 315967289, 466778031, 14362133, 165418627,
102: 325258002, 442776452, 23947838, 141187752,
103: -334573813, -452329571, -33509849, -150495567,
104: 269456196, 419996626, 33682024, 184992510,
105: -278767779, -429561909, -43239823, -194312473,
106: -288089226, -405591072, -52790694, -170046772,
107: 297394031, 415166457, 62373443, 179343061,
108: 383165416, 533828478, 81314500, 232780370,
109: -373594127, -524527769, -72022307, -223201717,
110: -401789990, -519431348, -100447498, -217810336,
111: 392228803, 510123861, 91131631, 208256633,
112: -345918580, -496598246, -110112096, -261561802,
113: 336361365, 487278339, 100800185, 251995695,
114: 364526526, 482151208, 129260178, 246639108,
115: -354943065, -472854735, -119955829, -237064675,
116: 459588272, 308539942, 157983644, 7181066,
117: -469170519, -317835713, -167286907, -16754925,
118: -440448382, -323454444, -139383890, -21619912,
119: 450006683, 332774925, 148697015, 31186721,
120: -422325548, -271261118, -186797064, -36011154,
121: 431888077, 280569435, 196114401, 45565815,
122: 403200742, 286222960, 168180682, 50400092,
123: -412770561, -295522711, -177471533, -59977915,
124: -536157576, -384970002, -234585260, -83643454,
125: 526853729, 375396087, 225003341, 74348507,
126: 517040714, 399923932, 215944038, 98057200,
127: -507728301, -390357307, -206385281, -88735767,
128: 498987548, 347783818, 263426864, 112501670,
129: -489671163, -338229613, -253864151, -103192641,
130: -479823314, -362722632, -244835582, -126932076,
131: 470531639, 353144481, 235265819, 117632909
132: };
133:
134: xe = x + n;
135: while(x < xe)
136: sum = crc_table[(sum ^ *x++) & 0xff] ^ (sum >> 8 & 0xffffff);
137: return sum;
138: }
139:
140: int
141: #ifdef KR_headers
142: cr_purge(buf, n)
143: Uchar *buf;
144: int n;
145: #else
146: cr_purge(Uchar *buf, int n)
147: #endif
148: {
149: register Uchar *b, *b1, *be;
150: b = buf;
151: be = b + n;
152: while(b < be)
153: if (*b++ == '\r') {
154: b1 = b - 1;
155: while(b < be)
156: if ((*b1 = *b++) != '\r')
157: b1++;
158: return b1 - buf;
159: }
160: return n;
161: }
162:
163: static Uchar Buf[16*1024];
164:
165: void
166: #ifdef KR_headers
167: process(s, x)
168: char *s;
169: int x;
170: #else
171: process(char *s, int x)
172: #endif
173: {
174: register int n;
175: long fsize, sum;
176:
177: sum = 0;
178: fsize = 0;
179: while((n = read(x, (char *)Buf, sizeof(Buf))) > 0) {
180: if (ignore_cr)
181: n = cr_purge(Buf, n);
182: fsize += n;
183: sum = sum32(sum, Buf, n);
184: }
185: sum &= 0xffffffff;
186: if (n==0)
187: printf("%s\t%lx\t%ld\n", s, sum & 0xffffffff, fsize);
188: else { perror(s); }
189: close(x);
190: }
191:
192: #ifdef KR_headers
193: main(argc, argv)
194: char **argv;
195: #else
196: main(int argc, char **argv)
197: #endif
198: {
199: int x;
200: char *s;
201: static int rc;
202:
203: progname = *argv;
204: s = *++argv;
205: if (s && *s == '-') {
206: switch(s[1]) {
207: case '?':
208: usage(0);
209: case 'r':
210: ignore_cr = 1;
211: case '-':
212: break;
213: default:
214: fprintf(stderr, "invalid option %s\n", s);
215: usage(1);
216: }
217: s = *++argv;
218: }
219: if (s) do {
220: x = open(s, O_RDONLY|O_BINARY);
221: if (x < 0) {
222: fprintf(stderr, "%s: can't open %s\n", progname, s);
223: rc |= 1;
224: }
225: else
226: process(s, x);
227: }
228: while(s = *++argv);
229: else {
230: process("/dev/stdin", fileno(stdin));
231: }
232: return rc;
233: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.