home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / sum.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  817 b   |  49 lines

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