- unsigned ratio = 100 * beg_and_transferred / totalsize;
- fprintf(stderr, "%4u%%", ratio);
-
- barlength = get_tty2_width() - 49;
- if (barlength > 0) {
- /* god bless gcc for variable arrays :) */
- char buf[barlength + 1];
- unsigned stars = (unsigned)barlength * beg_and_transferred / totalsize;
- memset(buf, ' ', barlength);
- buf[barlength] = '\0';
- memset(buf, '*', stars);
- fprintf(stderr, " |%s|", buf);
+ int barlength;
+ unsigned beg_and_transferred; /* does not need uoff_t, see scaling code */
+ unsigned ratio;
+
+ beg_and_transferred = beg_size + transferred;
+ ratio = 100 * beg_and_transferred / totalsize;
+ /* can't overflow ^^^^^^^^^^^^^^^ */
+ fprintf(stderr, "%3u%% ", ratio);
+
+ barlength = get_terminal_width(2) - 48;
+ /*
+ * Must reject barlength <= 0 (terminal too narrow). While at it,
+ * also reject: 1-char bar (useless), 2-char bar (ridiculous).
+ */
+ if (barlength > 2) {
+ if (barlength > 999)
+ barlength = 999;
+ {
+ /* god bless gcc for variable arrays :) */
+ char buf[barlength + 1];
+ unsigned stars = (unsigned)barlength * beg_and_transferred / totalsize;
+ /* can't overflow ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */
+ memset(buf, ' ', barlength);
+ buf[barlength] = '\0';
+ memset(buf, '*', stars);
+ fprintf(stderr, "|%s| ", buf);
+ }