diff options
| author | Bruce Hill <bruce@bruce-hill.com> | 2020-09-10 23:11:08 -0700 |
|---|---|---|
| committer | Bruce Hill <bruce@bruce-hill.com> | 2020-09-10 23:11:08 -0700 |
| commit | 8a846230f7b4269af08a6b6496ebd28c4ff459ba (patch) | |
| tree | 9813268cb25a062879369bfe45c1ca4354d21845 /bpeg.c | |
| parent | 238ab2afa74e3809818d6f60c1540b2158e15934 (diff) | |
Fixed/tidied replacement logic
Diffstat (limited to 'bpeg.c')
| -rw-r--r-- | bpeg.c | 56 |
1 files changed, 31 insertions, 25 deletions
@@ -892,40 +892,46 @@ static void print_match(match_t *m, const char *color) { if (m->is_replacement) { printf("\033[0;34m"); - for (const char *r = m->name_or_replacement; *r; r++) { - if (*r == '@') { + for (const char *r = m->name_or_replacement; *r; ) { + if (*r == '\\') { + fputc(unescapechar(r, &r), stdout); + continue; + } else if (*r != '@') { + fputc(*r, stdout); ++r; - match_t *cap = NULL; - if (isdigit(*r)) { + continue; + } + + ++r; + match_t *cap = NULL; + switch (*r) { + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': { int n = (int)strtol(r, (char**)&r, 10); cap = get_capture_n(m->child, &n); - --r; - } else if (*r == '[') { + break; + } + case '[': { char *closing = strchr(r+1, ']'); if (!closing) { fputc('@', stdout); - --r; - } else { - ++r; - char *name = strndup(r, (size_t)(closing-r)); - cap = get_capture_named(m, name); - free(name); - r = closing; + break; } - } else if (*r == '@') { - fputc('@', stdout); - } else { - fputc('@', stdout); + ++r; + char *name = strndup(r, (size_t)(closing-r)); + cap = get_capture_named(m, name); + free(name); + r = closing + 1; + break; } - if (cap != NULL) { - print_match(cap, "\033[0;35m"); - printf("\033[0;34m"); + default: { + fputc('@', stdout); + break; } - } else if (matchchar(&r, '\\')) { - fputc(unescapechar(r, &r), stdout); - --r; - } else { - fputc(*r, stdout); + } + if (cap != NULL) { + print_match(cap, "\033[0;35m"); + printf("\033[0;34m"); } } } else { |
