From 8b164ba17f6077d8c4adf801a6806b24e2830e59 Mon Sep 17 00:00:00 2001 From: Steven Franke Date: Thu, 22 Mar 2018 14:18:14 +0000 Subject: [PATCH] Add crc14.cpp git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@8584 ab8295b8-cf94-4d9e-aec4-7959e3be5d79 --- lib/crc.f90 | 17 +++++++++++++++++ lib/crc14.cpp | 31 +++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 lib/crc14.cpp diff --git a/lib/crc.f90 b/lib/crc.f90 index 6e5c262eb..423f54923 100644 --- a/lib/crc.f90 +++ b/lib/crc.f90 @@ -1,6 +1,23 @@ module crc use, intrinsic :: iso_c_binding, only: c_int, c_loc, c_int8_t, c_bool, c_short interface + + function crc14 (data, length) bind (C, name="crc14") + use, intrinsic :: iso_c_binding, only: c_short, c_ptr, c_int + implicit none + integer (c_short) :: crc14 + type (c_ptr), value :: data + integer (c_int), value :: length + end function crc14 + + function crc14_check (data, length) bind (C, name="crc16_check") + use, intrinsic :: iso_c_binding, only: c_bool, c_ptr, c_int + implicit none + logical (c_bool) :: crc14_check + type (c_ptr), value :: data + integer (c_int), value :: length + end function crc14_check + function crc12 (data, length) bind (C, name="crc12") use, intrinsic :: iso_c_binding, only: c_short, c_ptr, c_int implicit none diff --git a/lib/crc14.cpp b/lib/crc14.cpp new file mode 100644 index 000000000..19a9ba55b --- /dev/null +++ b/lib/crc14.cpp @@ -0,0 +1,31 @@ +#include +#include + +extern "C" +{ + short crc14 (unsigned char const * data, int length); + bool crc14_check (unsigned char const * data, int length); +} + +#define POLY 0x2757 + +#ifdef BOOST_NO_CXX11_CONSTEXPR +#define TRUNCATED_POLYNOMIAL POLY +#else +namespace +{ + unsigned long constexpr TRUNCATED_POLYNOMIAL = POLY; +} +#endif + +// assumes CRC is last 14 bits of the data and is set to zero +// caller should assign the returned CRC into the message in big endian byte order +short crc14 (unsigned char const * data, int length) +{ + return boost::augmented_crc<14, TRUNCATED_POLYNOMIAL> (data, length); +} + +bool crc14_check (unsigned char const * data, int length) +{ + return !boost::augmented_crc<14, TRUNCATED_POLYNOMIAL> (data, length); +}