#define HEC_GENERATOR   0x107               /* x^8 + x^2 +  x  + 1  */
#define COSET_LEADER    0x055               /* x^6 + x^4 + x^2 + 1  */

static unsigned char syndrome_table[256];

void gen_syndrome_table()
/* generate a table of CRC-8 syndromes for all possible input bytes */
{
    register int i, j, syndrome;
    for ( i = 0;  i < 256;  i++ )
    {
        syndrome = i;
        for ( j = 0;  j < 8;  j++ )
        {
            if ( syndrome & 0x80 )
               syndrome = ( syndrome << 1 ) ^ HEC_GENERATOR;
            else
               syndrome = ( syndrome << 1 );
        }
        syndrome_table[i] = (unsigned char) syndrome;
        printf("0x%02x ", syndrome_table[i]);
        if ((i+1) % 16 == 0) printf("\n");
    }
    return;
}

unsigned char hec(cell_header)
unsigned char cell_header[4];
/* calculate CRC-8 remainder over first four bytes of cell header   */
/* then exclusive-or with coset leader */
{
    register unsigned char hec_accum = 0;
    register int i;
    for ( i = 0;  i < 4;  i++ ) {
        hec_accum = syndrome_table [ hec_accum ^ cell_header[i] ];
        printf("Byte = 0x%02x, HEC = 0x%02x\n",
               cell_header[i], hec_accum);
    }
    return hec_accum ^ COSET_LEADER;
}
