Module Name:    src
Committed By:   rillig
Date:           Tue May 23 06:35:01 UTC 2023

Modified Files:
        src/tests/usr.bin/indent: lsym_for.c
        src/usr.bin/indent: debug.c indent.c indent.h lexi.c

Log Message:
indent: fix spacing in declarations in for loops


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/tests/usr.bin/indent/lsym_for.c
cvs rdiff -u -r1.20 -r1.21 src/usr.bin/indent/debug.c
cvs rdiff -u -r1.304 -r1.305 src/usr.bin/indent/indent.c
cvs rdiff -u -r1.157 -r1.158 src/usr.bin/indent/indent.h
cvs rdiff -u -r1.203 -r1.204 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/lsym_for.c
diff -u src/tests/usr.bin/indent/lsym_for.c:1.5 src/tests/usr.bin/indent/lsym_for.c:1.6
--- src/tests/usr.bin/indent/lsym_for.c:1.5	Tue May 23 06:18:00 2023
+++ src/tests/usr.bin/indent/lsym_for.c	Tue May 23 06:35:01 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_for.c,v 1.5 2023/05/23 06:18:00 rillig Exp $ */
+/* $NetBSD: lsym_for.c,v 1.6 2023/05/23 06:35:01 rillig Exp $ */
 
 /*
  * Tests for the token lsym_for, which represents the keyword 'for' that
@@ -89,17 +89,18 @@ function(void)
 //indent run-equals-input
 
 
+/* Ensure that the '*' after 'list_item' is a unary operator. */
 //indent input
 {
 	for (const list_item *i = first; i != NULL; i = i->next) {
 	}
-}
-//indent end
-
-//indent run
-{
-// $ FIXME: Wrong spacing after '*'.
-	for (const list_item * i = first; i != NULL; i = i->next) {
+	for (list_item **i = first; i != NULL; i = i->next) {
+	}
+	for (list_item *const *i = first; i != NULL; i = i->next) {
+	}
+	for (const char *const *i = first; i != NULL; i = i->next) {
 	}
 }
 //indent end
+
+//indent run-equals-input

Index: src/usr.bin/indent/debug.c
diff -u src/usr.bin/indent/debug.c:1.20 src/usr.bin/indent/debug.c:1.21
--- src/usr.bin/indent/debug.c:1.20	Mon May 22 10:28:59 2023
+++ src/usr.bin/indent/debug.c	Tue May 23 06:35:01 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: debug.c,v 1.20 2023/05/22 10:28:59 rillig Exp $	*/
+/*	$NetBSD: debug.c,v 1.21 2023/05/23 06:35:01 rillig Exp $	*/
 
 /*-
  * Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: debug.c,v 1.20 2023/05/22 10:28:59 rillig Exp $");
+__RCSID("$NetBSD: debug.c,v 1.21 2023/05/23 06:35:01 rillig Exp $");
 
 #include <stdarg.h>
 
@@ -127,6 +127,13 @@ const char *const line_kind_name[] = {
 	"block comment",
 };
 
+static const char *const decl_ptr_name[] = {
+	"start",
+	"word",
+	"word *",
+	"other",
+};
+
 void
 debug_printf(const char *fmt, ...)
 {
@@ -316,6 +323,7 @@ debug_parser_state(lexer_symbol lsym)
 	debug_ps_bool(blank_line_after_decl);
 	debug_ps_bool(in_func_def_params);
 	debug_ps_enum(in_enum, in_enum_name);
+	debug_ps_enum(decl_ptr, decl_ptr_name);
 	debug_ps_bool(decl_indent_done);
 	debug_ps_int(decl_ind);
 	debug_ps_bool(tabs_to_var);

Index: src/usr.bin/indent/indent.c
diff -u src/usr.bin/indent/indent.c:1.304 src/usr.bin/indent/indent.c:1.305
--- src/usr.bin/indent/indent.c:1.304	Mon May 22 23:03:16 2023
+++ src/usr.bin/indent/indent.c	Tue May 23 06:35:01 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.c,v 1.304 2023/05/22 23:03:16 rillig Exp $	*/
+/*	$NetBSD: indent.c,v 1.305 2023/05/23 06:35:01 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: indent.c,v 1.304 2023/05/22 23:03:16 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.305 2023/05/23 06:35:01 rillig Exp $");
 
 #include <sys/param.h>
 #include <err.h>
@@ -334,6 +334,42 @@ code_add_decl_indent(int decl_ind, bool 
 	}
 }
 
+static void
+update_ps_decl_ptr(lexer_symbol lsym)
+{
+	switch (ps.decl_ptr) {
+	case dp_start:
+		if (lsym == lsym_storage_class)
+			ps.decl_ptr = dp_start;
+		else if (lsym == lsym_type_outside_parentheses)
+			ps.decl_ptr = dp_word;
+		else if (lsym == lsym_word)
+			ps.decl_ptr = dp_word;
+		else
+			ps.decl_ptr = dp_other;
+		break;
+	case dp_word:
+		if (lsym == lsym_unary_op && token.st[0] == '*')
+			ps.decl_ptr = dp_word_asterisk;
+		else
+			ps.decl_ptr = dp_other;
+		break;
+	case dp_word_asterisk:
+		if (lsym == lsym_unary_op && token.st[0] == '*')
+			ps.decl_ptr = dp_word_asterisk;
+		else
+			ps.decl_ptr = dp_other;
+		break;
+	case dp_other:
+		if (lsym == lsym_semicolon || lsym == lsym_rbrace)
+			ps.decl_ptr = dp_start;
+		if (lsym == lsym_lparen_or_lbracket
+		    && ps.prev_token == lsym_for)
+			ps.decl_ptr = dp_start;
+		break;
+	}
+}
+
 static int
 process_eof(void)
 {
@@ -1006,6 +1042,8 @@ indent(void)
 				move_com_to_code(lsym);
 		}
 
+		update_ps_decl_ptr(lsym);
+
 		switch (lsym) {
 
 		case lsym_newline:

Index: src/usr.bin/indent/indent.h
diff -u src/usr.bin/indent/indent.h:1.157 src/usr.bin/indent/indent.h:1.158
--- src/usr.bin/indent/indent.h:1.157	Mon May 22 10:28:59 2023
+++ src/usr.bin/indent/indent.h	Tue May 23 06:35:01 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.h,v 1.157 2023/05/22 10:28:59 rillig Exp $	*/
+/*	$NetBSD: indent.h,v 1.158 2023/05/23 06:35:01 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -371,6 +371,14 @@ extern struct parser_state {
 				 * are currently open; used to indent the
 				 * remaining lines of the statement,
 				 * initializer or declaration */
+	enum {
+	    dp_start,
+	    dp_word,
+	    dp_word_asterisk,
+	    dp_other,
+	} decl_ptr;		/* detects declarations like 'typename *x',
+				 * to prevent the '*' from being interpreted as
+				 * a binary operator */
 	paren_level_props paren[20];
 
 	/* Horizontal spacing for comments */

Index: src/usr.bin/indent/lexi.c
diff -u src/usr.bin/indent/lexi.c:1.203 src/usr.bin/indent/lexi.c:1.204
--- src/usr.bin/indent/lexi.c:1.203	Mon May 22 22:09:45 2023
+++ src/usr.bin/indent/lexi.c	Tue May 23 06:35:01 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: lexi.c,v 1.203 2023/05/22 22:09:45 rillig Exp $	*/
+/*	$NetBSD: lexi.c,v 1.204 2023/05/23 06:35:01 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: lexi.c,v 1.203 2023/05/22 22:09:45 rillig Exp $");
+__RCSID("$NetBSD: lexi.c,v 1.204 2023/05/23 06:35:01 rillig Exp $");
 
 #include <stdlib.h>
 #include <string.h>
@@ -438,6 +438,8 @@ found_typename:
 static bool
 is_asterisk_unary(void)
 {
+	if (ps.decl_ptr == dp_word)
+		return true;
 	if (ps.next_unary || ps.in_func_def_params)
 		return true;
 	if (ps.prev_token == lsym_word ||

Reply via email to