Module Name:    src
Committed By:   rillig
Date:           Fri May 12 08:40:54 UTC 2023

Modified Files:
        src/usr.bin/indent: indent.c indent.h lexi.c parse.c

Log Message:
indent: condense code for handling spaced expressions

No functional change outside debug mode.


To generate a diff of this commit:
cvs rdiff -u -r1.252 -r1.253 src/usr.bin/indent/indent.c
cvs rdiff -u -r1.119 -r1.120 src/usr.bin/indent/indent.h
cvs rdiff -u -r1.175 -r1.176 src/usr.bin/indent/lexi.c
cvs rdiff -u -r1.50 -r1.51 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/indent.c
diff -u src/usr.bin/indent/indent.c:1.252 src/usr.bin/indent/indent.c:1.253
--- src/usr.bin/indent/indent.c:1.252	Thu May 11 19:01:35 2023
+++ src/usr.bin/indent/indent.c	Fri May 12 08:40:54 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.c,v 1.252 2023/05/11 19:01:35 rillig Exp $	*/
+/*	$NetBSD: indent.c,v 1.253 2023/05/12 08:40:54 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -43,7 +43,7 @@ static char sccsid[] = "@(#)indent.c	5.1
 
 #include <sys/cdefs.h>
 #if defined(__NetBSD__)
-__RCSID("$NetBSD: indent.c,v 1.252 2023/05/11 19:01:35 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.253 2023/05/12 08:40:54 rillig Exp $");
 #elif defined(__FreeBSD__)
 __FBSDID("$FreeBSD: head/usr.bin/indent/indent.c 340138 2018-11-04 19:24:49Z oshogbo $");
 #endif
@@ -492,7 +492,8 @@ process_lparen_or_lbracket(void)
     debug_println("paren_indents[%d] is now %d",
 	ps.nparen - 1, ps.paren[ps.nparen - 1].indent);
 
-    if (ps.spaced_expr && ps.nparen == 1 && opt.extra_expr_indent
+    if (ps.spaced_expr_psym != psym_semicolon
+	    && ps.nparen == 1 && opt.extra_expr_indent
 	    && ps.paren[0].indent < 2 * opt.indent_size) {
 	ps.paren[0].indent = (short)(2 * opt.indent_size);
 	debug_println("paren_indents[0] is now %d", ps.paren[0].indent);
@@ -534,14 +535,12 @@ process_rparen_or_rbracket(void)
 
     *code.e++ = token.s[0];
 
-    if (ps.spaced_expr && ps.nparen == 0) {
-	ps.spaced_expr = false;
+    if (ps.spaced_expr_psym != psym_semicolon && ps.nparen == 0) {
 	ps.force_nl = true;
 	ps.next_unary = true;
-	ps.in_stmt_or_decl = false;	/* don't use stmt continuation
-					 * indentation */
-
-	parse_stmt_head(ps.hd);
+	ps.in_stmt_or_decl = false;
+	parse(ps.spaced_expr_psym);
+	ps.spaced_expr_psym = psym_semicolon;
     }
 }
 
@@ -652,24 +651,23 @@ process_semicolon(void)
 					 * structure declaration before, we
 					 * aren't anymore */
 
