Module Name:    src
Committed By:   rillig
Date:           Sat Jun 10 09:31:42 UTC 2023

Modified Files:
        src/usr.bin/indent: debug.c

Log Message:
indent: clean up debug output

In diff mode, don't print a diff of the very first parser state, instead
print its full state.

Don't print headings for empty sections of the parser state.


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/usr.bin/indent/debug.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/debug.c
diff -u src/usr.bin/indent/debug.c:1.46 src/usr.bin/indent/debug.c:1.47
--- src/usr.bin/indent/debug.c:1.46	Sat Jun 10 07:42:41 2023
+++ src/usr.bin/indent/debug.c	Sat Jun 10 09:31:41 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: debug.c,v 1.46 2023/06/10 07:42:41 rillig Exp $	*/
+/*	$NetBSD: debug.c,v 1.47 2023/06/10 09:31:41 rillig Exp $	*/
 
 /*-
  * Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -30,19 +30,24 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: debug.c,v 1.46 2023/06/10 07:42:41 rillig Exp $");
+__RCSID("$NetBSD: debug.c,v 1.47 2023/06/10 09:31:41 rillig Exp $");
 
 #include <stdarg.h>
+#include <string.h>
 
 #include "indent.h"
 
 #ifdef debug
 
-/*-
- * false	show only the changes to the parser state
- * true		show unchanged parts of the parser state as well
- */
-static bool debug_full_parser_state = true;
+static struct {
+	/*-
+	 * false	show only the changes to the parser state
+	 * true		show unchanged parts of the parser state as well
+	 */
+	bool full_parser_state;
+} config = {
+	.full_parser_state = false,
+};
 
 const char *const lsym_name[] = {
 	"eof",
@@ -135,8 +140,15 @@ static const char *const extra_expr_inde
 	"last",
 };
 
-static unsigned wrote_newlines = 1;
-
+static struct {
+	struct parser_state prev_ps;
+	bool ps_first;
+	const char *heading;
+    	unsigned wrote_newlines;
+} state = {
+	.ps_first = true,
+	.wrote_newlines = 1,
+};
 
 void
 debug_printf(const char *fmt, ...)
@@ -144,10 +156,14 @@ debug_printf(const char *fmt, ...)
 	FILE *f = output == stdout ? stderr : stdout;
 	va_list ap;
 
+	if (state.heading != NULL) {
+		fprintf(f, "%s\n", state.heading);
+		state.heading = NULL;
+	}
 	va_start(ap, fmt);
 	vfprintf(f, fmt, ap);
 	va_end(ap);
-	wrote_newlines = 0;
+	state.wrote_newlines = 0;
 }
 
 void
@@ -156,17 +172,22 @@ debug_println(const char *fmt, ...)
 	FILE *f = output == stdout ? stderr : stdout;
 	va_list ap;
 
+	if (state.heading != NULL) {
+		fprintf(f, "%s\n", state.heading);
+		state.heading = NULL;
+		state.wrote_newlines = 1;
+	}
 	va_start(ap, fmt);
 	vfprintf(f, fmt, ap);
 	va_end(ap);
 	fprintf(f, "\n");
-	wrote_newlines = fmt[0] == '\0' ? wrote_newlines + 1 : 1;
+	state.wrote_newlines = fmt[0] == '\0' ? state.wrote_newlines + 1 : 1;
 }
 
 void
 debug_blank_line(void)
 {
-	while (wrote_newlines < 2)
+	while (state.wrote_newlines < 2)
 		debug_println("");
 }
 
@@ -209,31 +230,41 @@ debug_buffers(void)
 	debug_println("");
 }
 
-#define debug_ps_bool(name) \
-	if (ps.name != prev_ps.name) \
-	    debug_println("        [%c]  ps." #name, \
-		" -+x"[(prev_ps.name ? 1 : 0) + (ps.name ? 2 : 0)]); \
-	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 void
+write_ps_bool(const char *name, bool prev, bool curr)
+{
+	if (curr != prev) {
+		char diff = " -+x"[(prev ? 1 : 0) + (curr ? 2 : 0)];
+		debug_println("        [%c]  ps.%s", diff, name);
+	} else if (config.full_parser_state || state.ps_first)
+		debug_println("        [%c]  ps.%s", curr ? 'x' : ' ', name);
+}
+
+static void
+write_ps_int(const char *name, int prev, int curr)
+{
+	if (curr != prev)
+		debug_println(" %3d -> %3d  ps.%s", prev, curr, name);
+	else if (config.full_parser_state || state.ps_first)
+		debug_println("        %3d  ps.%s", curr, name);
+}
+
+static void
+write_ps_enum(const char *name, const char *prev, const char *curr)
+{
+	if (strcmp(prev, curr) != 0)
+		debug_println(" %3s -> %3s  ps.%s", prev, curr, name);
+	else if (config.full_parser_state || state.ps_first)
+		debug_println(" %10s  ps.%s", curr, name);
+}
 
 static bool
