On Sun, Sep 17, 2017 at 02:56:32AM +0000, Scott Cheloha wrote:
> 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 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!


> 
> 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));

-- 
I'm not entirely sure you are real.

Reply via email to