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)
This commit is contained in:
parent
28c3507d53
commit
d8eba599f5
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=200442
@ -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 <bsd.subdir.mk>
|
||||
|
4
tools/regression/usr.bin/comm/Makefile
Normal file
4
tools/regression/usr.bin/comm/Makefile
Normal file
@ -0,0 +1,4 @@
|
||||
# $FreeBSD$
|
||||
|
||||
all:
|
||||
@m4 ${.CURDIR}/../regress.m4 ${.CURDIR}/regress.sh | sh /dev/stdin ${.CURDIR}
|
2
tools/regression/usr.bin/comm/regress.00.out
Normal file
2
tools/regression/usr.bin/comm/regress.00.out
Normal file
@ -0,0 +1,2 @@
|
||||
a b
|
||||
e f g
|
5
tools/regression/usr.bin/comm/regress.00a.in
Normal file
5
tools/regression/usr.bin/comm/regress.00a.in
Normal file
@ -0,0 +1,5 @@
|
||||
a b
|
||||
c d
|
||||
e f
|
||||
e f g
|
||||
h i
|
2
tools/regression/usr.bin/comm/regress.00b.in
Normal file
2
tools/regression/usr.bin/comm/regress.00b.in
Normal file
@ -0,0 +1,2 @@
|
||||
a b
|
||||
e f g
|
2
tools/regression/usr.bin/comm/regress.01.out
Normal file
2
tools/regression/usr.bin/comm/regress.01.out
Normal file
@ -0,0 +1,2 @@
|
||||
a b
|
||||
e f g
|
5
tools/regression/usr.bin/comm/regress.01a.in
Normal file
5
tools/regression/usr.bin/comm/regress.01a.in
Normal file
@ -0,0 +1,5 @@
|
||||
a b
|
||||
c d
|
||||
e f
|
||||
e f g
|
||||
h i
|
2
tools/regression/usr.bin/comm/regress.01b.in
Normal file
2
tools/regression/usr.bin/comm/regress.01b.in
Normal file
@ -0,0 +1,2 @@
|
||||
a b
|
||||
e f g
|
5
tools/regression/usr.bin/comm/regress.02.out
Normal file
5
tools/regression/usr.bin/comm/regress.02.out
Normal file
@ -0,0 +1,5 @@
|
||||
a
|
||||
b
|
||||
c
|
||||
d
|
||||
e
|
3
tools/regression/usr.bin/comm/regress.02a.in
Normal file
3
tools/regression/usr.bin/comm/regress.02a.in
Normal file
@ -0,0 +1,3 @@
|
||||
a
|
||||
b
|
||||
c
|
3
tools/regression/usr.bin/comm/regress.02b.in
Normal file
3
tools/regression/usr.bin/comm/regress.02b.in
Normal file
@ -0,0 +1,3 @@
|
||||
c
|
||||
d
|
||||
e
|
13
tools/regression/usr.bin/comm/regress.sh
Normal file
13
tools/regression/usr.bin/comm/regress.sh
Normal file
@ -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()
|
6
tools/regression/usr.bin/comm/regress.t
Normal file
6
tools/regression/usr.bin/comm/regress.t
Normal file
@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
# $FreeBSD$
|
||||
|
||||
cd `dirname $0`
|
||||
|
||||
m4 ../regress.m4 regress.sh | sh
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user