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;

Reply via email to