Module Name:    src
Committed By:   rillig
Date:           Thu Nov 25 18:36:30 UTC 2021

Modified Files:
        src/tests/usr.bin/indent: fmt_decl.c lsym_sizeof.c
        src/usr.bin/indent: lexi.c

Log Message:
indent: improve heuristic for spaces around '*' in declarations


To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/tests/usr.bin/indent/fmt_decl.c
cvs rdiff -u -r1.2 -r1.3 src/tests/usr.bin/indent/lsym_sizeof.c
cvs rdiff -u -r1.162 -r1.163 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.28 src/tests/usr.bin/indent/fmt_decl.c:1.29
--- src/tests/usr.bin/indent/fmt_decl.c:1.28	Thu Nov 25 18:20:21 2021
+++ src/tests/usr.bin/indent/fmt_decl.c	Thu Nov 25 18:36:30 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: fmt_decl.c,v 1.28 2021/11/25 18:20:21 rillig Exp $	*/
+/*	$NetBSD: fmt_decl.c,v 1.29 2021/11/25 18:36:30 rillig Exp $	*/
 /* $FreeBSD: head/usr.bin/indent/tests/declarations.0 334478 2018-06-01 09:41:15Z pstef $ */
 
 /*
@@ -590,7 +590,17 @@ buffer_add(buffer *buf, char ch)
 #indent end
 
 /* Before lexi.c 1.156 from 2021-11-25, indent generated 'buffer * buf'. */
-#indent run-equals-input
+#indent run
+void		buffer_add(buffer *, char);
+/* $ FIXME: space after '*' */
+void		buffer_add(buffer * buf, char ch);
+
+void
+buffer_add(buffer *buf, char ch)
+{
+	*buf->e++ = ch;
+}
+#indent end
 
 
 /*
@@ -793,9 +803,8 @@ function(void)
 
 /*
  * In declarations, most occurrences of '*' are pointer type derivations.
- * There are a few exceptions though.
- *
- * Broken since lexi.c 1.156 from 2021-11-25.
+ * There are a few exceptions though. Some of these are hard to detect
+ * without knowing which identifiers are type names.
  */
 #indent input
 char str[expr * expr];
@@ -809,17 +818,13 @@ char str[sizeof(**ptr)];
 #indent end
 
 #indent run -di0
-/* $ FIXME: The '*' must be a binary operator. */
-char str[expr *expr];
-/* $ FIXME: The first '*' must be a binary operator. */
-char str[expr **ptr];
-/* $ FIXME: The second '*' must be a binary operator. */
-char str[*ptr **ptr];
-/* $ FIXME: The '*' must be a binary operator. */
-char str[sizeof(expr *expr)];
-/* $ FIXME: The '*' must be a binary operator. */
-char str[sizeof(int) *expr];
+char str[expr * expr];
+char str[expr * *ptr];
+char str[*ptr * *ptr];
+char str[sizeof(expr * expr)];
+char str[sizeof(int) * expr];
 char str[sizeof(*ptr)];
-char str[sizeof(type **)];
+/* $ FIXME: should be 'type **' */
+char str[sizeof(type * *)];
 char str[sizeof(**ptr)];
 #indent end

Index: src/tests/usr.bin/indent/lsym_sizeof.c
diff -u src/tests/usr.bin/indent/lsym_sizeof.c:1.2 src/tests/usr.bin/indent/lsym_sizeof.c:1.3
--- src/tests/usr.bin/indent/lsym_sizeof.c:1.2	Thu Nov 25 18:10:23 2021
+++ src/tests/usr.bin/indent/lsym_sizeof.c	Thu Nov 25 18:36:30 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_sizeof.c,v 1.2 2021/11/25 18:10:23 rillig Exp $ */
+/* $NetBSD: lsym_sizeof.c,v 1.3 2021/11/25 18:36:30 rillig Exp $ */
 /* $FreeBSD$ */
 
 /*
@@ -20,14 +20,9 @@
 /*
  * After 'sizeof', a type name in parentheses does not start a cast
  * expression.
- *
- * Broken since lexi.c 1.156 from 2021-11-25.
  */
 #indent input
 char str[sizeof(int) * CHAR_BIT + 1];
 #indent end
 
-/* FIXME: The '*' must be a binary operator here. */
-#indent run -di0
-char str[sizeof(int) *CHAR_BIT + 1];
-#indent end
+#indent run-equals-input -di0

Index: src/usr.bin/indent/lexi.c
diff -u src/usr.bin/indent/lexi.c:1.162 src/usr.bin/indent/lexi.c:1.163
--- src/usr.bin/indent/lexi.c:1.162	Thu Nov 25 17:50:00 2021
+++ src/usr.bin/indent/lexi.c	Thu Nov 25 18:36:30 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: lexi.c,v 1.162 2021/11/25 17:50:00 rillig Exp $	*/
+/*	$NetBSD: lexi.c,v 1.163 2021/11/25 18:36:30 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.162 2021/11/25 17:50:00 rillig Exp $");
+__RCSID("$NetBSD: lexi.c,v 1.163 2021/11/25 18:36:30 rillig Exp $");
 #elif defined(__FreeBSD__)
 __FBSDID("$FreeBSD: head/usr.bin/indent/lexi.c 337862 2018-08-15 18:19:45Z pstef $");
 #endif
@@ -552,6 +552,17 @@ found_typename:
     return is_type ? lsym_type_in_parentheses : lsym_word;
 }
 
+static bool
+is_asterisk_unary(void)
+{
+    if (ps.next_unary || ps.in_parameter_declaration)
+	return true;
+    if (ps.prev_token == lsym_word ||
+	    ps.prev_token == lsym_rparen_or_rbracket)
+	return false;
+    return ps.in_decl && ps.p_l_follow > 0;
+}
+
 static void
 lex_asterisk_unary(void)
 {
@@ -694,8 +705,7 @@ lexi(void)
 	break;
 
     case '*':
-	if (ps.next_unary || ps.in_parameter_declaration ||
-		(ps.in_decl && ps.p_l_follow > 0)) {
+	if (is_asterisk_unary()) {
 	    lex_asterisk_unary();
 	    lsym = lsym_unary_op;
 	    next_unary = true;

Reply via email to