From 86d5737fc2f70bb81d180dedbd44ad475d4c1853 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 25 Aug 2017 16:26:40 -0700 Subject: [PATCH] Escape quotes when printing symbols to dot graphs --- src/runtime/parser.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/runtime/parser.c b/src/runtime/parser.c index 979bfdb0..3e7763e2 100644 --- a/src/runtime/parser.c +++ b/src/runtime/parser.c @@ -14,16 +14,10 @@ #include "runtime/error_costs.h" #define LOG(...) \ - if (self->lexer.logger.log) { \ + if (self->lexer.logger.log || self->print_debugging_graphs) { \ snprintf(self->lexer.debug_buffer, TREE_SITTER_SERIALIZATION_BUFFER_SIZE, __VA_ARGS__); \ - self->lexer.logger.log(self->lexer.logger.payload, TSLogTypeParse, \ - self->lexer.debug_buffer); \ + parser__log(self); \ } \ - if (self->print_debugging_graphs) { \ - fprintf(stderr, "graph {\nlabel=\""); \ - fprintf(stderr, __VA_ARGS__); \ - fprintf(stderr, "\"\n}\n\n"); \ - } #define LOG_STACK() \ if (self->print_debugging_graphs) { \ @@ -59,6 +53,25 @@ typedef struct { TSSymbol lookahead_symbol; } SkipPrecedingTreesSession; +static void parser__log(Parser *self) { + if (self->lexer.logger.log) { + self->lexer.logger.log( + self->lexer.logger.payload, + TSLogTypeParse, + self->lexer.debug_buffer + ); + } + + if (self->print_debugging_graphs) { + fprintf(stderr, "graph {\nlabel=\""); + for (char *c = &self->lexer.debug_buffer[0]; *c != 0; c++) { + if (*c == '"') fputc('\\', stderr); + fputc(*c, stderr); + } + fprintf(stderr, "\"\n}\n\n"); + } +} + static void parser__push(Parser *self, StackVersion version, Tree *tree, TSStateId state) { ts_stack_push(self->stack, version, tree, false, state); ts_tree_release(tree);