Skip to content
This repository was archived by the owner on Nov 6, 2022. It is now read-only.

Commit ad3b631

Browse files
committed
Turn normal_url_char into a bit array.
Makes http_parser slightly more cache friendly.
1 parent 4e1a6ab commit ad3b631

1 file changed

Lines changed: 27 additions & 21 deletions

File tree

http_parser.c

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@
4141
# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
4242
#endif
4343

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+
4450
#ifndef ELEM_AT
4551
# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v))
4652
#endif
@@ -192,45 +198,45 @@ static const int8_t unhex[256] =
192198

193199

194200
#if HTTP_PARSER_STRICT
195-
# define T 0
201+
# define T(v) 0
196202
#else
197-
# define T 1
203+
# define T(v) v
198204
#endif
199205

200206

201-
static const uint8_t normal_url_char[256] = {
207+
static const uint8_t normal_url_char[32] = {
202208
/* 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,
204210
/* 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,
206212
/* 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,
208214
/* 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,
210216
/* 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,
212218
/* 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,
214220
/* 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,
216222
/* 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,
218224
/* 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,
220226
/* 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,
222228
/* 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,
224230
/* 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,
226232
/* 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,
228234
/* 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,
230236
/* 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,
232238
/* 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, };
234240

235241
#undef T
236242

@@ -371,12 +377,12 @@ enum http_host_state
371377

372378
#if HTTP_PARSER_STRICT
373379
#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))
375381
#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-')
376382
#else
377383
#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c])
378384
#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))
380386
#define IS_HOST_CHAR(c) \
381387
(IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_')
382388
#endif

0 commit comments

Comments
 (0)