Module Name:    src
Committed By:   rillig
Date:           Wed Jun 14 09:31:05 UTC 2023

Modified Files:
        src/tests/usr.bin/indent: lsym_comment.c psym_decl.c
        src/usr.bin/indent: debug.c indent.h io.c pr_comment.c

Log Message:
indent: clean up handling of comments

One less moving part in the parser state.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/tests/usr.bin/indent/lsym_comment.c
cvs rdiff -u -r1.4 -r1.5 src/tests/usr.bin/indent/psym_decl.c
cvs rdiff -u -r1.56 -r1.57 src/usr.bin/indent/debug.c
cvs rdiff -u -r1.191 -r1.192 src/usr.bin/indent/indent.h
cvs rdiff -u -r1.217 -r1.218 src/usr.bin/indent/io.c
cvs rdiff -u -r1.163 -r1.164 src/usr.bin/indent/pr_comment.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_comment.c
diff -u src/tests/usr.bin/indent/lsym_comment.c:1.20 src/tests/usr.bin/indent/lsym_comment.c:1.21
--- src/tests/usr.bin/indent/lsym_comment.c:1.20	Sat Jun 10 16:43:56 2023
+++ src/tests/usr.bin/indent/lsym_comment.c	Wed Jun 14 09:31:05 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_comment.c,v 1.20 2023/06/10 16:43:56 rillig Exp $ */
+/* $NetBSD: lsym_comment.c,v 1.21 2023/06/14 09:31:05 rillig Exp $ */
 
 /*
  * Tests for the token lsym_comment, which starts a comment.
@@ -43,7 +43,6 @@
  * - with varying opt.comment_column (-c0, -c1, -c33, -c80)
  * - with varying opt.decl_comment_column (-cd0, -cd1, -cd20, -cd33, -cd80)
  * - with/without ps.line_has_decl
- * - with/without ps.next_col_1
  *
  * - very long comments that overflow the buffer 'com'
  * - comments that come from save_com
@@ -1020,8 +1019,8 @@ f(void)
 
 
 /*
- * Test two completely empty lines in a wrap comment. The second empty line
- * covers the condition ps.next_col_1 in copy_comment_wrap.
+ * In a comment that is wrapped, one or more empty lines separate paragraphs.
+ * All of these empty lines are preserved.
  */
 //indent input
 /* line 1
@@ -1131,3 +1130,17 @@ int line;			// comment line 1
 // comment line 2
 int block;			/* comment line 1 comment line 2 */
 //indent end
+
+
+//indent input
+/*/ comment? or:not; /* */
+//indent end
+
+//indent run
+/* / comment? or:not; /* */
+//indent end
+
+//indent run -nfc1
+// $ FIXME: It's a comment, not code.
+/*/ comment ? or : not;		/* */
+//indent end

Index: src/tests/usr.bin/indent/psym_decl.c
diff -u src/tests/usr.bin/indent/psym_decl.c:1.4 src/tests/usr.bin/indent/psym_decl.c:1.5
--- src/tests/usr.bin/indent/psym_decl.c:1.4	Sun Apr 24 10:36:37 2022
+++ src/tests/usr.bin/indent/psym_decl.c	Wed Jun 14 09:31:05 2023
@@ -1,20 +1,17 @@
-/* $NetBSD: psym_decl.c,v 1.4 2022/04/24 10:36:37 rillig Exp $ */
+/* $NetBSD: psym_decl.c,v 1.5 2023/06/14 09:31:05 rillig Exp $ */
 
 /*
  * Tests for the parser symbol psym_decl, which represents a declaration.
  *
  * Since C99, declarations and statements can be mixed in blocks.
  *
- * A label can be followed by a statement but not by a declaration.
+ * In C, a label can be followed by a statement but not by a declaration.
  *
  * Indent distinguishes global and local declarations.
  *
  * Declarations can be for functions or for variables.
  */
 
-// TODO: prove that psym_decl can only ever occur at the top of the stack.
-// TODO: delete decl_level if the above is proven.
-
 //indent input
 int global_var;
 int global_array = [1,2,3,4];
@@ -36,3 +33,23 @@ int global_array = [
 		    4,
 ];
 //indent end
