blob: 1e30d11667ed921782ccd29726a39c884dabf615 [file] [log] [blame]
Theodore Ts'oc762c8e1997-06-17 03:52:12 +00001/*
2 * sim_progress.c --- simple progress meter
3 */
4
5#include "resize2fs.h"
6
7struct ext2_sim_progress {
8 FILE *f;
9 char *label;
10 int labelwidth;
11 int barwidth;
12 __u32 maxdone;
13 __u32 current;
14 int shown;
15 int flags;
16};
17
18static errcode_t ext2fs_progress_display(ext2_sim_progmeter prog)
19{
20 int i, width;
21
22 fputs(prog->label, prog->f);
23 width = prog->labelwidth - strlen(prog->label);
24 while (width-- > 0)
25 putc(' ', prog->f);
26 if (prog->labelwidth + prog->barwidth > 80) {
27 fputs("\n", prog->f);
28 for (width = prog->labelwidth; width > 0; width--)
29 putc(' ', prog->f);
30 }
31 for (i=0; i < prog->barwidth; i++)
32 putc('-', prog->f);
33 for (i=0; i < prog->barwidth; i++)
34 putc('\b', prog->f);
35 fflush(prog->f);
36 return 0;
37}
38
39
40void ext2fs_progress_update(ext2_sim_progmeter prog, __u32 current)
41{
42 int old_level, level, num, i;
43
44 level = prog->barwidth * current / prog->maxdone;
45 old_level = prog->barwidth * prog->current / prog->maxdone;
46 prog->current = current;
47
48 num = level - old_level;
49 if (num == 0)
50 return;
51
52 if (num > 0) {
53 for (i=0; i < num; i++)
54 putc('X', prog->f);
55 } else {
56 num = -num;
57 for (i=0; i < num; i++)
58 putc('\b', prog->f);
59 for (i=0; i < num; i++)
60 putc('-', prog->f);
61 for (i=0; i < num; i++)
62 putc('\b', prog->f);
63 }
64 fflush(prog->f);
65}
66
67errcode_t ext2fs_progress_init(ext2_sim_progmeter *ret_prog,
68 const char *label,
69 int labelwidth, int barwidth,
70 __u32 maxdone, int flags)
71{
72 ext2_sim_progmeter prog;
73
74 prog = malloc(sizeof(struct ext2_sim_progress));
75 if (!prog)
76 return ENOMEM;
77 memset(prog, 0, sizeof(struct ext2_sim_progress));
78
79 prog->label = malloc(strlen(label)+1);
80 if (!prog->label) {
81 free(prog);
82 return ENOMEM;
83 }
84 strcpy(prog->label, label);
85 prog->labelwidth = labelwidth;
86 prog->barwidth = barwidth;
87 prog->flags = flags;
88 prog->maxdone = maxdone;
89 prog->current = 0;
90 prog->shown = 0;
91 prog->f = stdout;
92
93 *ret_prog = prog;
94
95 return ext2fs_progress_display(prog);
96}
97
98void ext2fs_progress_close(ext2_sim_progmeter prog)
99{
100
101 if (prog->label)
102 free(prog->label);
103 free(prog);
104 printf("\n");
105 return;
106}