-ps_paren_has_changed(const struct parser_state *prev_ps)
+ps_paren_has_changed(void)
 {
-	if (prev_ps->nparen != ps.nparen)
+	if (state.prev_ps.nparen != ps.nparen)
 		return true;
 
-	const paren_level_props *prev = prev_ps->paren, *curr = ps.paren;
+	const paren_level_props *prev = state.prev_ps.paren, *curr = ps.paren;
 	for (int i = 0; i < ps.nparen; i++)
 		if (curr[i].indent != prev[i].indent
 		    || curr[i].cast != prev[i].cast)
@@ -242,9 +273,10 @@ ps_paren_has_changed(const struct parser
 }
 
 static void
-debug_ps_paren(const struct parser_state *prev_ps)
+debug_ps_paren(void)
 {
-	if (!debug_full_parser_state && !ps_paren_has_changed(prev_ps))
+	if (!config.full_parser_state && !ps_paren_has_changed()
+	    && !state.ps_first)
 		return;
 
 	debug_printf("             ps.paren:");
@@ -259,21 +291,21 @@ debug_ps_paren(const struct parser_state
 }
 
 static bool
-ps_di_stack_has_changed(const struct parser_state *prev_ps)
+ps_di_stack_has_changed(void)
 {
-	if (prev_ps->decl_level != ps.decl_level)
+	if (state.prev_ps.decl_level != ps.decl_level)
 		return true;
 	for (int i = 0; i < ps.decl_level; i++)
-		if (prev_ps->di_stack[i] != ps.di_stack[i])
+		if (state.prev_ps.di_stack[i] != ps.di_stack[i])
 			return true;
 	return false;
 }
 
 static void
-debug_ps_di_stack(const struct parser_state *prev_ps)
+debug_ps_di_stack(void)
 {
-	bool changed = ps_di_stack_has_changed(prev_ps);
-	if (!debug_full_parser_state && !changed)
+	bool changed = ps_di_stack_has_changed();
+	if (!config.full_parser_state && !changed && !state.ps_first)
 		return;
 
 	debug_printf("     %s      ps.di_stack:", changed ? "->" : "  ");
@@ -284,16 +316,21 @@ debug_ps_di_stack(const struct parser_st
 	debug_println("");
 }
 
+#define debug_ps_bool(name) \
+	write_ps_bool(#name, state.prev_ps.name, ps.name)
+#define debug_ps_int(name) \
+	write_ps_int(#name, state.prev_ps.name, ps.name)
+#define debug_ps_enum(name, names) \
+        write_ps_enum(#name, (names)[state.prev_ps.name], (names)[ps.name])
+
 void
 debug_parser_state(void)
 {
-	static struct parser_state prev_ps;
-
 	debug_blank_line();
 	debug_println("             ps.prev_lsym = %s",
 	    lsym_name[ps.prev_lsym]);
 
-	debug_println("token classification");
+	state.heading = "token classification";
 	debug_ps_bool(in_stmt_or_decl);
 	debug_ps_bool(in_decl);
 	debug_ps_bool(in_var_decl);
@@ -308,12 +345,12 @@ debug_parser_state(void)
 	debug_ps_bool(prev_paren_was_cast);
 	debug_ps_int(quest_level);
 
-	debug_println("indentation of statements and declarations");
+	state.heading = "indentation of statements and declarations";
 	debug_ps_int(ind_level);
 	debug_ps_int(ind_level_follow);
 	debug_ps_bool(in_stmt_cont);
 	debug_ps_int(decl_level);
-	debug_ps_di_stack(&prev_ps);
+	debug_ps_di_stack();
 	debug_ps_bool(decl_indent_done);
 	debug_ps_int(decl_ind);
 	debug_ps_bool(tabs_to_var);
@@ -321,31 +358,33 @@ debug_parser_state(void)
 
 	// The parser symbol stack is printed in debug_parse_stack instead.
 
-	debug_println("spacing inside a statement or declaration");
+	state.heading = "spacing inside a statement or declaration";
 	debug_ps_bool(next_unary);
 	debug_ps_bool(want_blank);
 	debug_ps_int(line_start_nparen);
 	debug_ps_int(nparen);
-	debug_ps_paren(&prev_ps);
+	debug_ps_paren();
 
-	debug_println("horizontal spacing for comments");
+	state.heading = "horizontal spacing for comments";
 	debug_ps_int(comment_delta);
 	debug_ps_int(n_comment_delta);
 	debug_ps_int(com_ind);
 
-	debug_println("vertical spacing");
+	state.heading = "vertical spacing";
 	debug_ps_bool(break_after_comma);
 	debug_ps_bool(force_nl);
 	debug_ps_enum(declaration, declaration_name);
 	debug_ps_bool(blank_line_after_decl);
 
-	debug_println("comments");
+	state.heading = "comments";
 	debug_ps_bool(curr_col_1);
 	debug_ps_bool(next_col_1);
 
+	state.heading = NULL;
 	debug_blank_line();
 
-	prev_ps = ps;
+	state.prev_ps = ps;
+	state.ps_first = false;
 }
 
 void

Reply via email to