On Wed, Jan 23 2019 18:01:24 -0500, Ted Unangst wrote:
> Lauri Tirkkonen wrote:
> > > > oh, interesting. that's sloppy. can you please fix that first, 
> > > > separately?
> > > 
> > > Sure, here it is.
> > 
> > Could you please take a look at it? It's been a couple weeks.
> 
> yup, sorry, slipped by. committed.

Thanks. What about the fgetln->getline diff (same as I sent previously
applies cleanly; reattached below)? I know you said you're concerned
about the extra copy, but as I pointed out the getline code path will
only be taken if mmopen() fails, the file is not seekable, or if grep
was compiled -DSMALL.

diff --git a/usr.bin/grep/file.c b/usr.bin/grep/file.c
index 4b3c689e4ab..87c49dd5cc0 100644
--- a/usr.bin/grep/file.c
+++ b/usr.bin/grep/file.c
@@ -34,10 +34,8 @@
 #include "grep.h"
 
 static char     fname[PATH_MAX];
-#ifndef NOZ
 static char    *lnbuf;
-static size_t   lnbuflen;
-#endif
+static size_t   lnbufsize;
 
 #define FILE_STDIO     0
 #define FILE_MMAP      1
@@ -73,9 +71,9 @@ gzfgetln(gzFile *f, size_t *len)
                        else
                                errx(2, "%s: %s", fname, gzerrstr);
                }
-               if (n >= lnbuflen) {
-                       lnbuflen *= 2;
-                       lnbuf = grep_realloc(lnbuf, ++lnbuflen);
+               if (n >= lnbufsize) {
+                       lnbufsize *= 2;
+                       lnbuf = grep_realloc(lnbuf, ++lnbufsize);
                }
                if (c == '\n')
                        break;
@@ -182,7 +180,13 @@ grep_fgetln(file_t *f, size_t *l)
 {
        switch (f->type) {
        case FILE_STDIO:
-               return fgetln(f->f, l);
+               if ((*l = getline(&lnbuf, &lnbufsize, f->f)) == -1) {
+                       if (ferror(f->f))
+                               err(2, "%s: getline", fname);
+                       else
+                               return NULL;
+               }
+               return lnbuf;
 #ifndef SMALL
        case FILE_MMAP:
                return mmfgetln(f->mmf, l);
diff --git a/usr.bin/grep/grep.c b/usr.bin/grep/grep.c
index 913cc97a0f3..cfac24b12aa 100644
--- a/usr.bin/grep/grep.c
+++ b/usr.bin/grep/grep.c
@@ -224,15 +224,19 @@ read_patterns(const char *fn)
 {
        FILE *f;
        char *line;
-       size_t len;
+       ssize_t len;
+       size_t linesize;
 
        if ((f = fopen(fn, "r")) == NULL)
                err(2, "%s", fn);
-       while ((line = fgetln(f, &len)) != NULL)
+       line = NULL;
+       linesize = 0;
+       while ((len = getline(&line, &linesize, f)) != -1)
                add_pattern(line, *line == '\n' ? 0 : len);
        if (ferror(f))
                err(2, "%s", fn);
        fclose(f);
+       free(line);
 }
 
 int
-- 
Lauri Tirkkonen | lotheac @ IRCnet

Reply via email to