+
+
+// Declarations can be nested.
+//indent input
+struct level_1 {
+	union level_2 {
+		enum level_3 {
+			level_3_c_1,
+			level_3_c_2,
+		}		level_3;
+	}		level_2;
+} level_1;
+//indent end
+
+// The outermost declarator 'level_1' is indented as a global variable.
+// The inner declarators 'level_2' and 'level_3' are indented as local
+// variables.
+// XXX: This is inconsistent, as in practice, struct members are usually
+// aligned, while local variables aren't.
+//indent run-equals-input -ldi0

Index: src/usr.bin/indent/debug.c
diff -u src/usr.bin/indent/debug.c:1.56 src/usr.bin/indent/debug.c:1.57
--- src/usr.bin/indent/debug.c:1.56	Wed Jun 14 08:36:51 2023
+++ src/usr.bin/indent/debug.c	Wed Jun 14 09:31:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: debug.c,v 1.56 2023/06/14 08:36:51 rillig Exp $	*/
+/*	$NetBSD: debug.c,v 1.57 2023/06/14 09:31:05 rillig Exp $	*/
 
 /*-
  * Copyright (c) 2023 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: debug.c,v 1.56 2023/06/14 08:36:51 rillig Exp $");
+__RCSID("$NetBSD: debug.c,v 1.57 2023/06/14 09:31:05 rillig Exp $");
 
 #include <stdarg.h>
 #include <string.h>
@@ -363,10 +363,10 @@ debug_parser_state(void)
 	debug_ps_int(nparen);
 	debug_ps_paren();
 
-	state.heading = "horizontal spacing for comments";
-	debug_ps_int(comment_delta);
-	debug_ps_int(n_comment_delta);
-	debug_ps_int(com_ind);
+	state.heading = "indentation of comments";
+	debug_ps_int(comment_ind);
+	debug_ps_int(comment_shift);
+	debug_ps_bool(comment_in_first_line);
 
 	state.heading = "vertical spacing";
 	debug_ps_bool(break_after_comma);

Index: src/usr.bin/indent/indent.h
diff -u src/usr.bin/indent/indent.h:1.191 src/usr.bin/indent/indent.h:1.192
--- src/usr.bin/indent/indent.h:1.191	Wed Jun 14 08:36:51 2023
+++ src/usr.bin/indent/indent.h	Wed Jun 14 09:31:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.h,v 1.191 2023/06/14 08:36:51 rillig Exp $	*/
+/*	$NetBSD: indent.h,v 1.192 2023/06/14 09:31:05 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -71,7 +71,7 @@
 typedef enum lexer_symbol {
 	lsym_eof,
 	lsym_preprocessing,	/* the initial '#' of a preprocessing line */
-	lsym_newline,
+	lsym_newline,		/* outside block comments */
 	lsym_comment,		/* the initial '/ *' or '//' of a comment */
 
 	lsym_lparen,
