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;