|
41 | 41 | # define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) |
42 | 42 | #endif |
43 | 43 |
|
| 44 | +#ifndef BIT_AT |
| 45 | +# define BIT_AT(a, i) \ |
| 46 | + (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \ |
| 47 | + (1 << ((unsigned int) (i) & 7)))) |
| 48 | +#endif |
| 49 | + |
44 | 50 | #ifndef ELEM_AT |
45 | 51 | # define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v)) |
46 | 52 | #endif |
@@ -192,45 +198,45 @@ static const int8_t unhex[256] = |
192 | 198 |
|
193 | 199 |
|
194 | 200 | #if HTTP_PARSER_STRICT |
195 | | -# define T 0 |
| 201 | +# define T(v) 0 |
196 | 202 | #else |
197 | | -# define T 1 |
| 203 | +# define T(v) v |
198 | 204 | #endif |
199 | 205 |
|
200 | 206 |
|
201 | | -static const uint8_t normal_url_char[256] = { |
| 207 | +static const uint8_t normal_url_char[32] = { |
202 | 208 | /* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ |
203 | | - 0, 0, 0, 0, 0, 0, 0, 0, |
| 209 | + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, |
204 | 210 | /* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ |
205 | | - 0, T, 0, 0, T, 0, 0, 0, |
| 211 | + 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0, |
206 | 212 | /* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ |
207 | | - 0, 0, 0, 0, 0, 0, 0, 0, |
| 213 | + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, |
208 | 214 | /* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ |
209 | | - 0, 0, 0, 0, 0, 0, 0, 0, |
| 215 | + 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0, |
210 | 216 | /* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ |
211 | | - 0, 1, 1, 0, 1, 1, 1, 1, |
| 217 | + 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128, |
212 | 218 | /* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ |
213 | | - 1, 1, 1, 1, 1, 1, 1, 1, |
| 219 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, |
214 | 220 | /* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ |
215 | | - 1, 1, 1, 1, 1, 1, 1, 1, |
| 221 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, |
216 | 222 | /* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ |
217 | | - 1, 1, 1, 1, 1, 1, 1, 0, |
| 223 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, |
218 | 224 | /* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ |
219 | | - 1, 1, 1, 1, 1, 1, 1, 1, |
| 225 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, |
220 | 226 | /* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ |
221 | | - 1, 1, 1, 1, 1, 1, 1, 1, |
| 227 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, |
222 | 228 | /* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ |
223 | | - 1, 1, 1, 1, 1, 1, 1, 1, |
| 229 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, |
224 | 230 | /* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ |
225 | | - 1, 1, 1, 1, 1, 1, 1, 1, |
| 231 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, |
226 | 232 | /* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ |
227 | | - 1, 1, 1, 1, 1, 1, 1, 1, |
| 233 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, |
228 | 234 | /* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ |
229 | | - 1, 1, 1, 1, 1, 1, 1, 1, |
| 235 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, |
230 | 236 | /* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ |
231 | | - 1, 1, 1, 1, 1, 1, 1, 1, |
| 237 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128, |
232 | 238 | /* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ |
233 | | - 1, 1, 1, 1, 1, 1, 1, 0, }; |
| 239 | + 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, }; |
234 | 240 |
|
235 | 241 | #undef T |
236 | 242 |
|
@@ -371,12 +377,12 @@ enum http_host_state |
371 | 377 |
|
372 | 378 | #if HTTP_PARSER_STRICT |
373 | 379 | #define TOKEN(c) (tokens[(unsigned char)c]) |
374 | | -#define IS_URL_CHAR(c) (normal_url_char[(unsigned char) (c)]) |
| 380 | +#define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c)) |
375 | 381 | #define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') |
376 | 382 | #else |
377 | 383 | #define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) |
378 | 384 | #define IS_URL_CHAR(c) \ |
379 | | - (normal_url_char[(unsigned char) (c)] || ((c) & 0x80)) |
| 385 | + (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80)) |
380 | 386 | #define IS_HOST_CHAR(c) \ |
381 | 387 | (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') |
382 | 388 | #endif |
|
0 commit comments