};
void print_progress(struct progress_state *state) {
- int position, k;
+ int position, k, normalizer;
struct winsize win;
char buffer[PROGRESS_BUFFER_SIZE];
char *s;
+ normalizer = (state->nb_values > 1 ? state->nb_values - 1 : 1);
+
if(show_progress) {
/* We use the previous bar_width to compute the position, so that
we avoid doing too many ioctls */
- position = (state->bar_width * state->value) / (state->nb_values - 1);
+ position = (state->bar_width * state->value) / normalizer;
if(state->bar_width <= 0 || position != state->last_position) {
if(!ioctl (STDERR_FILENO, TIOCGWINSZ, (char *) &win)) {
/* Something weird is going on if the previous test is wrong */
} else {
state->bar_width = win.ws_col - 7;
}
- position = (state->bar_width * state->value) / (state->nb_values - 1);
+ position = (state->bar_width * state->value) / normalizer;
state->last_position = position;
s = buffer;
for(k = 0; k < position; k++) {
/* We need four % because of the fprintf that follows */
sprintf(s, " [%3d%%%%]\r",
- (100 * state->value) / (state->nb_values - 1));
+ (100 * state->value) / normalizer);
fprintf(stderr, buffer);
}