Module Name: src Committed By: rillig Date: Tue Jan 7 03:55:00 UTC 2025
Modified Files: src/tests/usr.bin/indent: psym_do_stmt.c src/usr.bin/indent: indent.c indent.h parse.c Log Message: indent: condense and simplify parsing code To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/tests/usr.bin/indent/psym_do_stmt.c cvs rdiff -u -r1.395 -r1.396 src/usr.bin/indent/indent.c cvs rdiff -u -r1.210 -r1.211 src/usr.bin/indent/indent.h cvs rdiff -u -r1.84 -r1.85 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/tests/usr.bin/indent/psym_do_stmt.c diff -u src/tests/usr.bin/indent/psym_do_stmt.c:1.4 src/tests/usr.bin/indent/psym_do_stmt.c:1.5 --- src/tests/usr.bin/indent/psym_do_stmt.c:1.4 Sun Apr 24 10:36:37 2022 +++ src/tests/usr.bin/indent/psym_do_stmt.c Tue Jan 7 03:55:00 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: psym_do_stmt.c,v 1.4 2022/04/24 10:36:37 rillig Exp $ */ +/* $NetBSD: psym_do_stmt.c,v 1.5 2025/01/07 03:55:00 rillig Exp $ */ /* * Tests for the parser symbol psym_do_stmt, which represents the state after @@ -29,3 +29,21 @@ function(void) while (0); } //indent end + + +//indent input +{ + if (cond) do stmt; while (cond); stmt; +} +//indent end + +//indent run +{ + if (cond) + do + stmt; + while (cond); + //$ Ensure that this statement is indented the same as the 'if' above. + stmt; +} +//indent end Index: src/usr.bin/indent/indent.c diff -u src/usr.bin/indent/indent.c:1.395 src/usr.bin/indent/indent.c:1.396 --- src/usr.bin/indent/indent.c:1.395 Sat Jan 4 21:54:26 2025 +++ src/usr.bin/indent/indent.c Tue Jan 7 03:55:00 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.c,v 1.395 2025/01/04 21:54:26 rillig Exp $ */ +/* $NetBSD: indent.c,v 1.396 2025/01/07 03:55:00 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: indent.c,v 1.395 2025/01/04 21:54:26 rillig Exp $"); +__RCSID("$NetBSD: indent.c,v 1.396 2025/01/07 03:55:00 rillig Exp $"); #include <sys/param.h> #include <err.h> @@ -298,7 +298,7 @@ initialize_parser(void) } ps.ind_level = ps.ind_level_follow = ind / opt.indent_size; - ps_push(psym_stmt, false); /* as a stop symbol */ + ps_psyms_push(psym_stmt, ps.ind_level); /* as a stop symbol */ ps.prev_lsym = lsym_semicolon; ps.lbrace_kind = psym_lbrace_block; } Index: src/usr.bin/indent/indent.h diff -u src/usr.bin/indent/indent.h:1.210 src/usr.bin/indent/indent.h:1.211 --- src/usr.bin/indent/indent.h:1.210 Sat Jan 4 21:20:59 2025 +++ src/usr.bin/indent/indent.h Tue Jan 7 03:55:00 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.h,v 1.210 2025/01/04 21:20:59 rillig Exp $ */ +/* $NetBSD: indent.h,v 1.211 2025/01/07 03:55:00 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD @@ -500,7 +500,7 @@ void parse(parser_symbol); void process_comment(void); void set_option(const char *, const char *); void load_profile_files(const char *); -void ps_push(parser_symbol, bool); +void ps_psyms_push(parser_symbol, int); void *nonnull(void *); Index: src/usr.bin/indent/parse.c diff -u src/usr.bin/indent/parse.c:1.84 src/usr.bin/indent/parse.c:1.85 --- src/usr.bin/indent/parse.c:1.84 Tue Jan 7 03:14:23 2025 +++ src/usr.bin/indent/parse.c Tue Jan 7 03:55:00 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: parse.c,v 1.84 2025/01/07 03:14:23 rillig Exp $ */ +/* $NetBSD: parse.c,v 1.85 2025/01/07 03:55:00 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: parse.c,v 1.84 2025/01/07 03:14:23 rillig Exp $"); +__RCSID("$NetBSD: parse.c,v 1.85 2025/01/07 03:55:00 rillig Exp $"); #include <stdlib.h> @@ -46,48 +46,11 @@ __RCSID("$NetBSD: parse.c,v 1.84 2025/01 /* Replace the top 2 symbols with the given symbol. */ static void -psyms_replace2(parser_symbol psym) +ps_psyms_replace2(parser_symbol psym) { ps.psyms.len--; ps.psyms.sym[ps.psyms.len - 1] = psym; -} - -/* - * 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. - */ -static bool -psyms_reduce_stmt(void) -{ - switch (ps.psyms.sym[ps.psyms.len - 2]) { - - case psym_stmt: - psyms_replace2(psym_stmt); - ps.ind_level_follow = ps.psyms.ind_level[ps.psyms.len - 1]; - return true; - - case psym_do: - psyms_replace2(psym_do_stmt); - ps.ind_level_follow = ps.psyms.ind_level[ps.psyms.len - 1]; - return true; - - case psym_if_expr: - psyms_replace2(psym_if_expr_stmt); - ps.ind_level_follow = ps.psyms.ind_level[ps.psyms.len - 1]; - return true; - - case psym_switch_expr: - case psym_decl: - case psym_if_expr_stmt_else: - case psym_for_exprs: - case psym_while_expr: - psyms_replace2(psym_stmt); - ps.ind_level_follow = ps.psyms.ind_level[ps.psyms.len - 1]; - return true; - - default: - return false; - } + ps.ind_level_follow = ps.psyms.ind_level[ps.psyms.len - 1]; } static int @@ -101,7 +64,7 @@ left_justify_decl_level(void) } void -ps_push(parser_symbol psym, bool follow) +ps_psyms_push(parser_symbol psym, int ind_level) { if (ps.psyms.len == ps.psyms.cap) { ps.psyms.cap += 16; @@ -112,8 +75,7 @@ ps_push(parser_symbol psym, bool follow) } ps.psyms.len++; ps.psyms.sym[ps.psyms.len - 1] = psym; - ps.psyms.ind_level[ps.psyms.len - 1] = - follow ? ps.ind_level_follow : ps.ind_level; + ps.psyms.ind_level[ps.psyms.len - 1] = ind_level; } /* @@ -124,9 +86,26 @@ static void psyms_reduce(void) { again: - if (ps.psyms.len >= 2 && ps.psyms.sym[ps.psyms.len - 1] == psym_stmt - && psyms_reduce_stmt()) - goto again; + if (ps.psyms.len >= 2 && ps.psyms.sym[ps.psyms.len - 1] == psym_stmt) { + switch (ps.psyms.sym[ps.psyms.len - 2]) { + case psym_decl: + case psym_stmt: + case psym_for_exprs: + case psym_if_expr_stmt_else: + case psym_switch_expr: + case psym_while_expr: + ps_psyms_replace2(psym_stmt); + goto again; + case psym_if_expr: + ps_psyms_replace2(psym_if_expr_stmt); + goto again; + case psym_do: + ps_psyms_replace2(psym_do_stmt); + goto again; + default: + return; + } + } 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; @@ -183,8 +162,8 @@ parse(parser_symbol psym) ps.ind_level--; } - ps_push(psym, false); - ps_push(psym_stmt, true); + ps_psyms_push(psym, ps.ind_level); + ps_psyms_push(psym_stmt, ps.ind_level_follow); break; case psym_rbrace: @@ -194,10 +173,8 @@ parse(parser_symbol psym) diag(1, "Statement nesting error"); break; } - 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; + ps_psyms_replace2(psym_stmt); + ps.ind_level = ps.ind_level_follow; break; case psym_decl: @@ -205,7 +182,7 @@ parse(parser_symbol psym) break; /* only put one declaration onto stack */ ps.break_after_comma = true; - ps_push(psym_decl, true); + ps_psyms_push(psym_decl, ps.ind_level_follow); if (opt.left_justify_decl) { ps.ind_level = left_justify_decl_level(); @@ -215,7 +192,7 @@ parse(parser_symbol psym) case psym_stmt: ps.break_after_comma = false; - ps_push(psym_stmt, false); + ps_psyms_push(psym_stmt, ps.ind_level); break; case psym_if_expr: @@ -230,7 +207,7 @@ parse(parser_symbol psym) case psym_for_exprs: ps.ind_level = ps.ind_level_follow; ps.ind_level_follow = ps.ind_level + 1; - ps_push(psym, false); + ps_psyms_push(psym, ps.ind_level); break; case psym_else: @@ -244,7 +221,7 @@ parse(parser_symbol psym) break; case psym_switch_expr: - ps_push(psym_switch_expr, true); + ps_psyms_push(psym_switch_expr, ps.ind_level_follow); ps.ind_level_follow += (int)opt.case_indent + 1; break; @@ -252,9 +229,9 @@ parse(parser_symbol psym) 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); + ps_psyms_push(psym_while_expr, ps.ind_level); } else { - ps_push(psym_while_expr, true); + ps_psyms_push(psym_while_expr, ps.ind_level_follow); ps.ind_level_follow++; } break;