/* * progress.c - Numeric progress meter * * Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, * 2003, 2004, 2005 by Theodore Ts'o. * * %Begin-Header% * This file may be redistributed under the terms of the GNU Public * License. * %End-Header% */ #include "ext2fs.h" #include "ext2fsP.h" static char spaces[80], backspaces[80]; static int int_log10(unsigned int arg) { int l; for (l=0; arg ; l++) arg = arg / 10; return l; } void ext2fs_numeric_progress_init(ext2_filsys fs, struct ext2fs_numeric_progress_struct * progress, const char *label, __u64 max) { /* * The PRINT_PROGRESS flag turns on or off ALL * progress-related messages, whereas the SKIP_PROGRESS * environment variable prints the start and end messages but * not the numeric countdown in the middle. */ if (!(fs->flags & EXT2_FLAG_PRINT_PROGRESS)) return; memset(spaces, ' ', sizeof(spaces)-1); spaces[sizeof(spaces)-1] = 0; memset(backspaces, '\b', sizeof(backspaces)-1); spaces[sizeof(backspaces)-1] = 0; progress->skip_progress = 0; if (getenv("E2FSPROGS_SKIP_PROGRESS")) progress->skip_progress++; memset(progress, 0, sizeof(*progress)); /* * Figure out how many digits we need */ progress->max = max; progress->log_max = int_log10(max); if (label) { fputs(label, stdout); fflush(stdout); } } void ext2fs_numeric_progress_update(ext2_filsys fs, struct ext2fs_numeric_progress_struct * progress, __u64 val) { if (!(fs->flags & EXT2_FLAG_PRINT_PROGRESS)) return; if (progress->skip_progress) return; fprintf(stdout, "%*llu/%*llu", progress->log_max, val, progress->log_max, progress->max); fprintf(stdout, "%.*s", (2*progress->log_max)+1, backspaces); } void ext2fs_numeric_progress_close(ext2_filsys fs, struct ext2fs_numeric_progress_struct * progress, const char *message) { if (!(fs->flags & EXT2_FLAG_PRINT_PROGRESS)) return; fprintf(stdout, "%.*s", (2*progress->log_max)+1, spaces); fprintf(stdout, "%.*s", (2*progress->log_max)+1, backspaces); if (message) fputs(message, stdout); }