home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / util / misc / chksum / chksum.c < prev    next >
C/C++ Source or Header  |  1993-08-31  |  2KB  |  64 lines

  1. /*
  2.  *    Produces a checksum of a byte stream that should be the same as
  3.  *    the standard SVR4 "sum" program.  Note that the "sum" documentation
  4.  *    is misleading, the checksum is NOT simply a 16-bit checksum of all
  5.  *    the bytes.  Here is the algorithm:
  6.  *
  7.  *    1.    Add up all the bytes using an unsigned long (32-bit)
  8.  *        integer and treating each byte as unsigned.
  9.  *
  10.  *    2.    Add the overflow from the lower 16 bits (the high 16
  11.  *        bits) back into the lower 16 bits using unsigned
  12.  *        arithmetic.  I.E. treat the 32-bit long as two 16-bit
  13.  *        unsigned ints and add them using 32-bit unsigned
  14.  *        arithmetic.
  15.  *
  16.  *    3.    Repeat step (2) one more time, presumably to catch
  17.  *        any additional overflow.
  18.  *
  19.  *    If stdout is not a terminal, then the input is passed on to the
  20.  *    output, and the checksum is printed on stderr rather than stdout.
  21.  *    This allows natural use as either the end of a pipeline with the
  22.  *    checksum printed on stdout, or in the middle with it printed on
  23.  *    stderr.
  24.  *
  25.  *    Written by Fred Fish.  This file is public domain.
  26.  */
  27.  
  28. #include <stdio.h>
  29.  
  30. #define BFSIZ 1024
  31.  
  32. main ()
  33. {
  34.   unsigned char buf[BFSIZ];
  35.   int nbytes;
  36.   unsigned long sum = 0;
  37.   unsigned long temp = 0;
  38.   int nopass;
  39.  
  40.   nopass = isatty (1);
  41.   while ((nbytes = read (0, buf, sizeof (buf))) > 0)
  42.     {
  43.       if (!nopass)
  44.     {
  45.       (void) write (1, buf, (unsigned) nbytes);
  46.     }
  47.       while (nbytes-- > 0)
  48.     {
  49.       sum += buf[nbytes];
  50.     }
  51.     }
  52.   temp = (sum >> 16) + (sum & 0xFFFF);
  53.   sum = (temp >> 16) + (temp & 0xFFFF);
  54.   if (nopass)
  55.     {
  56.       (void) fprintf (stdout, "%u\n", sum);
  57.     }
  58.   else
  59.     {
  60.       (void) fprintf (stderr, "%u\n", sum);
  61.     }
  62.   return (0);
  63. }
  64.