Skip to content

Commit

Permalink
Speeding up C implementation
Browse files Browse the repository at this point in the history
Switch from Sarwate's algorithm to byte-order free Slicing-by-16.
Each table data file is generated by `extconf.rb`.

In addition, the inspection string, which was previously 10 bytes, is extended to 19 bytes.
This is to check the slicing-by-16 loop, which processes in 16-byte units.
  • Loading branch information
dearblue committed Jul 24, 2023
1 parent 91ee75f commit e6f0aa3
Show file tree
Hide file tree
Showing 78 changed files with 912 additions and 1,071 deletions.
62 changes: 26 additions & 36 deletions ext/digest/crc12_3gpp/crc12_3gpp.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,52 +15,42 @@
*/

#include "crc12_3gpp.h"
#include "extconf.h"

/**
* Static table used for the table_driven implementation.
*/
static const crc12_t crc12_table[256] = {
0x000, 0x80f, 0x811, 0x01e, 0x82d, 0x022, 0x03c, 0x833, 0x855, 0x05a, 0x044, 0x84b, 0x078, 0x877, 0x869, 0x066,
0x8a5, 0x0aa, 0x0b4, 0x8bb, 0x088, 0x887, 0x899, 0x096, 0x0f0, 0x8ff, 0x8e1, 0x0ee, 0x8dd, 0x0d2, 0x0cc, 0x8c3,
0x945, 0x14a, 0x154, 0x95b, 0x168, 0x967, 0x979, 0x176, 0x110, 0x91f, 0x901, 0x10e, 0x93d, 0x132, 0x12c, 0x923,
0x1e0, 0x9ef, 0x9f1, 0x1fe, 0x9cd, 0x1c2, 0x1dc, 0x9d3, 0x9b5, 0x1ba, 0x1a4, 0x9ab, 0x198, 0x997, 0x989, 0x186,
0xa85, 0x28a, 0x294, 0xa9b, 0x2a8, 0xaa7, 0xab9, 0x2b6, 0x2d0, 0xadf, 0xac1, 0x2ce, 0xafd, 0x2f2, 0x2ec, 0xae3,
0x220, 0xa2f, 0xa31, 0x23e, 0xa0d, 0x202, 0x21c, 0xa13, 0xa75, 0x27a, 0x264, 0xa6b, 0x258, 0xa57, 0xa49, 0x246,
0x3c0, 0xbcf, 0xbd1, 0x3de, 0xbed, 0x3e2, 0x3fc, 0xbf3, 0xb95, 0x39a, 0x384, 0xb8b, 0x3b8, 0xbb7, 0xba9, 0x3a6,
0xb65, 0x36a, 0x374, 0xb7b, 0x348, 0xb47, 0xb59, 0x356, 0x330, 0xb3f, 0xb21, 0x32e, 0xb1d, 0x312, 0x30c, 0xb03,
0xd05, 0x50a, 0x514, 0xd1b, 0x528, 0xd27, 0xd39, 0x536, 0x550, 0xd5f, 0xd41, 0x54e, 0xd7d, 0x572, 0x56c, 0xd63,
0x5a0, 0xdaf, 0xdb1, 0x5be, 0xd8d, 0x582, 0x59c, 0xd93, 0xdf5, 0x5fa, 0x5e4, 0xdeb, 0x5d8, 0xdd7, 0xdc9, 0x5c6,
0x440, 0xc4f, 0xc51, 0x45e, 0xc6d, 0x462, 0x47c, 0xc73, 0xc15, 0x41a, 0x404, 0xc0b, 0x438, 0xc37, 0xc29, 0x426,
0xce5, 0x4ea, 0x4f4, 0xcfb, 0x4c8, 0xcc7, 0xcd9, 0x4d6, 0x4b0, 0xcbf, 0xca1, 0x4ae, 0xc9d, 0x492, 0x48c, 0xc83,
0x780, 0xf8f, 0xf91, 0x79e, 0xfad, 0x7a2, 0x7bc, 0xfb3, 0xfd5, 0x7da, 0x7c4, 0xfcb, 0x7f8, 0xff7, 0xfe9, 0x7e6,
0xf25, 0x72a, 0x734, 0xf3b, 0x708, 0xf07, 0xf19, 0x716, 0x770, 0xf7f, 0xf61, 0x76e, 0xf5d, 0x752, 0x74c, 0xf43,
0xec5, 0x6ca, 0x6d4, 0xedb, 0x6e8, 0xee7, 0xef9, 0x6f6, 0x690, 0xe9f, 0xe81, 0x68e, 0xebd, 0x6b2, 0x6ac, 0xea3,
0x660, 0xe6f, 0xe71, 0x67e, 0xe4d, 0x642, 0x65c, 0xe53, 0xe35, 0x63a, 0x624, 0xe2b, 0x618, 0xe17, 0xe09, 0x606
};

