Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 1 | |
| 2 | /* |
Igor Sysoev | ff8da91 | 2004-09-29 16:00:49 +0000 | [diff] [blame] | 3 | * Copyright (C) Igor Sysoev |
Maxim Konovalov | f8d59e3 | 2012-01-18 15:07:43 +0000 | [diff] [blame] | 4 | * Copyright (C) Nginx, Inc. |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 5 | */ |
| 6 | |
| 7 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 8 | #ifndef _NGX_CRC_H_INCLUDED_ |
| 9 | #define _NGX_CRC_H_INCLUDED_ |
| 10 | |
| 11 | |
Igor Sysoev | a8503de | 2006-10-19 08:16:29 +0000 | [diff] [blame] | 12 | #include <ngx_config.h> |
| 13 | #include <ngx_core.h> |
| 14 | |
| 15 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 16 | /* 32-bit crc16 */ |
| 17 | |
Igor Sysoev | 0ab9e43 | 2006-10-13 15:09:25 +0000 | [diff] [blame] | 18 | static ngx_inline uint32_t |
Igor Sysoev | 289e3ca | 2006-10-18 18:43:11 +0000 | [diff] [blame] | 19 | ngx_crc(u_char *data, size_t len) |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 20 | { |
| 21 | uint32_t sum; |
Igor Sysoev | 5f80078 | 2003-12-08 20:48:12 +0000 | [diff] [blame] | 22 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 23 | for (sum = 0; len; len--) { |
Igor Sysoev | d90282d | 2004-09-28 08:34:51 +0000 | [diff] [blame] | 24 | |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 25 | /* |
Igor Sysoev | 0ab9e43 | 2006-10-13 15:09:25 +0000 | [diff] [blame] | 26 | * gcc 2.95.2 x86 and icc 7.1.006 compile |
| 27 | * that operator into the single "rol" opcode, |
Igor Sysoev | 865c150 | 2003-11-30 20:03:18 +0000 | [diff] [blame] | 28 | * msvc 6.0sp2 compiles it into four opcodes. |
| 29 | */ |
| 30 | sum = sum >> 1 | sum << 31; |
| 31 | |
| 32 | sum += *data++; |
| 33 | } |
| 34 | |
| 35 | return sum; |
| 36 | } |
| 37 | |
| 38 | |
| 39 | #endif /* _NGX_CRC_H_INCLUDED_ */ |