From 53b5ea54c6f18e4e3d7991cf015bf6263552a214 Mon Sep 17 00:00:00 2001 From: Andrew Wood Date: Sat, 7 Dec 2024 19:39:44 +0000 Subject: [PATCH] Track the chosen size of format segments so that "%nA" can appear more than once, with different "n" values (#122). --- docs/NEWS.md | 1 + po/cs.po | 18 +++++++++--------- po/de.po | 18 +++++++++--------- po/es.po | 18 +++++++++--------- po/fr.po | 18 +++++++++--------- po/pl.po | 18 +++++++++--------- po/pt.po | 18 +++++++++--------- po/ru.po | 18 +++++++++--------- po/tr.po | 18 +++++++++--------- src/include/pv-internal.h | 3 ++- src/pv/display.c | 31 +++++++++++++++++++++++++++---- 11 files changed, 102 insertions(+), 77 deletions(-) diff --git a/docs/NEWS.md b/docs/NEWS.md index 66b4162..a21ce94 100644 --- a/docs/NEWS.md +++ b/docs/NEWS.md @@ -1,5 +1,6 @@ ### UNRELEASED + * *feature:* allow **--format** to include "%nA" more than once, with different "n" valeus (#122) * *fix:* add _configure_ script fallback for **--remote** check when cross-compiling (#120) * *fix:* allow **extra-display** to be changed by **--remote** (#123) diff --git a/po/cs.po b/po/cs.po index 0366ed5..af6dcb9 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-07 02:08+0000\n" +"POT-Creation-Date: 2024-12-07 19:37+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:681 src/pv/transfer.c:1011 +#: src/pv/display.c:686 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "selhala alokace vyrovnávací paměti" -#: src/pv/display.c:810 +#: src/pv/display.c:815 msgid "b" msgstr "b" -#: src/pv/display.c:813 src/pv/transfer.c:602 +#: src/pv/display.c:818 src/pv/transfer.c:602 msgid "B" msgstr "B" -#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 +#: src/pv/display.c:862 src/pv/display.c:877 src/pv/display.c:1099 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 msgid "/s" msgstr "/s" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:904 src/pv/display.c:908 +#: src/pv/display.c:909 src/pv/display.c:913 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:974 +#: src/pv/display.c:979 msgid "FIN" msgstr "FIN" diff --git a/po/de.po b/po/de.po index 33afa99..7981b06 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-07 02:08+0000\n" +"POT-Creation-Date: 2024-12-07 19:37+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:681 src/pv/transfer.c:1011 +#: src/pv/display.c:686 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "Speicherzuweisung für den Puffer fehlgeschlagen" -#: src/pv/display.c:810 +#: src/pv/display.c:815 msgid "b" msgstr "b" -#: src/pv/display.c:813 src/pv/transfer.c:602 +#: src/pv/display.c:818 src/pv/transfer.c:602 msgid "B" msgstr "B" -#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 +#: src/pv/display.c:862 src/pv/display.c:877 src/pv/display.c:1099 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 msgid "/s" msgstr "/s" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:904 src/pv/display.c:908 +#: src/pv/display.c:909 src/pv/display.c:913 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:974 +#: src/pv/display.c:979 msgid "FIN" msgstr "Endzeit" diff --git a/po/es.po b/po/es.po index 29b36fc..9987ed1 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-07 02:08+0000\n" +"POT-Creation-Date: 2024-12-07 19:37+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:681 src/pv/transfer.c:1011 +#: src/pv/display.c:686 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "" -#: src/pv/display.c:810 +#: src/pv/display.c:815 msgid "b" msgstr "" -#: src/pv/display.c:813 src/pv/transfer.c:602 +#: src/pv/display.c:818 src/pv/transfer.c:602 msgid "B" msgstr "" -#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 +#: src/pv/display.c:862 src/pv/display.c:877 src/pv/display.c:1099 #: src/pv/loop.c:549 msgid "b/s" msgstr "" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 msgid "/s" msgstr "" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 #: src/pv/loop.c:549 msgid "B/s" msgstr "" -#: src/pv/display.c:904 src/pv/display.c:908 +#: src/pv/display.c:909 src/pv/display.c:913 msgid "ETA" msgstr "" -#: src/pv/display.c:974 +#: src/pv/display.c:979 msgid "FIN" msgstr "" diff --git a/po/fr.po b/po/fr.po index 99fe7e7..7778b00 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-07 02:08+0000\n" +"POT-Creation-Date: 2024-12-07 19:37+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:681 src/pv/transfer.c:1011 +#: src/pv/display.c:686 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "échec de l'allocation de mémoire tampon" -#: src/pv/display.c:810 +#: src/pv/display.c:815 msgid "b" msgstr "" -#: src/pv/display.c:813 src/pv/transfer.c:602 +#: src/pv/display.c:818 src/pv/transfer.c:602 msgid "B" msgstr "O" -#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 +#: src/pv/display.c:862 src/pv/display.c:877 src/pv/display.c:1099 #: src/pv/loop.c:549 msgid "b/s" msgstr "" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 msgid "/s" msgstr "/s" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 #: src/pv/loop.c:549 msgid "B/s" msgstr "O/s" -#: src/pv/display.c:904 src/pv/display.c:908 +#: src/pv/display.c:909 src/pv/display.c:913 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:974 +#: src/pv/display.c:979 msgid "FIN" msgstr "" diff --git a/po/pl.po b/po/pl.po index c420d28..89eecc5 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-07 02:08+0000\n" +"POT-Creation-Date: 2024-12-07 19:37+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:681 src/pv/transfer.c:1011 +#: src/pv/display.c:686 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "nie udało się zaalokować bufora" -#: src/pv/display.c:810 +#: src/pv/display.c:815 msgid "b" msgstr "b" -#: src/pv/display.c:813 src/pv/transfer.c:602 +#: src/pv/display.c:818 src/pv/transfer.c:602 msgid "B" msgstr "B" -#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 +#: src/pv/display.c:862 src/pv/display.c:877 src/pv/display.c:1099 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 msgid "/s" msgstr "/s" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:904 src/pv/display.c:908 +#: src/pv/display.c:909 src/pv/display.c:913 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:974 +#: src/pv/display.c:979 msgid "FIN" msgstr "FIN" diff --git a/po/pt.po b/po/pt.po index aa21857..9763307 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-07 02:08+0000\n" +"POT-Creation-Date: 2024-12-07 19:37+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:681 src/pv/transfer.c:1011 +#: src/pv/display.c:686 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "erro alocando o buffer" -#: src/pv/display.c:810 +#: src/pv/display.c:815 msgid "b" msgstr "" -#: src/pv/display.c:813 src/pv/transfer.c:602 +#: src/pv/display.c:818 src/pv/transfer.c:602 msgid "B" msgstr "" -#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 +#: src/pv/display.c:862 src/pv/display.c:877 src/pv/display.c:1099 #: src/pv/loop.c:549 msgid "b/s" msgstr "" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 msgid "/s" msgstr "" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:904 src/pv/display.c:908 +#: src/pv/display.c:909 src/pv/display.c:913 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:974 +#: src/pv/display.c:979 msgid "FIN" msgstr "" diff --git a/po/ru.po b/po/ru.po index 6936e14..9ce0957 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-07 02:08+0000\n" +"POT-Creation-Date: 2024-12-07 19:37+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:681 src/pv/transfer.c:1011 +#: src/pv/display.c:686 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "не удалось выделить память для буфера" -#: src/pv/display.c:810 +#: src/pv/display.c:815 msgid "b" msgstr "бит" -#: src/pv/display.c:813 src/pv/transfer.c:602 +#: src/pv/display.c:818 src/pv/transfer.c:602 msgid "B" msgstr "байт" -#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 +#: src/pv/display.c:862 src/pv/display.c:877 src/pv/display.c:1099 #: src/pv/loop.c:549 msgid "b/s" msgstr "бит/с" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 msgid "/s" msgstr "/с" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 #: src/pv/loop.c:549 msgid "B/s" msgstr "байт/с" -#: src/pv/display.c:904 src/pv/display.c:908 +#: src/pv/display.c:909 src/pv/display.c:913 msgid "ETA" msgstr "ОЖИД" -#: src/pv/display.c:974 +#: src/pv/display.c:979 msgid "FIN" msgstr "ЗАВЕРШ" diff --git a/po/tr.po b/po/tr.po index ae9b0f7..595d8fa 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-07 02:08+0000\n" +"POT-Creation-Date: 2024-12-07 19:37+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:681 src/pv/transfer.c:1011 +#: src/pv/display.c:686 src/pv/transfer.c:1011 msgid "buffer allocation failed" msgstr "arabellek tahsisi başarısız oldu" -#: src/pv/display.c:810 +#: src/pv/display.c:815 msgid "b" msgstr "b" -#: src/pv/display.c:813 src/pv/transfer.c:602 +#: src/pv/display.c:818 src/pv/transfer.c:602 msgid "B" msgstr "B" -#: src/pv/display.c:857 src/pv/display.c:872 src/pv/display.c:1091 +#: src/pv/display.c:862 src/pv/display.c:877 src/pv/display.c:1099 #: src/pv/loop.c:549 msgid "b/s" msgstr "b/s" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 msgid "/s" msgstr "/s" -#: src/pv/display.c:861 src/pv/display.c:876 src/pv/display.c:1095 +#: src/pv/display.c:866 src/pv/display.c:881 src/pv/display.c:1103 #: src/pv/loop.c:549 msgid "B/s" msgstr "B/s" -#: src/pv/display.c:904 src/pv/display.c:908 +#: src/pv/display.c:909 src/pv/display.c:913 msgid "ETA" msgstr "ETA" -#: src/pv/display.c:974 +#: src/pv/display.c:979 msgid "FIN" msgstr "FIN" diff --git a/src/include/pv-internal.h b/src/include/pv-internal.h index 58e7894..9dc2c4f 100644 --- a/src/include/pv-internal.h +++ b/src/include/pv-internal.h @@ -192,6 +192,7 @@ struct pvstate_s { struct { /* format string broken into display components */ size_t str_start; /* for strings: start offset */ size_t str_bytes; /* for strings: length in bytes */ + size_t chosen_size; /* "n" from %A, or 0 */ pv_display_component type; /* type of display component */ } format[PV_FORMAT_ARRAY_MAX]; @@ -207,7 +208,7 @@ struct pvstate_s { size_t display_buffer_size; /* size allocated to display buffer */ size_t display_string_len; /* length of string in display buffer */ off_t initial_offset; /* offset when first opened (when watching fds) */ - size_t lastoutput_bytes; /* number of last-output bytes to show */ + size_t lastoutput_bytes; /* largest number of last-output bytes to show */ size_t format_segment_count; /* number of format string segments */ diff --git a/src/pv/display.c b/src/pv/display.c index e81aa63..eb59cd7 100644 --- a/src/pv/display.c +++ b/src/pv/display.c @@ -477,7 +477,9 @@ static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supp segment = 0; for (strpos = 0; format_used[strpos] != '\0' && segment < PV_FORMAT_ARRAY_MAX; strpos++, segment++) { pv_display_component seg_type; - size_t str_start, str_bytes; + size_t str_start, str_bytes, chosen_size; + + chosen_size = 0; if ('%' == format_used[strpos]) { unsigned long number_prefix; @@ -529,7 +531,9 @@ static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supp number_prefix = PV_SIZEOF_LASTOUTPUT_BUFFER; if (number_prefix < 1) number_prefix = 1; - display->lastoutput_bytes = (size_t) number_prefix; + chosen_size = (size_t) number_prefix; + if (display->lastoutput_bytes < chosen_size) + display->lastoutput_bytes = chosen_size; break; case 'r': seg_type = PV_COMPONENT_RATE; @@ -590,6 +594,7 @@ static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supp display->format[segment].type = seg_type; display->format[segment].str_start = str_start; display->format[segment].str_bytes = str_bytes; + display->format[segment].chosen_size = chosen_size; display->format_segment_count++; } } @@ -1043,7 +1048,10 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl if (display->format[segment].type == PV_COMPONENT_STRING) { static_portion_size += display->format[segment].str_bytes; } else if (display->format[segment].type != PV_COMPONENT_PROGRESS) { - static_portion_size += display->component[display->format[segment].type].bytes; + size_t segment_width = display->format[segment].chosen_size; + if (0 == segment_width) + segment_width = display->component[display->format[segment].type].bytes; + static_portion_size += segment_width; } } @@ -1203,7 +1211,9 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl new_display_string_len = 0; for (segment = 0; segment < display->format_segment_count; segment++) { const char *segment_content; - size_t segment_bytes; + size_t segment_bytes, chosen_size; + + chosen_size = display->format[segment].chosen_size; if (display->format[segment].type == PV_COMPONENT_STRING) { segment_content = &(format_used[display->format[segment].str_start]); @@ -1211,6 +1221,19 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl } else { segment_content = display->component[display->format[segment].type].content; segment_bytes = display->component[display->format[segment].type].bytes; + + /* + * If the segment's chosen size is smaller than the + * component, show only the last part of it. For + * instance with "show N last output bytes" (%nA), + * if one "n" was 16 and the other 8, then for the 8 + * one, we show the last 8 bytes of the 16-byte + * buffer (issue #122). + */ + if (0 != chosen_size && chosen_size < segment_bytes) { + segment_content += (segment_bytes - chosen_size); + segment_bytes = chosen_size; + } } /* Skip empty segments. */