aboutsummaryrefslogtreecommitdiffstats
path: root/dl_docrc.c
diff options
context:
space:
mode:
authorfishsoupisgood <github@madingley.org>2019-04-27 22:20:21 +0100
committerfishsoupisgood <github@madingley.org>2019-04-27 22:20:21 +0100
commitfd6bb20116127f6ac903d4b03abac72a49baa1ae (patch)
tree22e1e44fad2f844096f2d79bef9262112b45158c /dl_docrc.c
downloaddatalink-fd6bb20116127f6ac903d4b03abac72a49baa1ae.tar.gz
datalink-fd6bb20116127f6ac903d4b03abac72a49baa1ae.tar.bz2
datalink-fd6bb20116127f6ac903d4b03abac72a49baa1ae.zip
fish
Diffstat (limited to 'dl_docrc.c')
-rw-r--r--dl_docrc.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/dl_docrc.c b/dl_docrc.c
new file mode 100644
index 0000000..18a6cca
--- /dev/null
+++ b/dl_docrc.c
@@ -0,0 +1,52 @@
+/*
+ * Copyright 1996-2002 - Karl R. Hakimian and David Fries
+ *
+ * This file is part of datalink.
+ *
+ * Datalink is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Datalink is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with datalink (see COPYING); if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+/* crc lookup table */
+static unsigned short int crc16_table[16] = {
+ 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
+ 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
+};
+
+unsigned short int dl_docrc(unsigned char *data)
+{
+ int i;
+ unsigned short int t;
+ unsigned short int crc = 0;
+ int l;
+
+ l = data[0] - 2;
+
+ for (i = 0; i < l; i++)
+ {
+ t = crc16_table[crc & 0xF];
+ crc = (crc >> 4) & 0x0FFF;
+ crc = crc ^ t ^ crc16_table[data[i] & 0xF];
+
+ /* upper 4 bits */
+ t = crc16_table[crc & 0xF];
+ crc = (crc >> 4) & 0x0FFF;
+ crc = crc ^ t ^ crc16_table[(data[i] >> 4) & 0xF];
+ }
+
+ data[l++] = crc >> 8;
+ data[l] = crc & 0xff;
+ return (crc);
+}