Skip to content

Commit 3d0739b

Browse files
committed
have the coord_parser done in http server
1 parent 23ac611 commit 3d0739b

File tree

5 files changed

+82
-9
lines changed

5 files changed

+82
-9
lines changed

serve/bbf.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ static void uri_bbf_param_parser_terminate(bbf_param_parser_t* parser)
7272
parser->params.accurate = parser->bool_parser.result;
7373
break;
7474
case s_bbf_name_size:
75+
parser->params.size = ccv_size((int)(parser->coord_parser.x + 0.5), (int)(parser->coord_parser.y + 0.5));
7576
break;
7677
case s_bbf_name_model:
7778
if (parser->string_parser.state == s_string_start)
@@ -135,6 +136,7 @@ void* uri_bbf_detect_objects_parse(const void* context, void* parsed, const char
135136
bool_parser_init(&parser->bool_parser);
136137
} else if (strcmp(parser->name, "size") == 0) {
137138
parser->state = s_bbf_name_size;
139+
coord_parser_init(&parser->coord_parser);
138140
} else if (strcmp(parser->name, "model") == 0) {
139141
parser->state = s_bbf_name_model;
140142
string_parser_init(&parser->string_parser);
@@ -157,6 +159,7 @@ void* uri_bbf_detect_objects_parse(const void* context, void* parsed, const char
157159
bool_parser_execute(&parser->bool_parser, buf, len);
158160
break;
159161
case s_bbf_name_size:
162+
coord_parser_execute(&parser->coord_parser, buf, len);
160163
break;
161164
case s_bbf_name_model:
162165
string_parser_execute(&parser->string_parser, buf, len);
@@ -192,8 +195,8 @@ ebb_buf uri_bbf_detect_objects_intro(const void* context, const void* parsed)
192195
{
193196
ebb_buf buf;
194197
const static char bbf_intro[] =
195-
"HTTP/1.1 200 OK\r\nCache-Control: no-cache\r\nAccept: \r\nContent-Type: text/html\r\nContent-Length: 156\r\n\r\n"
196-
"<html><body><form enctype='multipart/form-data' method='post'><input name='model' value='face'><input type='file' name='source'><input type='submit'></form>\n";
198+
"HTTP/1.1 200 OK\r\nCache-Control: no-cache\r\nAccept: \r\nContent-Type: text/html\r\nContent-Length: 189\r\n\r\n"
199+
"<html><body><form enctype='multipart/form-data' method='post'><input name='size' value='24x24'><input name='model' value='face'><input type='file' name='source'><input type='submit'></form>\n";
197200
buf.data = (void*)bbf_intro;
198201
buf.len = sizeof(bbf_intro);
199202
return buf;

serve/ebb_request_parser.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
#define EMIT_HEADER_CB(FOR, ptr, len) \
4444
if (CURRENT->on_##FOR) { \
4545
CURRENT->on_##FOR(CURRENT, ptr, len, \
46-
CURRENT->number_of_multipart_headers); \
46+
CURRENT->number_of_multipart_headers); \
4747
}
4848
#define EMIT_DATA_CB(FOR, ptr, len) \
4949
if (CURRENT->on_##FOR) { \

serve/ebb_request_parser.rl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
#define EMIT_HEADER_CB(FOR, ptr, len) \
4242
if (CURRENT->on_##FOR) { \
4343
CURRENT->on_##FOR(CURRENT, ptr, len, \
44-
CURRENT->number_of_multipart_headers); \
44+
CURRENT->number_of_multipart_headers); \
4545
}
4646
#define EMIT_DATA_CB(FOR, ptr, len) \
4747
if (CURRENT->on_##FOR) { \

serve/parsers.c

Lines changed: 70 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ void numeric_parser_init(numeric_parser_t* parser)
106106
{
107107
parser->state = s_numeric_start;
108108
parser->result = 0;
109-
parser->division = 10;
109+
parser->division = 0.1;
110110
}
111111

112112
void numeric_parser_execute(numeric_parser_t* parser, const char* buf, size_t len)
@@ -120,9 +120,9 @@ void numeric_parser_execute(numeric_parser_t* parser, const char* buf, size_t le
120120
switch (parser->state)
121121
{
122122
case s_numeric_start:
123-
parser->result = digit;
123+
parser->result = 0;
124124
parser->state = s_numeric_before_decimal;
125-
break;
125+
/* fall-through */
126126
case s_numeric_before_decimal:
127127
if (buf[i] != '.')
128128
parser->result = parser->result * 10 + digit;
@@ -133,8 +133,8 @@ void numeric_parser_execute(numeric_parser_t* parser, const char* buf, size_t le
133133
if (buf[i] == '.') // we cannot bear another .
134134
parser->state = s_numeric_illegal;
135135
else {
136-
parser->result += digit / parser->division;
137-
parser->division *= 10;
136+
parser->result += digit * parser->division;
137+
parser->division *= 0.1;
138138
}
139139
break;
140140
case s_numeric_illegal:
@@ -214,10 +214,75 @@ void bool_parser_execute(bool_parser_t* parser, const char* buf, size_t len)
214214
void coord_parser_init(coord_parser_t* parser)
215215
{
216216
parser->state = s_coord_start;
217+
parser->x = parser->y = 0;
218+
parser->division = 0.1;
217219
}
218220

219221
void coord_parser_execute(coord_parser_t* parser, const char* buf, size_t len)
220222
{
223+
int i;
224+
for (i = 0; i < len; i++)
225+
{
226+
int digit = buf[i] - '0';
227+
if ((digit < 0 || digit >= 10) && buf[i] != '.' && buf[i] != 'x' && buf[i] != 'X')
228+
parser->state = s_coord_illegal;
229+
switch (parser->state)
230+
{
231+
case s_coord_start:
232+
parser->x = parser->y = 0;
233+
parser->state = s_coord_x_before_decimal;
234+
/* fall-through */
235+
case s_coord_x_before_decimal:
236+
if (buf[i] != 'x' && buf[i] != 'X')
237+
{
238+
if (buf[i] != '.')
239+
parser->x = parser->x * 10 + digit;
240+
else
241+
parser->state = s_coord_x_after_decimal;
242+
} else
243+
parser->state = s_coord_y_before_decimal;
244+
break;
245+
case s_coord_x_after_decimal:
246+
if (buf[i] != 'x' && buf[i] != 'X')
247+
{
248+
if (buf[i] == '.')
249+
{
250+
parser->state = s_coord_illegal;
251+
break;
252+
}
253+
parser->x += digit * parser->division;
254+
parser->division *= 0.1;
255+
} else {
256+
parser->division = 0.1;
257+
parser->state = s_coord_y_before_decimal;
258+
}
259+
break;
260+
case s_coord_y_before_decimal:
261+
if (buf[i] == 'x' || buf[i] == 'X')
262+
{
263+
parser->state = s_coord_illegal;
264+
break;
265+
}
266+
if (buf[i] != '.')
267+
parser->y = parser->y * 10 + digit;
268+
else
269+
parser->state = s_coord_y_after_decimal;
270+
break;
271+
case s_coord_y_after_decimal:
272+
if (buf[i] == 'x' || buf[i] == 'X' || buf[i] == '.')
273+
{
274+
parser->state = s_coord_illegal;
275+
break;
276+
}
277+
parser->y += digit * parser->division;
278+
parser->division *= 0.1;
279+
break;
280+
case s_coord_illegal:
281+
break;
282+
}
283+
if (parser->state == s_coord_illegal)
284+
break;
285+
}
221286
}
222287

223288
void string_parser_init(string_parser_t* parser)

serve/uri.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,13 +60,18 @@ void bool_parser_execute(bool_parser_t* parser, const char* buf, size_t len);
6060

6161
typedef enum {
6262
s_coord_start,
63+
s_coord_x_before_decimal,
64+
s_coord_x_after_decimal,
65+
s_coord_y_before_decimal,
66+
s_coord_y_after_decimal,
6367
s_coord_illegal,
6468
} coord_state_t;
6569

6670
typedef struct {
6771
coord_state_t state;
6872
double x;
6973
double y;
74+
double division;
7075
} coord_parser_t;
7176

7277
void coord_parser_init(coord_parser_t* parser);

0 commit comments

Comments
 (0)