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