crc12_t crc_reflect(crc12_t data, size_t data_len)
{
unsigned int i;
crc12_t ret = data & 0x01;

for (i = 1; i < data_len; i++)
{
data >>= 1;
ret = (ret << 1) | (data & 0x01);
}

return ret;
}
// This file is generated by generate_table in extconf.rb
#include "crc12_3gpp_table.h"

crc12_t crc12_3gpp_update(crc12_t crc, const void *data, size_t data_len)
{
const unsigned char *d = (const unsigned char *)data;
unsigned int tbl_idx;

for (; data_len >= SLICE_SIZE; data_len -= SLICE_SIZE)
{
crc = crc12_3gpp_table[15][d[ 0] ^ ((crc >> 4) & 0xff)] ^
crc12_3gpp_table[14][d[ 1] ^ ((crc << 4) & 0xff)] ^
crc12_3gpp_table[13][d[ 2] ] ^
crc12_3gpp_table[12][d[ 3] ] ^
crc12_3gpp_table[11][d[ 4] ] ^
crc12_3gpp_table[10][d[ 5] ] ^
crc12_3gpp_table[ 9][d[ 6] ] ^
crc12_3gpp_table[ 8][d[ 7] ] ^
crc12_3gpp_table[ 7][d[ 8] ] ^
crc12_3gpp_table[ 6][d[ 9] ] ^
crc12_3gpp_table[ 5][d[10] ] ^
crc12_3gpp_table[ 4][d[11] ] ^
crc12_3gpp_table[ 3][d[12] ] ^
crc12_3gpp_table[ 2][d[13] ] ^
crc12_3gpp_table[ 1][d[14] ] ^
crc12_3gpp_table[ 0][d[15] ];
crc &= 0xfff;
d += SLICE_SIZE;
}

while (data_len--)
{
tbl_idx = ((crc >> 4) ^ *d) & 0xff;
crc = (crc12_table[tbl_idx] ^ (crc << 8)) & 0xfff;
crc = (crc12_3gpp_table[0][tbl_idx] ^ (crc << 8)) & 0xfff;
d++;
}

Expand Down
3 changes: 3 additions & 0 deletions ext/digest/crc12_3gpp/extconf.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
require 'mkmf'
require_relative '../gentable'

have_header("stdint.h")
have_header('stddef.h')

generate_table("crc12_3gpp_table.h", "crc12_3gpp_table", 12, 0x080f, false)

create_header
create_makefile "crc12_3gpp_ext"
48 changes: 26 additions & 22 deletions ext/digest/crc15/crc15.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,38 +15,42 @@
*/

#include "crc15.h"
#include "extconf.h"

/**
* Static table used for the table_driven implementation.
*/
static const crc15_t crc15_table[256] = {
0x0000, 0x4599, 0x4eab, 0x0b32, 0x58cf, 0x1d56, 0x1664, 0x53fd, 0x7407, 0x319e, 0x3aac, 0x7f35, 0x2cc8, 0x6951, 0x6263, 0x27fa,
0x2d97, 0x680e, 0x633c, 0x26a5, 0x7558, 0x30c1, 0x3bf3, 0x7e6a, 0x5990, 0x1c09, 0x173b, 0x52a2, 0x015f, 0x44c6, 0x4ff4, 0x0a6d,
0x5b2e, 0x1eb7, 0x1585, 0x501c, 0x03e1, 0x4678, 0x4d4a, 0x08d3, 0x2f29, 0x6ab0, 0x6182, 0x241b, 0x77e6, 0x327f, 0x394d, 0x7cd4,
0x76b9, 0x3320, 0x3812, 0x7d8b, 0x2e76, 0x6bef, 0x60dd, 0x2544, 0x02be, 0x4727, 0x4c15, 0x098c, 0x5a71, 0x1fe8, 0x14da, 0x5143,
0x73c5, 0x365c, 0x3d6e, 0x78f7, 0x2b0a, 0x6e93, 0x65a1, 0x2038, 0x07c2, 0x425b, 0x4969, 0x0cf0, 0x5f0d, 0x1a94, 0x11a6, 0x543f,
0x5e52, 0x1bcb, 0x10f9, 0x5560, 0x069d, 0x4304, 0x4836, 0x0daf, 0x2a55, 0x6fcc, 0x64fe, 0x2167, 0x729a, 0x3703, 0x3c31, 0x79a8,
0x28eb, 0x6d72, 0x6640, 0x23d9, 0x7024, 0x35bd, 0x3e8f, 0x7b16, 0x5cec, 0x1975, 0x1247, 0x57de, 0x0423, 0x41ba, 0x4a88, 0x0f11,
0x057c, 0x40e5, 0x4bd7, 0x0e4e, 0x5db3, 0x182a, 0x1318, 0x5681, 0x717b, 0x34e2, 0x3fd0, 0x7a49, 0x29b4, 0x6c2d, 0x671f, 0x2286,
0x2213, 0x678a, 0x6cb8, 0x2921, 0x7adc, 0x3f45, 0x3477, 0x71ee, 0x5614, 0x138d, 0x18bf, 0x5d26, 0x0edb, 0x4b42, 0x4070, 0x05e9,
0x0f84, 0x4a1d, 0x412f, 0x04b6, 0x574b, 0x12d2, 0x19e0, 0x5c79, 0x7b83, 0x3e1a, 0x3528, 0x70b1, 0x234c, 0x66d5, 0x6de7, 0x287e,
0x793d, 0x3ca4, 0x3796, 0x720f, 0x21f2, 0x646b, 0x6f59, 0x2ac0, 0x0d3a, 0x48a3, 0x4391, 0x0608, 0x55f5, 0x106c, 0x1b5e, 0x5ec7,
0x54aa, 0x1133, 0x1a01, 0x5f98, 0x0c65, 0x49fc, 0x42ce, 0x0757, 0x20ad, 0x6534, 0x6e06, 0x2b9f, 0x7862, 0x3dfb, 0x36c9, 0x7350,
0x51d6, 0x144f, 0x1f7d, 0x5ae4, 0x0919, 0x4c80, 0x47b2, 0x022b, 0x25d1, 0x6048, 0x6b7a, 0x2ee3, 0x7d1e, 0x3887, 0x33b5, 0x762c,
0x7c41, 0x39d8, 0x32ea, 0x7773, 0x248e, 0x6117, 0x6a25, 0x2fbc, 0x0846, 0x4ddf, 0x46ed, 0x0374, 0x5089, 0x1510, 0x1e22, 0x5bbb,
0x0af8, 0x4f61, 0x4453, 0x01ca, 0x5237, 0x17ae, 0x1c9c, 0x5905, 0x7eff, 0x3b66, 0x3054, 0x75cd, 0x2630, 0x63a9, 0x689b, 0x2d02,
0x276f, 0x62f6, 0x69c4, 0x2c5d, 0x7fa0, 0x3a39, 0x310b, 0x7492, 0x5368, 0x16f1, 0x1dc3, 0x585a, 0x0ba7, 0x4e3e, 0x450c, 0x0095
};
// This file is generated by generate_table in extconf.rb
#include "crc15_table.h"

crc15_t crc15_update(crc15_t crc, const void *data, size_t data_len)
{
const unsigned char *d = (const unsigned char *)data;
unsigned int tbl_idx;

for (; data_len >= SLICE_SIZE; data_len -= SLICE_SIZE)
{
crc = crc15_table[15][d[ 0] ^ ((crc >> 7) & 0xff)] ^
crc15_table[14][d[ 1] ^ ((crc << 1) & 0xff)] ^
crc15_table[13][d[ 2] ] ^
crc15_table[12][d[ 3] ] ^
crc15_table[11][d[ 4] ] ^
crc15_table[10][d[ 5] ] ^
crc15_table[ 9][d[ 6] ] ^
crc15_table[ 8][d[ 7] ] ^
crc15_table[ 7][d[ 8] ] ^
crc15_table[ 6][d[ 9] ] ^
crc15_table[ 5][d[10] ] ^
crc15_table[ 4][d[11] ] ^
crc15_table[ 3][d[12] ] ^
crc15_table[ 2][d[13] ] ^
crc15_table[ 1][d[14] ] ^
crc15_table[ 0][d[15] ];
crc &= 0x7fff;
d += SLICE_SIZE;
}

while (data_len--)
{
tbl_idx = ((crc >> 7) ^ *d) & 0xff;
crc = (crc15_table[tbl_idx] ^ (crc << 8)) & 0x7fff;
crc = (crc15_table[0][tbl_idx] ^ (crc << 8)) & 0x7fff;
d++;
}

Expand Down
3 changes: 3 additions & 0 deletions ext/digest/crc15/extconf.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
require 'mkmf'
require_relative '../gentable'

have_header("stdint.h")
have_header('stddef.h')

generate_table("crc15_table.h", "crc15_table", 15, 0x4599, false)

create_header
create_makefile "crc15_ext"
64 changes: 26 additions & 38 deletions ext/digest/crc16/crc16.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,54 +15,42 @@
*/

#include "crc16.h"
#include "extconf.h"

/**
* Static table used for the table_driven implementation.
*/
static const crc16_t crc16_table[256] = {
0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
};
// This file is generated by generate_table in extconf.rb
#include "crc16_table.h"

crc16_t crc16_update(crc16_t crc, const void *data, size_t data_len)
{
const unsigned char *d = (const unsigned char *)data;
unsigned int tbl_idx;

for (; data_len >= SLICE_SIZE; data_len -= SLICE_SIZE)
{
crc = crc16_table[15][d[ 0] ^ ((crc >> 0) & 0xff)] ^
crc16_table[14][d[ 1] ^ ((crc >> 8) & 0xff)] ^
crc16_table[13][d[ 2] ] ^
crc16_table[12][d[ 3] ] ^
crc16_table[11][d[ 4] ] ^
crc16_table[10][d[ 5] ] ^
crc16_table[ 9][d[ 6] ] ^
crc16_table[ 8][d[ 7] ] ^
crc16_table[ 7][d[ 8] ] ^
crc16_table[ 6][d[ 9] ] ^
crc16_table[ 5][d[10] ] ^
crc16_table[ 4][d[11] ] ^
crc16_table[ 3][d[12] ] ^
crc16_table[ 2][d[13] ] ^
crc16_table[ 1][d[14] ] ^
crc16_table[ 0][d[15] ];
crc &= 0xffff;
d += SLICE_SIZE;
}

while (data_len--)
{
tbl_idx = (crc ^ *d) & 0xff;
crc = (crc16_table[tbl_idx] ^ (crc >> 8)) & 0xffff;
crc = (crc16_table[0][tbl_idx] ^ (crc >> 8)) & 0xffff;
d++;
}

Expand Down
3 changes: 3 additions & 0 deletions ext/digest/crc16/extconf.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
require 'mkmf'
require_relative '../gentable'

have_header("stdint.h")
have_header('stddef.h')

generate_table("crc16_table.h", "crc16_table", 16, 0x8005, true)

create_header
create_makefile "crc16_ext"
64 changes: 26 additions & 38 deletions ext/digest/crc16_ccitt/crc16_ccitt.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,54 +15,42 @@
*/

#include "crc16_ccitt.h"
#include "extconf.h"

/**
* Static table used for the table_driven implementation.
*/
static const crc16_t crc16_ccitt_table[256] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
};
// This file is generated by generate_table in extconf.rb
#include "crc16_ccitt_table.h"

crc16_t crc16_ccitt_update(crc16_t crc, const void *data, size_t data_len)
{
const unsigned char *d = (const unsigned char *)data;
unsigned int tbl_idx;

for (; data_len >= SLICE_SIZE; data_len -= SLICE_SIZE)
{
crc = crc16_ccitt_table[15][d[ 0] ^ ((crc >> 8) & 0xff)] ^
crc16_ccitt_table[14][d[ 1] ^ ((crc >> 0) & 0xff)] ^
crc16_ccitt_table[13][d[ 2] ] ^
crc16_ccitt_table[12][d[ 3] ] ^
crc16_ccitt_table[11][d[ 4] ] ^
crc16_ccitt_table[10][d[ 5] ] ^
crc16_ccitt_table[ 9][d[ 6] ] ^
crc16_ccitt_table[ 8][d[ 7] ] ^
crc16_ccitt_table[ 7][d[ 8] ] ^
crc16_ccitt_table[ 6][d[ 9] ] ^
crc16_ccitt_table[ 5][d[10] ] ^
crc16_ccitt_table[ 4][d[11] ] ^
crc16_ccitt_table[ 3][d[12] ] ^
crc16_ccitt_table[ 2][d[13] ] ^
crc16_ccitt_table[ 1][d[14] ] ^
crc16_ccitt_table[ 0][d[15] ];
crc &= 0xffff;
d += SLICE_SIZE;
}

while (data_len--)
{
tbl_idx = ((crc >> 8) ^ *d) & 0xff;
crc = (crc16_ccitt_table[tbl_idx] ^ (crc << 8)) & 0xffff;
crc = (crc16_ccitt_table[0][tbl_idx] ^ (crc << 8)) & 0xffff;
d++;
}

Expand Down
3 changes: 3 additions & 0 deletions ext/digest/crc16_ccitt/extconf.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
require 'mkmf'
require_relative '../gentable'

have_header("stdint.h")
have_header('stddef.h')

generate_table("crc16_ccitt_table.h", "crc16_ccitt_table", 16, 0x1021, false)

create_header
create_makefile "crc16_ccitt_ext"
Loading

0 comments on commit e6f0aa3

Please sign in to comment.