summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--include/grecs/json.h1
-rw-r--r--include/wordsplit.h8
-rw-r--r--src/diag.c2
-rw-r--r--src/json-gram.y1
-rw-r--r--src/json-lex.l35
5 files changed, 31 insertions, 16 deletions
diff --git a/include/grecs/json.h b/include/grecs/json.h
index f8402e7..49a6b87 100644
--- a/include/grecs/json.h
+++ b/include/grecs/json.h
@@ -54,6 +54,7 @@ extern struct grecs_locus json_err_locus;
extern struct json_value *json_return_obj;
void jsonlex_setup(char const *s, size_t l);
+void jsonlex_cleanup(void);
void jsonlex_diag(const char *s);
int json_unescape(char c, char *o);
diff --git a/include/wordsplit.h b/include/wordsplit.h
index d13ec3c..7229df3 100644
--- a/include/wordsplit.h
+++ b/include/wordsplit.h
@@ -26,9 +26,11 @@ typedef struct wordsplit wordsplit_t;
provide return values when the function returns. If neither mark is
used, the member is internal and must not be used by the caller.
- In the comments below, the
- identifiers in parentheses indicate bits that must be set (or unset, if
- starting with !) in the ws_flags to initialize or use the given member.
+ In the comments below, the identifiers in parentheses indicate bits that
+ must be set (or unset, if starting with !) in ws_flags (if starting with
+ WRDSF_) or ws_options (if starting with WRDSO_) to initialize or use the
+ given member.
+
If not redefined explicitly, most of them are set to some reasonable
default value upon entry to wordsplit(). */
struct wordsplit
diff --git a/src/diag.c b/src/diag.c
index bdbb407..db96e75 100644
--- a/src/diag.c
+++ b/src/diag.c
@@ -37,7 +37,7 @@ default_print_diag(grecs_locus_t const *locus, int err, int errcode,
fprintf(stderr, "warning: ");
fprintf(stderr, "%s", msg);
if (errcode)
- fprintf(stderr, ": %s", strerror(errno));
+ fprintf(stderr, ": %s", strerror(errcode));
fputc('\n', stderr);
}
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)
/* FIXME: error recovery */
return NULL;
}
+ jsonlex_cleanup();
return json_return_obj;
}
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;
} while (0);
void
-jsonlex_setup(char const *s, size_t l)
-{
- input_ptr = s;
- input_size = l;
- json_current_locus_point.file = NULL;
- json_current_locus_point.line = 1;
- json_current_locus_point.col = 0;
- json_err_diag = NULL;
- yy_flex_debug = 0;
-}
-
-void
jsonlex_diag(const char *s)
{
if (!json_err_diag) {
@@ -227,3 +215,26 @@ false { yylval.b = 0; return T_BOOL; }
\n grecs_locus_point_advance_line(json_current_locus_point);
. { jsonlex_diag("bogus character");
return T_ERR; }
+%%
+void
+jsonlex_setup(char const *s, size_t l)
+{
+ input_ptr = s;
+ input_size = l;
+ json_current_locus_point.file = "input";
+ json_current_locus_point.line = 1;
+ json_current_locus_point.col = 0;
+ json_err_diag = NULL;
+ yy_flex_debug = 0;
+ BEGIN(INITIAL);
+ yyrestart(NULL);
+}
+
+void
+jsonlex_cleanup(void)
+{
+ if (json_line_acc) {
+ grecs_txtacc_free(json_line_acc);
+ json_line_acc = NULL;
+ }
+}

Return to:

Send suggestions and report system problems to the System administrator.