On Sun, Apr 21, 2013 at 01:33:55PM -0400, Ted Unangst wrote:
> ok, it's not a rewrite, but I changed a lot of the lines.
> 
> Use better types, check errors against -1, delete some casts, stack
> buffer eliminates one malloc, braces for long blocks.

As long as you're in there, why not eliminate LIST as well and just
use 'struct list'?

.... Ken

> 
> 
> Index: tee.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/tee/tee.c,v
> retrieving revision 1.7
> diff -u -p -r1.7 tee.c
> --- tee.c     27 Oct 2009 23:59:44 -0000      1.7
> +++ tee.c     21 Apr 2013 07:27:16 -0000
> @@ -42,30 +42,41 @@
>  #include <locale.h>
>  #include <err.h>
>  
> -typedef struct _list {
> -     struct _list *next;
> +typedef struct list {
> +     struct list *next;
>       int fd;
>       char *name;
>  } LIST;
>  LIST *head;
>  
> -void add(int, char *);
> +static void
> +add(int fd, char *name)
> +{
> +     LIST *p;
> +
> +     if ((p = malloc(sizeof(LIST))) == NULL)
> +             err(1, NULL);
> +     p->fd = fd;
> +     p->name = name;
> +     p->next = head;
> +     head = p;
> +}
>  
>  int
>  main(int argc, char *argv[])
>  {
>       LIST *p;
> -     int n, fd, rval, wval;
> +     int fd;
> +     ssize_t n, rval, wval;
>       char *bp;
>       int append, ch, exitval;
> -     char *buf;
> -#define      BSIZE (8 * 1024)
> +     char buf[8192];
>  
>       setlocale(LC_ALL, "");
>  
>       append = 0;
> -     while ((ch = getopt(argc, argv, "ai")) != -1)
> -             switch((char)ch) {
> +     while ((ch = getopt(argc, argv, "ai")) != -1) {
> +             switch(ch) {
>               case 'a':
>                       append = 1;
>                       break;
> @@ -77,23 +88,24 @@ main(int argc, char *argv[])
>                       (void)fprintf(stderr, "usage: tee [-ai] [file ...]\n");
>                       exit(1);
>               }
> +     }
>       argv += optind;
>       argc -= optind;
>  
> -     if ((buf = malloc((size_t)BSIZE)) == NULL)
> -             err(1, NULL);
> -
>       add(STDOUT_FILENO, "stdout");
>  
> -     for (exitval = 0; *argv; ++argv)
> -             if ((fd = open(*argv, append ? O_WRONLY|O_CREAT|O_APPEND :
> -                 O_WRONLY|O_CREAT|O_TRUNC, DEFFILEMODE)) < 0) {
> +     exitval = 0;
> +     while (*argv) {
> +             if ((fd = open(*argv, O_WRONLY | O_CREAT |
> +                 (append ? O_APPEND : O_TRUNC), DEFFILEMODE)) == -1) {
>                       warn("%s", *argv);
>                       exitval = 1;
>               } else
>                       add(fd, *argv);
> +             argv++;
> +     }
>  
> -     while ((rval = read(STDIN_FILENO, buf, BSIZE)) > 0)
> +     while ((rval = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
>               for (p = head; p; p = p->next) {
>                       n = rval;
>                       bp = buf;
> @@ -106,7 +118,8 @@ main(int argc, char *argv[])
>                               bp += wval;
>                       } while (n -= wval);
>               }
> -     if (rval < 0) {
> +     }
> +     if (rval == -1) {
>               warn("read");
>               exitval = 1;
>       }
> @@ -119,17 +132,4 @@ main(int argc, char *argv[])
>       }
>  
>       exit(exitval);
> -}
> -
> -void
> -add(int fd, char *name)
> -{
> -     LIST *p;
> -
> -     if ((p = malloc((size_t)sizeof(LIST))) == NULL)
> -             err(1, NULL);
> -     p->fd = fd;
> -     p->name = name;
> -     p->next = head;
> -     head = p;
>  }
> 
> 

  • tee rewrite Ted Unangst
    • Re: tee rewrite Kenneth R Westerback

Reply via email to