xref: /f-stack/app/nginx-1.16.1/src/core/ngx_crc32.h (revision 3da8d17d)
1 
2 /*
3  * Copyright (C) Igor Sysoev
4  * Copyright (C) Nginx, Inc.
5  */
6 
7 
8 #ifndef _NGX_CRC32_H_INCLUDED_
9 #define _NGX_CRC32_H_INCLUDED_
10 
11 
12 #include <ngx_config.h>
13 #include <ngx_core.h>
14 
15 
16 extern uint32_t  *ngx_crc32_table_short;
17 extern uint32_t   ngx_crc32_table256[];
18 
19 
20 static ngx_inline uint32_t
ngx_crc32_short(u_char * p,size_t len)21 ngx_crc32_short(u_char *p, size_t len)
22 {
23     u_char    c;
24     uint32_t  crc;
25 
26     crc = 0xffffffff;
27 
28     while (len--) {
29         c = *p++;
30         crc = ngx_crc32_table_short[(crc ^ (c & 0xf)) & 0xf] ^ (crc >> 4);
31         crc = ngx_crc32_table_short[(crc ^ (c >> 4)) & 0xf] ^ (crc >> 4);
32     }
33 
34     return crc ^ 0xffffffff;
35 }
36 
37 
38 static ngx_inline uint32_t
ngx_crc32_long(u_char * p,size_t len)39 ngx_crc32_long(u_char *p, size_t len)
40 {
41     uint32_t  crc;
42 
43     crc = 0xffffffff;
44 
45     while (len--) {
46         crc = ngx_crc32_table256[(crc ^ *p++) & 0xff] ^ (crc >> 8);
47     }
48 
49     return crc ^ 0xffffffff;
50 }
51 
52 
53 #define ngx_crc32_init(crc)                                                   \
54     crc = 0xffffffff
55 
56 
57 static ngx_inline void
ngx_crc32_update(uint32_t * crc,u_char * p,size_t len)58 ngx_crc32_update(uint32_t *crc, u_char *p, size_t len)
59 {
60     uint32_t  c;
61 
62     c = *crc;
63 
64     while (len--) {
65         c = ngx_crc32_table256[(c ^ *p++) & 0xff] ^ (c >> 8);
66     }
67 
68     *crc = c;
69 }
70 
71 
72 #define ngx_crc32_final(crc)                                                  \
73     crc ^= 0xffffffff
74 
75 
76 ngx_int_t ngx_crc32_table_init(void);
77 
78 
79 #endif /* _NGX_CRC32_H_INCLUDED_ */
80