2020-04-02 22:54:33 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
add command-line options to show line and to show spinner
diff --git a/mpb.c b/mpb.c index aa18072..e87bfa8 100644 --- a/mpb.c +++ b/mpb.c @@ -10,22 +10,25 @@ static unsigned lastfill = UINT_MAX; static unsigned lastpercent = 101; void -print_bar(unsigned percent, int showline) +print_bar(unsigned percent, int showspinner, int showline) { unsigned i, fill; fill = percent * width / 100; - if (percent % 100 == 0) - spinindex = 0; - printf(" (%c) [", spinchars[spinindex++]); - spinindex %= sizeof(spinchars) - 1; + if (showspinner) { + if (percent % 100 == 0) + spinindex = 0; + printf(" (%c)", spinchars[spinindex++]); + spinindex %= sizeof(spinchars) - 1; + } if (fill != lastfill) { + printf(" ["); for (i = 0; i < fill; i++) putchar('#'); for (; i < width; i++) putchar('-'); lastfill = fill; } else { - printf("\x1B[%uC", width); + printf("\x1B[%uC", width + 2); } if (percent != lastpercent) { printf("] %3u%%", percent); @@ -42,25 +45,50 @@ main(int argc, char *argv[]) { unsigned long count, total; unsigned percent; - if (argc != 2) { - fprintf(stderr, "usage:\n %s total\n", argv[0]); + int i; + char *arg; + char *argtotal = NULL; + int opt_showline = 0; + int opt_showspinner = 0; + for (i = 1; i < argc; i++) { + arg = argv[i]; + if (*arg == '-') { + while (*(++arg)) { + switch (*arg) { + case 'v': + opt_showline = 1; + break; + case 's': + opt_showspinner = 1; + break; + default: + fprintf(stderr, "%s: error: unknown option '-%c'\n", argv[0], *arg); + return 1; + } + } + } else { + argtotal = arg; + } + } + if (argtotal == NULL) { + fprintf(stderr, "%s: error: no total given\n", argv[0]); return 1; } - total = (unsigned) atol(argv[1]); + total = (unsigned) atol(argtotal); if (total == 0) { - fprintf(stderr, "total must be nonzero\n"); + fprintf(stderr, "%s: error: total must be nonzero\n", argv[0]); return 1; } width = 32; - print_bar(0, 0); + print_bar(0, opt_showspinner, 0); count = 0; while (scanf("%s", line) != EOF) { if (count < total) count++; percent = count * 100 / total; - print_bar(percent, 1); + print_bar(percent, opt_showspinner, opt_showline); } - print_bar(100, 0); + print_bar(100, opt_showspinner, 0); puts("\x1B[B\x1B[2K\x1B[A"); return 0; }