@@ -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
112112void 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)
214214void 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
219221void 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
223288void string_parser_init (string_parser_t * parser )
0 commit comments