Module Name: src Committed By: rillig Date: Sun Jun 4 10:23:36 UTC 2023
Modified Files: src/usr.bin/indent: debug.c indent.c indent.h lexi.c Log Message: indent: separate code for handling parentheses and brackets Handling parentheses is more complicated than for brackets. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/usr.bin/indent/debug.c cvs rdiff -u -r1.317 -r1.318 src/usr.bin/indent/indent.c cvs rdiff -u -r1.162 -r1.163 src/usr.bin/indent/indent.h cvs rdiff -u -r1.206 -r1.207 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/debug.c diff -u src/usr.bin/indent/debug.c:1.25 src/usr.bin/indent/debug.c:1.26 --- src/usr.bin/indent/debug.c:1.25 Fri Jun 2 13:59:33 2023 +++ src/usr.bin/indent/debug.c Sun Jun 4 10:23:36 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.25 2023/06/02 13:59:33 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.26 2023/06/04 10:23:36 rillig Exp $ */ /*- * Copyright (c) 2023 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: debug.c,v 1.25 2023/06/02 13:59:33 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.26 2023/06/04 10:23:36 rillig Exp $"); #include <stdarg.h> @@ -49,8 +49,10 @@ const char *const lsym_name[] = { "preprocessing", "newline", "comment", - "lparen_or_lbracket", - "rparen_or_rbracket", + "lparen", + "lbracket", + "rparen", + "rbracket", "lbrace", "rbrace", "period", Index: src/usr.bin/indent/indent.c diff -u src/usr.bin/indent/indent.c:1.317 src/usr.bin/indent/indent.c:1.318 --- src/usr.bin/indent/indent.c:1.317 Sat Jun 3 21:44:08 2023 +++ src/usr.bin/indent/indent.c Sun Jun 4 10:23:36 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.c,v 1.317 2023/06/03 21:44:08 rillig Exp $ */ +/* $NetBSD: indent.c,v 1.318 2023/06/04 10:23:36 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: indent.c,v 1.317 2023/06/03 21:44:08 rillig Exp $"); +__RCSID("$NetBSD: indent.c,v 1.318 2023/06/04 10:23:36 rillig Exp $"); #include <sys/param.h> #include <err.h> @@ -362,8 +362,7 @@ update_ps_decl_ptr(lexer_symbol lsym) case dp_other: if (lsym == lsym_semicolon || lsym == lsym_rbrace) ps.decl_ptr = dp_start; - if (lsym == lsym_lparen_or_lbracket && token.st[0] == '(' - && ps.prev_token != lsym_sizeof) + if (lsym == lsym_lparen && ps.prev_token != lsym_sizeof) ps.decl_ptr = dp_start; if (lsym == lsym_comma && ps.in_decl) ps.decl_ptr = dp_start; @@ -441,7 +440,7 @@ move_com_to_code(lexer_symbol lsym) if (ps.want_blank) buf_add_char(&code, ' '); buf_add_buf(&code, &com); - if (lsym != lsym_rparen_or_rbracket) + if (lsym != lsym_rparen && lsym != lsym_rbracket) buf_add_char(&code, ' '); com.len = 0; ps.want_blank = false; @@ -470,8 +469,7 @@ stay_in_line: static bool is_function_pointer_declaration(void) { - return token.st[0] == '(' - && ps.in_decl + return ps.in_decl && !ps.block_init && !ps.decl_indent_done && !ps.is_function_definition @@ -485,7 +483,7 @@ want_blank_before_lparen(void) return false; if (opt.proc_calls_space) return true; - if (ps.prev_token == lsym_rparen_or_rbracket) + if (ps.prev_token == lsym_rparen || ps.prev_token == lsym_rbracket) return false; if (ps.prev_token == lsym_offsetof) return false; @@ -496,20 +494,8 @@ want_blank_before_lparen(void) return true; } -static bool -want_blank_before_lbracket(void) -{ - if (code.len == 0) - return false; - if (ps.prev_token == lsym_comma) - return true; - if (ps.prev_token == lsym_binary_op) - return true; - return false; -} - static void -process_lparen_or_lbracket(void) +process_lparen(void) { if (++ps.nparen == array_length(ps.paren)) { diag(0, "Reached internal limit of %zu unclosed parentheses", @@ -520,8 +506,7 @@ process_lparen_or_lbracket(void) if (is_function_pointer_declaration()) { code_add_decl_indent(ps.decl_ind, ps.tabs_to_var); ps.decl_indent_done = true; - } else if (token.st[0] == '(' - ? want_blank_before_lparen() : want_blank_before_lbracket()) + } else if (want_blank_before_lparen()) buf_add_char(&code, ' '); ps.want_blank = false; buf_add_char(&code, token.st[0]); @@ -531,7 +516,7 @@ process_lparen_or_lbracket(void) && opt.continuation_indent == opt.indent_size) ps.extra_expr_indent = eei_yes; - if (ps.init_or_struct && *token.st == '(' && ps.tos <= 2) { + if (ps.init_or_struct && ps.tos <= 2) { /* this is a kluge to make sure that declarations will be * aligned right if proc decl has an explicit type on it, i.e. * "int a(x) {..." */ @@ -555,8 +540,41 @@ process_lparen_or_lbracket(void) ps.nparen - 1, paren_level_cast_name[cast], indent); } +static bool +want_blank_before_lbracket(void) +{ + if (code.len == 0) + return false; + if (ps.prev_token == lsym_comma) + return true; + if (ps.prev_token == lsym_binary_op) + return true; + return false; +} + +static void +process_lbracket(void) +{ + if (++ps.nparen == array_length(ps.paren)) { + diag(0, "Reached internal limit of %zu unclosed parentheses", + array_length(ps.paren)); + ps.nparen--; + } + + if (want_blank_before_lbracket()) + buf_add_char(&code, ' '); + ps.want_blank = false; + buf_add_char(&code, token.st[0]); + + int indent = ind_add(0, code.st, code.len); + + ps.paren[ps.nparen - 1].indent = indent; + ps.paren[ps.nparen - 1].cast = cast_no; + debug_println("paren_indents[%d] is now %d", ps.nparen - 1, indent); +} + static void -process_rparen_or_rbracket(void) +process_rparen(void) { if (ps.nparen == 0) { diag(0, "Extra '%c'", *token.st); @@ -573,8 +591,8 @@ process_rparen_or_rbracket(void) } else ps.want_blank = true; - if (code.len == 0) /* if the paren starts the line */ - ps.line_start_nparen = ps.nparen; /* then indent it */ + if (code.len == 0) + ps.line_start_nparen = ps.nparen; unbalanced: buf_add_char(&code, token.st[0]); @@ -592,6 +610,23 @@ unbalanced: } } +static void +process_rbracket(void) +{ + if (ps.nparen == 0) { + diag(0, "Extra '%c'", *token.st); + goto unbalanced; + } + --ps.nparen; + + ps.want_blank = true; + if (code.len == 0) + ps.line_start_nparen = ps.nparen; + +unbalanced: + buf_add_char(&code, token.st[0]); +} + static bool want_blank_before_unary_op(void) { @@ -691,7 +726,7 @@ process_semicolon(void) ps.init_or_struct = false; ps.seen_case = false; /* only needs to be reset on error */ ps.quest_level = 0; /* only needs to be reset on error */ - if (ps.prev_token == lsym_rparen_or_rbracket) + if (ps.prev_token == lsym_rparen) ps.in_func_def_params = false; ps.block_init = false; ps.block_init_level = 0; @@ -873,7 +908,7 @@ process_type(void) { parse(psym_decl); /* let the parser worry about indentation */ - if (ps.prev_token == lsym_rparen_or_rbracket && ps.tos <= 1) { + if (ps.prev_token == lsym_rparen && ps.tos <= 1) { if (code.len > 0) output_line(); } @@ -1068,12 +1103,20 @@ process_lsym(lexer_symbol lsym) process_newline(); break; - case lsym_lparen_or_lbracket: - process_lparen_or_lbracket(); + case lsym_lparen: + process_lparen(); + break; + + case lsym_lbracket: + process_lbracket(); + break; + + case lsym_rparen: + process_rparen(); break; - case lsym_rparen_or_rbracket: - process_rparen_or_rbracket(); + case lsym_rbracket: + process_rbracket(); break; case lsym_unary_op: Index: src/usr.bin/indent/indent.h diff -u src/usr.bin/indent/indent.h:1.162 src/usr.bin/indent/indent.h:1.163 --- src/usr.bin/indent/indent.h:1.162 Fri Jun 2 14:21:55 2023 +++ src/usr.bin/indent/indent.h Sun Jun 4 10:23:36 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.h,v 1.162 2023/06/02 14:21:55 rillig Exp $ */ +/* $NetBSD: indent.h,v 1.163 2023/06/04 10:23:36 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-2-Clause-FreeBSD @@ -73,8 +73,10 @@ typedef enum lexer_symbol { lsym_preprocessing, /* '#' */ lsym_newline, lsym_comment, /* the initial '/ *' or '//' of a comment */ - lsym_lparen_or_lbracket, - lsym_rparen_or_rbracket, + lsym_lparen, + lsym_lbracket, + lsym_rparen, + lsym_rbracket, lsym_lbrace, lsym_rbrace, lsym_period, Index: src/usr.bin/indent/lexi.c diff -u src/usr.bin/indent/lexi.c:1.206 src/usr.bin/indent/lexi.c:1.207 --- src/usr.bin/indent/lexi.c:1.206 Tue May 23 18:16:28 2023 +++ src/usr.bin/indent/lexi.c Sun Jun 4 10:23:36 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: lexi.c,v 1.206 2023/05/23 18:16:28 rillig Exp $ */ +/* $NetBSD: lexi.c,v 1.207 2023/06/04 10:23:36 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: lexi.c,v 1.206 2023/05/23 18:16:28 rillig Exp $"); +__RCSID("$NetBSD: lexi.c,v 1.207 2023/06/04 10:23:36 rillig Exp $"); #include <stdlib.h> #include <string.h> @@ -438,7 +438,8 @@ is_asterisk_unary(void) if (ps.next_unary || ps.in_func_def_params) return true; if (ps.prev_token == lsym_word || - ps.prev_token == lsym_rparen_or_rbracket) + ps.prev_token == lsym_rparen || + ps.prev_token == lsym_rbracket) return false; return ps.in_decl && ps.nparen > 0; } @@ -555,10 +556,10 @@ lexi(void) switch (token.mem[token.len - 1]) { /* INDENT OFF */ - case '(': - case '[': lsym = lsym_lparen_or_lbracket; next_unary = true; break; - case ')': - case ']': lsym = lsym_rparen_or_rbracket; next_unary = false; break; + case '(': lsym = lsym_lparen; next_unary = true; break; + case '[': lsym = lsym_lbracket; next_unary = true; break; + case ')': lsym = lsym_rparen; next_unary = false; break; + case ']': lsym = lsym_rbracket; next_unary = false; break; case '?': lsym = lsym_question; next_unary = true; break; case ':': lsym = lsym_colon; next_unary = true; break; case ';': lsym = lsym_semicolon; next_unary = true; break; @@ -596,7 +597,8 @@ lexi(void) if (inp.st[0] == token.mem[token.len - 1]) { token_add_char(*inp.st++); if (ps.prev_token == lsym_word || - ps.prev_token == lsym_rparen_or_rbracket) { + ps.prev_token == lsym_rparen || + ps.prev_token == lsym_rbracket) { lsym = ps.next_unary ? lsym_unary_op : lsym_postfix_op; next_unary = false;