progressbar.c

Go to the documentation of this file.
00001 
00002 #include <stdio.h>
00003 #include <stdlib.h>
00004 #include <time.h>
00005 #include <unistd.h>
00006 #include <string.h>
00007 
00008 _PROTOTYPE(int main, (int argc, char **argv));
00009 
00010 void
00011 prettyprogress(long b, long maxb, time_t starttime)
00012 {
00013   /* print progress indication */
00014   time_t spent, now;
00015   double bpsec;
00016   time(&now);
00017   spent = now - starttime;
00018   printf("\r"); /* Make sure progress bar starts at beginning of line */
00019   if(spent > 0 && (bpsec = (double)b / spent) > 0) {
00020         int len, i;
00021         long secremain, minremain, hremain;
00022           secremain = (maxb - b) / bpsec;
00023           minremain = (secremain / 60) % 60;
00024           hremain = secremain / 3600;
00025         len = printf("Remaining: %ld files. ", maxb-b);
00026 
00027 #if 0
00028         len += printf("ETA: %d:%02d:%02d ",
00029                 hremain, minremain, secremain % 60);
00030 #endif
00031 
00032         len += printf(" [");
00033 
00034 #define WIDTH 77
00035         len = WIDTH - len;
00036         for(i = 0; i < (b * (len-1) / maxb); i++) 
00037                 printf("=");
00038         printf("|");
00039         for(; i < len-2; i++) 
00040                 printf("-");
00041         printf("]\n");
00042   } else printf("\n");
00043 
00044   return;
00045 }
00046 
00047 int main(argc, argv)
00048 int argc;
00049 char *argv[];
00050 {
00051         long i = 0, count = 0;
00052         int l;
00053         char line[2000];
00054         time_t start;
00055         if(argc < 2) return 1;
00056         count = atol(argv[1]);
00057         if(count < 0) return 1;
00058         time(&start);
00059         printf("\n");
00060 #define LINES 5
00061         for(l = 1; l <= LINES+1; l++) printf("\n");
00062         printf("");
00063         while(fgets(line, sizeof(line), stdin)) {
00064                 char *nl;
00065                 i++;
00066                 for(l = 0; l <= LINES; l++)  printf("");
00067                 if(i <= count) prettyprogress(i, count, start);
00068                 else printf("\n");
00069                 printf("");
00070                 for(l = 0; l < LINES; l++)  printf("");
00071                 if((nl = strchr(line, '\n'))) *nl = '\0';
00072                 line[78] = '\0';
00073                 printf("\r%s\r", line);
00074         }
00075 
00076         printf("\nDone.\n");
00077 
00078         return 0;
00079 }

Generated on Fri Apr 14 22:57:10 2006 for minix by  doxygen 1.4.6