summaryrefslogtreecommitdiff
path: root/minix/commands/progressbar/progressbar.c
blob: 4065fa9e5d22c020f2f1de92194f62a02b4f7a77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char **argv);

void
prettyprogress(long b, long maxb, time_t starttime)
{
  /* print progress indication */
  time_t spent, now;
  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 = printf("Remaining: %ld files. ", maxb-b);

#if 0
  	len += printf("ETA: %d:%02d:%02d ",
  		hremain, minremain, secremain % 60);
#endif

	len += printf(" [");

#define WIDTH 77
  	len = WIDTH - len;
  	for(i = 0; i < (b * (len-1) / maxb); i++) 
  		printf("=");
 	printf("|");
  	for(; i < len-2; i++) 
  		printf("-");
  	printf("]\n");
  } else printf("\n");

  return;
}

int main(argc, argv)
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 < 0) return 1;
	time(&start);
	printf("\n");
#define LINES 5
	for(l = 1; l <= LINES+1; l++) printf("\n");
	printf("");
	while(fgets(line, sizeof(line), stdin)) {
		char *nl;
		i++;
		for(l = 0; l <= LINES; l++)  printf("");
		if(i <= count) prettyprogress(i, count, start);
		else printf("\n");
		printf("");
		for(l = 0; l < LINES; l++)  printf("");
		if((nl = strchr(line, '\n'))) *nl = '\0';
		line[78] = '\0';
		printf("\r%s\r", line);
	}

  	printf("\nDone.\n");

	return 0;
}