Blob


1 #include <u.h>
2 #include <libc.h>
4 typedef ulong Sumfn(ulong, void*, uvlong);
5 extern Sumfn sumr, sum5, sum32;
6 char *sumfile(char*, Sumfn*);
8 void
9 usage(void)
10 {
11 fprint(2, "Usage: %s [-r5] [files]\n", argv0);
12 exits("usage");
13 }
15 void
16 main(int argc, char **argv)
17 {
18 Sumfn *fn = sum32;
19 char *exitstr=0, *s;
21 ARGBEGIN{
22 case 'r':
23 fn = sumr;
24 break;
25 case '5':
26 fn = sum5;
27 break;
28 default:
29 usage();
30 break;
31 }ARGEND
32 if(*argv){
33 while(*argv)
34 if(s = sumfile(*argv++, fn)) /* assign = */
35 exitstr = s;
36 }else
37 exitstr = sumfile(0, fn);
38 exits(exitstr);
39 }
41 char*
42 sumfile(char *file, Sumfn *fn)
43 {
44 int fd;
45 int n;
46 ulong sum;
47 uvlong fsize;
48 char buf[8*1024];
50 if(file){
51 if((fd = open(file, OREAD)) < 0){
52 errstr(buf, sizeof buf);
53 fprint(2, "%s: %s: %s\n", argv0, file, buf);
54 return "can't open";
55 }
56 }else
57 fd = 0;
58 fsize = 0;
59 sum = 0;
60 while((n=read(fd, buf, sizeof buf)) > 0){
61 fsize += n;
62 sum = (*fn)(sum, buf, n);
63 }
64 if(n < 0){
65 errstr(buf, sizeof buf);
66 fprint(2, "%s: %s: read error: %s\n", argv0, file? file:"<stdin>", buf);
67 if(file)
68 close(fd);
69 return "read error";
70 }
71 if(file)
72 close(fd);
73 (*fn)(sum, (char*)0, fsize);
74 if(file)
75 print(" %s", file);
76 print("\n");
77 return 0;
78 }
80 #define VBSIZE 512 /* system v */
82 ulong
83 sum5(ulong sum, void *buf, uvlong uvn)
84 {
85 uchar *s, *send;
86 int n;
88 if(buf == 0){
89 sum = ((sum>>16)+sum) & 0xFFFF;
90 print("%.5lud%6lld", sum, (uvn+(VBSIZE-1))/VBSIZE);
91 return 0;
92 }
93 n = uvn;
94 for(s=buf, send=s+n; s<send; s++)
95 sum += 0xffff & *s;
96 return sum;
97 }
99 #define RBSIZE 1024 /* research */
101 ulong
102 sumr(ulong sum, void *buf, uvlong uvn)
104 uchar *s, *send;
105 int n;
107 if(buf == 0){
108 sum &= 0xFFFF;
109 print("%.5lud%6lld", sum, (uvn+(RBSIZE-1))/RBSIZE);
110 return 0;
112 n = uvn;
113 for(s=buf, send=s+n; s<send; s++)
114 if(sum & 1)
115 sum = 0xffff & ((sum>>1)+*s+0x8000);
116 else
117 sum = 0xffff & ((sum>>1)+*s);
118 return sum;
121 extern ulong crc_table[256];
123 ulong
124 sum32(ulong lcrc, void *buf, uvlong uvn)
126 uchar *s = buf;
127 ulong crc = lcrc;
128 int n;
130 n = uvn;
131 if(buf == 0){
132 char x[4];
134 x[0] = (n>>24)^0xCC; /* encode the length but make n==0 not 0 */
135 x[1] = (n>>16)^0x55;
136 x[2] = (n>>8)^0xCC;
137 x[3] = (n)^0x55;
138 crc = sum32(lcrc, x, 4);
139 print("%.8lux %6lld", crc, uvn);
140 return 0;
142 while(n-- > 0)
143 crc = crc_table[(crc^*s++)&0xff] ^ (crc>>8);
144 return crc;
147 /*
148 * CRC 035556101440
149 */
150 ulong crc_table[256] = {
151 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
152 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
153 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
154 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
155 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
156 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
157 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
158 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
159 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
160 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
161 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
162 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
163 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
164 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
165 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
166 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
167 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
168 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
169 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
170 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
171 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
172 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
173 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
174 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
175 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
176 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
177 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
178 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
179 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
180 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
181 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
182 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
183 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
184 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
185 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
186 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
187 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
188 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
189 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
190 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
191 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
192 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
193 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
194 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
195 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
196 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
197 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
198 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
199 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
200 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
201 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
202 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
203 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
204 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
205 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
206 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
207 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
208 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
209 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
210 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
211 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
212 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
213 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
214 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
215 };