In the same vein as my previous diff for join(1), make paste(1) use getline instead of fgetln.
diff --git a/usr.bin/paste/paste.c b/usr.bin/paste/paste.c index fd51bfa0a4c..185fb6d1535 100644 --- a/usr.bin/paste/paste.c +++ b/usr.bin/paste/paste.c @@ -107,8 +107,8 @@ parallel(char **argv) int cnt; char ch, *p; int opencnt, output; - char *buf, *lbuf; - size_t len; + char *line; + size_t len, linesize; for (cnt = 0; (p = *argv); ++argv, ++cnt) { if (!(lp = malloc(sizeof(struct list)))) @@ -123,17 +123,21 @@ parallel(char **argv) SIMPLEQ_INSERT_TAIL(&head, lp, entries); } + line = NULL; + linesize = 0; + for (opencnt = cnt; opencnt;) { output = 0; SIMPLEQ_FOREACH(lp, &head, entries) { - lbuf = NULL; if (!lp->fp) { if (output && lp->cnt && (ch = delim[(lp->cnt - 1) % delimcnt])) putchar(ch); continue; } - if (!(buf = fgetln(lp->fp, &len))) { + if ((len = getline(&line, &linesize, lp->fp)) == -1) { + if (ferror(lp->fp)) + err(1, "getline"); if (!--opencnt) break; if (lp->fp != stdin) @@ -144,15 +148,8 @@ parallel(char **argv) putchar(ch); continue; } - if (buf[len - 1] == '\n') - buf[len - 1] = '\0'; - else { - if ((lbuf = malloc(len + 1)) == NULL) - err(1, "malloc"); - memcpy(lbuf, buf, len); - lbuf[len] = '\0'; - buf = lbuf; - } + if (line[len - 1] == '\n') + line[len - 1] = '\0'; /* * make sure that we don't print any delimiters * unless there's a non-empty file. @@ -164,13 +161,12 @@ parallel(char **argv) putchar(ch); } else if ((ch = delim[(lp->cnt - 1) % delimcnt])) putchar(ch); - (void)printf("%s", buf); - if (lbuf) - free(lbuf); + (void)printf("%s", line); } if (output) putchar('\n'); } + free(line); } void @@ -179,30 +175,27 @@ sequential(char **argv) FILE *fp; int cnt; char ch, *p, *dp; - char *buf, *lbuf; - size_t len; + char *line; + size_t len, linesize; + line = NULL; + linesize = 0; for (; (p = *argv); ++argv) { - lbuf = NULL; if (p[0] == '-' && !p[1]) fp = stdin; else if (!(fp = fopen(p, "r"))) { warn("%s", p); continue; } - if ((buf = fgetln(fp, &len))) { + len = getline(&line, &linesize, fp); + if (len == -1 && ferror(fp)) + err(1, "getline"); + else if (len != -1) { for (cnt = 0, dp = delim;;) { - if (buf[len - 1] == '\n') - buf[len - 1] = '\0'; - else { - if ((lbuf = malloc(len + 1)) == NULL) - err(1, "malloc"); - memcpy(lbuf, buf, len); - lbuf[len] = '\0'; - buf = lbuf; - } - (void)printf("%s", buf); - if (!(buf = fgetln(fp, &len))) + if (line[len - 1] == '\n') + line[len - 1] = '\0'; + (void)printf("%s", line); + if ((len = getline(&line, &linesize, fp)) == -1) break; if ((ch = *dp++)) putchar(ch); @@ -215,8 +208,8 @@ sequential(char **argv) } if (fp != stdin) (void)fclose(fp); - free(lbuf); } + free(line); } int -- Lauri Tirkkonen | lotheac @ IRCnet