> On Oct 11, 2017, at 2:36 AM, Florian Obser <flor...@openbsd.org> wrote:
> 
> On Sun, Sep 17, 2017 at 02:56:32AM +0000, Scott Cheloha wrote:
>> 
>> 
>>      if (buf[len - 1] == '\n')
>>              buf[len - 1] = '\0';
> 
> the diff reads fine to me, but code tends to get copied around,
> can you send a diff with those lines added please? That's the
> canonical way of using getline I believe and there is no good
> reason for mg to be different, thanks!

here you go

--
Scott Cheloha

Index: usr.bin/mg/cscope.c
===================================================================
RCS file: /cvs/src/usr.bin/mg/cscope.c,v
retrieving revision 1.16
diff -u -p -r1.16 cscope.c
--- usr.bin/mg/cscope.c 19 Jan 2016 14:51:00 -0000      1.16
+++ usr.bin/mg/cscope.c 12 Oct 2017 04:11:36 -0000
@@ -166,9 +166,13 @@ cscreatelist(int f, int n)
        struct stat sb;
        FILE *fpipe;
        char dir[NFILEN], cmd[BUFSIZ], title[BUFSIZ], *line, *bufp;
-       size_t len;
+       size_t sz;
+       ssize_t len;
        int clen;
 
+       line = NULL;
+       sz = 0;
+
        if (getbufcwd(dir, sizeof(dir)) == FALSE)
                dir[0] = '\0';
 
@@ -221,11 +225,14 @@ cscreatelist(int f, int n)
        }
        addline(bp, title);
        addline(bp, "");
-       /* All lines are NUL terminated */
-       while ((line = fgetln(fpipe, &len)) != NULL) {
-               line[len - 1] = '\0';
+       while ((len = getline(&line, &sz, fpipe)) != -1) {
+               if (line[len - 1] == '\n')
+                       line[len - 1] = '\0';
                addline(bp, line);
        }
+       free(line);
+       if (ferror(fpipe))
+               ewprintf("Problem reading pipe");
        pclose(fpipe);
        return (popbuftop(bp, WNONE));
 }
@@ -397,7 +404,11 @@ do_cscope(int i)
        char pattern[MAX_TOKEN], cmd[BUFSIZ], title[BUFSIZ];
        char *p, *buf;
        int clen, nores = 0;
-       size_t len;
+       size_t sz;
+       ssize_t len;
+
+       buf = NULL;
+       sz = 0;
 
        /* If current buffer isn't a source file just return */
        if (fnmatch("*.[chy]", curbp->b_fname, 0) != 0) {
@@ -447,13 +458,18 @@ do_cscope(int i)
        addline(bp, title);
        addline(bp, "");
        addline(bp, 
"-------------------------------------------------------------------------------");
-       /* All lines are NUL terminated */
-       while ((buf = fgetln(fpipe, &len)) != NULL) {
-               buf[len - 1] = '\0';
-               if (addentry(bp, buf) != TRUE)
+       while ((len = getline(&buf, &sz, fpipe)) != -1) {
+               if (buf[len - 1] == '\n')
+                       buf[len - 1] = '\0';
+               if (addentry(bp, buf) != TRUE) {
+                       free(buf);
                        return (FALSE);
+               }
                nores = 1;
-       };
+       }
+       free(buf);
+       if (ferror(fpipe))
+               ewprintf("Problem reading pipe");
        pclose(fpipe);
        addline(bp, 
"-------------------------------------------------------------------------------");
        if (nores == 0)
Index: usr.bin/mg/grep.c
===================================================================
RCS file: /cvs/src/usr.bin/mg/grep.c,v
retrieving revision 1.44
diff -u -p -r1.44 grep.c
--- usr.bin/mg/grep.c   19 Mar 2015 21:48:05 -0000      1.44
+++ usr.bin/mg/grep.c   12 Oct 2017 04:11:36 -0000
@@ -178,12 +178,16 @@ compile_mode(const char *name, const cha
        struct buffer   *bp;
        FILE    *fpipe;
        char    *buf;
-       size_t   len;
+       size_t   sz;
+       ssize_t  len;
        int      ret, n;
        char     cwd[NFILEN], qcmd[NFILEN];
        char     timestr[NTIME];
        time_t   t;
 
+       buf = NULL;
+       sz = 0;
+
        n = snprintf(qcmd, sizeof(qcmd), "%s 2>&1", command);
        if (n < 0 || n >= sizeof(qcmd))
                return (NULL);
@@ -210,15 +214,14 @@ compile_mode(const char *name, const cha
                ewprintf("Problem opening pipe");
                return (NULL);
        }
-       /*
-        * We know that our commands are nice and the last line will end with
-        * a \n, so we don't need to try to deal with the last line problem
-        * in fgetln.
-        */
-       while ((buf = fgetln(fpipe, &len)) != NULL) {
-               buf[len - 1] = '\0';
+       while ((len = getline(&buf, &sz, fpipe)) != -1) {
+               if (buf[len - 1] == '\n')
+                       buf[len - 1] = '\0';
                addline(bp, buf);
        }
+       free(buf);
+       if (ferror(fpipe))
+               ewprintf("Problem reading pipe");
        ret = pclose(fpipe);
        t = time(NULL);
        strftime(timestr, sizeof(timestr), "%a %b %e %T %Y", localtime(&t));

Reply via email to