Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Oct 2020 14:41:20 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r367171 - in stable/12/usr.bin/col: . tests
Message-ID:  <202010301441.09UEfKCB080331@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Fri Oct 30 14:41:19 2020
New Revision: 367171
URL: https://svnweb.freebsd.org/changeset/base/367171

Log:
  MFC r366577:
  col(1): Fix a couple of bugs
  
  PR:	249308

Added:
  stable/12/usr.bin/col/tests/hlf.in
     - copied unchanged from r366577, head/usr.bin/col/tests/hlf.in
  stable/12/usr.bin/col/tests/hlf2.in
     - copied unchanged from r366577, head/usr.bin/col/tests/hlf2.in
  stable/12/usr.bin/col/tests/nl.in
     - copied unchanged from r366577, head/usr.bin/col/tests/nl.in
  stable/12/usr.bin/col/tests/nl2.in
     - copied unchanged from r366577, head/usr.bin/col/tests/nl2.in
  stable/12/usr.bin/col/tests/nl3.in
     - copied unchanged from r366577, head/usr.bin/col/tests/nl3.in
  stable/12/usr.bin/col/tests/rlf3.in
     - copied unchanged from r366577, head/usr.bin/col/tests/rlf3.in
Modified:
  stable/12/usr.bin/col/col.c
  stable/12/usr.bin/col/tests/Makefile
  stable/12/usr.bin/col/tests/col_test.sh   (contents, props changed)
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/usr.bin/col/col.c
==============================================================================
--- stable/12/usr.bin/col/col.c	Fri Oct 30 14:40:48 2020	(r367170)
+++ stable/12/usr.bin/col/col.c	Fri Oct 30 14:41:19 2020	(r367171)
@@ -100,7 +100,7 @@ struct line_str {
 };
 
 static void	addto_lineno(int *, int);
-static LINE   *alloc_line(void);
+static LINE	*alloc_line(void);
 static void	dowarn(int);
 static void	flush_line(LINE *);
 static void	flush_lines(int);
@@ -109,7 +109,7 @@ static void	free_line(LINE *);
 static void	usage(void);
 
 static CSET	last_set;		/* char_set of last char printed */
-static LINE    *lines;
+static LINE	*lines;
 static int	compress_spaces;	/* if doing space -> tab conversion */
 static int	fine;			/* if `fine' resolution (half lines) */
 static int	max_bufd_lines;		/* max # of half lines to keep in memory */
@@ -340,8 +340,16 @@ main(int argc, char **argv)
 	}
 	if (ferror(stdin))
 		err(1, NULL);
-	if (extra_lines)
+	if (extra_lines) {
+		/*
+		 * Extra lines only exist if no lines have been flushed
+		 * yet. This means that 'lines' must point to line zero
+		 * after we flush the extra lines.
+		 */
 		flush_lines(extra_lines);
+		l = lines;
+		this_line = 0;
+	}
 
 	/* goto the last line that had a character on it */
 	for (; l->l_next; l = l->l_next)
@@ -353,14 +361,22 @@ main(int argc, char **argv)
 		PUTC(SI);
 
 	/* flush out the last few blank lines */
-	if (max_line > this_line)
-		nblank_lines = max_line - this_line;
-	if (max_line & 1)
-		nblank_lines++;
+	if (max_line >= this_line)
+		nblank_lines = max_line - this_line + (max_line & 1);
+	if (nblank_lines == 0)
+		/* end with a newline even if the source doesn't */
+		nblank_lines = 2;
 	flush_blanks();
 	exit(0);
 }
 
+/*
+ * Prints the first 'nflush' lines. Printed lines are freed.
+ * After this function returns, 'lines' points to the first
+ * of the remaining lines, and 'nblank_lines' will have the
+ * number of half line feeds between the final flushed line
+ * and the first remaining line.
+ */
 static void
 flush_lines(int nflush)
 {
@@ -372,11 +388,10 @@ flush_lines(int nflush)
 		if (l->l_line) {
 			flush_blanks();
 			flush_line(l);
+			free(l->l_line);
 		}
-		if (l->l_line || l->l_next)
+		if (l->l_next)
 			nblank_lines++;
-		if (l->l_line)
-			(void)free(l->l_line);
 		free_line(l);
 	}
 	if (lines)
@@ -384,9 +399,8 @@ flush_lines(int nflush)
 }
 
 /*
- * Print a number of newline/half newlines.  If fine flag is set, nblank_lines
- * is the number of half line feeds, otherwise it is the number of whole line
- * feeds.
+ * Print a number of newline/half newlines.
+ * nblank_lines is the number of half line feeds.
  */
 static void
 flush_blanks(void)

Modified: stable/12/usr.bin/col/tests/Makefile
==============================================================================
--- stable/12/usr.bin/col/tests/Makefile	Fri Oct 30 14:40:48 2020	(r367170)
+++ stable/12/usr.bin/col/tests/Makefile	Fri Oct 30 14:41:19 2020	(r367171)
@@ -4,8 +4,14 @@ PACKAGE=	tests
 
 ATF_TESTS_SH=	col_test
 
-${PACKAGE}FILES+=	\
+${PACKAGE}FILES+= \
+		hlf.in \
+		hlf2.in \
+		nl.in \
+		nl2.in \
+		nl3.in \
 		rlf.in \