-    if ((!ps.spaced_expr || ps.hd != hd_for) && ps.nparen > 0) {
-
+    if (ps.nparen > 0 && ps.spaced_expr_psym != psym_for_exprs) {
 	/*
 	 * There were unbalanced parentheses in the statement. It is a bit
 	 * complicated, because the semicolon might be in a for statement.
 	 */
 	diag(1, "Unbalanced parentheses");
 	ps.nparen = 0;
-	if (ps.spaced_expr) {
-	    ps.spaced_expr = false;
-	    parse_stmt_head(ps.hd);
+	if (ps.spaced_expr_psym != psym_semicolon) {
+	    parse(ps.spaced_expr_psym);
+	    ps.spaced_expr_psym = psym_semicolon;
 	}
     }
     *code.e++ = ';';
     ps.want_blank = true;
     ps.in_stmt_or_decl = ps.nparen > 0;
 
-    if (!ps.spaced_expr) {
+    if (ps.spaced_expr_psym == psym_semicolon) {
 	parse(psym_semicolon);	/* let parser know about end of stmt */
 	ps.force_nl = true;
     }
@@ -705,9 +703,9 @@ process_lbrace(void)
     if (ps.nparen > 0) {
 	diag(1, "Unbalanced parentheses");
 	ps.nparen = 0;
-	if (ps.spaced_expr) {
-	    ps.spaced_expr = false;
-	    parse_stmt_head(ps.hd);
+	if (ps.spaced_expr_psym != psym_semicolon) {
+	    parse(ps.spaced_expr_psym);
+	    ps.spaced_expr_psym = psym_semicolon;
 	    ps.ind_level = ps.ind_level_follow;
 	}
     }
@@ -749,7 +747,7 @@ process_rbrace(void)
     if (ps.nparen > 0) {	/* check for unclosed if, for, else. */
 	diag(1, "Unbalanced parentheses");
 	ps.nparen = 0;
-	ps.spaced_expr = false;
+	ps.spaced_expr_psym = psym_semicolon;
     }
 
     ps.just_saw_decl = 0;
@@ -863,12 +861,12 @@ process_ident(lexer_symbol lsym)
 	    ps.want_blank = false;
 	}
 
-    } else if (ps.spaced_expr && ps.nparen == 0) {
-	ps.spaced_expr = false;
+    } else if (ps.spaced_expr_psym != psym_semicolon && ps.nparen == 0) {
 	ps.force_nl = true;
 	ps.next_unary = true;
 	ps.in_stmt_or_decl = false;
-	parse_stmt_head(ps.hd);
+	parse(ps.spaced_expr_psym);
+	ps.spaced_expr_psym = psym_semicolon;
     }
 }
 
@@ -1102,23 +1100,19 @@ main_loop(void)
 	    break;
 
 	case lsym_switch:
-	    ps.spaced_expr = true;
-	    ps.hd = hd_switch;
+	    ps.spaced_expr_psym = psym_switch_expr;
 	    goto copy_token;
 
 	case lsym_for:
-	    ps.spaced_expr = true;
-	    ps.hd = hd_for;
+	    ps.spaced_expr_psym = psym_for_exprs;
 	    goto copy_token;
 
 	case lsym_if:
-	    ps.spaced_expr = true;
-	    ps.hd = hd_if;
+	    ps.spaced_expr_psym = psym_if_expr;
 	    goto copy_token;
 
 	case lsym_while:
-	    ps.spaced_expr = true;
-	    ps.hd = hd_while;
+	    ps.spaced_expr_psym = psym_while_expr;
 	    goto copy_token;
 
 	case lsym_do:

Index: src/usr.bin/indent/indent.h
diff -u src/usr.bin/indent/indent.h:1.119 src/usr.bin/indent/indent.h:1.120
--- src/usr.bin/indent/indent.h:1.119	Thu May 11 19:01:35 2023
+++ src/usr.bin/indent/indent.h	Fri May 12 08:40:54 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.h,v 1.119 2023/05/11 19:01:35 rillig Exp $	*/
+/*	$NetBSD: indent.h,v 1.120 2023/05/12 08:40:54 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -127,14 +127,6 @@ typedef enum parser_symbol {
     psym_while_expr,		/* 'while' '(' expr ')' */
 } parser_symbol;
 
