Listing 9 Calculate the CRC, a block of data at a time

/** CRC16G. C
 *
 * Adapted from CRC-16F.C, a public domain routine
 * in Bob Stout's Snippets file collection.
 * Adaptations donated to public domain.
 *
 * Call initcrctab() to initialize table.
 */
#include "crc16.h"

unsigned short crctab[1 << 8];
static int initialized = 0;

#define P 0x1021          /* CRC polynomial */

unsigned short
updcrc(unsigned short crc,      /* prev CRC */
      const unsigned char *cp, /* new data */
      unsigned int cnt)        /* # bytes  */
{
  while (cnt--)
     crc = UPDATE_CRC1(*cp++, crc);
  return (crc & CRCMASK);
}

void initcrctab(void) {
  unsigned int b, v;
  int  i;
  if (initialized)
     return;

  for (b = 0; b <= (1 << 8) - 1; ++b) {
     for (v = b << (CRCW - 8), i = 8; --i >= 0;)
        v = v & 0x8000 ? (v << 1) ^ P : v << 1;
     crctab[b] = v;
  }
  initialized = 1;
}

/* End of File */