Module Name:    src
Committed By:   rillig
Date:           Sun Jun 18 06:56:33 UTC 2023

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

Log Message:
indent: untangle code for handling the statement indentation

The expression 'psyms.level-- - 2' did too much in a single line, so
extract the '--' to a separate statement, to highlight the symmetry
between the 'sym' and 'ind_level' code.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.78 -r1.79 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/parse.c
diff -u src/usr.bin/indent/parse.c:1.78 src/usr.bin/indent/parse.c:1.79
--- src/usr.bin/indent/parse.c:1.78	Sat Jun 17 22:28:49 2023
+++ src/usr.bin/indent/parse.c	Sun Jun 18 06:56:32 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: parse.c,v 1.78 2023/06/17 22:28:49 rillig Exp $	*/
+/*	$NetBSD: parse.c,v 1.79 2023/06/18 06:56:32 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: parse.c,v 1.78 2023/06/17 22:28:49 rillig Exp $");
+__RCSID("$NetBSD: parse.c,v 1.79 2023/06/18 06:56:32 rillig Exp $");
 
 #include <stdlib.h>
 
@@ -51,28 +51,30 @@ __RCSID("$NetBSD: parse.c,v 1.78 2023/06
 static bool
 psyms_reduce_stmt(void)
 {
-	struct psym_stack *psyms = &ps.psyms;
-	switch (psyms->sym[psyms->len - 2]) {
+	switch (ps.psyms.sym[ps.psyms.len - 2]) {
 
 	case psym_stmt:
-		psyms->sym[psyms->len-- - 2] = psym_stmt;
+		ps.psyms.len--;
+		ps.psyms.sym[ps.psyms.len - 1] = psym_stmt;
 		return true;
 
 	case psym_do:
-		psyms->sym[psyms->len-- - 2] = psym_do_stmt;
-		ps.ind_level_follow = psyms->ind_level[psyms->len - 1];
+		ps.psyms.len--;
+		ps.psyms.sym[ps.psyms.len - 1] = psym_do_stmt;
+		ps.ind_level_follow = ps.psyms.ind_level[ps.psyms.len - 1];
 		return true;
 
 	case psym_if_expr:
-		psyms->sym[psyms->len-- - 2] = psym_if_expr_stmt;
-		size_t i = psyms->len - 2;
-		while (psyms->sym[i] != psym_stmt &&
-		    psyms->sym[i] != psym_lbrace_block)
-			i--;
-		ps.ind_level_follow = psyms->ind_level[i];
+		ps.psyms.len--;
+		ps.psyms.sym[ps.psyms.len - 1] = psym_if_expr_stmt;
 		/* For the time being, assume that there is no 'else' on this
 		 * 'if', and set the indentation level accordingly. If an
 		 * 'else' is scanned, it will be fixed up later. */
+		size_t i = ps.psyms.len - 2;
+		while (ps.psyms.sym[i] != psym_stmt
+		    && ps.psyms.sym[i] != psym_lbrace_block)
+			i--;
+		ps.ind_level_follow = ps.psyms.ind_level[i];
 		return true;
 
 	case psym_switch_expr:
@@ -80,8 +82,9 @@ psyms_reduce_stmt(void)
 	case psym_if_expr_stmt_else:
 	case psym_for_exprs:
 	case psym_while_expr:
-		psyms->sym[psyms->len-- - 2] = psym_stmt;
-		ps.ind_level_follow = psyms->ind_level[psyms->len - 1];
+		ps.psyms.len--;
+		ps.psyms.sym[ps.psyms.len - 1] = psym_stmt;
+		ps.ind_level_follow = ps.psyms.ind_level[ps.psyms.len - 1];
 		return true;
 
 	default:
@@ -90,7 +93,7 @@ psyms_reduce_stmt(void)
 }
 
 static int
