Module Name: src Committed By: rillig Date: Sat May 13 09:27:49 UTC 2023
Modified Files: src/usr.bin/indent: Makefile indent.h io.c lexi.c parse.c Added Files: src/usr.bin/indent: debug.c Log Message: indent: move debugging code to separate file No functional change. To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/usr.bin/indent/Makefile cvs rdiff -u -r0 -r1.1 src/usr.bin/indent/debug.c cvs rdiff -u -r1.122 -r1.123 src/usr.bin/indent/indent.h cvs rdiff -u -r1.155 -r1.156 src/usr.bin/indent/io.c cvs rdiff -u -r1.176 -r1.177 src/usr.bin/indent/lexi.c cvs rdiff -u -r1.53 -r1.54 src/usr.bin/indent/parse.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/indent/Makefile diff -u src/usr.bin/indent/Makefile:1.14 src/usr.bin/indent/Makefile:1.15 --- src/usr.bin/indent/Makefile:1.14 Thu Oct 7 18:32:09 2021 +++ src/usr.bin/indent/Makefile Sat May 13 09:27:49 2023 @@ -1,8 +1,8 @@ -# $NetBSD: Makefile,v 1.14 2021/10/07 18:32:09 rillig Exp $ +# $NetBSD: Makefile,v 1.15 2023/05/13 09:27:49 rillig Exp $ # from: @(#)Makefile 8.1 (Berkeley) 6/6/93 PROG= indent -SRCS= indent.c io.c lexi.c parse.c pr_comment.c args.c +SRCS= args.c debug.c indent.c io.c lexi.c parse.c pr_comment.c CPPFLAGS+= ${DEBUG:D-Ddebug} LINTFLAGS+= -e -w -T Index: src/usr.bin/indent/indent.h diff -u src/usr.bin/indent/indent.h:1.122 src/usr.bin/indent/indent.h:1.123 --- src/usr.bin/indent/indent.h:1.122 Fri May 12 22:38:47 2023 +++ src/usr.bin/indent/indent.h Sat May 13 09:27:49 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.h,v 1.122 2023/05/12 22:38:47 rillig Exp $ */ +/* $NetBSD: indent.h,v 1.123 2023/05/13 09:27:49 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD @@ -348,14 +348,22 @@ extern struct parser_state { #define array_length(array) (sizeof(array) / sizeof((array)[0])) #ifdef debug +void debug_printf(const char *, ...) __printflike(1, 2); +void debug_println(const char *, ...) __printflike(1, 2); void debug_vis_range(const char *, const char *, const char *, const char *); -void debug_printf(const char *, ...)__printflike(1, 2); -void debug_println(const char *, ...)__printflike(1, 2); -const char *psym_name(parser_symbol); +void debug_parser_state(lexer_symbol); +void debug_parse_stack(const char *); +void debug_buffers(void); +extern const char *const lsym_name[]; +extern const char *const psym_name[]; #else -#define debug_printf(fmt, ...) do { } while (false) -#define debug_println(fmt, ...) do { } while (false) -#define debug_vis_range(prefix, s, e, suffix) do { } while (false) +#define debug_noop() do { } while (false) +#define debug_printf(fmt, ...) debug_noop() +#define debug_println(fmt, ...) debug_noop() +#define debug_vis_range(prefix, s, e, suffix) debug_noop() +#define debug_parser_state() debug_noop() +#define debug_parse_stack(situation) debug_noop() +#define debug_buffers() debug_noop() #endif void register_typename(const char *); Index: src/usr.bin/indent/io.c diff -u src/usr.bin/indent/io.c:1.155 src/usr.bin/indent/io.c:1.156 --- src/usr.bin/indent/io.c:1.155 Fri May 12 10:53:33 2023 +++ src/usr.bin/indent/io.c Sat May 13 09:27:49 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: io.c,v 1.155 2023/05/12 10:53:33 rillig Exp $ */ +/* $NetBSD: io.c,v 1.156 2023/05/13 09:27:49 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -43,7 +43,7 @@ static char sccsid[] = "@(#)io.c 8.1 (Be #include <sys/cdefs.h> #if defined(__NetBSD__) -__RCSID("$NetBSD: io.c,v 1.155 2023/05/12 10:53:33 rillig Exp $"); +__RCSID("$NetBSD: io.c,v 1.156 2023/05/13 09:27:49 rillig Exp $"); #elif defined(__FreeBSD__) __FBSDID("$FreeBSD: head/usr.bin/indent/io.c 334927 2018-06-10 16:44:18Z pstef $"); #endif @@ -277,10 +277,16 @@ output_line_comment(int ind) /* * Write a line of formatted source to the output file. The line consists of * the label, the code and the comment. + * + * Comments are written directly, bypassing this function. */ static void output_complete_line(char line_terminator) { + debug_printf("%s", __func__); + debug_buffers(); + debug_println("%s", line_terminator == '\f' ? " form_feed" : ""); + ps.is_function_definition = false; if (!inhibit_formatting) { Index: src/usr.bin/indent/lexi.c diff -u src/usr.bin/indent/lexi.c:1.176 src/usr.bin/indent/lexi.c:1.177 --- src/usr.bin/indent/lexi.c:1.176 Fri May 12 08:40:54 2023 +++ src/usr.bin/indent/lexi.c Sat May 13 09:27:49 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: lexi.c,v 1.176 2023/05/12 08:40:54 rillig Exp $ */ +/* $NetBSD: lexi.c,v 1.177 2023/05/13 09:27:49 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -43,7 +43,7 @@ static char sccsid[] = "@(#)lexi.c 8.1 ( #include <sys/cdefs.h> #if defined(__NetBSD__) -__RCSID("$NetBSD: lexi.c,v 1.176 2023/05/12 08:40:54 rillig Exp $"); +__RCSID("$NetBSD: lexi.c,v 1.177 2023/05/13 09:27:49 rillig Exp $"); #elif defined(__FreeBSD__) __FBSDID("$FreeBSD: head/usr.bin/indent/lexi.c 337862 2018-08-15 18:19:45Z pstef $"); #endif @@ -191,184 +191,12 @@ token_add_char(char ch) *token.e++ = ch; } -#ifdef debug -static const char * -lsym_name(lexer_symbol sym) -{ - static const char *const name[] = { - "eof", - "preprocessing", - "newline", - "form_feed", - "comment", - "lparen_or_lbracket", - "rparen_or_rbracket", - "lbrace", - "rbrace", - "period", - "unary_op", - "binary_op", - "postfix_op", - "question", - "colon", - "comma", - "semicolon", - "typedef", - "storage_class", - "type_outside_parentheses", - "type_in_parentheses", - "tag", - "case_label", - "sizeof", - "offsetof", - "word", - "funcname", - "do", - "else", - "for", - "if", - "switch", - "while", - "return", - }; - - return name[sym]; -} - -static void -debug_print_buf(const char *name, const struct buffer *buf) -{ - if (buf->s < buf->e) { - debug_printf("%s ", name); - debug_vis_range("\"", buf->s, buf->e, "\"\n"); - } -} - -static bool -debug_full_parser_state(void) -{ - return true; -} - -#define debug_ps_bool(name) \ - if (ps.name != prev_ps.name) \ - debug_println("[%c] -> [%c] ps." #name, \ - prev_ps.name ? 'x' : ' ', ps.name ? 'x' : ' '); \ - else if (debug_full_parser_state()) \ - debug_println(" [%c] ps." #name, ps.name ? 'x' : ' ') -#define debug_ps_int(name) \ - if (ps.name != prev_ps.name) \ - debug_println("%3d -> %3d ps." #name, prev_ps.name, ps.name); \ - else if (debug_full_parser_state()) \ - debug_println(" %3d ps." #name, ps.name) -#define debug_ps_enum(name, repr) \ - if (ps.name != prev_ps.name) \ - debug_println("%3s -> %3s ps." #name, \ - repr(prev_ps.name), repr(ps.name)); \ - else if (debug_full_parser_state()) \ - debug_println("%10s ps." #name, repr(ps.name)) - -static bool -ps_paren_has_changed(const struct parser_state *prev_ps) -{ - const paren_level_props *prev = prev_ps->paren, *curr = ps.paren; - - if (prev_ps->nparen != ps.nparen) - return true; - - for (int i = 0; i < ps.nparen; i++) { - if (curr[i].indent != prev[i].indent || - curr[i].maybe_cast != prev[i].maybe_cast || - curr[i].no_cast != prev[i].no_cast) - return true; - } - return false; -} - -static void -debug_ps_paren(const struct parser_state *prev_ps) -{ - if (!debug_full_parser_state() && !ps_paren_has_changed(prev_ps)) - return; - - debug_printf(" ps.paren:"); - for (int i = 0; i < ps.nparen; i++) { - const paren_level_props *props = ps.paren + i; - const char *cast = props->no_cast ? "(no cast)" - : props->maybe_cast ? "(cast)" - : ""; - debug_printf(" %s%d", cast, props->indent); - } - if (ps.nparen == 0) - debug_printf(" none"); - debug_println(""); -} - -static void -debug_lexi(lexer_symbol lsym) -{ - static struct parser_state prev_ps; - - debug_println(""); - debug_printf("line %d: %s", line_no, lsym_name(lsym)); - debug_vis_range(" \"", token.s, token.e, "\"\n"); - - debug_print_buf("label", &lab); - debug_print_buf("code", &code); - debug_print_buf("comment", &com); - - debug_println(" ps.prev_token = %s", lsym_name(ps.prev_token)); - debug_ps_bool(curr_col_1); - debug_ps_bool(next_col_1); - debug_ps_bool(next_unary); - debug_ps_bool(is_function_definition); - debug_ps_bool(want_blank); - debug_ps_bool(force_nl); - debug_ps_int(line_start_nparen); - debug_ps_int(nparen); - debug_ps_paren(&prev_ps); - - debug_ps_int(comment_delta); - debug_ps_int(n_comment_delta); - debug_ps_int(com_ind); - - debug_ps_bool(block_init); - debug_ps_int(block_init_level); - debug_ps_bool(init_or_struct); - - debug_ps_int(ind_level); - debug_ps_int(ind_level_follow); - - debug_ps_int(decl_level); - debug_ps_bool(decl_on_line); - debug_ps_bool(in_decl); - debug_ps_int(just_saw_decl); - debug_ps_bool(in_func_def_params); - // No debug output for in_enum. - debug_ps_bool(decl_indent_done); - debug_ps_int(decl_ind); - // No debug output for di_stack. - debug_ps_bool(tabs_to_var); - - debug_ps_bool(in_stmt_or_decl); - debug_ps_bool(in_stmt_cont); - debug_ps_bool(is_case_label); - debug_ps_bool(seen_case); - - // The debug output for the parser symbols is done in 'parse' instead. - - debug_ps_enum(spaced_expr_psym, psym_name); - debug_ps_int(quest_level); - - prev_ps = ps; -} -#endif static lexer_symbol lexi_end(lexer_symbol lsym) { #ifdef debug - debug_lexi(lsym); + debug_parser_state(lsym); #endif return lsym; } Index: src/usr.bin/indent/parse.c diff -u src/usr.bin/indent/parse.c:1.53 src/usr.bin/indent/parse.c:1.54 --- src/usr.bin/indent/parse.c:1.53 Fri May 12 22:38:47 2023 +++ src/usr.bin/indent/parse.c Sat May 13 09:27:49 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.53 2023/05/12 22:38:47 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.54 2023/05/13 09:27:49 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -43,7 +43,7 @@ static char sccsid[] = "@(#)parse.c 8.1 #include <sys/cdefs.h> #if defined(__NetBSD__) -__RCSID("$NetBSD: parse.c,v 1.53 2023/05/12 22:38:47 rillig Exp $"); +__RCSID("$NetBSD: parse.c,v 1.54 2023/05/13 09:27:49 rillig Exp $"); #else __FBSDID("$FreeBSD: head/usr.bin/indent/parse.c 337651 2018-08-11 19:20:06Z pstef $"); #endif @@ -55,32 +55,6 @@ __FBSDID("$FreeBSD: head/usr.bin/indent/ static void reduce(void); -#ifdef debug -const char * -psym_name(parser_symbol psym) -{ - static const char *const name[] = { - "0", - "lbrace", - "rbrace", - "decl", - "stmt", - "stmt_list", - "for_exprs", - "if_expr", - "if_expr_stmt", - "if_expr_stmt_else", - "else", - "switch_expr", - "do", - "do_stmt", - "while_expr", - }; - - return name[psym]; -} -#endif - static int decl_level(void) { @@ -91,21 +65,6 @@ decl_level(void) return level; } -#ifdef debug -static void -debug_parse_stack(const char *situation) -{ - printf("parse stack %s:", situation); - for (int i = 1; i <= ps.tos; ++i) - printf(" %s %d", psym_name(ps.s_sym[i]), ps.s_ind_level[i]); - if (ps.tos == 0) - printf(" empty"); - printf("\n"); -} -#else -#define debug_parse_stack(situation) do { } while (false) -#endif - /* * Shift the token onto the parser stack, or reduce it by combining it with * previous tokens. @@ -113,7 +72,7 @@ debug_parse_stack(const char *situation) void parse(parser_symbol psym) { - debug_println("parse token: %s", psym_name(psym)); + debug_println("parse token: %s", psym_name[psym]); if (psym != psym_else) { while (ps.s_sym[ps.tos] == psym_if_expr_stmt) { Added files: Index: src/usr.bin/indent/debug.c diff -u /dev/null src/usr.bin/indent/debug.c:1.1 --- /dev/null Sat May 13 09:27:49 2023 +++ src/usr.bin/indent/debug.c Sat May 13 09:27:49 2023 @@ -0,0 +1,244 @@ +/* $NetBSD: debug.c,v 1.1 2023/05/13 09:27:49 rillig Exp $ */ + +/*- + * Copyright (c) 2023 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Roland Illig <ril...@netbsd.org>. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__RCSID("$NetBSD: debug.c,v 1.1 2023/05/13 09:27:49 rillig Exp $"); + +#include "indent.h" + +#ifdef debug +const char *const lsym_name[] = { + "eof", + "preprocessing", + "newline", + "form_feed", + "comment", + "lparen_or_lbracket", + "rparen_or_rbracket", + "lbrace", + "rbrace", + "period", + "unary_op", + "binary_op", + "postfix_op", + "question", + "colon", + "comma", + "semicolon", + "typedef", + "storage_class", + "type_outside_parentheses", + "type_in_parentheses", + "tag", + "case_label", + "sizeof", + "offsetof", + "word", + "funcname", + "do", + "else", + "for", + "if", + "switch", + "while", + "return", +}; + +const char *const psym_name[] = { + "0", + "lbrace", + "rbrace", + "decl", + "stmt", + "stmt_list", + "for_exprs", + "if_expr", + "if_expr_stmt", + "if_expr_stmt_else", + "else", + "switch_expr", + "do", + "do_stmt", + "while_expr", +}; + +static bool debug_full_parser_state = true; + +static void +debug_print_buf(const char *name, const struct buffer *buf) +{ + if (buf->s < buf->e) { + debug_printf("%s ", name); + debug_vis_range("\"", buf->s, buf->e, "\"\n"); + } +} + +void +debug_buffers(void) +{ + if (lab.e != lab.s) { + debug_printf(" label "); + debug_vis_range("\"", lab.s, lab.e, "\""); + } + if (code.e != code.s) { + debug_printf(" code "); + debug_vis_range("\"", code.s, code.e, "\""); + } + if (com.e < com.s) { + debug_printf(" comment "); + debug_vis_range("\"", com.s, com.e, "\""); + } +} + +#define debug_ps_bool(name) \ + if (ps.name != prev_ps.name) \ + debug_println("[%c] -> [%c] ps." #name, \ + prev_ps.name ? 'x' : ' ', ps.name ? 'x' : ' '); \ + else if (debug_full_parser_state) \ + debug_println(" [%c] ps." #name, ps.name ? 'x' : ' ') +#define debug_ps_int(name) \ + if (ps.name != prev_ps.name) \ + debug_println("%3d -> %3d ps." #name, prev_ps.name, ps.name); \ + else if (debug_full_parser_state) \ + debug_println(" %3d ps." #name, ps.name) +#define debug_ps_enum(name, names) \ + if (ps.name != prev_ps.name) \ + debug_println("%3s -> %3s ps." #name, \ + (names)[prev_ps.name], (names)[ps.name]); \ + else if (debug_full_parser_state) \ + debug_println("%10s ps." #name, (names)[ps.name]) + +static bool +ps_paren_has_changed(const struct parser_state *prev_ps) +{ + const paren_level_props *prev = prev_ps->paren, *curr = ps.paren; + + if (prev_ps->nparen != ps.nparen) + return true; + + for (int i = 0; i < ps.nparen; i++) { + if (curr[i].indent != prev[i].indent || + curr[i].maybe_cast != prev[i].maybe_cast || + curr[i].no_cast != prev[i].no_cast) + return true; + } + return false; +} + +static void +debug_ps_paren(const struct parser_state *prev_ps) +{ + if (!debug_full_parser_state && !ps_paren_has_changed(prev_ps)) + return; + + debug_printf(" ps.paren:"); + for (int i = 0; i < ps.nparen; i++) { + const paren_level_props *props = ps.paren + i; + const char *cast = props->no_cast ? "(no cast)" + : props->maybe_cast ? "(cast)" + : ""; + debug_printf(" %s%d", cast, props->indent); + } + if (ps.nparen == 0) + debug_printf(" none"); + debug_println(""); +} + +void +debug_parser_state(lexer_symbol lsym) +{ + static struct parser_state prev_ps; + + debug_println(""); + debug_printf("line %d: %s", line_no, lsym_name[lsym]); + debug_vis_range(" \"", token.s, token.e, "\"\n"); + + debug_print_buf("label", &lab); + debug_print_buf("code", &code); + debug_print_buf("comment", &com); + + debug_println(" ps.prev_token = %s", lsym_name[ps.prev_token]); + debug_ps_bool(curr_col_1); + debug_ps_bool(next_col_1); + debug_ps_bool(next_unary); + debug_ps_bool(is_function_definition); + debug_ps_bool(want_blank); + debug_ps_bool(force_nl); + debug_ps_int(line_start_nparen); + debug_ps_int(nparen); + debug_ps_paren(&prev_ps); + + debug_ps_int(comment_delta); + debug_ps_int(n_comment_delta); + debug_ps_int(com_ind); + + debug_ps_bool(block_init); + debug_ps_int(block_init_level); + debug_ps_bool(init_or_struct); + + debug_ps_int(ind_level); + debug_ps_int(ind_level_follow); + + debug_ps_int(decl_level); + debug_ps_bool(decl_on_line); + debug_ps_bool(in_decl); + debug_ps_int(just_saw_decl); + debug_ps_bool(in_func_def_params); + // No debug output for in_enum. + debug_ps_bool(decl_indent_done); + debug_ps_int(decl_ind); + // No debug output for di_stack. + debug_ps_bool(tabs_to_var); + + debug_ps_bool(in_stmt_or_decl); + debug_ps_bool(in_stmt_cont); + debug_ps_bool(is_case_label); + debug_ps_bool(seen_case); + + // The debug output for the parser symbols is done in 'parse' instead. + + debug_ps_enum(spaced_expr_psym, psym_name); + debug_ps_int(quest_level); + + prev_ps = ps; +} + +void +debug_parse_stack(const char *situation) +{ + printf("parse stack %s:", situation); + for (int i = 1; i <= ps.tos; ++i) + printf(" %s %d", psym_name[ps.s_sym[i]], ps.s_ind_level[i]); + if (ps.tos == 0) + printf(" empty"); + printf("\n"); +} +#endif