aboutsummaryrefslogtreecommitdiffstats
path: root/print-syntax.c
diff options
context:
space:
mode:
Diffstat (limited to 'print-syntax.c')
-rw-r--r--print-syntax.c44
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;