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:
Jaakko Heinonen 2009-12-12 18:18:46 +00:00
parent 28c3507d53
commit d8eba599f5
14 changed files with 66 additions and 17 deletions

View File

@ -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>

View File

@ -0,0 +1,4 @@
# $FreeBSD$
all:
@m4 ${.CURDIR}/../regress.m4 ${.CURDIR}/regress.sh | sh /dev/stdin ${.CURDIR}

View File

@ -0,0 +1,2 @@
a b
e f g

View File

@ -0,0 +1,5 @@
a b
c d
e f
e f g
h i

View File

@ -0,0 +1,2 @@
a b
e f g

View File

@ -0,0 +1,2 @@
a b
e f g

View File

@ -0,0 +1,5 @@
a b
c d
e f
e f g
h i

View File

@ -0,0 +1,2 @@
a b
e f g

View File

@ -0,0 +1,5 @@
a
b
c
d
e

View File

@ -0,0 +1,3 @@
a
b
c

View File

@ -0,0 +1,3 @@
c
d
e

View 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()

View File

@ -0,0 +1,6 @@
#!/bin/sh
# $FreeBSD$
cd `dirname $0`
m4 ../regress.m4 regress.sh | sh

View File

@ -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);