diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2022-10-23 00:15:49 -0400 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2022-10-23 00:15:49 -0400 |
| commit | 5db008dbd2084d90631b567ed5320566aa76b41c (patch) | |
| tree | 359b5b79bcc5c21b443b067a808cacb659ded1f6 /json.c | |
| parent | 23c64e386c7ea1d0054c37f945a6467dccdf2980 (diff) | |
Better JSON printing and fixed issue with numbered captures
Diffstat (limited to 'json.c')
| -rw-r--r-- | json.c | 49 |
1 files changed, 36 insertions, 13 deletions
@@ -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); |
