xref: /aosp_15_r20/external/e2fsprogs/resize/sim_progress.c (revision 6a54128f25917bfc36a8a6e9d722c04a0b4641b6)
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