From d8eba599f5e230965a7c7f5fea862da1907087de Mon Sep 17 00:00:00 2001 From: Jaakko Heinonen Date: Sat, 12 Dec 2009 18:18:46 +0000 Subject: [PATCH] Don't read the newline character to line buffer because lines are passed to wcscoll(3). Newline characters could cause incorrect results when comparing lines. Also, if an input line didn't contain a newline character, it was omitted from the output. According to my interpretation, SUSv3 requires that the newline is always printed. Add regression tests for the cases. [1] PR: bin/140976 Submitted by: D'Arcy Cain (original version) [1] Approved by: trasz (mentor) --- tools/regression/usr.bin/Makefile | 2 +- tools/regression/usr.bin/comm/Makefile | 4 +++ tools/regression/usr.bin/comm/regress.00.out | 2 ++ tools/regression/usr.bin/comm/regress.00a.in | 5 ++++ tools/regression/usr.bin/comm/regress.00b.in | 2 ++ tools/regression/usr.bin/comm/regress.01.out | 2 ++ tools/regression/usr.bin/comm/regress.01a.in | 5 ++++ tools/regression/usr.bin/comm/regress.01b.in | 2 ++ tools/regression/usr.bin/comm/regress.02.out | 5 ++++ tools/regression/usr.bin/comm/regress.02a.in | 3 ++ tools/regression/usr.bin/comm/regress.02b.in | 3 ++ tools/regression/usr.bin/comm/regress.sh | 13 +++++++++ tools/regression/usr.bin/comm/regress.t | 6 ++++ usr.bin/comm/comm.c | 29 +++++++++----------- 14 files changed, 66 insertions(+), 17 deletions(-) create mode 100644 tools/regression/usr.bin/comm/Makefile create mode 100644 tools/regression/usr.bin/comm/regress.00.out create mode 100644 tools/regression/usr.bin/comm/regress.00a.in create mode 100644 tools/regression/usr.bin/comm/regress.00b.in create mode 100644 tools/regression/usr.bin/comm/regress.01.out create mode 100644 tools/regression/usr.bin/comm/regress.01a.in create mode 100644 tools/regression/usr.bin/comm/regress.01b.in create mode 100644 tools/regression/usr.bin/comm/regress.02.out create mode 100644 tools/regression/usr.bin/comm/regress.02a.in create mode 100644 tools/regression/usr.bin/comm/regress.02b.in create mode 100644 tools/regression/usr.bin/comm/regress.sh create mode 100644 tools/regression/usr.bin/comm/regress.t diff --git a/tools/regression/usr.bin/Makefile b/tools/regression/usr.bin/Makefile index 6e6d6f124b1..b88669b6f8b 100644 --- a/tools/regression/usr.bin/Makefile +++ b/tools/regression/usr.bin/Makefile @@ -1,5 +1,5 @@ # $FreeBSD$ -SUBDIR= calendar file2c join jot m4 printf sed tr uudecode uuencode xargs lastcomm +SUBDIR= calendar comm file2c join jot m4 printf sed tr uudecode uuencode xargs lastcomm .include diff --git a/tools/regression/usr.bin/comm/Makefile b/tools/regression/usr.bin/comm/Makefile new file mode 100644 index 00000000000..b937d41a4e4 --- /dev/null +++ b/tools/regression/usr.bin/comm/Makefile @@ -0,0 +1,4 @@ +# $FreeBSD$ + +all: + @m4 ${.CURDIR}/../regress.m4 ${.CURDIR}/regress.sh | sh /dev/stdin ${.CURDIR} diff --git a/tools/regression/usr.bin/comm/regress.00.out b/tools/regression/usr.bin/comm/regress.00.out new file mode 100644 index 00000000000..89a65daab38 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.00.out @@ -0,0 +1,2 @@ +a b +e f g diff --git a/tools/regression/usr.bin/comm/regress.00a.in b/tools/regression/usr.bin/comm/regress.00a.in new file mode 100644 index 00000000000..85b5cd53a6b --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.00a.in @@ -0,0 +1,5 @@ +a b +c d +e f +e f g +h i diff --git a/tools/regression/usr.bin/comm/regress.00b.in b/tools/regression/usr.bin/comm/regress.00b.in new file mode 100644 index 00000000000..89a65daab38 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.00b.in @@ -0,0 +1,2 @@ +a b +e f g diff --git a/tools/regression/usr.bin/comm/regress.01.out b/tools/regression/usr.bin/comm/regress.01.out new file mode 100644 index 00000000000..05ab154ecba --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.01.out @@ -0,0 +1,2 @@ +a b +e f g diff --git a/tools/regression/usr.bin/comm/regress.01a.in b/tools/regression/usr.bin/comm/regress.01a.in new file mode 100644 index 00000000000..78c410b7d75 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.01a.in @@ -0,0 +1,5 @@ +a b +c d +e f +e f g +h i diff --git a/tools/regression/usr.bin/comm/regress.01b.in b/tools/regression/usr.bin/comm/regress.01b.in new file mode 100644 index 00000000000..05ab154ecba --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.01b.in @@ -0,0 +1,2 @@ +a b +e f g diff --git a/tools/regression/usr.bin/comm/regress.02.out b/tools/regression/usr.bin/comm/regress.02.out new file mode 100644 index 00000000000..a451adbbb24 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.02.out @@ -0,0 +1,5 @@ +a +b + c + d + e diff --git a/tools/regression/usr.bin/comm/regress.02a.in b/tools/regression/usr.bin/comm/regress.02a.in new file mode 100644 index 00000000000..1c943a98887 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.02a.in @@ -0,0 +1,3 @@ +a +b +c \ No newline at end of file diff --git a/tools/regression/usr.bin/comm/regress.02b.in b/tools/regression/usr.bin/comm/regress.02b.in new file mode 100644 index 00000000000..36019ee78df --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.02b.in @@ -0,0 +1,3 @@ +c +d +e \ No newline at end of file diff --git a/tools/regression/usr.bin/comm/regress.sh b/tools/regression/usr.bin/comm/regress.sh new file mode 100644 index 00000000000..774093f0c42 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.sh @@ -0,0 +1,13 @@ +# $FreeBSD$ + +LC_ALL=C; export LC_ALL + +echo 1..3 + +REGRESSION_START($1) + +REGRESSION_TEST(`00', `comm -12 regress.00a.in regress.00b.in') +REGRESSION_TEST(`01', `comm -12 regress.01a.in regress.01b.in') +REGRESSION_TEST(`02', `comm regress.02a.in regress.02b.in') + +REGRESSION_END() diff --git a/tools/regression/usr.bin/comm/regress.t b/tools/regression/usr.bin/comm/regress.t new file mode 100644 index 00000000000..a82aacd9886 --- /dev/null +++ b/tools/regression/usr.bin/comm/regress.t @@ -0,0 +1,6 @@ +#!/bin/sh +# $FreeBSD$ + +cd `dirname $0` + +m4 ../regress.m4 regress.sh | sh diff --git a/usr.bin/comm/comm.c b/usr.bin/comm/comm.c index ea926731135..5e1ab540b65 100644 --- a/usr.bin/comm/comm.c +++ b/usr.bin/comm/comm.c @@ -163,7 +163,7 @@ main(int argc, char *argv[]) if (!comp) { read1 = read2 = 1; if (col3 != NULL) - (void)printf("%ls%ls", col3, line1); + (void)printf("%ls%ls\n", col3, line1); continue; } @@ -172,12 +172,12 @@ main(int argc, char *argv[]) read1 = 1; read2 = 0; if (col1 != NULL) - (void)printf("%ls%ls", col1, line1); + (void)printf("%ls%ls\n", col1, line1); } else { read1 = 0; read2 = 1; if (col2 != NULL) - (void)printf("%ls%ls", col2, line2); + (void)printf("%ls%ls\n", col2, line2); } } exit(0); @@ -190,19 +190,16 @@ getline(wchar_t *buf, size_t *buflen, FILE *fp) wint_t ch; bufpos = 0; - do { - if ((ch = getwc(fp)) != WEOF) { - if (bufpos + 2 >= *buflen) { - *buflen = *buflen * 2; - buf = reallocf(buf, *buflen * sizeof(*buf)); - if (buf == NULL) - return (NULL); - } - buf[bufpos++] = ch; + while ((ch = getwc(fp)) != WEOF && ch != '\n') { + if (bufpos + 1 >= *buflen) { + *buflen = *buflen * 2; + buf = reallocf(buf, *buflen * sizeof(*buf)); + if (buf == NULL) + return (NULL); } - } while (ch != WEOF && ch != '\n'); - if (bufpos + 1 != *buflen) - buf[bufpos] = '\0'; + buf[bufpos++] = ch; + } + buf[bufpos] = '\0'; return (bufpos != 0 || ch == '\n' ? buf : NULL); } @@ -212,7 +209,7 @@ show(FILE *fp, const char *fn, const wchar_t *offset, wchar_t *buf, size_t *bufl { do { - (void)printf("%ls%ls", offset, buf); + (void)printf("%ls%ls\n", offset, buf); } while ((buf = getline(buf, buflen, fp)) != NULL); if (ferror(fp)) err(1, "%s", fn); -- 2.45.2