1*1111Sbill static char *sccsid = "@(#)sum.c 4.1 (Berkeley) 10/01/80";
2*1111Sbill /*
3*1111Sbill * Sum bytes in file mod 2^16
4*1111Sbill */
5*1111Sbill
6*1111Sbill #include <stdio.h>
7*1111Sbill
main(argc,argv)8*1111Sbill main(argc,argv)
9*1111Sbill char **argv;
10*1111Sbill {
11*1111Sbill register unsigned sum;
12*1111Sbill register i, c;
13*1111Sbill register FILE *f;
14*1111Sbill register long nbytes;
15*1111Sbill int errflg = 0;
16*1111Sbill
17*1111Sbill i = 1;
18*1111Sbill do {
19*1111Sbill if(i < argc) {
20*1111Sbill if ((f = fopen(argv[i], "r")) == NULL) {
21*1111Sbill fprintf(stderr, "sum: Can't open %s\n", argv[i]);
22*1111Sbill errflg += 10;
23*1111Sbill continue;
24*1111Sbill }
25*1111Sbill } else
26*1111Sbill f = stdin;
27*1111Sbill sum = 0;
28*1111Sbill nbytes = 0;
29*1111Sbill while ((c = getc(f)) != EOF) {
30*1111Sbill nbytes++;
31*1111Sbill if (sum&01)
32*1111Sbill sum = (sum>>1) + 0x8000;
33*1111Sbill else
34*1111Sbill sum >>= 1;
35*1111Sbill sum += c;
36*1111Sbill sum &= 0xFFFF;
37*1111Sbill }
38*1111Sbill if (ferror(f)) {
39*1111Sbill errflg++;
40*1111Sbill fprintf(stderr, "sum: read error on %s\n", argc>1?argv[i]:"-");
41*1111Sbill }
42*1111Sbill printf("%05u%6ld", sum, (nbytes+BUFSIZ-1)/BUFSIZ);
43*1111Sbill if(argc > 2)
44*1111Sbill printf(" %s", argv[i]);
45*1111Sbill printf("\n");
46*1111Sbill fclose(f);
47*1111Sbill } while(++i < argc);
48*1111Sbill exit(errflg);
49*1111Sbill }
50