summaryrefslogtreecommitdiff
path: root/common/crc.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/crc.c')
-rw-r--r--common/crc.c39
1 files changed, 32 insertions, 7 deletions
diff --git a/common/crc.c b/common/crc.c
index 31054ad732..79d405eb13 100644
--- a/common/crc.c
+++ b/common/crc.c
@@ -56,9 +56,6 @@ static const uint32_t crc32_tab[] = {
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
};
-/* Accumulator for the CRC */
-static uint32_t crc_;
-
static uint32_t crc32_hash(uint32_t crc, const void *buf, int size)
{
const uint8_t *p;
@@ -73,22 +70,50 @@ static uint32_t crc32_hash(uint32_t crc, const void *buf, int size)
return crc;
}
+void crc32_ctx_init(uint32_t *crc)
+{
+ *crc = CRC32_INITIAL;
+}
+
+void crc32_ctx_hash32(uint32_t *crc, uint32_t val)
+{
+ *crc = crc32_hash(*crc, &val, sizeof(val));
+}
+
+void crc32_ctx_hash16(uint32_t *crc, uint16_t val)
+{
+ *crc = crc32_hash(*crc, &val, sizeof(val));
+}
+
+void crc32_ctx_hash8(uint32_t *crc, uint8_t val)
+{
+ *crc = crc32_hash(*crc, &val, sizeof(val));
+}
+
+uint32_t crc32_ctx_result(uint32_t *crc)
+{
+ return *crc ^ 0xFFFFFFFF;
+}
+
+/* Accumulator for the CRC */
+static uint32_t crc_;
+
void crc32_init(void)
{
- crc_ = CRC32_INITIAL;
+ crc32_ctx_init(&crc_);
}
void crc32_hash32(uint32_t val)
{
- crc_ = crc32_hash(crc_, &val, sizeof(uint32_t));
+ crc32_ctx_hash32(&crc_, val);
}
void crc32_hash16(uint16_t val)
{
- crc_ = crc32_hash(crc_, &val, sizeof(uint16_t));
+ crc32_ctx_hash16(&crc_, val);
}
uint32_t crc32_result(void)
{
- return crc_ ^ 0xFFFFFFFF;
+ return crc32_ctx_result(&crc_);
}