From 5db008dbd2084d90631b567ed5320566aa76b41c Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sun, 23 Oct 2022 00:15:49 -0400 Subject: Better JSON printing and fixed issue with numbered captures --- json.c | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) (limited to 'json.c') diff --git a/json.c b/json.c index 297aa30..e3731d5 100644 --- a/json.c +++ b/json.c @@ -16,24 +16,47 @@ static int _json_match(const char *text, match_t *m, int comma, bool verbose); // static int _json_match(const char *text, match_t *m, int comma, bool verbose) { - if (comma) printf(",\n"); - comma = 0; - printf("{\"rule\":\""); - for (const char *c = m->pat->start; c < m->pat->end; c++) { - switch (*c) { - case '"': printf("\\\""); break; - case '\\': printf("\\\\"); break; - case '\t': printf("\\t"); break; - case '\n': printf("↵"); break; - default: printf("%c", *c); break; + if (!verbose && m->pat->type != BP_TAGGED) { + if (m->children) { + for (int i = 0; m->children && m->children[i]; i++) + comma |= _json_match(text, m->children[i], comma, verbose); } + return comma; } - printf("\",\"range\":[%ld,%ld]", m->start - text, m->end - text); + if (comma) printf(",\n"); + comma = 0; + printf("{"); if (m->pat->type == BP_TAGGED) - printf(",\"tag\":\"%.*s\"", (int)m->pat->args.capture.namelen, m->pat->args.capture.name); + printf("\"tag\":\"%.*s\"", (int)m->pat->args.capture.namelen, m->pat->args.capture.name); + if (verbose) { + printf(",\"rule\":\""); + for (const char *c = m->pat->start; c < m->pat->end; c++) { + switch (*c) { + case '"': printf("\\\""); break; + case '\\': printf("\\\\"); break; + case '\t': printf("\\t"); break; + case '\n': printf("↵"); break; + default: printf("%c", *c); break; + } + } + printf("\","); + printf("\"range\":[%ld,%ld]", m->start - text, m->end - text); + } else { + printf(",\"text\":\""); + for (const char *c = m->start; c < m->end; c++) { + switch (*c) { + case '"': printf("\\\""); break; + case '\\': printf("\\\\"); break; + case '\t': printf("\\t"); break; + case '\n': printf("↵"); break; + default: printf("%c", *c); break; + } + } + printf("\""); + } - if (m->children && (verbose || m->pat->type != BP_REF)) { + if (m->children) { printf(",\"children\":["); for (int i = 0; m->children && m->children[i]; i++) comma |= _json_match(text, m->children[i], comma, verbose); -- cgit v1.2.3