Module Name: src Committed By: rillig Date: Sun Jun 25 19:19:43 UTC 2023
Modified Files: src/tests/usr.bin/indent: fmt_decl.c src/usr.bin/indent: indent.c lexi.c Log Message: indent: fix formatting of parenthesized name in function definition To generate a diff of this commit: cvs rdiff -u -r1.59 -r1.60 src/tests/usr.bin/indent/fmt_decl.c cvs rdiff -u -r1.382 -r1.383 src/usr.bin/indent/indent.c cvs rdiff -u -r1.233 -r1.234 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/tests/usr.bin/indent/fmt_decl.c diff -u src/tests/usr.bin/indent/fmt_decl.c:1.59 src/tests/usr.bin/indent/fmt_decl.c:1.60 --- src/tests/usr.bin/indent/fmt_decl.c:1.59 Fri Jun 16 23:51:32 2023 +++ src/tests/usr.bin/indent/fmt_decl.c Sun Jun 25 19:19:42 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: fmt_decl.c,v 1.59 2023/06/16 23:51:32 rillig Exp $ */ +/* $NetBSD: fmt_decl.c,v 1.60 2023/06/25 19:19:42 rillig Exp $ */ /* * Tests for declarations of global variables, external functions, and local @@ -963,6 +963,12 @@ debug_printf(const char *fmt, ...) //indent end +/* + * When a name is defined both as a function and as a macro, the name in the + * function definition must be enclosed in parentheses, to prevent the macro + * from being expanded. It is also possible to undefine the macro, but that is + * often not done in practice. + */ //indent input void (error_at)(int msgid, const pos_t *pos, ...) @@ -970,14 +976,7 @@ void } //indent end -//indent run -ci4 -di0 -ndj -nlp -void -// $ FIXME: Wrong indentation, should be 0 instead. -// $ FIXME: There should be no space after the '*'. - (error_at)(int msgid, const pos_t * pos, ...) -{ -} -//indent end +//indent run-equals-input //indent input Index: src/usr.bin/indent/indent.c diff -u src/usr.bin/indent/indent.c:1.382 src/usr.bin/indent/indent.c:1.383 --- src/usr.bin/indent/indent.c:1.382 Fri Jun 23 20:43:21 2023 +++ src/usr.bin/indent/indent.c Sun Jun 25 19:19:42 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: indent.c,v 1.382 2023/06/23 20:43:21 rillig Exp $ */ +/* $NetBSD: indent.c,v 1.383 2023/06/25 19:19:42 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: indent.c,v 1.382 2023/06/23 20:43:21 rillig Exp $"); +__RCSID("$NetBSD: indent.c,v 1.383 2023/06/25 19:19:42 rillig Exp $"); #include <sys/param.h> #include <err.h> @@ -961,7 +961,8 @@ process_word(lexer_symbol lsym) if (ps.in_decl) { if (lsym == lsym_funcname) { ps.in_decl = false; - if (opt.procnames_start_line && code.len > 0) + if (opt.procnames_start_line + && code.len > (*inp_p == ')' ? 1 : 0)) output_line(); else if (ps.want_blank) buf_add_char(&code, ' '); Index: src/usr.bin/indent/lexi.c diff -u src/usr.bin/indent/lexi.c:1.233 src/usr.bin/indent/lexi.c:1.234 --- src/usr.bin/indent/lexi.c:1.233 Sun Jun 25 18:41:03 2023 +++ src/usr.bin/indent/lexi.c Sun Jun 25 19:19:42 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: lexi.c,v 1.233 2023/06/25 18:41:03 rillig Exp $ */ +/* $NetBSD: lexi.c,v 1.234 2023/06/25 19:19:42 rillig Exp $ */ /*- * SPDX-License-Identifier: BSD-4-Clause @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: lexi.c,v 1.233 2023/06/25 18:41:03 rillig Exp $"); +__RCSID("$NetBSD: lexi.c,v 1.234 2023/06/25 19:19:42 rillig Exp $"); #include <stdlib.h> #include <string.h> @@ -333,10 +333,10 @@ cmp_keyword_by_name(const void *key, con * function declaration. */ static bool -probably_function_definition(void) +probably_function_definition(const char *p) { int paren_level = 0; - for (const char *p = inp_p; *p != '\n'; p++) { + for (; *p != '\n'; p++) { if (*p == '(') paren_level++; if (*p == ')' && --paren_level == 0) { @@ -438,10 +438,17 @@ found_typename: } } - if (*inp_p == '(' && ps.psyms.len < 3 && ps.ind_level == 0 && + const char *p = inp_p; + if (*p == ')') + p++; + if (*p == '(' && ps.psyms.len < 3 && ps.ind_level == 0 && !ps.in_func_def_params && !ps.in_init) { - if (ps.paren.len == 0 && probably_function_definition()) { + bool maybe_function_definition = *inp_p == ')' + ? ps.paren.len == 1 && ps.prev_lsym != lsym_unary_op + : ps.paren.len == 0; + if (maybe_function_definition + && probably_function_definition(p)) { ps.line_has_func_def = true; if (ps.in_decl) ps.in_func_def_params = true; @@ -456,8 +463,28 @@ found_typename: return lsym; } +static void +check_parenthesized_function_definition(void) +{ + const char *p = inp_p; + while (ch_isblank(*p)) + p++; + if (is_identifier_start(*p)) + while (is_identifier_part(*p)) + p++; + while (ch_isblank(*p)) + p++; + if (*p == ')') { + p++; + while (ch_isblank(*p)) + p++; + if (*p == '(' && probably_function_definition(p)) + ps.line_has_func_def = true; + } +} + static bool -is_asterisk_pointer(void) +is_asterisk_unary(void) { const char *p = inp_p; while (*p == '*' || ch_isblank(*p)) @@ -490,7 +517,7 @@ probably_in_function_definition(void) } static void -lex_asterisk_pointer(void) +lex_asterisk_unary(void) { while (*inp_p == '*' || ch_isspace(*inp_p)) { if (*inp_p == '*') @@ -575,7 +602,6 @@ lexi(void) break; /* INDENT OFF */ - case '(': lsym = lsym_lparen; next_unary = true; break; case ')': lsym = lsym_rparen; next_unary = false; break; case '[': lsym = lsym_lbracket; next_unary = true; break; case ']': lsym = lsym_rbracket; next_unary = false; break; @@ -587,6 +613,13 @@ lexi(void) case ';': lsym = lsym_semicolon; next_unary = true; break; /* INDENT ON */ + case '(': + if (inp_p == inp.s + 1) + check_parenthesized_function_definition(); + lsym = lsym_lparen; + next_unary = true; + break; + case '+': case '-': lsym = ps.next_unary ? lsym_unary_op : lsym_binary_op; @@ -625,8 +658,8 @@ lexi(void) if (*inp_p == '=') { token_add_char(*inp_p++); lsym = lsym_binary_op; - } else if (is_asterisk_pointer()) { - lex_asterisk_pointer(); + } else if (is_asterisk_unary()) { + lex_asterisk_unary(); lsym = lsym_unary_op; } else lsym = lsym_binary_op;