7
static unsigned long progress_max;
8
static unsigned int progress_pcent;
9
static unsigned long progress_n_upd;
10
static unsigned int progress_prevsec;
11
static struct timespec progress_start;
13
#define PROGRESS_CHARS 50
15
void progress_init(unsigned long count)
21
progress_n_upd = ULONG_MAX;
22
progress_prevsec = UINT_MAX;
25
for (i = 0; i < PROGRESS_CHARS; i++)
29
clock_gettime(CLOCK_MONOTONIC, &progress_start);}
31
void progress_tick(unsigned long cur)
33
unsigned int pcent, i, pos, sec;
36
pcent = (cur * 100) / progress_max;
37
if (progress_pcent == pcent && cur < progress_n_upd &&
40
progress_pcent = pcent;
41
pos = (pcent * PROGRESS_CHARS) / 101;
42
clock_gettime(CLOCK_MONOTONIC, &now);
45
for (i = 0; i <= pos; i++)
47
for (; i < PROGRESS_CHARS; i++)
49
printf("] %d%%", pcent);
51
sec = now.tv_sec - progress_start.tv_sec;
52
if (sec >= 5 && pcent > 0) {
53
unsigned int persec = cur / sec;
58
progress_n_upd = cur + persec;
59
rem_sec = ((sec * 100) + (pcent / 2)) / pcent - sec;
60
if (rem_sec > progress_prevsec)
61
rem_sec = progress_prevsec;
62
progress_prevsec = rem_sec;
64
printf(" ETA:%ds ", rem_sec);
66
printf(" ETA:%d:%02d:%02d ",
76
void progress_end(void)