Hi,

This will make mg(1) ever so slightly more portable: downstream
will appreciate it.  And fgetln(3) was recently deprecated.

Misc. comments:

The comments about NUL and "the last line problem" aren't per se
applicable with getline(3) so I removed them.

I will say that if ever a command does *not* emit a trailing
newline that we will stub out the last byte, but I decided to take
the comments' authors at their word and continued to assume the
presence of a newline.  This can be rectified with:

        if (buf[len - 1] == '\n')
                buf[len - 1] = '\0';

The '};' in do_cscope() looked like a typo so I deleted the
semicolon.

I also noticed that there were no error checks after the read loops
so I added an echo print on ferror().  I don't know if this is
sufficient, but we weren't doing anything before, so it's a start.

Thoughts?

--
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 16 Sep 2017 22:44:50 -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,13 @@ cscreatelist(int f, int n)
        }
        addline(bp, title);
        addline(bp, "");
-       /* All lines are NUL terminated */
-       while ((line = fgetln(fpipe, &len)) != NULL) {
+       while ((len = getline(&line, &sz, fpipe)) != -1) {
                line[len - 1] = '\0';
                addline(bp, line);
        }
+       free(line);
+       if (ferror(fpipe))
+               ewprintf("Problem reading pipe");
        pclose(fpipe);
        return (popbuftop(bp, WNONE));
 }
@@ -397,7 +403,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 +457,17 @@ do_cscope(int i)
        addline(bp, title);
        addline(bp, "");
        addline(bp, 
"-------------------------------------------------------------------------------");
-       /* All lines are NUL terminated */
-       while ((buf = fgetln(fpipe, &len)) != NULL) {
+       while ((len = getline(&buf, &sz, fpipe)) != -1) {
                buf[len - 1] = '\0';
-               if (addentry(bp, buf) != TRUE)
+               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   16 Sep 2017 22:44:50 -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,13 @@ 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) {
+       while ((len = getline(&buf, &sz, fpipe)) != -1) {
                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