]> Zhao Yanbai Git Server - minix.git/commitdiff
Al's window feature
authorBen Gras <ben@minix3.org>
Fri, 12 Aug 2005 11:23:33 +0000 (11:23 +0000)
committerBen Gras <ben@minix3.org>
Fri, 12 Aug 2005 11:23:33 +0000 (11:23 +0000)
commands/simple/progressbar.c

index a4405b13844ace6cd827bfe46c58843b8435c3ad..a5c40a6b07ea13710e06d1e2160ee04256bf9ff6 100755 (executable)
@@ -3,6 +3,7 @@
 #include <stdlib.h>
 #include <time.h>
 #include <unistd.h>
+#include <string.h>
 
 _PROTOTYPE(int main, (int argc, char **argv));
 
@@ -14,31 +15,31 @@ prettyprogress(long b, long maxb, time_t starttime)
   double bpsec;
   time(&now);
   spent = now - starttime;
+  printf("\r");        /* Make sure progress bar starts at beginning of line */
   if(spent > 0 && (bpsec = (double)b / spent) > 0) {
        int len, i;
        long secremain, minremain, hremain;
          secremain = (maxb - b) / bpsec;
          minremain = (secremain / 60) % 60;
          hremain = secremain / 3600;
-       len = fprintf(stderr, "Remain %ld files. ", maxb-b);
+       len = printf("Remainining: %ld files. ", maxb-b);
 
 #if 0
-       len += fprintf(stderr, "ETA: %d:%02d:%02d ",
+       len += printf("ETA: %d:%02d:%02d ",
                hremain, minremain, secremain % 60);
 #endif
 
-       len += fprintf(stderr, " [");
+       len += printf(" [");
 
 #define WIDTH 77
        len = WIDTH - len;
        for(i = 0; i < (b * (len-1) / maxb); i++) 
-               fprintf(stderr, "=");
-       fprintf(stderr, "|");
+               printf("=");
+       printf("|");
        for(; i < len-2; i++) 
-               fprintf(stderr, "-");
-       fprintf(stderr, "]\r");
-       fflush(stderr);
-  }
+               printf("-");
+       printf("]\n");
+  } else printf("\n");
 
   return;
 }
@@ -48,24 +49,29 @@ int argc;
 char *argv[];
 {
        long i = 0, count = 0;
+       int l;
        char line[2000];
        time_t start;
        if(argc < 2) return 1;
        count = atol(argv[1]);
        if(count < 1) return 1;
-       sync();
        time(&start);
        printf("\n");
+#define LINES 5
+       for(l = 1; l <= LINES+1; l++) printf("\n");
+       printf("\e[A");
+       sleep(1);
        while(fgets(line, sizeof(line), stdin)) {
                i++;
-               printf("\e[K%s", line);
+               for(l = 0; l <= LINES; l++)  printf("\e[A");
                if(i <= count) prettyprogress(i, count, start);
-               else printf("\r");
-               printf("\e[A");
-               fflush(stdout);
+               else printf("\n");
+               printf("\e[M");
+               for(l = 0; l < LINES; l++)  printf("\e[B");
+               printf("\r%s\e[A", line);
        }
 
-       fprintf(stderr, "\nDone.\e[K\n");
+       printf("\nDone.\e[K\n");
 
        return 0;
 }