Rewritten by mistake.
authorMatt Kraai <kraai@debian.org>
Mon, 28 Aug 2000 03:53:27 +0000 (03:53 -0000)
committerMatt Kraai <kraai@debian.org>
Mon, 28 Aug 2000 03:53:27 +0000 (03:53 -0000)
coreutils/tee.c
tee.c

index c15408b..dc98760 100644 (file)
@@ -2,9 +2,8 @@
 /*
  * Mini tee implementation for busybox
  *
- *
  * Copyright (C) 1999,2000 by Lineo, inc.
- * Written by John Beppu <beppu@lineo.com>
+ * Written by Matt Kraai <kraai@alumni.carnegiemellon.edu>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 
 #include "internal.h"
-#include <errno.h>
+#include <getopt.h>
 #include <stdio.h>
 
-/* FileList _______________________________________________________________ */
-
-#define FL_MAX 1024
-static FILE **FileList;
-static int FL_end;
-
-typedef void (FL_Function) (FILE * file, char c);
-
-
-/* apply a function to everything in FileList */
-static void FL_apply(FL_Function * f, char c)
-{
-       int i;
-
-       for (i = 0; i <= FL_end; i++) {
-               f(FileList[i], c);
-       }
-}
-
-/* FL_Function for writing to files*/
-static void tee_fwrite(FILE * file, char c)
-{
-       fputc(c, file);
-}
-
-/* FL_Function for closing files */
-static void tee_fclose(FILE * file, char c)
-{
-       fclose(file);
-}
-
-/* ________________________________________________________________________ */
-
-/* BusyBoxed tee(1) */
-int tee_main(int argc, char **argv)
+int
+tee_main(int argc, char **argv)
 {
-       int i;
-       char c;
-       char opt;
-       char opt_fopen[2] = "w";
-       FILE *file;
-
-       /* parse argv[] */
-       for (i = 1; i < argc; i++) {
-               if (argv[i][0] == '-') {
-                       opt = argv[i][1];
-                       switch (opt) {
-                       case 'a':
-                               opt_fopen[0] = 'a';
-                               break;
-#if 0
-                       case 'i':
-                               fprintf(stderr, "ignore interrupt not implemented\n");
-                               break;
-#endif
-                       default:
-                               usage(tee_usage);
-                       }
-               } else {
+       char *mode = "w";
+       int c, i, status = 0, nfiles = 0;
+       FILE **files;
+
+       while ((c = getopt(argc, argv, "a")) != EOF) {
+               switch (c) {
+               case 'a': 
+                       mode = "a";
                        break;
+               default:
+                       usage(tee_usage);
                }
        }
 
-       /* init FILE pointers */
-       FileList = calloc(FL_MAX, sizeof(FILE*));
-       if (!FileList) {
-               errorMsg("%s\n", strerror(errno));
-               exit(1);
-       }
-       FL_end = 0;
-       FileList[0] = stdout;
-       for (; i < argc; i++) {
-               /* add a file to FileList */
-               file = fopen(argv[i], opt_fopen);
-               if (!file) {
-                       continue;
-               }
-               if (FL_end < FL_MAX) {
-                       FileList[++FL_end] = file;
+       files = (FILE **)xmalloc(sizeof(FILE *) * (argc - optind + 1));
+       files[nfiles++] = stdout;
+       while (optind < argc) {
+               if ((files[nfiles++] = fopen(argv[optind++], mode)) == NULL) {
+                       nfiles--;
+                       errorMsg("%s: %s\n", argv[optind-1], strerror(errno));
+                       status = 1;
                }
        }
 
-       /* read and redirect */
-       while ((c = (char) getchar()) && (!feof(stdin))) {
-               FL_apply(tee_fwrite, c);
-       }
+       while ((c = getchar()) != EOF)
+               for (i = 0; i < nfiles; i++)
+                       putc(c, files[i]);
 
-       /* clean up */
-       FL_apply(tee_fclose, 0);
-       /* Don't bother to close files  Exit does that 
-        * automagically, so we can save a few bytes */
-       /* free(FileList); */
-       return(0);
+       return status;
 }
 
-/* $Id: tee.c,v 1.13 2000/07/16 20:57:15 kraai Exp $ */
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/
diff --git a/tee.c b/tee.c
index c15408b..dc98760 100644 (file)
--- a/tee.c
+++ b/tee.c
@@ -2,9 +2,8 @@
 /*
  * Mini tee implementation for busybox
  *
- *
  * Copyright (C) 1999,2000 by Lineo, inc.
- * Written by John Beppu <beppu@lineo.com>
+ * Written by Matt Kraai <kraai@alumni.carnegiemellon.edu>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  */
 
 #include "internal.h"
-#include <errno.h>
+#include <getopt.h>
 #include <stdio.h>
 
-/* FileList _______________________________________________________________ */
-
-#define FL_MAX 1024
-static FILE **FileList;
-static int FL_end;
-
-typedef void (FL_Function) (FILE * file, char c);
-
-
-/* apply a function to everything in FileList */
-static void FL_apply(FL_Function * f, char c)
-{
-       int i;
-
-       for (i = 0; i <= FL_end; i++) {
-               f(FileList[i], c);
-       }
-}
-
-/* FL_Function for writing to files*/
-static void tee_fwrite(FILE * file, char c)
-{
-       fputc(c, file);
-}
-
-/* FL_Function for closing files */
-static void tee_fclose(FILE * file, char c)
-{
-       fclose(file);
-}
-
-/* ________________________________________________________________________ */
-
-/* BusyBoxed tee(1) */
-int tee_main(int argc, char **argv)
+int
+tee_main(int argc, char **argv)
 {
-       int i;
-       char c;
-       char opt;
-       char opt_fopen[2] = "w";
-       FILE *file;
-
-       /* parse argv[] */
-       for (i = 1; i < argc; i++) {
-               if (argv[i][0] == '-') {
-                       opt = argv[i][1];
-                       switch (opt) {
-                       case 'a':
-                               opt_fopen[0] = 'a';
-                               break;
-#if 0
-                       case 'i':
-                               fprintf(stderr, "ignore interrupt not implemented\n");
-                               break;
-#endif
-                       default:
-                               usage(tee_usage);
-                       }
-               } else {
+       char *mode = "w";
+       int c, i, status = 0, nfiles = 0;
+       FILE **files;
+
+       while ((c = getopt(argc, argv, "a")) != EOF) {
+               switch (c) {
+               case 'a': 
+                       mode = "a";
                        break;
+               default:
+                       usage(tee_usage);
                }
        }
 
-       /* init FILE pointers */
-       FileList = calloc(FL_MAX, sizeof(FILE*));
-       if (!FileList) {
-               errorMsg("%s\n", strerror(errno));
-               exit(1);
-       }
-       FL_end = 0;
-       FileList[0] = stdout;
-       for (; i < argc; i++) {
-               /* add a file to FileList */
-               file = fopen(argv[i], opt_fopen);
-               if (!file) {
-                       continue;
-               }
-               if (FL_end < FL_MAX) {
-                       FileList[++FL_end] = file;
+       files = (FILE **)xmalloc(sizeof(FILE *) * (argc - optind + 1));
+       files[nfiles++] = stdout;
+       while (optind < argc) {
+               if ((files[nfiles++] = fopen(argv[optind++], mode)) == NULL) {
+                       nfiles--;
+                       errorMsg("%s: %s\n", argv[optind-1], strerror(errno));
+                       status = 1;
                }
        }
 
-       /* read and redirect */
-       while ((c = (char) getchar()) && (!feof(stdin))) {
-               FL_apply(tee_fwrite, c);
-       }
+       while ((c = getchar()) != EOF)
+               for (i = 0; i < nfiles; i++)
+                       putc(c, files[i]);
 
-       /* clean up */
-       FL_apply(tee_fclose, 0);
-       /* Don't bother to close files  Exit does that 
-        * automagically, so we can save a few bytes */
-       /* free(FileList); */
-       return(0);
+       return status;
 }
 
-/* $Id: tee.c,v 1.13 2000/07/16 20:57:15 kraai Exp $ */
+/*
+Local Variables:
+c-file-style: "linux"
+c-basic-offset: 4
+tab-width: 4
+End:
+*/