@@ -229,8 +229,8 @@ extern struct options {
 					 * lined-up code within the margin */
 	bool lineup_to_parens;	/* whether continued code within parens will be
 				 * lined up to the open paren */
-	bool proc_calls_space;	/* whether function calls look like: foo (bar)
-				 * rather than foo(bar) */
+	bool proc_calls_space;	/* whether function calls look like 'foo (bar)'
+				 * rather than 'foo(bar)' */
 	bool procnames_start_line;	/* whether the names of functions being
 					 * defined get placed in column 1 (i.e.
 					 * a newline is placed between the type
@@ -376,15 +376,12 @@ extern struct parser_state {
 				 * initializer or declaration */
 	struct paren_level paren[20];
 
-	/* Horizontal spacing for comments */
+	/* Indentation of comments */
 
-	int comment_delta;	/* used to set up indentation for all lines of
-				 * a boxed comment after the first one */
-	int n_comment_delta;	/* remembers how many columns there were before
-				 * the start of a box comment so that
-				 * forthcoming lines of the comment are
-				 * indented properly */
-	int com_ind;		/* indentation of the current comment */
+	int comment_ind;	/* indentation of the current comment */
+	int comment_shift;	/* all but the first line of a boxed comment
+				 * are shifted this much to the right */
+	bool comment_in_first_line;
 
 	/* Vertical spacing */
 

Index: src/usr.bin/indent/io.c
diff -u src/usr.bin/indent/io.c:1.217 src/usr.bin/indent/io.c:1.218
--- src/usr.bin/indent/io.c:1.217	Sat Jun 10 21:36:38 2023
+++ src/usr.bin/indent/io.c	Wed Jun 14 09:31:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: io.c,v 1.217 2023/06/10 21:36:38 rillig Exp $	*/
+/*	$NetBSD: io.c,v 1.218 2023/06/14 09:31:05 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: io.c,v 1.217 2023/06/10 21:36:38 rillig Exp $");
+__RCSID("$NetBSD: io.c,v 1.218 2023/06/14 09:31:05 rillig Exp $");
 
 #include <stdio.h>
 
@@ -294,10 +294,14 @@ output_line_code(void)
 static void
 output_comment(void)
 {
-	int target_ind = ps.com_ind + ps.comment_delta;
+	int target_ind = ps.comment_ind;
 	const char *p;
 
-	/* consider original indentation in case this is a box comment */
+	if (!ps.comment_in_first_line)
+		target_ind += ps.comment_shift;
+	ps.comment_in_first_line = false;
+
+	/* consider the original indentation in case this is a box comment */
 	for (p = com.s; *p == '\t'; p++)
 		target_ind += opt.tabsize;
 
@@ -321,8 +325,6 @@ output_comment(void)
 
 	write_indent(target_ind);
 	write_range(p, com.len - (size_t)(p - com.s));
-
-	ps.comment_delta = ps.n_comment_delta;
 }
 
 static void

Index: src/usr.bin/indent/pr_comment.c
diff -u src/usr.bin/indent/pr_comment.c:1.163 src/usr.bin/indent/pr_comment.c:1.164
--- src/usr.bin/indent/pr_comment.c:1.163	Wed Jun 14 08:36:51 2023
+++ src/usr.bin/indent/pr_comment.c	Wed Jun 14 09:31:05 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: pr_comment.c,v 1.163 2023/06/14 08:36:51 rillig Exp $	*/
+/*	$NetBSD: pr_comment.c,v 1.164 2023/06/14 09:31:05 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: pr_comment.c,v 1.163 2023/06/14 08:36:51 rillig Exp $");
+__RCSID("$NetBSD: pr_comment.c,v 1.164 2023/06/14 09:31:05 rillig Exp $");
 
 #include <string.h>
 
@@ -58,7 +58,7 @@ com_add_delim(void)
 }
 
 static bool
-fits_in_one_line(int com_ind, int max_line_length)
+fits_in_one_line(int max_line_length)
 {
 	for (const char *start = inp_p, *p = start; *p != '\n'; p++) {
 		if (p[0] == '*' && p[1] == '/') {
@@ -66,18 +66,17 @@ fits_in_one_line(int com_ind, int max_li
 			    && ch_isblank(p[-1])
 			    && ch_isblank(p[-2]))
 				p--;
-			int len = ind_add(com_ind + 3,
+			int ind = ind_add(ps.comment_ind + 3,
 			    start, (size_t)(p - start));
-			len += p == start || ch_isblank(p[-1]) ? 2 : 3;
-			return len <= max_line_length;
+			ind += p == start || ch_isblank(p[-1]) ? 2 : 3;
+			return ind <= max_line_length;
 		}
 	}
 	return false;
 }
 
 static void
-analyze_comment(bool *p_may_wrap, bool *p_delim,
-    int *p_ind, int *p_line_length)
+analyze_comment(bool *p_may_wrap, bool *p_delim, int *p_line_length)
 {
 	bool may_wrap = true;
 	bool delim = false;
@@ -122,30 +121,28 @@ analyze_comment(bool *p_may_wrap, bool *
 		}
 	}
 
-	ps.com_ind = ind;
-
 	if (!may_wrap) {
 		/* Find out how much indentation there was originally, because
 		 * that much will have to be ignored by output_line. */
 		size_t len = (size_t)(inp_p - 2 - inp.s);
