diff --git a/docs/NEWS.md b/docs/NEWS.md index 169ec38..abf53b2 100644 --- a/docs/NEWS.md +++ b/docs/NEWS.md @@ -2,6 +2,7 @@ * *feature:* new **--format** sequence "**%nL**", showing the most recent line written (#121) * *feature:* each **--format** sequence now has a more readable equivalent name, for example "**%r**" can be written as "**%{rate}**" + * *feature:* new **--format** sequences "**%{progress-bar-only}**" and "**%{progress-amount-only}**" * *fix:* allow **--format** to include "%nA" more than once, with different "n" values (#122) * *fix:* allow **--format** to include "%p" more than once * *fix:* add _configure_ script fallback for **--remote** check when cross-compiling (#120) diff --git a/docs/pv.1 b/docs/pv.1 index 5974f31..d2cf068 100644 --- a/docs/pv.1 +++ b/docs/pv.1 @@ -477,6 +477,15 @@ Equivalent to \*(lq\fB\-\-progress\fR\*(rq. Expands to fill the remaining space unless prefixed by a number to set the width, such as \*(lq\fB%20p\fR\*(rq or \*(lq\fB%20{progress}\fR\*(rq. .TP +.B %{progress-bar-only} +Progress bar, without any sides, and without any percentage displayed +afterwards. +Expands to fill the remaining space unless prefixed by a number. +.TP +.B %{progress-amount-only} +The percentage completion (or maximum rate, with \*(lq\fB\-\-gauge\fR\*(rq +when the size is unknown). +.TP .BR %t ", " %{timer} Elapsed time. Equivalent to \*(lq\fB\-\-timer\fR\*(rq. diff --git a/docs/pv.1.md b/docs/pv.1.md index fbef586..670f0f5 100644 --- a/docs/pv.1.md +++ b/docs/pv.1.md @@ -427,6 +427,17 @@ contain the following sequences: unless prefixed by a number to set the width, such as "**%20p**" or "**%20{progress}**". +**%{progress-bar-only}** + +: Progress bar, without any sides, and without any percentage + displayed afterwards. Expands to fill the remaining space unless + prefixed by a number. + +**%{progress-amount-only}** + +: The percentage completion (or maximum rate, with "**\--gauge**" when + the size is unknown). + **%t**, **%{timer}** : Elapsed time. Equivalent to "**\--timer**". diff --git a/po/cs.po b/po/cs.po index 915d86d..29d60c4 100644 --- a/po/cs.po +++ b/po/cs.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 17:39+0000\n" +"POT-Creation-Date: 2024-12-08 20:11+0000\n" "PO-Revision-Date: 2024-10-13 20:43+0000\n" "Last-Translator: mmatous \n" "Language-Team: Czech \n" @@ -403,37 +403,37 @@ msgstr "yzafpnum kMGTPEZY" msgid "yzafpnum KMGTPEZY" msgstr "yzafpnum KMGTPEZY" -#: src/pv/display.c:515 src/pv/display.c:893 src/pv/display.c:922 +#: src/pv/display.c:523 src/pv/display.c:998 src/pv/display.c:1027 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 msgid "/s" msgstr "/s" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:770 src/pv/display.c:774 +#: src/pv/display.c:875 src/pv/display.c:879 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:856 +#: src/pv/display.c:961 msgid "FIN" msgstr "FIN" -#: src/pv/display.c:952 +#: src/pv/display.c:1057 msgid "b" msgstr "b" -#: src/pv/display.c:955 src/pv/transfer.c:594 +#: src/pv/display.c:1060 src/pv/transfer.c:594 msgid "B" msgstr "B" -#: src/pv/display.c:1495 src/pv/transfer.c:1056 +#: src/pv/display.c:1602 src/pv/transfer.c:1056 msgid "buffer allocation failed" msgstr "selhala alokace vyrovnávací paměti" diff --git a/po/de.po b/po/de.po index 0bbba59..1c40079 100644 --- a/po/de.po +++ b/po/de.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 17:39+0000\n" +"POT-Creation-Date: 2024-12-08 20:11+0000\n" "PO-Revision-Date: 2024-10-13 20:43+0000\n" "Last-Translator: fnetX \n" "Language-Team: German \n" @@ -426,37 +426,37 @@ msgstr "yzafpnµm kMGTPEZY" msgid "yzafpnum KMGTPEZY" msgstr "yzafpnµm KMGTPEZY" -#: src/pv/display.c:515 src/pv/display.c:893 src/pv/display.c:922 +#: src/pv/display.c:523 src/pv/display.c:998 src/pv/display.c:1027 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 msgid "/s" msgstr "/s" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:770 src/pv/display.c:774 +#: src/pv/display.c:875 src/pv/display.c:879 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:856 +#: src/pv/display.c:961 msgid "FIN" msgstr "Endzeit" -#: src/pv/display.c:952 +#: src/pv/display.c:1057 msgid "b" msgstr "b" -#: src/pv/display.c:955 src/pv/transfer.c:594 +#: src/pv/display.c:1060 src/pv/transfer.c:594 msgid "B" msgstr "B" -#: src/pv/display.c:1495 src/pv/transfer.c:1056 +#: src/pv/display.c:1602 src/pv/transfer.c:1056 msgid "buffer allocation failed" msgstr "Speicherzuweisung für den Puffer fehlgeschlagen" diff --git a/po/es.po b/po/es.po index 8e63ad2..1cdb59f 100644 --- a/po/es.po +++ b/po/es.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 17:39+0000\n" +"POT-Creation-Date: 2024-12-08 20:11+0000\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -395,37 +395,37 @@ msgstr "" msgid "yzafpnum KMGTPEZY" msgstr "" -#: src/pv/display.c:515 src/pv/display.c:893 src/pv/display.c:922 +#: src/pv/display.c:523 src/pv/display.c:998 src/pv/display.c:1027 #: src/pv/loop.c:549 msgid "b/s" msgstr "" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 msgid "/s" msgstr "" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 #: src/pv/loop.c:549 msgid "B/s" msgstr "" -#: src/pv/display.c:770 src/pv/display.c:774 +#: src/pv/display.c:875 src/pv/display.c:879 msgid "ETA" msgstr "" -#: src/pv/display.c:856 +#: src/pv/display.c:961 msgid "FIN" msgstr "" -#: src/pv/display.c:952 +#: src/pv/display.c:1057 msgid "b" msgstr "" -#: src/pv/display.c:955 src/pv/transfer.c:594 +#: src/pv/display.c:1060 src/pv/transfer.c:594 msgid "B" msgstr "" -#: src/pv/display.c:1495 src/pv/transfer.c:1056 +#: src/pv/display.c:1602 src/pv/transfer.c:1056 msgid "buffer allocation failed" msgstr "" diff --git a/po/fr.po b/po/fr.po index 931a35d..6fc114e 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 17:39+0000\n" +"POT-Creation-Date: 2024-12-08 20:11+0000\n" "PO-Revision-Date: 2024-10-12 11:13+0000\n" "Last-Translator: a-j-wood \n" "Language-Team: French \n" @@ -430,37 +430,37 @@ msgstr "" msgid "yzafpnum KMGTPEZY" msgstr "" -#: src/pv/display.c:515 src/pv/display.c:893 src/pv/display.c:922 +#: src/pv/display.c:523 src/pv/display.c:998 src/pv/display.c:1027 #: src/pv/loop.c:549 msgid "b/s" msgstr "" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 msgid "/s" msgstr "/s" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 #: src/pv/loop.c:549 msgid "B/s" msgstr "O/s" -#: src/pv/display.c:770 src/pv/display.c:774 +#: src/pv/display.c:875 src/pv/display.c:879 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:856 +#: src/pv/display.c:961 msgid "FIN" msgstr "" -#: src/pv/display.c:952 +#: src/pv/display.c:1057 msgid "b" msgstr "" -#: src/pv/display.c:955 src/pv/transfer.c:594 +#: src/pv/display.c:1060 src/pv/transfer.c:594 msgid "B" msgstr "O" -#: src/pv/display.c:1495 src/pv/transfer.c:1056 +#: src/pv/display.c:1602 src/pv/transfer.c:1056 msgid "buffer allocation failed" msgstr "échec de l'allocation de mémoire tampon" diff --git a/po/pl.po b/po/pl.po index 23c7068..ea72dab 100644 --- a/po/pl.po +++ b/po/pl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 17:39+0000\n" +"POT-Creation-Date: 2024-12-08 20:11+0000\n" "PO-Revision-Date: 2024-10-20 14:07+0000\n" "Last-Translator: coralpink \n" "Language-Team: Polish \n" @@ -421,37 +421,37 @@ msgstr "yzafpnum kMGTPEZY" msgid "yzafpnum KMGTPEZY" msgstr "yzafpnum KMGTPEZY" -#: src/pv/display.c:515 src/pv/display.c:893 src/pv/display.c:922 +#: src/pv/display.c:523 src/pv/display.c:998 src/pv/display.c:1027 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 msgid "/s" msgstr "/s" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:770 src/pv/display.c:774 +#: src/pv/display.c:875 src/pv/display.c:879 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:856 +#: src/pv/display.c:961 msgid "FIN" msgstr "FIN" -#: src/pv/display.c:952 +#: src/pv/display.c:1057 msgid "b" msgstr "b" -#: src/pv/display.c:955 src/pv/transfer.c:594 +#: src/pv/display.c:1060 src/pv/transfer.c:594 msgid "B" msgstr "B" -#: src/pv/display.c:1495 src/pv/transfer.c:1056 +#: src/pv/display.c:1602 src/pv/transfer.c:1056 msgid "buffer allocation failed" msgstr "nie udało się zaalokować bufora" diff --git a/po/pt.po b/po/pt.po index 85f055a..9192a85 100644 --- a/po/pt.po +++ b/po/pt.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 17:39+0000\n" +"POT-Creation-Date: 2024-12-08 20:11+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -409,37 +409,37 @@ msgstr "" msgid "yzafpnum KMGTPEZY" msgstr "" -#: src/pv/display.c:515 src/pv/display.c:893 src/pv/display.c:922 +#: src/pv/display.c:523 src/pv/display.c:998 src/pv/display.c:1027 #: src/pv/loop.c:549 msgid "b/s" msgstr "" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 msgid "/s" msgstr "" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:770 src/pv/display.c:774 +#: src/pv/display.c:875 src/pv/display.c:879 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:856 +#: src/pv/display.c:961 msgid "FIN" msgstr "" -#: src/pv/display.c:952 +#: src/pv/display.c:1057 msgid "b" msgstr "" -#: src/pv/display.c:955 src/pv/transfer.c:594 +#: src/pv/display.c:1060 src/pv/transfer.c:594 msgid "B" msgstr "" -#: src/pv/display.c:1495 src/pv/transfer.c:1056 +#: src/pv/display.c:1602 src/pv/transfer.c:1056 msgid "buffer allocation failed" msgstr "erro alocando o buffer" diff --git a/po/ru.po b/po/ru.po index c5939b2..d422803 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1,7 +1,7 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 17:39+0000\n" +"POT-Creation-Date: 2024-12-08 20:11+0000\n" "PO-Revision-Date: 2024-10-22 18:07+0000\n" "Last-Translator: 0ko <0ko@users.noreply.translate.codeberg.org>\n" "Language-Team: Russian \n" @@ -404,37 +404,37 @@ msgstr "" msgid "yzafpnum KMGTPEZY" msgstr "" -#: src/pv/display.c:515 src/pv/display.c:893 src/pv/display.c:922 +#: src/pv/display.c:523 src/pv/display.c:998 src/pv/display.c:1027 #: src/pv/loop.c:549 msgid "b/s" msgstr "бит/с" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 msgid "/s" msgstr "/с" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 #: src/pv/loop.c:549 msgid "B/s" msgstr "байт/с" -#: src/pv/display.c:770 src/pv/display.c:774 +#: src/pv/display.c:875 src/pv/display.c:879 msgid "ETA" msgstr "ОЖИД" -#: src/pv/display.c:856 +#: src/pv/display.c:961 msgid "FIN" msgstr "ЗАВЕРШ" -#: src/pv/display.c:952 +#: src/pv/display.c:1057 msgid "b" msgstr "бит" -#: src/pv/display.c:955 src/pv/transfer.c:594 +#: src/pv/display.c:1060 src/pv/transfer.c:594 msgid "B" msgstr "байт" -#: src/pv/display.c:1495 src/pv/transfer.c:1056 +#: src/pv/display.c:1602 src/pv/transfer.c:1056 msgid "buffer allocation failed" msgstr "не удалось выделить память для буфера" diff --git a/po/tr.po b/po/tr.po index 8d2d2f7..a6b1ff2 100644 --- a/po/tr.po +++ b/po/tr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: pv 1.8.14\n" "Report-Msgid-Bugs-To: pv@ivarch.com\n" -"POT-Creation-Date: 2024-12-08 17:39+0000\n" +"POT-Creation-Date: 2024-12-08 20:11+0000\n" "PO-Revision-Date: 2024-10-12 23:51+0000\n" "Last-Translator: a-j-wood \n" "Language-Team: Turkish \n" @@ -405,37 +405,37 @@ msgstr "yzafpnum kMGTPEZY" msgid "yzafpnum KMGTPEZY" msgstr "yzafpnum KMGTPEZY" -#: src/pv/display.c:515 src/pv/display.c:893 src/pv/display.c:922 +#: src/pv/display.c:523 src/pv/display.c:998 src/pv/display.c:1027 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 msgid "/s" msgstr "/s" -#: src/pv/display.c:519 src/pv/display.c:897 src/pv/display.c:926 +#: src/pv/display.c:527 src/pv/display.c:1002 src/pv/display.c:1031 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:770 src/pv/display.c:774 +#: src/pv/display.c:875 src/pv/display.c:879 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:856 +#: src/pv/display.c:961 msgid "FIN" msgstr "FIN" -#: src/pv/display.c:952 +#: src/pv/display.c:1057 msgid "b" msgstr "b" -#: src/pv/display.c:955 src/pv/transfer.c:594 +#: src/pv/display.c:1060 src/pv/transfer.c:594 msgid "B" msgstr "B" -#: src/pv/display.c:1495 src/pv/transfer.c:1056 +#: src/pv/display.c:1602 src/pv/transfer.c:1056 msgid "buffer allocation failed" msgstr "arabellek tahsisi başarısız oldu" diff --git a/src/pv/display.c b/src/pv/display.c index 5478d49..6c87d0e 100644 --- a/src/pv/display.c +++ b/src/pv/display.c @@ -449,8 +449,8 @@ static void pv__sizestr(char *buffer, size_t bufsize, char *format, /* * Add a null-terminated string to the buffer if there is room for it, - * updating the segment's offset and bytes values and returning the bytes, - * or treating the byte count as zero if there's insufficient space. + * updating the segment's offset and bytes values and returning the bytes + * value, or treating the byte count as zero if there's insufficient space. */ static size_t pv__format_segmentcontent(char *content, pvdisplay_segment_t segment, char *buffer, size_t buffer_size, size_t offset) @@ -483,10 +483,18 @@ static size_t pv__format_segmentcontent(char *content, pvdisplay_segment_t segme * content is bounded to the given width. Returns the number of bytes * written to the buffer. * + * If "bar_sides" is false, only the bar itself is rendered, not the opening + * and closing characters. + * + * If "include_bar" is false, the bar is omitted entirely. + * + * If "include_amount" is false, the percentage or rate after the bar is + * omitted. + * * This is only called by pv__format_progress(). */ static size_t pv__format_progress_knownsize(pvstate_t state, pvdisplay_t display, char *buffer, size_t buffer_size, - size_t width) + size_t width, bool bar_sides, bool include_bar, bool include_amount) { char after_bar[32]; /* flawfinder: ignore - only populated by pv_snprintf(). */ size_t after_bar_bytes, after_bar_width; @@ -521,14 +529,34 @@ static size_t pv__format_progress_knownsize(pvstate_t state, pvdisplay_t display /*@+mustfreefresh@ *//* splint: see above about gettext(). */ } + if (!include_amount) + after_bar[0] = '\0'; + after_bar_bytes = strlen(after_bar); /* flawfinder: ignore */ /* flawfinder: always \0-terminated by pv_snprintf() and the earlier memset(). */ after_bar_width = pv_strwidth(after_bar, after_bar_bytes); - if (width < (after_bar_width + 2)) + if (!include_bar) { + if (buffer_size < after_bar_bytes) + return 0; + if (after_bar_bytes > 1) { + /* NB we skip the leading space. */ + memmove(buffer, after_bar + 1, after_bar_bytes - 1); + buffer[after_bar_bytes - 1] = '\0'; + return after_bar_bytes - 1; + } return 0; + } - bar_area_width = width - after_bar_width - 2; + if (bar_sides) { + if (width < (after_bar_width + 2)) + return 0; + bar_area_width = width - after_bar_width - 2; + } else { + if (width < after_bar_width) + return 0; + bar_area_width = width - after_bar_width; + } if (bar_area_width > buffer_size - 16) bar_area_width = buffer_size - 16; @@ -542,8 +570,10 @@ static size_t pv__format_progress_knownsize(pvstate_t state, pvdisplay_t display buffer_offset = 0; - /* The opening of the bar area. */ - buffer[buffer_offset++] = '['; + if (bar_sides) { + /* The opening of the bar area. */ + buffer[buffer_offset++] = '['; + } /* The bar portion. */ for (pad_count = 0; pad_count < filled_bar_width && buffer_offset < buffer_size - 1; pad_count++) { @@ -564,12 +594,14 @@ static size_t pv__format_progress_knownsize(pvstate_t state, pvdisplay_t display buffer[buffer_offset++] = ' '; } - /* The closure of the bar area. */ - if (buffer_offset < buffer_size - 1) - buffer[buffer_offset++] = ']'; + if (bar_sides) { + /* The closure of the bar area. */ + if (buffer_offset < buffer_size - 1) + buffer[buffer_offset++] = ']'; + } /* The percentage. */ - if (after_bar_bytes < (buffer_size - 1 - buffer_offset)) { + if (after_bar_bytes > 0 && after_bar_bytes < (buffer_size - 1 - buffer_offset)) { memmove(buffer + buffer_offset, after_bar, after_bar_bytes); buffer_offset += after_bar_bytes; } @@ -585,27 +617,33 @@ static size_t pv__format_progress_knownsize(pvstate_t state, pvdisplay_t display * indicator. The total width of the content is bounded to the given width. * Returns the number of bytes written to the buffer. * + * If "bar_sides" is false, only the bar itself is rendered, not the opening + * and closing characters. + * * This is only called by pv__format_progress(). */ static size_t pv__format_progress_unknownsize(pvstate_t state, /*@unused@ */ __attribute__((unused)) pvdisplay_t display, char *buffer, - size_t buffer_size, size_t width) + size_t buffer_size, size_t width, bool bar_sides) { size_t bar_area_width, buffer_offset, pad_count; size_t indicator_position; buffer[0] = '\0'; - if (width < 6) - return 0; - - bar_area_width = width - 5; + if (bar_sides) { + if (width < 6) + return 0; + bar_area_width = width - 5; + } else { + if (width < 5) + return 0; + bar_area_width = width - 3; + } if (bar_area_width > buffer_size - 16) bar_area_width = buffer_size - 16; - debug("bar_area_width: %d", bar_area_width); - /* * Note that pv_calculate_transfer_rate() sets the percentage when * the size is unknown to a value that goes 0 - 200 and resets, so @@ -620,8 +658,10 @@ static size_t pv__format_progress_unknownsize(pvstate_t state, /*@unused@ */ buffer_offset = 0; - /* The opening of the bar area. */ - buffer[buffer_offset++] = '['; + if (bar_sides) { + /* The opening of the bar area. */ + buffer[buffer_offset++] = '['; + } /* The spaces before the indicator. */ for (pad_count = 0; pad_count < (bar_area_width * indicator_position) / 100; pad_count++) { @@ -642,9 +682,11 @@ static size_t pv__format_progress_unknownsize(pvstate_t state, /*@unused@ */ buffer[buffer_offset++] = ' '; } - /* The closure of the bar area. */ - if (buffer_offset < buffer_size - 1) - buffer[buffer_offset++] = ']'; + if (bar_sides) { + /* The closure of the bar area. */ + if (buffer_offset < buffer_size - 1) + buffer[buffer_offset++] = ']'; + } buffer[buffer_offset] = '\0'; @@ -668,10 +710,73 @@ static size_t pv__format_progress(pvstate_t state, pvdisplay_t display, pvdispla if (state->control.size > 0 || state->control.rate_gauge) { /* Known size or rate gauge - bar with percentage. */ - bytes = pv__format_progress_knownsize(state, display, content, sizeof(content), segment->width); + bytes = + pv__format_progress_knownsize(state, display, content, sizeof(content), segment->width, true, true, + true); } else { /* Unknown size - back-and-forth moving indicator. */ - bytes = pv__format_progress_unknownsize(state, display, content, sizeof(content), segment->width); + bytes = pv__format_progress_unknownsize(state, display, content, sizeof(content), segment->width, true); + } + + content[bytes] = '\0'; + + return pv__format_segmentcontent(content, segment, buffer, buffer_size, offset); +} + + +/* + * Progress bar, without sides and without a number afterwards. + */ +static size_t pv__format_progress_bar_only(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment, + char *buffer, size_t buffer_size, size_t offset) +{ + char content[1024]; /* flawfinder: ignore - always bounded */ + size_t bytes; + + content[0] = '\0'; + + if (0 == buffer_size) + return 0; + + if (state->control.size > 0 || state->control.rate_gauge) { + /* Known size or rate gauge - bar with percentage. */ + bytes = + pv__format_progress_knownsize(state, display, content, sizeof(content), segment->width, false, true, + false); + } else { + /* Unknown size - back-and-forth moving indicator. */ + bytes = + pv__format_progress_unknownsize(state, display, content, sizeof(content), segment->width, false); + } + + content[bytes] = '\0'; + + return pv__format_segmentcontent(content, segment, buffer, buffer_size, offset); +} + + +/* + * The number after the progress bar. + */ +static size_t pv__format_progress_amount_only(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment, + char *buffer, size_t buffer_size, size_t offset) +{ + char content[256]; /* flawfinder: ignore - always bounded */ + size_t bytes; + + content[0] = '\0'; + + if (0 == buffer_size) + return 0; + + if (state->control.size > 0 || state->control.rate_gauge) { + /* Known size or rate gauge - percentage or rate. */ + bytes = + pv__format_progress_knownsize(state, display, content, sizeof(content), segment->width, false, + false, true); + } else { + /* Unknown size - no number. */ + return 0; } content[bytes] = '\0'; @@ -1197,6 +1302,8 @@ static struct pvdisplay_component_s { } format_component[] = { { "p", &pv__format_progress, true }, { "{progress}", &pv__format_progress, true }, + { "{progress-bar-only}", &pv__format_progress_bar_only, true }, + { "{progress-amount-only}", &pv__format_progress_amount_only, false }, { "t", &pv__format_timer, false }, { "{timer}", &pv__format_timer, false }, { "e", &pv__format_eta, false },