aboutsummaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/cut/cut.c37
1 files changed, 20 insertions, 17 deletions
diff --git a/usr.bin/cut/cut.c b/usr.bin/cut/cut.c
index df4a2d7eb132..60ff5a31062a 100644
--- a/usr.bin/cut/cut.c
+++ b/usr.bin/cut/cut.c
@@ -268,14 +268,15 @@ b_cut(FILE *fp, const char *fname __unused)
static int
b_n_cut(FILE *fp, const char *fname)
{
- size_t col, i, lbuflen;
- char *lbuf;
+ size_t col, i, bufsize = 0;
+ ssize_t lbuflen;
+ char *lbuf = NULL;
int canwrite, clen, warned;
mbstate_t mbs;
memset(&mbs, 0, sizeof(mbs));
warned = 0;
- while ((lbuf = fgetln(fp, &lbuflen)) != NULL) {
+ while ((lbuflen = getline(&lbuf, &bufsize, fp)) >= 0) {
for (col = 0; lbuflen > 0; col += clen) {
if ((clen = mbrlen(lbuf, lbuflen, &mbs)) < 0) {
if (!warned) {
@@ -324,6 +325,7 @@ b_n_cut(FILE *fp, const char *fname)
if (lbuflen > 0)
putchar('\n');
}
+ free(lbuf);
return (warned);
}
@@ -382,21 +384,22 @@ f_cut(FILE *fp, const char *fname)
int field, i, isdelim;
char *pos, *p;
int output;
- char *lbuf, *mlbuf;
- size_t clen, lbuflen, reallen;
+ char *lbuf = NULL;
+ size_t clen, bufsize = 0, reallen;
+ ssize_t lbuflen;
- mlbuf = NULL;
- while ((lbuf = fgetln(fp, &lbuflen)) != NULL) {
+ while ((lbuflen = getline(&lbuf, &bufsize, fp)) >= 0) {
reallen = lbuflen;
/* Assert EOL has a newline. */
- if (*(lbuf + lbuflen - 1) != '\n') {
+ if (lbuflen > 0 && *(lbuf + lbuflen - 1) != '\n') {
/* Can't have > 1 line with no trailing newline. */
- mlbuf = malloc(lbuflen + 1);
- if (mlbuf == NULL)
- err(1, "malloc");
- memcpy(mlbuf, lbuf, lbuflen);
- *(mlbuf + lbuflen) = '\n';
- lbuf = mlbuf;
+ if ((ssize_t)bufsize < (lbuflen + 1)) {
+ bufsize = lbuflen + 1;
+ lbuf = realloc(lbuf, bufsize);
+ }
+ if (lbuf == NULL)
+ err(1, "realloc");
+ lbuf[lbuflen] = '\n';
reallen++;
}
output = 0;
@@ -404,7 +407,7 @@ f_cut(FILE *fp, const char *fname)
clen = mbrtowc(&ch, p, lbuf + reallen - p, NULL);
if (clen == (size_t)-1 || clen == (size_t)-2) {
warnc(EILSEQ, "%s", fname);
- free(mlbuf);
+ free(lbuf);
return (1);
}
if (clen == 0)
@@ -431,7 +434,7 @@ f_cut(FILE *fp, const char *fname)
NULL);
if (clen == (size_t)-1 || clen == (size_t)-2) {
warnc(EILSEQ, "%s", fname);
- free(mlbuf);
+ free(lbuf);
return (1);
}
if (clen == 0)
@@ -463,7 +466,7 @@ f_cut(FILE *fp, const char *fname)
}
(void)putchar('\n');
}
- free(mlbuf);
+ free(lbuf);
return (0);
}