2
2
#include <assert.h>
3
3
#include <string.h>
4
4
5
-
6
- #ifdef __GNUC__
7
- # define EXPECTED (X ) __builtin_expect(!!(X), 1)
8
- # define UNEXPECTED (X ) __builtin_expect(!!(X), 0)
5
+ #ifdef assert
6
+ # define assertFalse (msg ) assert(0 && msg)
9
7
#else
10
- # define EXPECTED (X ) (X)
11
- # define UNEXPECTED (X ) (X)
8
+ # define assertFalse (msg )
12
9
#endif
13
10
14
11
#define SET_STATE (V ) parser->state = V
15
12
#define HAS_DATA () (p < end )
16
13
#define CC (*p)
17
- #define GET_PARSED () ( (p == end) ? len : (p - data) )
14
+ #define GET_NPARSED () ( (p == end) ? len : (p - data) )
18
15
19
16
#define NOTIFY_CB (FOR ) \
20
17
do { \
21
18
if (settings->on_##FOR) { \
22
19
if (settings->on_##FOR(parser) != 0) { \
23
- return GET_PARSED (); \
20
+ return GET_NPARSED (); \
24
21
} \
25
22
} \
26
23
} while (0)
29
26
do { \
30
27
if (settings->on_##FOR) { \
31
28
if (settings->on_##FOR(parser, ptr, len) != 0) { \
32
- return GET_PARSED (); \
29
+ return GET_NPARSED (); \
33
30
} \
34
31
} \
35
32
} while (0)
@@ -47,7 +44,6 @@ void websocket_parser_init(websocket_parser * parser) {
47
44
memset (parser , 0 , sizeof (* parser ));
48
45
parser -> data = data ;
49
46
parser -> state = s_start ;
50
- parser -> error = 0 ;
51
47
}
52
48
53
49
void websocket_parser_settings_init (websocket_parser_settings * settings ) {
@@ -65,8 +61,8 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
65
61
parser -> offset = 0 ;
66
62
parser -> length = 0 ;
67
63
parser -> mask_offset = 0 ;
68
- parser -> flags = (uint32_t ) (CC & WS_OP_MASK );
69
- if (EXPECTED ( CC & (1 <<7 ) )) {
64
+ parser -> flags = (websocket_flags ) (CC & WS_OP_MASK );
65
+ if (CC & (1 <<7 )) {
70
66
parser -> flags |= WS_FIN ;
71
67
}
72
68
SET_STATE (s_head );
@@ -78,18 +74,18 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
78
74
if (CC & 0x80 ) {
79
75
parser -> flags |= WS_HAS_MASK ;
80
76
}
81
- if (EXPECTED ( parser -> length >= 126 ) ) {
82
- if (EXPECTED ( parser -> length == 127 ) ) {
77
+ if (parser -> length >= 126 ) {
78
+ if (parser -> length == 127 ) {
83
79
parser -> require = 8 ;
84
80
} else {
85
81
parser -> require = 2 ;
86
82
}
87
83
parser -> length = 0 ;
88
84
SET_STATE (s_length );
89
- } else if (EXPECTED ( parser -> flags & WS_HAS_MASK ) ) {
85
+ } else if (parser -> flags & WS_HAS_MASK ) {
90
86
SET_STATE (s_mask );
91
87
parser -> require = 4 ;
92
- } else if (EXPECTED ( parser -> length ) ) {
88
+ } else if (parser -> length ) {
93
89
SET_STATE (s_body );
94
90
parser -> require = parser -> length ;
95
91
NOTIFY_CB (frame_header );
@@ -110,11 +106,11 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
110
106
p ++ ;
111
107
}
112
108
p -- ;
113
- if (UNEXPECTED ( !parser -> require ) ) {
114
- if (EXPECTED ( parser -> flags & WS_HAS_MASK ) ) {
109
+ if (!parser -> require ) {
110
+ if (parser -> flags & WS_HAS_MASK ) {
115
111
SET_STATE (s_mask );
116
112
parser -> require = 4 ;
117
- } else if (EXPECTED ( parser -> length ) ) {
113
+ } else if (parser -> length ) {
118
114
SET_STATE (s_body );
119
115
parser -> require = parser -> length ;
120
116
NOTIFY_CB (frame_header );
@@ -132,7 +128,7 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
132
128
p ++ ;
133
129
}
134
130
p -- ;
135
- if (UNEXPECTED ( !parser -> require ) ) {
131
+ if (!parser -> require ) {
136
132
if (parser -> length ) {
137
133
SET_STATE (s_body );
138
134
parser -> require = parser -> length ;
@@ -145,7 +141,7 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
145
141
}
146
142
break ;
147
143
case s_body :
148
- if (EXPECTED ( parser -> require ) ) {
144
+ if (parser -> require ) {
149
145
if (p + parser -> require <= end ) {
150
146
EMIT_DATA_CB (frame_body , p , parser -> require );
151
147
p += parser -> require ;
@@ -161,17 +157,17 @@ size_t websocket_parser_execute(websocket_parser *parser, const websocket_parser
161
157
162
158
p -- ;
163
159
}
164
- if (UNEXPECTED ( !parser -> require ) ) {
160
+ if (!parser -> require ) {
165
161
NOTIFY_CB (frame_end );
166
162
SET_STATE (s_start );
167
163
}
168
164
break ;
169
165
default :
170
- assert ( 0 && "Unreachable case" );
166
+ assertFalse ( "Unreachable case" );
171
167
}
172
168
}
173
169
174
- return GET_PARSED ();
170
+ return GET_NPARSED ();
175
171
}
176
172
177
173
void websocket_parser_decode (char * dst , const char * src , size_t len , websocket_parser * parser ) {
@@ -192,23 +188,23 @@ uint8_t websocket_decode(char * dst, const char * src, size_t len, const char ma
192
188
return (uint8_t ) ((i + mask_offset ) % 4 );
193
189
}
194
190
195
- size_t websocket_calc_frame_size (uint32_t flags , size_t data_len ) {
191
+ size_t websocket_calc_frame_size (websocket_flags flags , size_t data_len ) {
196
192
size_t size = data_len + 2 ; // body + 2 bytes of head
197
- if (EXPECTED ( data_len >= 126 ) ) {
198
- if (EXPECTED ( data_len > 0xFFFF ) ) {
193
+ if (data_len >= 126 ) {
194
+ if (data_len > 0xFFFF ) {
199
195
size += 8 ;
200
196
} else {
201
197
size += 2 ;
202
198
}
203
199
}
204
- if (EXPECTED ( flags & WS_HAS_MASK ) ) {
200
+ if (flags & WS_HAS_MASK ) {
205
201
size += 4 ;
206
202
}
207
203
208
204
return size ;
209
205
}
210
206
211
- size_t websocket_build_frame (char * frame , uint32_t flags , const char mask [4 ], const char * data , size_t data_len ) {
207
+ size_t websocket_build_frame (char * frame , websocket_flags flags , const char mask [4 ], const char * data , size_t data_len ) {
212
208
size_t body_offset = 0 ;
213
209
frame [0 ] = 0 ;
214
210
frame [1 ] = 0 ;
0 commit comments