From f92ad0482483b8e2a546223d9eaebb458085e4f3 Mon Sep 17 00:00:00 2001 From: Andrew Hlynskyi Date: Sun, 7 Feb 2021 02:59:59 +0200 Subject: [PATCH] parser.c - added LOG_LOOKAHEAD macro to escape \n in logging --- lib/src/parser.c | 42 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/lib/src/parser.c b/lib/src/parser.c index 0c711b0c..0aa02e2c 100644 --- a/lib/src/parser.c +++ b/lib/src/parser.c @@ -25,6 +25,41 @@ ts_parser__log(self); \ } +#define LOG_LOOKAHEAD(symbol_name, size, ...) \ + if (self->lexer.logger.log || self->dot_graph_file) { \ + char *buf = self->lexer.debug_buffer; \ + const char *symbol = symbol_name; \ + int off = sprintf(buf, "lexed_lookahead sym:"); \ + for ( \ + int i = 0; \ + symbol[i] != '\0' \ + && off < TREE_SITTER_SERIALIZATION_BUFFER_SIZE; \ + i++ \ + ) { \ + switch (symbol[i]) { \ + case '\t': buf[off++] = '\\'; buf[off++] = 't'; break; \ + case '\n': buf[off++] = '\\'; buf[off++] = 'n'; break; \ + case '\v': buf[off++] = '\\'; buf[off++] = 'v'; break; \ + case '\f': buf[off++] = '\\'; buf[off++] = 'f'; break; \ + case '\r': buf[off++] = '\\'; buf[off++] = 'r'; break; \ + default: buf[off++] = symbol[i]; break; \ + } \ + } \ + off += snprintf( \ + buf + off, \ + TREE_SITTER_SERIALIZATION_BUFFER_SIZE - off, \ + ", size:%u", \ + size \ + ); \ + if (sizeof( (char[]){#__VA_ARGS__} ) == 1) \ + snprintf( \ + buf + off, \ + TREE_SITTER_SERIALIZATION_BUFFER_SIZE - off, \ + ", " __VA_ARGS__ \ + ); \ + ts_parser__log(self); \ + } + #define LOG_STACK() \ if (self->dot_graph_file) { \ ts_stack_print_dot_graph(self->stack, self->language, self->dot_graph_file); \ @@ -477,10 +512,10 @@ static Subtree ts_parser__lex( self->language ); - LOG( - "lexed_lookahead sym:%s, size:%u, character:'%c'", + LOG_LOOKAHEAD( SYM_NAME(ts_subtree_symbol(result)), ts_subtree_total_size(result).bytes, + "character:'%c'", first_error_character ); } else { @@ -534,8 +569,7 @@ static Subtree ts_parser__lex( ); } - LOG( - "lexed_lookahead sym:%s, size:%u", + LOG_LOOKAHEAD( SYM_NAME(ts_subtree_symbol(result)), ts_subtree_total_size(result).bytes );