1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * sim_progress.c --- simple progress meter
3*6a54128fSAndroid Build Coastguard Worker *
4*6a54128fSAndroid Build Coastguard Worker * Copyright (C) 1997, 1998 by Theodore Ts'o and
5*6a54128fSAndroid Build Coastguard Worker * PowerQuest, Inc.
6*6a54128fSAndroid Build Coastguard Worker *
7*6a54128fSAndroid Build Coastguard Worker * Copyright (C) 1999, 2000 by Theodore Ts'o
8*6a54128fSAndroid Build Coastguard Worker *
9*6a54128fSAndroid Build Coastguard Worker * %Begin-Header%
10*6a54128fSAndroid Build Coastguard Worker * This file may be redistributed under the terms of the GNU Public
11*6a54128fSAndroid Build Coastguard Worker * License.
12*6a54128fSAndroid Build Coastguard Worker * %End-Header%
13*6a54128fSAndroid Build Coastguard Worker */
14*6a54128fSAndroid Build Coastguard Worker
15*6a54128fSAndroid Build Coastguard Worker #include "config.h"
16*6a54128fSAndroid Build Coastguard Worker #include "resize2fs.h"
17*6a54128fSAndroid Build Coastguard Worker
18*6a54128fSAndroid Build Coastguard Worker struct ext2_sim_progress {
19*6a54128fSAndroid Build Coastguard Worker FILE *f;
20*6a54128fSAndroid Build Coastguard Worker char *label;
21*6a54128fSAndroid Build Coastguard Worker int labelwidth;
22*6a54128fSAndroid Build Coastguard Worker int barwidth;
23*6a54128fSAndroid Build Coastguard Worker __u32 maxdone;
24*6a54128fSAndroid Build Coastguard Worker __u32 current;
25*6a54128fSAndroid Build Coastguard Worker int shown;
26*6a54128fSAndroid Build Coastguard Worker int flags;
27*6a54128fSAndroid Build Coastguard Worker };
28*6a54128fSAndroid Build Coastguard Worker
ext2fs_progress_display(ext2_sim_progmeter prog)29*6a54128fSAndroid Build Coastguard Worker static errcode_t ext2fs_progress_display(ext2_sim_progmeter prog)
30*6a54128fSAndroid Build Coastguard Worker {
31*6a54128fSAndroid Build Coastguard Worker int i, width;
32*6a54128fSAndroid Build Coastguard Worker
33*6a54128fSAndroid Build Coastguard Worker fputs(prog->label, prog->f);
34*6a54128fSAndroid Build Coastguard Worker width = prog->labelwidth - strlen(prog->label);
35*6a54128fSAndroid Build Coastguard Worker while (width-- > 0)
36*6a54128fSAndroid Build Coastguard Worker putc(' ', prog->f);
37*6a54128fSAndroid Build Coastguard Worker if (prog->labelwidth + prog->barwidth > 80) {
38*6a54128fSAndroid Build Coastguard Worker fputs("\n", prog->f);
39*6a54128fSAndroid Build Coastguard Worker for (width = prog->labelwidth; width > 0; width--)
40*6a54128fSAndroid Build Coastguard Worker putc(' ', prog->f);
41*6a54128fSAndroid Build Coastguard Worker }
42*6a54128fSAndroid Build Coastguard Worker for (i=0; i < prog->barwidth; i++)
43*6a54128fSAndroid Build Coastguard Worker putc('-', prog->f);
44*6a54128fSAndroid Build Coastguard Worker for (i=0; i < prog->barwidth; i++)
45*6a54128fSAndroid Build Coastguard Worker putc('\b', prog->f);
46*6a54128fSAndroid Build Coastguard Worker fflush(prog->f);
47*6a54128fSAndroid Build Coastguard Worker return 0;
48*6a54128fSAndroid Build Coastguard Worker }
49*6a54128fSAndroid Build Coastguard Worker
50*6a54128fSAndroid Build Coastguard Worker
ext2fs_progress_update(ext2_sim_progmeter prog,__u32 current)51*6a54128fSAndroid Build Coastguard Worker void ext2fs_progress_update(ext2_sim_progmeter prog, __u32 current)
52*6a54128fSAndroid Build Coastguard Worker {
53*6a54128fSAndroid Build Coastguard Worker int old_level, level, num, i;
54*6a54128fSAndroid Build Coastguard Worker
55*6a54128fSAndroid Build Coastguard Worker level = prog->barwidth * current / prog->maxdone;
56*6a54128fSAndroid Build Coastguard Worker old_level = prog->barwidth * prog->current / prog->maxdone;
57*6a54128fSAndroid Build Coastguard Worker prog->current = current;
58*6a54128fSAndroid Build Coastguard Worker
59*6a54128fSAndroid Build Coastguard Worker num = level - old_level;
60*6a54128fSAndroid Build Coastguard Worker if (num == 0)
61*6a54128fSAndroid Build Coastguard Worker return;
62*6a54128fSAndroid Build Coastguard Worker
63*6a54128fSAndroid Build Coastguard Worker if (num > 0) {
64*6a54128fSAndroid Build Coastguard Worker for (i=0; i < num; i++)
65*6a54128fSAndroid Build Coastguard Worker putc('X', prog->f);
66*6a54128fSAndroid Build Coastguard Worker } else {
67*6a54128fSAndroid Build Coastguard Worker num = -num;
68*6a54128fSAndroid Build Coastguard Worker for (i=0; i < num; i++)
69*6a54128fSAndroid Build Coastguard Worker putc('\b', prog->f);
70*6a54128fSAndroid Build Coastguard Worker for (i=0; i < num; i++)
71*6a54128fSAndroid Build Coastguard Worker putc('-', prog->f);
72*6a54128fSAndroid Build Coastguard Worker for (i=0; i < num; i++)
73*6a54128fSAndroid Build Coastguard Worker putc('\b', prog->f);
74*6a54128fSAndroid Build Coastguard Worker }
75*6a54128fSAndroid Build Coastguard Worker fflush(prog->f);
76*6a54128fSAndroid Build Coastguard Worker }
77*6a54128fSAndroid Build Coastguard Worker
ext2fs_progress_init(ext2_sim_progmeter * ret_prog,const char * label,int labelwidth,int barwidth,__u32 maxdone,int flags)78*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_progress_init(ext2_sim_progmeter *ret_prog,
79*6a54128fSAndroid Build Coastguard Worker const char *label,
80*6a54128fSAndroid Build Coastguard Worker int labelwidth, int barwidth,
81*6a54128fSAndroid Build Coastguard Worker __u32 maxdone, int flags)
82*6a54128fSAndroid Build Coastguard Worker {
83*6a54128fSAndroid Build Coastguard Worker ext2_sim_progmeter prog;
84*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
85*6a54128fSAndroid Build Coastguard Worker
86*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_get_mem(sizeof(struct ext2_sim_progress), &prog);
87*6a54128fSAndroid Build Coastguard Worker if (retval)
88*6a54128fSAndroid Build Coastguard Worker return retval;
89*6a54128fSAndroid Build Coastguard Worker memset(prog, 0, sizeof(struct ext2_sim_progress));
90*6a54128fSAndroid Build Coastguard Worker
91*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_get_mem(strlen(label)+1, &prog->label);
92*6a54128fSAndroid Build Coastguard Worker if (retval) {
93*6a54128fSAndroid Build Coastguard Worker free(prog);
94*6a54128fSAndroid Build Coastguard Worker return retval;
95*6a54128fSAndroid Build Coastguard Worker }
96*6a54128fSAndroid Build Coastguard Worker strcpy(prog->label, label);
97*6a54128fSAndroid Build Coastguard Worker prog->labelwidth = labelwidth;
98*6a54128fSAndroid Build Coastguard Worker prog->barwidth = barwidth;
99*6a54128fSAndroid Build Coastguard Worker prog->flags = flags;
100*6a54128fSAndroid Build Coastguard Worker prog->maxdone = maxdone;
101*6a54128fSAndroid Build Coastguard Worker prog->current = 0;
102*6a54128fSAndroid Build Coastguard Worker prog->shown = 0;
103*6a54128fSAndroid Build Coastguard Worker prog->f = stdout;
104*6a54128fSAndroid Build Coastguard Worker
105*6a54128fSAndroid Build Coastguard Worker *ret_prog = prog;
106*6a54128fSAndroid Build Coastguard Worker
107*6a54128fSAndroid Build Coastguard Worker return ext2fs_progress_display(prog);
108*6a54128fSAndroid Build Coastguard Worker }
109*6a54128fSAndroid Build Coastguard Worker
ext2fs_progress_close(ext2_sim_progmeter prog)110*6a54128fSAndroid Build Coastguard Worker void ext2fs_progress_close(ext2_sim_progmeter prog)
111*6a54128fSAndroid Build Coastguard Worker {
112*6a54128fSAndroid Build Coastguard Worker
113*6a54128fSAndroid Build Coastguard Worker if (prog->label)
114*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&prog->label);
115*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&prog);
116*6a54128fSAndroid Build Coastguard Worker printf("\n");
117*6a54128fSAndroid Build Coastguard Worker return;
118*6a54128fSAndroid Build Coastguard Worker }
119