-decl_level(void)
+left_justify_decl_level(void)
 {
 	int level = 0;
 	for (size_t i = ps.psyms.len - 2; i > 0; i--)
@@ -122,14 +125,13 @@ ps_push(parser_symbol psym, bool follow)
 static void
 psyms_reduce(void)
 {
-	struct psym_stack *psyms = &ps.psyms;
 again:
-	if (psyms->len >= 2 && psyms->sym[psyms->len - 1] == psym_stmt
+	if (ps.psyms.len >= 2 && ps.psyms.sym[ps.psyms.len - 1] == psym_stmt
 	    && psyms_reduce_stmt())
 		goto again;
-	if (psyms->sym[psyms->len - 1] == psym_while_expr &&
-	    psyms->sym[psyms->len - 2] == psym_do_stmt) {
-		psyms->len -= 2;
+	if (ps.psyms.sym[ps.psyms.len - 1] == psym_while_expr &&
+	    ps.psyms.sym[ps.psyms.len - 2] == psym_do_stmt) {
+		ps.psyms.len -= 2;
 		goto again;
 	}
 }
@@ -153,10 +155,9 @@ parse(parser_symbol psym)
 	debug_blank_line();
 	debug_println("parse token: %s", psym_name[psym]);
 
-	struct psym_stack *psyms = &ps.psyms;
 	if (psym != psym_else) {
-		while (psyms->sym[psyms->len - 1] == psym_if_expr_stmt) {
-			psyms->sym[psyms->len - 1] = psym_stmt;
+		while (ps.psyms.sym[ps.psyms.len - 1] == psym_if_expr_stmt) {
+			ps.psyms.sym[ps.psyms.len - 1] = psym_stmt;
 			psyms_reduce();
 		}
 	}
@@ -168,8 +169,8 @@ parse(parser_symbol psym)
 	case psym_lbrace_union:
 	case psym_lbrace_enum:
 		ps.break_after_comma = false;
-		if (psyms->sym[psyms->len - 1] == psym_decl
-		    || psyms->sym[psyms->len - 1] == psym_stmt)
+		if (ps.psyms.sym[ps.psyms.len - 1] == psym_decl
+		    || ps.psyms.sym[ps.psyms.len - 1] == psym_stmt)
 			ps.ind_level_follow++;
 		else if (code.len == 0) {
 			/* It is part of a while, for, etc. */
@@ -177,7 +178,7 @@ parse(parser_symbol psym)
 
 			/* for a switch, brace should be two levels out from
 			 * the code */
-			if (psyms->sym[psyms->len - 1] == psym_switch_expr
+			if (ps.psyms.sym[ps.psyms.len - 1] == psym_switch_expr
 			    && opt.case_indent >= 1.0F)
 				ps.ind_level--;
 		}
@@ -188,25 +189,28 @@ parse(parser_symbol psym)
 
 	case psym_rbrace:
 		/* stack should have <lbrace> <stmt> or <lbrace> <decl> */
-		if (!(psyms->len >= 2
-			&& is_lbrace(psyms->sym[psyms->len - 2]))) {
+		if (!(ps.psyms.len >= 2
+			&& is_lbrace(ps.psyms.sym[ps.psyms.len - 2]))) {
 			diag(1, "Statement nesting error");
 			break;
 		}
-		ps.ind_level = ps.ind_level_follow =
-		    psyms->ind_level[psyms->len-- - 2];
-		psyms->sym[psyms->len - 1] = psym_stmt;
+		ps.psyms.len--;
+		ps.ind_level = ps.psyms.ind_level[ps.psyms.len - 1];
+		ps.ind_level_follow = ps.ind_level;
+		ps.psyms.sym[ps.psyms.len - 1] = psym_stmt;
 		break;
 
 	case psym_decl:
-		if (psyms->sym[psyms->len - 1] == psym_decl)
+		if (ps.psyms.sym[ps.psyms.len - 1] == psym_decl)
 			break;	/* only put one declaration onto stack */
 
 		ps.break_after_comma = true;
 		ps_push(psym_decl, true);
 
-		if (opt.left_justify_decl)
-			ps.ind_level_follow = ps.ind_level = decl_level();
+		if (opt.left_justify_decl) {
+			ps.ind_level = left_justify_decl_level();
+			ps.ind_level_follow = ps.ind_level;
+		}
 		break;
 
 	case psym_stmt:
@@ -215,25 +219,28 @@ parse(parser_symbol psym)
 		break;
 
 	case psym_if_expr:
-		if (psyms->sym[psyms->len - 1] == psym_if_expr_stmt_else
-		    && opt.else_if_in_same_line)
+		if (ps.psyms.sym[ps.psyms.len - 1] == psym_if_expr_stmt_else
+		    && opt.else_if_in_same_line) {
 			ps.ind_level_follow =
-			    psyms->ind_level[psyms->len-- - 1];
+			    ps.psyms.ind_level[ps.psyms.len - 1];
+			ps.psyms.len--;
+		}
 		/* FALLTHROUGH */
 	case psym_do:
 	case psym_for_exprs:
-		ps.ind_level = ps.ind_level_follow++;
+		ps.ind_level = ps.ind_level_follow;
+		ps.ind_level_follow = ps.ind_level + 1;
 		ps_push(psym, false);
 		break;
 
 	case psym_else:
-		if (psyms->sym[psyms->len - 1] != psym_if_expr_stmt) {
+		if (ps.psyms.sym[ps.psyms.len - 1] != psym_if_expr_stmt) {
 			diag(1, "Unmatched 'else'");
 			break;
 		}
-		ps.ind_level = psyms->ind_level[psyms->len - 1];
+		ps.ind_level = ps.psyms.ind_level[ps.psyms.len - 1];
 		ps.ind_level_follow = ps.ind_level + 1;
-		psyms->sym[psyms->len - 1] = psym_if_expr_stmt_else;
+		ps.psyms.sym[ps.psyms.len - 1] = psym_if_expr_stmt_else;
 		break;
 
 	case psym_switch_expr:
@@ -242,9 +249,9 @@ parse(parser_symbol psym)
 		break;
 
 	case psym_while_expr:
-		if (psyms->sym[psyms->len - 1] == psym_do_stmt) {
-			ps.ind_level = ps.ind_level_follow =
-			    psyms->ind_level[psyms->len - 1];
+		if (ps.psyms.sym[ps.psyms.len - 1] == psym_do_stmt) {
+			ps.ind_level = ps.psyms.ind_level[ps.psyms.len - 1];
+			ps.ind_level_follow = ps.ind_level;
 			ps_push(psym_while_expr, false);
 		} else {
 			ps_push(psym_while_expr, true);

Reply via email to