blob: 4435e4517e211429c891545b25002eb3b10e6dd8 [file] [log] [blame]
Igor Sysoev5864fc02006-10-18 19:00:21 +00001
2/*
3 * Copyright (C) Igor Sysoev
4 */
5
6
7#ifndef _NGX_CRC32_H_INCLUDED_
8#define _NGX_CRC32_H_INCLUDED_
9
10
11#include <ngx_config.h>
12#include <ngx_core.h>
13
14
Igor Sysoev5569faa2006-10-19 09:57:49 +000015extern uint32_t *ngx_crc32_table_short;
16extern uint32_t ngx_crc32_table256[];
Igor Sysoev5864fc02006-10-18 19:00:21 +000017
18
19static ngx_inline uint32_t
Igor Sysoev5569faa2006-10-19 09:57:49 +000020ngx_crc32_short(u_char *p, size_t len)
21{
22 u_char c;
23 uint32_t crc;
24
25 crc = 0xffffffff;
26
27 while (len--) {
28 c = *p++;
29 crc = ngx_crc32_table_short[(crc ^ (c & 0xf)) & 0xf] ^ (crc >> 4);
30 crc = ngx_crc32_table_short[(crc ^ (c >> 4)) & 0xf] ^ (crc >> 4);
31 }
32
33 return crc ^ 0xffffffff;
34}
35
36
37static ngx_inline uint32_t
38ngx_crc32_long(u_char *p, size_t len)
Igor Sysoev5864fc02006-10-18 19:00:21 +000039{
40 uint32_t crc;
41
42 crc = 0xffffffff;
43
44 while (len--) {
Igor Sysoev5569faa2006-10-19 09:57:49 +000045 crc = ngx_crc32_table256[(crc ^ *p++) & 0xff] ^ (crc >> 8);
Igor Sysoev5864fc02006-10-18 19:00:21 +000046 }
47
48 return crc ^ 0xffffffff;
49}
50
51
Igor Sysoevac7586e2007-12-07 20:19:41 +000052#define ngx_crc32_init(crc) \
53 crc = 0xffffffff
54
55
Igor Sysoev8cdfc512007-12-08 22:12:37 +000056static ngx_inline void
Igor Sysoevac7586e2007-12-07 20:19:41 +000057ngx_crc32_update(uint32_t *crc, u_char *p, size_t len)
58{
59 uint32_t c;
60
61 c = *crc;
62
63 while (len--) {
64 c = ngx_crc32_table256[(c ^ *p++) & 0xff] ^ (c >> 8);
65 }
66
67 *crc = c;
68}
69
70
71#define ngx_crc32_final(crc) \
72 crc ^= 0xffffffff
73
74
75ngx_int_t ngx_crc32_table_init(void);
Igor Sysoev5569faa2006-10-19 09:57:49 +000076
77
Igor Sysoev5864fc02006-10-18 19:00:21 +000078#endif /* _NGX_CRC32_H_INCLUDED_ */