xref: /csrg-svn/old/sum/sum.c (revision 1111)
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