Module Name:    src
Committed By:   rillig
Date:           Fri Jun  9 22:01:26 UTC 2023

Modified Files:
        src/tests/usr.bin/indent: lsym_newline.c
        src/usr.bin/indent: indent.c indent.h io.c

Log Message:
indent: trim trailing blank lines


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/tests/usr.bin/indent/lsym_newline.c
cvs rdiff -u -r1.347 -r1.348 src/usr.bin/indent/indent.c
cvs rdiff -u -r1.182 -r1.183 src/usr.bin/indent/indent.h
cvs rdiff -u -r1.207 -r1.208 src/usr.bin/indent/io.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_newline.c
diff -u src/tests/usr.bin/indent/lsym_newline.c:1.4 src/tests/usr.bin/indent/lsym_newline.c:1.5
--- src/tests/usr.bin/indent/lsym_newline.c:1.4	Sun Apr 24 10:36:37 2022
+++ src/tests/usr.bin/indent/lsym_newline.c	Fri Jun  9 22:01:26 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lsym_newline.c,v 1.4 2022/04/24 10:36:37 rillig Exp $ */
+/* $NetBSD: lsym_newline.c,v 1.5 2023/06/09 22:01:26 rillig Exp $ */
 
 /*
  * Tests for the token lsym_newline, which represents a forced line break in
@@ -32,3 +32,15 @@ int		var =
 + 3
 + 4;
 //indent end
+
+
+// Trim trailing blank lines.
+//indent input
+int x;
+
+
+//indent end
+
+//indent run -di0
+int x;
+//indent end

Index: src/usr.bin/indent/indent.c
diff -u src/usr.bin/indent/indent.c:1.347 src/usr.bin/indent/indent.c:1.348
--- src/usr.bin/indent/indent.c:1.347	Fri Jun  9 16:23:43 2023
+++ src/usr.bin/indent/indent.c	Fri Jun  9 22:01:26 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.c,v 1.347 2023/06/09 16:23:43 rillig Exp $	*/
+/*	$NetBSD: indent.c,v 1.348 2023/06/09 22:01:26 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: indent.c,v 1.347 2023/06/09 16:23:43 rillig Exp $");
+__RCSID("$NetBSD: indent.c,v 1.348 2023/06/09 22:01:26 rillig Exp $");
 
 #include <sys/param.h>
 #include <err.h>
@@ -83,7 +83,6 @@ struct buffer com;
 bool found_err;
 bool had_eof;
 int line_no = 1;
-enum indent_enabled indent_enabled;
 
 static int ifdef_level;
 static struct parser_state state_stack[5];
@@ -380,17 +379,11 @@ is_function_pointer_declaration(void)
 static int
 process_eof(void)
 {
-	if (lab.len > 0 || code.len > 0 || com.len > 0)
-		output_line();
-	if (indent_enabled != indent_on) {
-		indent_enabled = indent_last_off_line;
-		output_line();
-	}
+	output_finish();
 
 	if (ps.psyms.top > 1)	/* check for balanced braces */
 		diag(1, "Stuff missing from end of file");
 
-	fflush(output);
 	return found_err ? EXIT_FAILURE : EXIT_SUCCESS;
 }
 

Index: src/usr.bin/indent/indent.h
diff -u src/usr.bin/indent/indent.h:1.182 src/usr.bin/indent/indent.h:1.183
--- src/usr.bin/indent/indent.h:1.182	Fri Jun  9 16:23:43 2023
+++ src/usr.bin/indent/indent.h	Fri Jun  9 22:01:26 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: indent.h,v 1.182 2023/06/09 16:23:43 rillig Exp $	*/
+/*	$NetBSD: indent.h,v 1.183 2023/06/09 22:01:26 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
@@ -472,6 +472,7 @@ int ind_add(int, const char *, size_t);
 
 void inp_skip(void);
 char inp_next(void);
+void output_finish(void);
 
 lexer_symbol lexi(void);
 void diag(int, const char *, ...) __printflike(2, 3);

Index: src/usr.bin/indent/io.c
diff -u src/usr.bin/indent/io.c:1.207 src/usr.bin/indent/io.c:1.208
--- src/usr.bin/indent/io.c:1.207	Fri Jun  9 08:10:58 2023
+++ src/usr.bin/indent/io.c	Fri Jun  9 22:01:26 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: io.c,v 1.207 2023/06/09 08:10:58 rillig Exp $	*/
+/*	$NetBSD: io.c,v 1.208 2023/06/09 22:01:26 rillig Exp $	*/
 
 /*-
  * SPDX-License-Identifier: BSD-4-Clause
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: io.c,v 1.207 2023/06/09 08:10:58 rillig Exp $");
+__RCSID("$NetBSD: io.c,v 1.208 2023/06/09 22:01:26 rillig Exp $");
 
 #include <stdio.h>
 
@@ -48,10 +48,12 @@ struct buffer inp;
 const char *inp_p;
 
 struct output_state out;
+enum indent_enabled indent_enabled;
 static int out_ind;		/* width of the line that is being written */
 static unsigned wrote_newlines = 2;	/* 0 in the middle of a line, 1 after a
 					 * single '\n', > 1 means there were (n
 					 * - 1) blank lines above */
+static unsigned buffered_blank_lines;
 static int paren_indent;
 
 
@@ -108,15 +110,24 @@ inp_next(void)
 static void
 output_newline(void)
 {
-	fputc('\n', output);
-	debug_println("output_newline");
+	buffered_blank_lines++;
 	wrote_newlines++;
 	out_ind = 0;
 }
 
 static void
+write_buffered_blank_lines(void)
+{
+	for (; buffered_blank_lines > 0; buffered_blank_lines--) {
+		fputc('\n', output);
+		debug_println("output_newline");
+	}
+}
+
+static void
 output_range(const char *s, size_t len)
 {
+	write_buffered_blank_lines();
 	fwrite(s, 1, len, output);
 	debug_vis_range("output_range \"", s, len, "\"\n");
 	for (size_t i = 0; i < len; i++)
@@ -127,6 +138,8 @@ output_range(const char *s, size_t len)
 static void
 output_indent(int new_ind)
 {
+	write_buffered_blank_lines();
+
 	int ind = out_ind;
 
 	if (opt.use_tabs) {
@@ -148,6 +161,22 @@ output_indent(int new_ind)
 	out_ind = ind;
 }
 
+void
+output_finish(void)
+{
+	if (lab.len > 0 || code.len > 0 || com.len > 0)
+		output_line();
+	if (indent_enabled == indent_on) {
+		if (buffered_blank_lines > 1)
+			buffered_blank_lines = 1;
+		write_buffered_blank_lines();
+	} else {
+		indent_enabled = indent_last_off_line;
+		output_line();
+	}
+	fflush(output);
+}
+
 static bool
 want_blank_line(void)
 {

Reply via email to