diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2018-06-04 11:11:20 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2018-06-04 11:11:20 +0300 |
commit | c3850a4d3f94436aab6b23020242bc99c71506ee (patch) | |
tree | 644cd582c39c833124d1d071a4b7738bac97428d /src | |
parent | 43a1c4ce04cf9301b88c8df31087fe84dcb7e232 (diff) | |
download | grecs-c3850a4d3f94436aab6b23020242bc99c71506ee.tar.gz grecs-c3850a4d3f94436aab6b23020242bc99c71506ee.tar.bz2 |
json: improve parser reentrability
* include/grecs/json.h (jsonlex_cleanup): New proto.
* src/json-lex.l (jsonlex_setup): Initialize parser state.
Initialize json_current_locus_point.file to a non-NULL value.
(jsonlex_cleanup): New function.
* src/json-gram.y (json_parse_string): Call jsonlex_cleanup before returning.
* src/diag.c (default_print_diag): Print the passed errcode argument,
instead of errno.
Diffstat (limited to 'src')
-rw-r--r-- | src/diag.c | 2 | ||||
-rw-r--r-- | src/json-gram.y | 1 | ||||
-rw-r--r-- | src/json-lex.l | 35 |
3 files changed, 25 insertions, 13 deletions
@@ -37,7 +37,7 @@ default_print_diag(grecs_locus_t const *locus, int err, int errcode, | |||
37 | fprintf(stderr, "warning: "); | 37 | fprintf(stderr, "warning: "); |
38 | fprintf(stderr, "%s", msg); | 38 | fprintf(stderr, "%s", msg); |
39 | if (errcode) | 39 | if (errcode) |
40 | fprintf(stderr, ": %s", strerror(errno)); | 40 | fprintf(stderr, ": %s", strerror(errcode)); |
41 | fputc('\n', stderr); | 41 | fputc('\n', stderr); |
42 | } | 42 | } |
43 | 43 | ||
diff --git a/src/json-gram.y b/src/json-gram.y index fe8996b..d5b0248 100644 --- a/src/json-gram.y +++ b/src/json-gram.y | |||
@@ -280,6 +280,7 @@ json_parse_string(char const *input, size_t len) | |||
280 | /* FIXME: error recovery */ | 280 | /* FIXME: error recovery */ |
281 | return NULL; | 281 | return NULL; |
282 | } | 282 | } |
283 | jsonlex_cleanup(); | ||
283 | return json_return_obj; | 284 | return json_return_obj; |
284 | } | 285 | } |
285 | 286 | ||
diff --git a/src/json-lex.l b/src/json-lex.l index 169cf32..4bbdedf 100644 --- a/src/json-lex.l +++ b/src/json-lex.l | |||
@@ -55,18 +55,6 @@ struct grecs_locus json_err_locus; | |||
55 | } while (0); | 55 | } while (0); |
56 | 56 | ||
57 | void | 57 | void |
58 | jsonlex_setup(char const *s, size_t l) | ||
59 | { | ||
60 | input_ptr = s; | ||
61 | input_size = l; | ||
62 | json_current_locus_point.file = NULL; | ||
63 | json_current_locus_point.line = 1; | ||
64 | json_current_locus_point.col = 0; | ||
65 | json_err_diag = NULL; | ||
66 | yy_flex_debug = 0; | ||
67 | } | ||
68 | |||
69 | void | ||
70 | jsonlex_diag(const char *s) | 58 | jsonlex_diag(const char *s) |
71 | { | 59 | { |
72 | if (!json_err_diag) { | 60 | if (!json_err_diag) { |
@@ -227,3 +215,26 @@ false { yylval.b = 0; return T_BOOL; } | |||
227 | \n grecs_locus_point_advance_line(json_current_locus_point); | 215 | \n grecs_locus_point_advance_line(json_current_locus_point); |
228 | . { jsonlex_diag("bogus character"); | 216 | . { jsonlex_diag("bogus character"); |
229 | return T_ERR; } | 217 | return T_ERR; } |
218 | %% | ||
219 | void | ||
220 | jsonlex_setup(char const *s, size_t l) | ||
221 | { | ||
222 | input_ptr = s; | ||
223 | input_size = l; | ||
224 | json_current_locus_point.file = "input"; | ||
225 | json_current_locus_point.line = 1; | ||
226 | json_current_locus_point.col = 0; | ||
227 | json_err_diag = NULL; | ||
228 | yy_flex_debug = 0; | ||
229 | BEGIN(INITIAL); | ||
230 | yyrestart(NULL); | ||
231 | } | ||
232 | |||
233 | void | ||
234 | jsonlex_cleanup(void) | ||
235 | { | ||
236 | if (json_line_acc) { | ||
237 | grecs_txtacc_free(json_line_acc); | ||
238 | json_line_acc = NULL; | ||
239 | } | ||
240 | } | ||