Whamcloud - gitweb
1e30d11667ed921782ccd29726a39c884dabf615
[tools/e2fsprogs.git] / resize / sim_progress.c
1 /*
2  * sim_progress.c --- simple progress meter
3  */
4
5 #include "resize2fs.h"
6
7 struct 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
18 static 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
40 void 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
67 errcode_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
98 void 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 }