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; }