a fix from openbsd.
XXX is it better to output a newline? > revision 1.7 > date: 2000/06/04 23:52:19; author: aaron; state: Exp; lines: +30 -14 > Handle the case where the last line of input does not contain a newline; issue > reported by marc@snafu.org. The main thing here is we use fgetln() instead of > fgets(), also giving us the advantage of being able to handle lines of > unlimited length. Some -Wall and other fixes from millert@ as well.
This commit is contained in:
parent
80843b35d1
commit
656cf52a10
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: cut.c,v 1.17 2005/02/17 17:35:47 xtraeme Exp $ */
|
/* $NetBSD: cut.c,v 1.18 2005/03/22 21:56:28 yamt Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1989, 1993
|
* Copyright (c) 1989, 1993
|
||||||
@ -42,7 +42,7 @@ __COPYRIGHT("@(#) Copyright (c) 1989, 1993\n\
|
|||||||
#if 0
|
#if 0
|
||||||
static char sccsid[] = "@(#)cut.c 8.3 (Berkeley) 5/4/95";
|
static char sccsid[] = "@(#)cut.c 8.3 (Berkeley) 5/4/95";
|
||||||
#endif
|
#endif
|
||||||
__RCSID("$NetBSD: cut.c,v 1.17 2005/02/17 17:35:47 xtraeme Exp $");
|
__RCSID("$NetBSD: cut.c,v 1.18 2005/03/22 21:56:28 yamt Exp $");
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@ -222,19 +222,27 @@ f_cut(FILE *fp, const char *fname)
|
|||||||
int ch, field, isdelim;
|
int ch, field, isdelim;
|
||||||
char *pos, *p, sep;
|
char *pos, *p, sep;
|
||||||
int output;
|
int output;
|
||||||
char lbuf[_POSIX2_LINE_MAX + 1];
|
size_t len;
|
||||||
|
char *lbuf, *tbuf;
|
||||||
|
|
||||||
for (sep = dchar; fgets(lbuf, sizeof(lbuf), fp);) {
|
for (sep = dchar, tbuf = NULL; (lbuf = fgetln(fp, &len));) {
|
||||||
output = 0;
|
output = 0;
|
||||||
|
if (lbuf[len - 1] != '\n') {
|
||||||
|
/* no newline at the end of the last line so add one */
|
||||||
|
if ((tbuf = (char *)malloc(len + 1)) == NULL)
|
||||||
|
err(1, NULL);
|
||||||
|
memcpy(tbuf, lbuf, len);
|
||||||
|
tbuf[len] = '\n';
|
||||||
|
lbuf = tbuf;
|
||||||
|
}
|
||||||
for (isdelim = 0, p = lbuf;; ++p) {
|
for (isdelim = 0, p = lbuf;; ++p) {
|
||||||
if (!(ch = *p))
|
ch = *p;
|
||||||
errx(1, "%s: line too long.", fname);
|
|
||||||
/* this should work if newline is delimiter */
|
/* this should work if newline is delimiter */
|
||||||
if (ch == sep)
|
if (ch == sep)
|
||||||
isdelim = 1;
|
isdelim = 1;
|
||||||
if (ch == '\n') {
|
if (ch == '\n') {
|
||||||
if (!isdelim && !sflag)
|
if (!isdelim && !sflag)
|
||||||
(void)printf("%s", lbuf);
|
(void)fwrite(lbuf, len, 1, stdout);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -266,6 +274,8 @@ f_cut(FILE *fp, const char *fname)
|
|||||||
}
|
}
|
||||||
(void)putchar('\n');
|
(void)putchar('\n');
|
||||||
}
|
}
|
||||||
|
if (tbuf)
|
||||||
|
free(tbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user