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

Reply via email to