-		rlf2.in
+		rlf2.in \
+		rlf3.in
 
 .include <bsd.test.mk>

Modified: stable/12/usr.bin/col/tests/col_test.sh
==============================================================================
--- stable/12/usr.bin/col/tests/col_test.sh	Fri Oct 30 14:40:48 2020	(r367170)
+++ stable/12/usr.bin/col/tests/col_test.sh	Fri Oct 30 14:41:19 2020	(r367171)
@@ -1,5 +1,44 @@
 # $FreeBSD$
 
+atf_test_case nl
+
+nl_head()
+{
+	atf_set "descr" "testing just newlines"
+}
+nl_body()
+{
+	atf_check \
+		-o inline:"a\nb\n" \
+		-e empty \
+		-s exit:0 \
+		col < $(atf_get_srcdir)/nl.in
+
+	atf_check \
+		-o inline:"a\nb\n" \
+		-e empty \
+		-s exit:0 \
+		col -f < $(atf_get_srcdir)/nl.in
+
+	atf_check \
+		-o inline:"a\nb\n" \
+		-e empty \
+		-s exit:0 \
+		col < $(atf_get_srcdir)/nl2.in
+
+	atf_check \
+		-o inline:"a\nb\n" \
+		-e empty \
+		-s exit:0 \
+		col -f < $(atf_get_srcdir)/nl2.in
+
+	atf_check \
+		-o inline:"a\n\nb\n\n" \
+		-e empty \
+		-s exit:0 \
+		col < $(atf_get_srcdir)/nl3.in
+}
+
 atf_test_case rlf
 
 rlf_head()
@@ -25,9 +64,53 @@ rlf_body()
 		-e empty \
 		-s exit:0 \
 		col -x < $(atf_get_srcdir)/rlf2.in
+
+	atf_check \
+		-o inline:" b\na\n" \
+		-e empty \
+		-s exit:0 \
+		col < $(atf_get_srcdir)/rlf3.in
 }
 
+atf_test_case hlf
+
+hlf_head()
+{
+	atf_set "descr" "testing half line feed"
+}
+hlf_body()
+{
+	atf_check \
+		-o inline:"a f\naf\n" \
+		-e empty \
+		-s exit:0 \
+		col < $(atf_get_srcdir)/hlf.in
+
+	atf_check \
+		-o inline:"a f9
+ f9
+a\n" \
+		-e empty \
+		-s exit:0 \
+		col -f < $(atf_get_srcdir)/hlf.in
+
+	atf_check \
+		-o inline:"a\n f\n" \
+		-e empty \
+		-s exit:0 \
+		col < $(atf_get_srcdir)/hlf2.in
+
+	atf_check \
+		-o inline:"a9
+ f\n9"  \
+		-e empty \
+		-s exit:0 \
+		col -f < $(atf_get_srcdir)/hlf2.in
+}
+
 atf_init_test_cases()
 {
+	atf_add_test_case nl
 	atf_add_test_case rlf
+	atf_add_test_case hlf
 }

Copied: stable/12/usr.bin/col/tests/hlf.in (from r366577, head/usr.bin/col/tests/hlf.in)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.bin/col/tests/hlf.in	Fri Oct 30 14:41:19 2020	(r367171, copy of r366577, head/usr.bin/col/tests/hlf.in)
@@ -0,0 +1,2 @@
+a
+a8f8f

Copied: stable/12/usr.bin/col/tests/hlf2.in (from r366577, head/usr.bin/col/tests/hlf2.in)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.bin/col/tests/hlf2.in	Fri Oct 30 14:41:19 2020	(r367171, copy of r366577, head/usr.bin/col/tests/hlf2.in)
@@ -0,0 +1 @@
+a9f

Copied: stable/12/usr.bin/col/tests/nl.in (from r366577, head/usr.bin/col/tests/nl.in)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.bin/col/tests/nl.in	Fri Oct 30 14:41:19 2020	(r367171, copy of r366577, head/usr.bin/col/tests/nl.in)
@@ -0,0 +1,2 @@
+a
+b

Copied: stable/12/usr.bin/col/tests/nl2.in (from r366577, head/usr.bin/col/tests/nl2.in)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.bin/col/tests/nl2.in	Fri Oct 30 14:41:19 2020	(r367171, copy of r366577, head/usr.bin/col/tests/nl2.in)
@@ -0,0 +1,2 @@
+a
+b
\ No newline at end of file

Copied: stable/12/usr.bin/col/tests/nl3.in (from r366577, head/usr.bin/col/tests/nl3.in)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.bin/col/tests/nl3.in	Fri Oct 30 14:41:19 2020	(r367171, copy of r366577, head/usr.bin/col/tests/nl3.in)
@@ -0,0 +1,4 @@
+a
+
+b
+

Copied: stable/12/usr.bin/col/tests/rlf3.in (from r366577, head/usr.bin/col/tests/rlf3.in)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/12/usr.bin/col/tests/rlf3.in	Fri Oct 30 14:41:19 2020	(r367171, copy of r366577, head/usr.bin/col/tests/rlf3.in)
@@ -0,0 +1 @@
+ab



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202010301441.09UEfKCB080331>