1 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <time.h> 5 #include <unistd.h> 6 #include <string.h> 7 8 int main(int argc, char **argv); 9 10 void 11 prettyprogress(long b, long maxb, time_t starttime) 12 { 13 /* print progress indication */ 14 time_t spent, now; 15 double bpsec; 16 time(&now); 17 spent = now - starttime; 18 printf("\r"); /* Make sure progress bar starts at beginning of line */ 19 if(spent > 0 && (bpsec = (double)b / spent) > 0) { 20 int len, i; 21 long secremain, minremain, hremain; 22 secremain = (maxb - b) / bpsec; 23 minremain = (secremain / 60) % 60; 24 hremain = secremain / 3600; 25 len = printf("Remaining: %ld files. ", maxb-b); 26 27 #if 0 28 len += printf("ETA: %d:%02d:%02d ", 29 hremain, minremain, secremain % 60); 30 #endif 31 32 len += printf(" ["); 33 34 #define WIDTH 77 35 len = WIDTH - len; 36 for(i = 0; i < (b * (len-1) / maxb); i++) 37 printf("="); 38 printf("|"); 39 for(; i < len-2; i++) 40 printf("-"); 41 printf("][K\n"); 42 } else printf("\n"); 43 44 return; 45 } 46 47 int main(argc, argv) 48 int argc; 49 char *argv[]; 50 { 51 long i = 0, count = 0; 52 int l; 53 char line[2000]; 54 time_t start; 55 if(argc < 2) return 1; 56 count = atol(argv[1]); 57 if(count < 0) return 1; 58 time(&start); 59 printf("\n"); 60 #define LINES 5 61 for(l = 1; l <= LINES+1; l++) printf("\n"); 62 printf("[A"); 63 while(fgets(line, sizeof(line), stdin)) { 64 char *nl; 65 i++; 66 for(l = 0; l <= LINES; l++) printf("[A"); 67 if(i <= count) prettyprogress(i, count, start); 68 else printf("\n"); 69 printf("[M"); 70 for(l = 0; l < LINES; l++) printf("[B"); 71 if((nl = strchr(line, '\n'))) *nl = '\0'; 72 line[78] = '\0'; 73 printf("\r%s\r", line); 74 } 75 76 printf("\nDone.[K\n"); 77 78 return 0; 79 } 80