Listing 8 Header for 16-bit CRC calculation

/* CRC16.H
 *
 * Use updcrc() for a block of data,
 * UPDATE_CRC1() for a single byte.
 *
 * Adapted from CRC-16F.C, a public domain routine
 * in Bob Stout's Snippets file collection.
 * Adaptations donated to public domain.
*/

#define CRCW 16             /* # bits in CRC */
#define CRCLBY (CRCW/8)     /* CRC byte length */
#define CRCMASK ((1U<<CRCW)-1) /* mask for full CRC */

extern unsigned short crctab[1 << 8];

void initcrctab(void);  /* Initialize CRC table */
unsigned short updcrc(unsigned short icrc,
   const unsigned char *icp, unsigned int icnt);

#define UPDATE_CRC1(c,crc) (((crc)<<8) ^ \
       crctab[(((crc)>>(CRCW-8)) ^ (c)) & 0xff])

/* End of File */