-		ps.n_comment_delta = -ind_add(0, inp.s, len);
+		ps.comment_shift = -ind_add(0, inp.s, len);
 	} else {
-		ps.n_comment_delta = 0;
+		ps.comment_shift = 0;
 		if (!(inp_p[0] == '\t' && !ch_isblank(inp_p[1])))
 			while (ch_isblank(inp_p[0]))
 				inp_p++;
 	}
 
+	ps.comment_ind = ind;
 	*p_may_wrap = may_wrap;
 	*p_delim = delim;
-	*p_ind = ind;
 	*p_line_length = line_length;
 }
 
 static void
-copy_comment_start(bool may_wrap, bool *delim, int ind, int line_length)
+copy_comment_start(bool may_wrap, bool *delim, int line_length)
 {
-	ps.comment_delta = 0;
+	ps.comment_in_first_line = true;
 	com_add_char('/');
 	com_add_char(token.s[token.len - 1]);	/* either '*' or '/' */
 
@@ -153,7 +150,7 @@ copy_comment_start(bool may_wrap, bool *
 		if (!ch_isblank(inp_p[0]))
 			com_add_char(' ');
 
-		if (*delim && fits_in_one_line(ind, line_length))
+		if (*delim && fits_in_one_line(line_length))
 			*delim = false;
 		if (*delim) {
 			output_line();
@@ -165,7 +162,7 @@ copy_comment_start(bool may_wrap, bool *
 static void
 copy_comment_wrap_text(int line_length, ssize_t *last_blank)
 {
-	int now_len = ind_add(ps.com_ind, com.s, com.len);
+	int now_len = ind_add(ps.comment_ind, com.s, com.len);
 	for (;;) {
 		char ch = inp_next();
 		if (ch_isblank(ch))
@@ -204,10 +201,10 @@ copy_comment_wrap_text(int line_length, 
 }
 
 static bool
-copy_comment_wrap_newline(ssize_t *last_blank, bool *seen_newline)
+copy_comment_wrap_newline(ssize_t *last_blank, bool seen_newline)
 {
 	*last_blank = -1;
-	if (*seen_newline) {
+	if (seen_newline) {
 		if (com.len == 0)
 			com_add_char(' ');	/* force empty output line */
 		if (com.len > 3) {
@@ -217,7 +214,6 @@ copy_comment_wrap_newline(ssize_t *last_
 		output_line();
 		com_add_delim();
 	} else {
-		*seen_newline = true;
 		if (!(com.len > 0 && ch_isblank(com.s[com.len - 1])))
 			com_add_char(' ');
 		*last_blank = (int)com.len - 1;
@@ -252,7 +248,7 @@ copy_comment_wrap_finish(int line_length
 		size_t len = com.len;
 		while (ch_isblank(com.s[len - 1]))
 			len--;
-		int end_ind = ind_add(ps.com_ind, com.s, len);
+		int end_ind = ind_add(ps.comment_ind, com.s, len);
 		if (end_ind + 3 > line_length)
 			output_line();
 	}
@@ -287,17 +283,17 @@ copy_comment_wrap(int line_length, bool 
 			if (had_eof)
 				goto unterminated_comment;
 			if (!copy_comment_wrap_newline(&last_blank,
-			    &seen_newline))
-				goto end_of_comment;
+			    seen_newline))
+				break;
+			seen_newline = true;
 		} else if (inp_p[0] == '*' && inp_p[1] == '/')
-			goto end_of_comment;
+			break;
 		else {
 			copy_comment_wrap_text(line_length, &last_blank);
 			seen_newline = false;
 		}
 	}
 
-end_of_comment:
 	copy_comment_wrap_finish(line_length, delim);
 	return;
 
@@ -348,10 +344,10 @@ void
 process_comment(void)
 {
 	bool may_wrap, delim;
-	int ind, line_length;
+	int line_length;
 
-	analyze_comment(&may_wrap, &delim, &ind, &line_length);
-	copy_comment_start(may_wrap, &delim, ind, line_length);
+	analyze_comment(&may_wrap, &delim, &line_length);
+	copy_comment_start(may_wrap, &delim, line_length);
 	if (may_wrap)
 		copy_comment_wrap(line_length, delim);
 	else

Reply via email to