Module Name: src
Committed By: rillig
Date: Thu May 11 11:25:47 UTC 2023
Modified Files:
src/usr.bin/indent: indent.c indent.h lexi.c
Log Message:
indent: move parser state variables to the parser_state struct
Include the variables in the debug output.
To generate a diff of this commit:
cvs rdiff -u -r1.249 -r1.250 src/usr.bin/indent/indent.c
cvs rdiff -u -r1.114 -r1.115 src/usr.bin/indent/indent.h
cvs rdiff -u -r1.174 -r1.175 src/usr.bin/indent/lexi.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.249 src/usr.bin/indent/indent.c:1.250
--- src/usr.bin/indent/indent.c:1.249 Thu May 11 10:54:14 2023
+++ src/usr.bin/indent/indent.c Thu May 11 11:25:47 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: indent.c,v 1.249 2023/05/11 10:54:14 rillig Exp $ */
+/* $NetBSD: indent.c,v 1.250 2023/05/11 11:25:47 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.249 2023/05/11 10:54:14 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.250 2023/05/11 11:25:47 rillig Exp $");
#elif defined(__FreeBSD__)
__FBSDID("$FreeBSD: head/usr.bin/indent/indent.c 340138 2018-11-04 19:24:49Z oshogbo $");
#endif
@@ -470,7 +470,7 @@ want_blank_before_lparen(void)
}
static void
-process_lparen_or_lbracket(int decl_ind, bool tabs_to_var, bool spaced_expr)
+process_lparen_or_lbracket(void)
{
if (++ps.nparen == array_length(ps.paren)) {
diag(0, "Reached internal limit of %zu unclosed parentheses",
@@ -482,7 +482,7 @@ process_lparen_or_lbracket(int decl_ind,
&& !ps.block_init && !ps.decl_indent_done &&
!ps.is_function_definition && ps.line_start_nparen == 0) {
/* function pointer declarations */
- code_add_decl_indent(decl_ind, tabs_to_var);
+ code_add_decl_indent(ps.decl_ind, ps.tabs_to_var);
ps.decl_indent_done = true;
} else if (want_blank_before_lparen())
*code.e++ = ' ';
@@ -493,7 +493,7 @@ process_lparen_or_lbracket(int decl_ind,
debug_println("paren_indents[%d] is now %d",
ps.nparen - 1, ps.paren[ps.nparen - 1].indent);
- if (spaced_expr && ps.nparen == 1 && opt.extra_expr_indent
+ if (ps.spaced_expr && 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);
@@ -514,7 +514,7 @@ process_lparen_or_lbracket(int decl_ind,
}
static void
-process_rparen_or_rbracket(bool *spaced_expr, stmt_head hd)
+process_rparen_or_rbracket(void)
{
if (ps.paren[ps.nparen - 1].maybe_cast &&
!ps.paren[ps.nparen - 1].no_cast) {
@@ -535,15 +535,14 @@ process_rparen_or_rbracket(bool *spaced_
*code.e++ = token.s[0];
- if (*spaced_expr && ps.nparen == 0) { /* check for end of 'if
- * (...)', or some such */
- *spaced_expr = false;
+ if (ps.spaced_expr && ps.nparen == 0) {
+ ps.spaced_expr = false;
ps.force_nl = true;
ps.next_unary = true;
ps.in_stmt_or_decl = false; /* don't use stmt continuation
* indentation */
- parse_stmt_head(hd);
+ parse_stmt_head(ps.hd);
}
}
@@ -558,12 +557,13 @@ want_blank_before_unary_op(void)
}
static void
-process_unary_op(int decl_ind, bool tabs_to_var)
+process_unary_op(void)
{
if (!ps.decl_indent_done && ps.in_decl && !ps.block_init &&
!ps.is_function_definition && ps.line_start_nparen == 0) {
/* pointer declarations */
- code_add_decl_indent(decl_ind - (int)buf_len(&token), tabs_to_var);
+ code_add_decl_indent(ps.decl_ind - (int)buf_len(&token),
+ ps.tabs_to_var);
ps.decl_indent_done = true;
} else if (want_blank_before_unary_op())
*code.e++ = ' ';
@@ -590,9 +590,9 @@ process_postfix_op(void)
}
static void
-process_question(int *quest_level)
+process_question(void)
{
- (*quest_level)++;
+ ps.quest_level++;
if (ps.want_blank)
*code.e++ = ' ';
*code.e++ = '?';
@@ -600,10 +600,10 @@ process_question(int *quest_level)
}
static void
-process_colon(int *quest_level, bool *seen_case)
+process_colon(void)
{
- if (*quest_level > 0) { /* part of a '?:' operator */
- --*quest_level;
+ if (ps.quest_level > 0) { /* part of a '?:' operator */
+ ps.quest_level--;
if (ps.want_blank)
*code.e++ = ' ';
*code.e++ = ':';
@@ -623,20 +623,19 @@ process_colon(int *quest_level, bool *se
buf_reset(&code);
ps.in_stmt_or_decl = false;
- ps.is_case_label = *seen_case;
- ps.force_nl = *seen_case;
- *seen_case = false;
+ ps.is_case_label = ps.seen_case;
+ ps.force_nl = ps.seen_case;
+ ps.seen_case = false;
ps.want_blank = false;
}
static void
-process_semicolon(bool *seen_case, int *quest_level, int decl_ind,
- bool tabs_to_var, bool *spaced_expr, stmt_head hd)
+process_semicolon(void)
{
if (ps.decl_level == 0)
ps.init_or_struct = false;
- *seen_case = false; /* these will only need resetting in an error */
- *quest_level = 0;
+ ps.seen_case = false; /* these will only need resetting in an error */
+ ps.quest_level = 0;
if (ps.prev_token == lsym_rparen_or_rbracket)
ps.in_func_def_params = false;
ps.block_init = false;
@@ -646,7 +645,7 @@ process_semicolon(bool *seen_case, int *
if (ps.in_decl && code.s == code.e && !ps.block_init &&
!ps.decl_indent_done && ps.line_start_nparen == 0) {
/* indent stray semicolons in declarations */
- code_add_decl_indent(decl_ind - 1, tabs_to_var);
+ code_add_decl_indent(ps.decl_ind - 1, ps.tabs_to_var);
ps.decl_indent_done = true;
}
@@ -654,7 +653,7 @@ process_semicolon(bool *seen_case, int *
* structure declaration before, we
* aren't anymore */
- if ((!*spaced_expr || hd != hd_for) && ps.nparen > 0) {
+ if ((!ps.spaced_expr || ps.hd != hd_for) && ps.nparen > 0) {
/*
* There were unbalanced parentheses in the statement. It is a bit
@@ -662,24 +661,23 @@ process_semicolon(bool *seen_case, int *
*/
diag(1, "Unbalanced parentheses");
ps.nparen = 0;
- if (*spaced_expr) { /* 'if', 'while', etc. */
- *spaced_expr = false;
- parse_stmt_head(hd);
+ if (ps.spaced_expr) {
+ ps.spaced_expr = false;
+ parse_stmt_head(ps.hd);
}
}
*code.e++ = ';';
ps.want_blank = true;
ps.in_stmt_or_decl = ps.nparen > 0;
- if (!*spaced_expr) { /* if not if for (;;) */
+ if (!ps.spaced_expr) {
parse(psym_semicolon); /* let parser know about end of stmt */
ps.force_nl = true;
}
}
static void
-process_lbrace(bool *spaced_expr, stmt_head hd,
- int *di_stack, int di_stack_cap, int *decl_ind)
+process_lbrace(void)
{
ps.in_stmt_or_decl = false; /* don't indent the {} */
@@ -711,9 +709,9 @@ process_lbrace(bool *spaced_expr, stmt_h
if (ps.nparen > 0) {
diag(1, "Unbalanced parentheses");
ps.nparen = 0;
- if (*spaced_expr) { /* check for unclosed 'if', 'for', etc. */
- *spaced_expr = false;
- parse_stmt_head(hd);
+ if (ps.spaced_expr) {
+ ps.spaced_expr = false;
+ parse_stmt_head(ps.hd);
ps.ind_level = ps.ind_level_follow;
}
}
@@ -721,10 +719,10 @@ process_lbrace(bool *spaced_expr, stmt_h
if (code.s == code.e)
ps.in_stmt_cont = false; /* don't indent the '{' itself */
if (ps.in_decl && ps.init_or_struct) {
- di_stack[ps.decl_level] = *decl_ind;
- if (++ps.decl_level == di_stack_cap) {
+ ps.di_stack[ps.decl_level] = ps.decl_ind;
+ if (++ps.decl_level == (int)array_length(ps.di_stack)) {
diag(0, "Reached internal limit of %d struct levels",
- di_stack_cap);
+ (int)array_length(ps.di_stack));
ps.decl_level--;
}
} else {
@@ -737,7 +735,7 @@ process_lbrace(bool *spaced_expr, stmt_h
ps.in_decl = false;
}
- *decl_ind = 0;
+ ps.decl_ind = 0;
parse(psym_lbrace);
if (ps.want_blank)
*code.e++ = ' ';
@@ -747,7 +745,7 @@ process_lbrace(bool *spaced_expr, stmt_h
}
static void
-process_rbrace(bool *spaced_expr, int *decl_ind, const int *di_stack)
+process_rbrace(void)
{
if (ps.s_sym[ps.tos] == psym_decl && !ps.block_init) {
/* semicolons can be omitted in declarations */
@@ -757,7 +755,7 @@ process_rbrace(bool *spaced_expr, int *d
if (ps.nparen > 0) { /* check for unclosed if, for, else. */
diag(1, "Unbalanced parentheses");
ps.nparen = 0;
- *spaced_expr = false;
+ ps.spaced_expr = false;
}
ps.just_saw_decl = 0;
@@ -775,10 +773,10 @@ process_rbrace(bool *spaced_expr, int *d
ps.in_stmt_cont = false;
if (ps.decl_level > 0) { /* multi-level structure declaration */
- *decl_ind = di_stack[--ps.decl_level];
+ ps.decl_ind = ps.di_stack[--ps.decl_level];
if (ps.decl_level == 0 && !ps.in_func_def_params) {
ps.just_saw_decl = 2;
- *decl_ind = ps.ind_level == 0
+ ps.decl_ind = ps.ind_level == 0
? opt.decl_indent : opt.local_decl_indent;
}
ps.in_decl = true;
@@ -824,7 +822,7 @@ process_else(void)
}
static void
-process_type(int *decl_ind, bool *tabs_to_var)
+process_type(void)
{
parse(psym_decl); /* let the parser worry about indentation */
@@ -852,13 +850,12 @@ process_type(int *decl_ind, bool *tabs_t
int ind = ps.ind_level == 0 || ps.decl_level > 0
? opt.decl_indent /* global variable or local member */
: opt.local_decl_indent; /* local variable */
- *decl_ind = ind > 0 ? ind : len;
- *tabs_to_var = opt.use_tabs && ind > 0;
+ ps.decl_ind = ind > 0 ? ind : len;
+ ps.tabs_to_var = opt.use_tabs && ind > 0;
}
static void
-process_ident(lexer_symbol lsym, int decl_ind, bool tabs_to_var,
- bool *spaced_expr, stmt_head hd)
+process_ident(lexer_symbol lsym)
{
if (ps.in_decl) {
if (lsym == lsym_funcname) {
@@ -873,17 +870,17 @@ process_ident(lexer_symbol lsym, int dec
} else if (!ps.block_init && !ps.decl_indent_done &&
ps.line_start_nparen == 0) {
- code_add_decl_indent(decl_ind, tabs_to_var);
+ code_add_decl_indent(ps.decl_ind, ps.tabs_to_var);
ps.decl_indent_done = true;
ps.want_blank = false;
}
- } else if (*spaced_expr && ps.nparen == 0) {
- *spaced_expr = false;
+ } else if (ps.spaced_expr && ps.nparen == 0) {
+ ps.spaced_expr = false;
ps.force_nl = true;
ps.next_unary = true;
ps.in_stmt_or_decl = false;
- parse_stmt_head(hd);
+ parse_stmt_head(ps.hd);
}
}
@@ -905,7 +902,7 @@ process_period(void)
}
static void
-process_comma(int decl_ind, bool tabs_to_var)
+process_comma(void)
{
ps.want_blank = code.s != code.e; /* only put blank after comma if comma
* does not start the line */
@@ -913,7 +910,7 @@ process_comma(int decl_ind, bool tabs_to
if (ps.in_decl && !ps.is_function_definition && !ps.block_init &&
!ps.decl_indent_done && ps.line_start_nparen == 0) {
/* indent leading commas and not the actual identifiers */
- code_add_decl_indent(decl_ind - 1, tabs_to_var);
+ code_add_decl_indent(ps.decl_ind - 1, ps.tabs_to_var);
ps.decl_indent_done = true;
}
@@ -1056,20 +1053,8 @@ process_preprocessing(void)
__dead static void
main_loop(void)
{
- int decl_ind = 0; /* current indentation for declarations */
- int di_stack[20]; /* a stack of structure indentation levels */
- bool tabs_to_var = false; /* true if using tabs to indent to var name */
- bool spaced_expr = false; /* whether we are in the expression of
- * if(...), while(...), etc. */
- stmt_head hd = hd_0; /* the type of statement for 'if (...)', 'for
- * (...)', etc */
- int quest_level = 0; /* when this is positive, we have seen a '?'
- * without the matching ':' in a '?:'
- * expression */
- bool seen_case = false; /* set to true when we see a 'case', so we
- * know what to do with the following colon */
- di_stack[ps.decl_level = 0] = 0;
+ ps.di_stack[ps.decl_level = 0] = 0;
for (;;) { /* loop until we reach eof */
lexer_symbol lsym = lexi();
@@ -1106,15 +1091,15 @@ main_loop(void)
break;
case lsym_lparen_or_lbracket:
- process_lparen_or_lbracket(decl_ind, tabs_to_var, spaced_expr);
+ process_lparen_or_lbracket();
break;
case lsym_rparen_or_rbracket:
- process_rparen_or_rbracket(&spaced_expr, hd);
+ process_rparen_or_rbracket();
break;
case lsym_unary_op:
- process_unary_op(decl_ind, tabs_to_var);
+ process_unary_op();
break;
case lsym_binary_op:
@@ -1126,51 +1111,47 @@ main_loop(void)
break;
case lsym_question:
- process_question(&quest_level);
+ process_question();
break;
case lsym_case_label:
- seen_case = true;
+ ps.seen_case = true;
goto copy_token;
case lsym_colon:
- process_colon(&quest_level, &seen_case);
+ process_colon();
break;
case lsym_semicolon:
- process_semicolon(&seen_case, &quest_level, decl_ind, tabs_to_var,
- &spaced_expr, hd);
+ process_semicolon();
break;
case lsym_lbrace:
- process_lbrace(&spaced_expr, hd, di_stack,
- (int)array_length(di_stack), &decl_ind);
+ process_lbrace();
break;
case lsym_rbrace:
- process_rbrace(&spaced_expr, &decl_ind, di_stack);
+ process_rbrace();
break;
case lsym_switch:
- spaced_expr = true; /* the interesting stuff is done after the
- * expressions are scanned */
- hd = hd_switch; /* remember the type of header for later use
- * by the parser */
+ ps.spaced_expr = true;
+ ps.hd = hd_switch;
goto copy_token;
case lsym_for:
- spaced_expr = true;
- hd = hd_for;
+ ps.spaced_expr = true;
+ ps.hd = hd_for;
goto copy_token;
case lsym_if:
- spaced_expr = true;
- hd = hd_if;
+ ps.spaced_expr = true;
+ ps.hd = hd_if;
goto copy_token;
case lsym_while:
- spaced_expr = true;
- hd = hd_while;
+ ps.spaced_expr = true;
+ ps.hd = hd_while;
goto copy_token;
case lsym_do:
@@ -1191,7 +1172,7 @@ main_loop(void)
goto copy_token;
/* FALLTHROUGH */
case lsym_type_outside_parentheses:
- process_type(&decl_ind, &tabs_to_var);
+ process_type();
goto copy_token;
case lsym_type_in_parentheses:
@@ -1200,7 +1181,7 @@ main_loop(void)
case lsym_word:
case lsym_funcname:
case lsym_return:
- process_ident(lsym, decl_ind, tabs_to_var, &spaced_expr, hd);
+ process_ident(lsym);
copy_token:
copy_token();
if (lsym != lsym_funcname)
@@ -1212,7 +1193,7 @@ main_loop(void)
break;
case lsym_comma:
- process_comma(decl_ind, tabs_to_var);
+ process_comma();
break;
case lsym_preprocessing:
Index: src/usr.bin/indent/indent.h
diff -u src/usr.bin/indent/indent.h:1.114 src/usr.bin/indent/indent.h:1.115
--- src/usr.bin/indent/indent.h:1.114 Thu May 11 10:51:34 2023
+++ src/usr.bin/indent/indent.h Thu May 11 11:25:47 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: indent.h,v 1.114 2023/05/11 10:51:34 rillig Exp $ */
+/* $NetBSD: indent.h,v 1.115 2023/05/11 11:25:47 rillig Exp $ */
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -330,6 +330,9 @@ extern struct parser_state {
} in_enum; /* enum { . } */
bool decl_indent_done; /* whether the indentation for a declaration
* has been added to the code buffer. */
+ int decl_ind; /* current indentation for declarations */
+ int di_stack[20]; /* a stack of structure indentation levels */
+ bool tabs_to_var; /* true if using tabs to indent to var name */
bool in_stmt_or_decl; /* whether in a statement or a struct
* declaration or a plain declaration */
@@ -338,12 +341,23 @@ extern struct parser_state {
* middle of a statement */
bool is_case_label; /* 'case' and 'default' labels are indented
* differently from regular labels */
+ bool seen_case; /* set to true when we see a 'case', so we
+ * know what to do with the following colon */
int tos; /* pointer to top of stack */
parser_symbol s_sym[STACKSIZE];
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'. */
+ int quest_level; /* when this is positive, we have seen a '?'
+ * without the matching ':' in a '?:'
+ * expression */
+
struct {
int comments;
int lines;
Index: src/usr.bin/indent/lexi.c
diff -u src/usr.bin/indent/lexi.c:1.174 src/usr.bin/indent/lexi.c:1.175
--- src/usr.bin/indent/lexi.c:1.174 Thu May 11 10:51:34 2023
+++ src/usr.bin/indent/lexi.c Thu May 11 11:25:47 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lexi.c,v 1.174 2023/05/11 10:51:34 rillig Exp $ */
+/* $NetBSD: lexi.c,v 1.175 2023/05/11 11:25:47 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.174 2023/05/11 10:51:34 rillig Exp $");
+__RCSID("$NetBSD: lexi.c,v 1.175 2023/05/11 11:25:47 rillig Exp $");
#elif defined(__FreeBSD__)
__FBSDID("$FreeBSD: head/usr.bin/indent/lexi.c 337862 2018-08-15 18:19:45Z pstef $");
#endif
@@ -301,10 +301,6 @@ debug_ps_paren(const struct parser_state
static void
debug_lexi(lexer_symbol lsym)
{
- /*
- * Watch out for 'rolled back parser state' in the debug output; the
- * differences around these are unreliable.
- */
static struct parser_state prev_ps;
debug_println("");
@@ -316,8 +312,8 @@ debug_lexi(lexer_symbol lsym)
debug_print_buf("comment", &com);
debug_println(" ps.prev_token = %s", lsym_name(ps.prev_token));
- debug_ps_bool(next_col_1);
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);
@@ -342,11 +338,22 @@ debug_lexi(lexer_symbol lsym)
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.
+
+ // No debug output for hd.
+ debug_ps_bool(spaced_expr);
+ debug_ps_int(quest_level);
prev_ps = ps;
}