-typedef enum stmt_head {
-    hd_0,			/* placeholder for uninitialized */
-    hd_for,
-    hd_if,
-    hd_switch,
-    hd_while,
-} stmt_head;
-
 /* A range of characters, in some cases null-terminated. */
 struct buffer {
     char *s;			/* start of the usable text */
@@ -342,11 +334,11 @@ extern struct parser_state {
     int s_ind_level[STACKSIZE];
     float s_case_ind_level[STACKSIZE];
 
-    stmt_head hd;		/* the type of statement for 'if (...)', 'for
-				 * (...)', etc */
-    bool spaced_expr;		/* whether we are in a parenthesized expression
-				 * that should be surrounded by spaces, such as
-				 * in 'if', 'while', 'switch'. */
+    parser_symbol spaced_expr_psym;	/* the parser symbol to be shifted
+					 * after the parenthesized expression
+					 * from a 'for', 'if', 'switch' or
+					 * 'while'; or psym_semicolon */
+
     int quest_level;		/* when this is positive, we have seen a '?'
 				 * without the matching ':' in a '?:'
 				 * expression */
@@ -363,11 +355,10 @@ extern struct parser_state {
 #define array_length(array) (sizeof(array) / sizeof((array)[0]))
 
 #ifdef debug
-void
-debug_vis_range(const char *, const char *, const char *,
-    const char *);
+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);
 #else
 #define		debug_printf(fmt, ...) do { } while (false)
 #define		debug_println(fmt, ...) do { } while (false)
@@ -395,7 +386,6 @@ void output_line(void);
 void output_line_ff(void);
 void inp_read_line(void);
 void parse(parser_symbol);
-void parse_stmt_head(stmt_head);
 void process_comment(void);
 void set_option(const char *, const char *);
 void load_profiles(const char *);

Index: src/usr.bin/indent/lexi.c
diff -u src/usr.bin/indent/lexi.c:1.175 src/usr.bin/indent/lexi.c:1.176
--- src/usr.bin/indent/lexi.c:1.175	Thu May 11 11:25:47 2023
+++ src/usr.bin/indent/lexi.c	Fri May 12 08:40:54 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: lexi.c,v 1.175 2023/05/11 11:25:47 rillig Exp $	*/
+/*	$NetBSD: lexi.c,v 1.176 2023/05/12 08:40:54 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.175 2023/05/11 11:25:47 rillig Exp $");
+__RCSID("$NetBSD: lexi.c,v 1.176 2023/05/12 08:40:54 rillig Exp $");
 #elif defined(__FreeBSD__)
 __FBSDID("$FreeBSD: head/usr.bin/indent/lexi.c 337862 2018-08-15 18:19:45Z pstef $");
 #endif
@@ -261,6 +261,12 @@ debug_full_parser_state(void)
 	    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)
@@ -351,8 +357,7 @@ debug_lexi(lexer_symbol lsym)
 
     // The debug output for the parser symbols is done in 'parse' instead.
 
-    // No debug output for hd.
-    debug_ps_bool(spaced_expr);
+    debug_ps_enum(spaced_expr_psym, psym_name);
     debug_ps_int(quest_level);
 
     prev_ps = ps;

Index: src/usr.bin/indent/parse.c
diff -u src/usr.bin/indent/parse.c:1.50 src/usr.bin/indent/parse.c:1.51
--- src/usr.bin/indent/parse.c:1.50	Thu May 11 09:28:53 2023
+++ src/usr.bin/indent/parse.c	Fri May 12 08:40:54 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.50 2023/05/11 09:28:53 rillig Exp $	*/
+/*	$NetBSD: parse.c,v 1.51 2023/05/12 08:40:54 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -43,12 +43,11 @@ static char sccsid[] = "@(#)parse.c	8.1 
 
 #include <sys/cdefs.h>
 #if defined(__NetBSD__)
-__RCSID("$NetBSD: parse.c,v 1.50 2023/05/11 09:28:53 rillig Exp $");
+__RCSID("$NetBSD: parse.c,v 1.51 2023/05/12 08:40:54 rillig Exp $");
 #else
 __FBSDID("$FreeBSD: head/usr.bin/indent/parse.c 337651 2018-08-11 19:20:06Z pstef $");
 #endif
 
-#include <assert.h>
 #include <err.h>
 #include <stdio.h>
 
@@ -57,7 +56,7 @@ __FBSDID("$FreeBSD: head/usr.bin/indent/
 static void reduce(void);
 
 #ifdef debug
-static const char *
+const char *
 psym_name(parser_symbol psym)
 {
     static const char *const name[] = {
@@ -78,8 +77,6 @@ psym_name(parser_symbol psym)
 	"while_expr",
     };
 
-    assert(array_length(name) == (int)psym_while_expr + 1);
-
     return name[psym];
 }
 #endif
@@ -235,18 +232,6 @@ parse(parser_symbol psym)
 #endif
 }
 
-void
-parse_stmt_head(stmt_head hd)
-{
-    static const parser_symbol psym[] = {
-	[hd_for] = psym_for_exprs,
-	[hd_if] = psym_if_expr,
-	[hd_switch] = psym_switch_expr,
-	[hd_while] = psym_while_expr
-    };
-    parse(psym[hd]);
-}
-
 /*
  * Try to combine the statement on the top of the parse stack with the symbol
  * directly below it, replacing these two symbols with a single symbol.

Reply via email to