diff options
| author | Mattias Andrée <m@maandree.se> | 2026-01-05 15:18:50 +0100 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-02-23 07:53:09 +0100 |
| commit | 28b0a361363acbd9a2d291d82e145fb3757ed9f8 (patch) | |
| tree | b86f7c42410ada38631bbdd4ada2a3d4120660f6 /print-syntax.c | |
| parent | Make deterministic the default (diff) | |
| download | libparser-28b0a361363acbd9a2d291d82e145fb3757ed9f8.tar.gz libparser-28b0a361363acbd9a2d291d82e145fb3757ed9f8.tar.bz2 libparser-28b0a361363acbd9a2d291d82e145fb3757ed9f8.tar.xz | |
Add \t and improve printing of text, and print the input text when PRINT_ACTIONS used
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to 'print-syntax.c')
| -rw-r--r-- | print-syntax.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/print-syntax.c b/print-syntax.c index 07b3858..6a00fb8 100644 --- a/print-syntax.c +++ b/print-syntax.c @@ -14,6 +14,7 @@ static int print_sentence(const union libparser_sentence *sentence, int indent) { + size_t off, n; int len; switch (sentence->type) { @@ -79,7 +80,48 @@ print_sentence(const union libparser_sentence *sentence, int indent) break; case LIBPARSER_SENTENCE_TYPE_STRING: - printf("\"%.*s\"%n", (int)sentence->string.length, sentence->string.string, &len); + printf("\"%n", &len); + indent += len; + off = 0; + n = 0; + while (off + n < sentence->string.length) { + if (sentence->string.string[off + n] < ' ' || + sentence->string.string[off + n] >= 0x7F || + sentence->string.string[off + n] == '"' || + sentence->string.string[off + n] == '\\') { + printf("%.*s%n", (int)n, &sentence->string.string[off], &len); + indent += len; + off += n; + n = 0; + switch (sentence->string.string[off]) { + case '\\': printf("\\\\%n", &len); break; + case '\"': printf("\\\"%n", &len); break; + case '\a': printf("\\a%n", &len); break; + case '\b': printf("\\b%n", &len); break; + case '\f': printf("\\f%n", &len); break; + case '\n': printf("\\n%n", &len); break; + case '\r': printf("\\r%n", &len); break; + case '\t': printf("\\t%n", &len); break; + case '\v': printf("\\v%n", &len); break; + default: + printf("\\x%02X%n", +(unsigned char)sentence->string.string[off], &len); + break; + } + off++; + } else if (n == 4096U) { + printf("%.*s%n", (int)n, &sentence->string.string[off], &len); + indent += len; + off += n; + n = 0; + } else { + n++; + } + } + if (n) { + printf("%.*s%n", (int)n, &sentence->string.string[off], &len); + indent += len; + } + printf("\"%n", &len); indent += len; break; |
