Change the formatter functions to take their 6 arguments as one struct pointer, making it less messy.
This commit is contained in:
+28
-15
@@ -355,9 +355,22 @@ struct pvstate_s {
|
||||
typedef struct pvdisplay_s *pvdisplay_t;
|
||||
typedef struct pvdisplay_segment_s *pvdisplay_segment_t;
|
||||
|
||||
/*
|
||||
* Structure containing the parameters used by formatters.
|
||||
*/
|
||||
struct pvformatter_args_s {
|
||||
/*@dependent@*/ pvstate_t state; /* overall state */
|
||||
/*@dependent@*/ pvdisplay_t display; /* the display being updated */
|
||||
/*@dependent@*/ pvdisplay_segment_t segment; /* the segment of the display */
|
||||
/*@dependent@*/ char *buffer; /* buffer to write formatted segments into */
|
||||
size_t buffer_size; /* size of the buffer */
|
||||
size_t offset; /* current write position in the buffer */
|
||||
};
|
||||
typedef struct pvformatter_args_s *pvformatter_args_t;
|
||||
|
||||
|
||||
/* Pointer to a formatter function. */
|
||||
typedef size_t (*pvdisplay_formatter_t)(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
typedef size_t (*pvdisplay_formatter_t)(pvformatter_args_t);
|
||||
|
||||
|
||||
/*
|
||||
@@ -399,7 +412,7 @@ long pv_seconds_remaining(const off_t, const off_t, const long double);
|
||||
void pv_si_prefix(long double *, char *, const long double, pvtransfercount_t);
|
||||
void pv_describe_amount(char *, size_t, char *, long double, char *, char *, pvtransfercount_t);
|
||||
|
||||
size_t pv_formatter_segmentcontent(char *, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_segmentcontent(char *, pvformatter_args_t);
|
||||
|
||||
/*
|
||||
* Formatting functions.
|
||||
@@ -422,19 +435,19 @@ size_t pv_formatter_segmentcontent(char *, pvdisplay_segment_t, char *, size_t,
|
||||
* If called with a buffer size of 0, only the side effects occur (such as
|
||||
* setting flags like display->showing_timer).
|
||||
*/
|
||||
size_t pv_formatter_progress(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_progress_bar_only(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_progress_amount_only(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_timer(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_eta(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_fineta(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_rate(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_average_rate(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_bytes(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_buffer_percent(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_last_written(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_previous_line(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_name(pvstate_t, pvdisplay_t, pvdisplay_segment_t, char *, size_t, size_t);
|
||||
size_t pv_formatter_progress(pvformatter_args_t);
|
||||
size_t pv_formatter_progress_bar_only(pvformatter_args_t);
|
||||
size_t pv_formatter_progress_amount_only(pvformatter_args_t);
|
||||
size_t pv_formatter_timer(pvformatter_args_t);
|
||||
size_t pv_formatter_eta(pvformatter_args_t);
|
||||
size_t pv_formatter_fineta(pvformatter_args_t);
|
||||
size_t pv_formatter_rate(pvformatter_args_t);
|
||||
size_t pv_formatter_average_rate(pvformatter_args_t);
|
||||
size_t pv_formatter_bytes(pvformatter_args_t);
|
||||
size_t pv_formatter_buffer_percent(pvformatter_args_t);
|
||||
size_t pv_formatter_last_written(pvformatter_args_t);
|
||||
size_t pv_formatter_previous_line(pvformatter_args_t);
|
||||
size_t pv_formatter_name(pvformatter_args_t);
|
||||
|
||||
bool pv_format(pvstate_t, /*@null@*/ const char *, pvdisplay_t, bool, bool);
|
||||
void pv_display(pvstate_t, bool);
|
||||
|
||||
+46
-22
@@ -429,26 +429,25 @@ void pv_describe_amount(char *buffer, size_t bufsize, char *format,
|
||||
* 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.
|
||||
*/
|
||||
size_t pv_formatter_segmentcontent(char *content, pvdisplay_segment_t segment, char *buffer, size_t buffer_size,
|
||||
size_t offset)
|
||||
size_t pv_formatter_segmentcontent(char *content, pvformatter_args_t formatter_info)
|
||||
{
|
||||
size_t bytes;
|
||||
|
||||
bytes = strlen(content); /* flawfinder: ignore */
|
||||
/* flawfinder - caller is required to null-terminate the string. */
|
||||
|
||||
if (offset >= buffer_size)
|
||||
if (formatter_info->offset >= formatter_info->buffer_size)
|
||||
bytes = 0;
|
||||
if ((offset + bytes) >= buffer_size)
|
||||
if ((formatter_info->offset + bytes) >= formatter_info->buffer_size)
|
||||
bytes = 0;
|
||||
|
||||
segment->offset = offset;
|
||||
segment->bytes = bytes;
|
||||
formatter_info->segment->offset = formatter_info->offset;
|
||||
formatter_info->segment->bytes = bytes;
|
||||
|
||||
if (0 == bytes)
|
||||
return 0;
|
||||
|
||||
memmove(buffer + offset, content, bytes);
|
||||
memmove(formatter_info->buffer + formatter_info->offset, content, bytes);
|
||||
|
||||
return bytes;
|
||||
}
|
||||
@@ -781,6 +780,7 @@ static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supp
|
||||
|
||||
} else {
|
||||
char dummy_buffer[4]; /* flawfinder: ignore - unused. */
|
||||
struct pvformatter_args_s formatter_info;
|
||||
|
||||
display->format[segment].offset = 0;
|
||||
display->format[segment].bytes = 0;
|
||||
@@ -796,10 +796,26 @@ static void pv__format_init(pvstate_t state, /*@null@ */ const char *format_supp
|
||||
* the previous line, or numeric mode knowing which
|
||||
* additional display options are enabled.
|
||||
*/
|
||||
memset(&formatter_info, 0, sizeof(formatter_info));
|
||||
dummy_buffer[0] = '\0';
|
||||
(void) format_component_array[component_type].function(state, display,
|
||||
&(display->format[segment]),
|
||||
dummy_buffer, 0, 0);
|
||||
|
||||
formatter_info.state = state;
|
||||
formatter_info.display = display;
|
||||
formatter_info.segment = &(display->format[segment]);
|
||||
formatter_info.buffer = dummy_buffer;
|
||||
formatter_info.buffer_size = 0;
|
||||
formatter_info.offset = 0;
|
||||
|
||||
/*@-compmempass@ */
|
||||
(void) format_component_array[component_type].function(&formatter_info);
|
||||
/*@+compmempass@ */
|
||||
/*
|
||||
* splint - the buffer we point formatter_info to is
|
||||
* on the stack so doesn't match the "dependent"
|
||||
* annotation, but there's no other appropriate
|
||||
* annotation that doesn't make splint think there's
|
||||
* a leak here.
|
||||
*/
|
||||
}
|
||||
|
||||
display->format_segment_count++;
|
||||
@@ -829,13 +845,14 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl
|
||||
{
|
||||
struct pvdisplay_component_s *format_component_array;
|
||||
char display_segments[1024]; /* flawfinder: ignore - always bounded */
|
||||
size_t display_segment_offset;
|
||||
size_t segment_idx, dynamic_segment_count;
|
||||
const char *display_format;
|
||||
size_t static_portion_width, dynamic_segment_width;
|
||||
size_t display_buffer_offset, display_buffer_remaining;
|
||||
size_t new_display_string_bytes, new_display_string_width;
|
||||
struct pvformatter_args_s formatter_info;
|
||||
|
||||
memset(&formatter_info, 0, sizeof(formatter_info));
|
||||
display_segments[0] = '\0';
|
||||
|
||||
/* Quick safety check - state and display must exist. */
|
||||
@@ -844,6 +861,12 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl
|
||||
if (NULL == display)
|
||||
return false;
|
||||
|
||||
formatter_info.state = state;
|
||||
formatter_info.display = display;
|
||||
formatter_info.buffer = display_segments;
|
||||
formatter_info.buffer_size = sizeof(display_segments);
|
||||
formatter_info.offset = 0;
|
||||
|
||||
format_component_array = pv__format_components();
|
||||
|
||||
/* Populate the display's "final" flag, for formatters. */
|
||||
@@ -911,8 +934,6 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl
|
||||
* output, in two passes.
|
||||
*/
|
||||
|
||||
display_segment_offset = 0;
|
||||
|
||||
/* First pass - all components with a fixed width. */
|
||||
|
||||
static_portion_width = 0;
|
||||
@@ -942,16 +963,17 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl
|
||||
|
||||
segment->width = segment->chosen_size;
|
||||
|
||||
bytes_added =
|
||||
component->function(state, display, segment, display_segments, sizeof(display_segments),
|
||||
display_segment_offset);
|
||||
formatter_info.segment = segment;
|
||||
/*@-compmempass@ */
|
||||
bytes_added = component->function(&formatter_info);
|
||||
/*@+compmempass@ *//* see previous ->function() note. */
|
||||
|
||||
segment->width = 0;
|
||||
if (bytes_added > 0) {
|
||||
segment->width = pv_strwidth(&(display_segments[display_segment_offset]), bytes_added);
|
||||
segment->width = pv_strwidth(&(display_segments[formatter_info.offset]), bytes_added);
|
||||
}
|
||||
|
||||
display_segment_offset += bytes_added;
|
||||
formatter_info.offset += bytes_added;
|
||||
static_portion_width += segment->width;
|
||||
}
|
||||
|
||||
@@ -990,11 +1012,13 @@ bool pv_format(pvstate_t state, /*@null@ */ const char *format_supplied, pvdispl
|
||||
continue;
|
||||
|
||||
segment->width = dynamic_segment_width;
|
||||
bytes_added =
|
||||
component->function(state, display, segment, display_segments, sizeof(display_segments),
|
||||
display_segment_offset);
|
||||
|
||||
display_segment_offset += bytes_added;
|
||||
formatter_info.segment = segment;
|
||||
/*@-compmempass@ */
|
||||
bytes_added = component->function(&formatter_info);
|
||||
/*@+compmempass@ *//* see earlier ->function() note. */
|
||||
|
||||
formatter_info.offset += bytes_added;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -14,27 +14,26 @@
|
||||
/*
|
||||
* Average transfer rate.
|
||||
*/
|
||||
size_t pv_formatter_average_rate(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment, char *buffer,
|
||||
size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_average_rate(pvformatter_args_t args)
|
||||
{
|
||||
char content[128]; /* flawfinder: ignore - always bounded */
|
||||
|
||||
content[0] = '\0';
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
/*@-mustfreefresh@ */
|
||||
if (state->control.bits && !state->control.linemode) {
|
||||
if (args->state->control.bits && !args->state->control.linemode) {
|
||||
/* bits per second */
|
||||
pv_describe_amount(content, sizeof(content),
|
||||
"(%s)", 8 * state->calc.average_rate, "", _("b/s"), display->count_type);
|
||||
"(%s)", 8 * args->state->calc.average_rate, "", _("b/s"), args->display->count_type);
|
||||
} else {
|
||||
/* bytes or lines per second */
|
||||
pv_describe_amount(content,
|
||||
sizeof(content), "(%s)", state->calc.average_rate, _("/s"), _("B/s"), display->count_type);
|
||||
sizeof(content), "(%s)", args->state->calc.average_rate, _("/s"), _("B/s"), args->display->count_type);
|
||||
}
|
||||
/*@+mustfreefresh@ *//* splint: see above. */
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
@@ -14,27 +14,26 @@
|
||||
/*
|
||||
* Percentage transfer buffer utilisation.
|
||||
*/
|
||||
size_t pv_formatter_buffer_percent(pvstate_t state, /*@unused@ */ __attribute__((unused)) pvdisplay_t display,
|
||||
pvdisplay_segment_t segment, char *buffer, size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_buffer_percent(pvformatter_args_t args)
|
||||
{
|
||||
char content[16]; /* flawfinder: ignore - always bounded */
|
||||
|
||||
content[0] = '\0';
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
if (state->transfer.buffer_size > 0) {
|
||||
if (args->state->transfer.buffer_size > 0) {
|
||||
int pct_used = pv_percentage((off_t)
|
||||
(state->transfer.read_position - state->transfer.write_position),
|
||||
(args->state->transfer.read_position - args->state->transfer.write_position),
|
||||
(off_t)
|
||||
(state->transfer.buffer_size));
|
||||
(args->state->transfer.buffer_size));
|
||||
(void) pv_snprintf(content, sizeof(content), "{%3d%%}", pct_used);
|
||||
}
|
||||
#ifdef HAVE_SPLICE
|
||||
if (state->transfer.splice_used)
|
||||
if (args->state->transfer.splice_used)
|
||||
(void) pv_snprintf(content, sizeof(content), "{%s}", "----");
|
||||
#endif
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
@@ -14,27 +14,26 @@
|
||||
/*
|
||||
* Number of bytes or lines transferred.
|
||||
*/
|
||||
size_t pv_formatter_bytes(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment, char *buffer,
|
||||
size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_bytes(pvformatter_args_t args)
|
||||
{
|
||||
char content[128]; /* flawfinder: ignore - always bounded */
|
||||
|
||||
display->showing_bytes = true;
|
||||
args->display->showing_bytes = true;
|
||||
|
||||
content[0] = '\0';
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
/*@-mustfreefresh@ */
|
||||
if (state->control.bits && !state->control.linemode) {
|
||||
if (args->state->control.bits && !args->state->control.linemode) {
|
||||
pv_describe_amount(content, sizeof(content), "%s",
|
||||
(long double) (state->transfer.transferred * 8), "", _("b"), display->count_type);
|
||||
(long double) (args->state->transfer.transferred * 8), "", _("b"), args->display->count_type);
|
||||
} else {
|
||||
pv_describe_amount(content, sizeof(content), "%s",
|
||||
(long double) (state->transfer.transferred), "", _("B"), display->count_type);
|
||||
(long double) (args->state->transfer.transferred), "", _("B"), args->display->count_type);
|
||||
}
|
||||
/*@+mustfreefresh@ *//* splint - false positive from gettext(). */
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
+7
-8
@@ -14,8 +14,7 @@
|
||||
/*
|
||||
* Estimated time until completion.
|
||||
*/
|
||||
size_t pv_formatter_eta(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment, char *buffer,
|
||||
size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_eta(pvformatter_args_t args)
|
||||
{
|
||||
char content[128]; /* flawfinder: ignore - always bounded */
|
||||
long eta;
|
||||
@@ -25,15 +24,15 @@ size_t pv_formatter_eta(pvstate_t state, pvdisplay_t display, pvdisplay_segment_
|
||||
/*
|
||||
* Don't try to calculate this if the size is not known.
|
||||
*/
|
||||
if (state->control.size < 1)
|
||||
if (args->state->control.size < 1)
|
||||
return 0;
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
eta =
|
||||
pv_seconds_remaining((state->transfer.transferred - display->initial_offset),
|
||||
state->control.size - display->initial_offset, state->calc.current_avg_rate);
|
||||
pv_seconds_remaining((args->state->transfer.transferred - args->display->initial_offset),
|
||||
args->state->control.size - args->display->initial_offset, args->state->calc.current_avg_rate);
|
||||
|
||||
/*
|
||||
* Bounds check, so we don't overrun the suffix buffer. This means
|
||||
@@ -62,12 +61,12 @@ size_t pv_formatter_eta(pvstate_t state, pvdisplay_t display, pvdisplay_segment_
|
||||
* If this is the final update, show a blank space where the ETA
|
||||
* used to be.
|
||||
*/
|
||||
if (display->final_update) {
|
||||
if (args->display->final_update) {
|
||||
size_t erase_idx;
|
||||
for (erase_idx = 0; erase_idx < sizeof(content) && content[erase_idx] != '\0'; erase_idx++) {
|
||||
content[erase_idx] = ' ';
|
||||
}
|
||||
}
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
@@ -18,8 +18,7 @@
|
||||
/*
|
||||
* Estimated local time of completion.
|
||||
*/
|
||||
size_t pv_formatter_fineta(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment, char *buffer,
|
||||
size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_fineta(pvformatter_args_t args)
|
||||
{
|
||||
char content[128]; /* flawfinder: ignore - always bounded */
|
||||
time_t now, then;
|
||||
@@ -33,10 +32,10 @@ size_t pv_formatter_fineta(pvstate_t state, pvdisplay_t display, pvdisplay_segme
|
||||
/*
|
||||
* Don't try to calculate this if the size is not known.
|
||||
*/
|
||||
if (state->control.size < 1)
|
||||
if (args->state->control.size < 1)
|
||||
return 0;
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
now = time(NULL);
|
||||
@@ -48,8 +47,8 @@ size_t pv_formatter_fineta(pvstate_t state, pvdisplay_t display, pvdisplay_segme
|
||||
* lookup.
|
||||
*/
|
||||
|
||||
eta = pv_seconds_remaining(state->transfer.transferred - display->initial_offset,
|
||||
state->control.size - display->initial_offset, state->calc.current_avg_rate);
|
||||
eta = pv_seconds_remaining(args->state->transfer.transferred - args->display->initial_offset,
|
||||
args->state->control.size - args->display->initial_offset, args->state->calc.current_avg_rate);
|
||||
|
||||
/* Bounds check - see pv_formatter_eta(). */
|
||||
eta = pv_bound_long(eta, 0, (long) 360000000L);
|
||||
@@ -92,5 +91,5 @@ size_t pv_formatter_fineta(pvstate_t state, pvdisplay_t display, pvdisplay_segme
|
||||
}
|
||||
}
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
+17
-19
@@ -14,42 +14,40 @@
|
||||
/*
|
||||
* Display the last few bytes written.
|
||||
*
|
||||
* As a side effect, this sets display->lastwritten_bytes to the segment's
|
||||
* chosen_size, if it was previously smaller than that.
|
||||
* As a side effect, this sets args->display->lastwritten_bytes to
|
||||
* the segment's chosen_size, if it was previously smaller than that.
|
||||
*/
|
||||
size_t pv_formatter_last_written( /*@unused@ */
|
||||
__attribute__((unused)) pvstate_t state, pvdisplay_t display,
|
||||
pvdisplay_segment_t segment, char *buffer, size_t buffer_size,
|
||||
size_t offset)
|
||||
size_t pv_formatter_last_written(pvformatter_args_t args)
|
||||
{
|
||||
size_t bytes_to_show, read_offset, remaining;
|
||||
size_t bytes_to_show, read_offset, write_offset, remaining;
|
||||
|
||||
display->showing_last_written = true;
|
||||
args->display->showing_last_written = true;
|
||||
|
||||
bytes_to_show = segment->chosen_size;
|
||||
bytes_to_show = args->segment->chosen_size;
|
||||
if (0 == bytes_to_show)
|
||||
bytes_to_show = segment->width;
|
||||
bytes_to_show = args->segment->width;
|
||||
if (0 == bytes_to_show)
|
||||
return 0;
|
||||
|
||||
if (bytes_to_show > PV_SIZEOF_LASTWRITTEN_BUFFER)
|
||||
bytes_to_show = PV_SIZEOF_LASTWRITTEN_BUFFER;
|
||||
if (bytes_to_show > display->lastwritten_bytes)
|
||||
display->lastwritten_bytes = bytes_to_show;
|
||||
if (bytes_to_show > args->display->lastwritten_bytes)
|
||||
args->display->lastwritten_bytes = bytes_to_show;
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
if (offset + bytes_to_show >= buffer_size)
|
||||
if (args->offset + bytes_to_show >= args->buffer_size)
|
||||
return 0;
|
||||
|
||||
segment->offset = offset;
|
||||
segment->bytes = bytes_to_show;
|
||||
args->segment->offset = args->offset;
|
||||
args->segment->bytes = bytes_to_show;
|
||||
|
||||
read_offset = display->lastwritten_bytes - bytes_to_show;
|
||||
read_offset = args->display->lastwritten_bytes - bytes_to_show;
|
||||
write_offset = args->offset;
|
||||
for (remaining = bytes_to_show; remaining > 0; remaining--) {
|
||||
char display_char = display->lastwritten_buffer[read_offset++];
|
||||
buffer[offset++] = pv_isprint(display_char) ? display_char : '.';
|
||||
char display_char = args->display->lastwritten_buffer[read_offset++];
|
||||
args->buffer[write_offset++] = pv_isprint(display_char) ? display_char : '.';
|
||||
}
|
||||
|
||||
return bytes_to_show;
|
||||
|
||||
@@ -16,17 +16,16 @@
|
||||
/*
|
||||
* Display the transfer's name.
|
||||
*/
|
||||
size_t pv_formatter_name(pvstate_t state, /*@unused@ */ __attribute__((unused)) pvdisplay_t display,
|
||||
pvdisplay_segment_t segment, char *buffer, size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_name(pvformatter_args_t args)
|
||||
{
|
||||
char string_format[32]; /* flawfinder: ignore - always bounded */
|
||||
char content[512]; /* flawfinder: ignore - always bounded */
|
||||
size_t field_width;
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
field_width = segment->chosen_size;
|
||||
field_width = args->segment->chosen_size;
|
||||
if (field_width < 1)
|
||||
field_width = 9;
|
||||
if (field_width > 500)
|
||||
@@ -36,9 +35,9 @@ size_t pv_formatter_name(pvstate_t state, /*@unused@ */ __attribute__((unused))
|
||||
(void) pv_snprintf(string_format, sizeof(string_format), "%%%d.500s:", field_width);
|
||||
|
||||
content[0] = '\0';
|
||||
if (state->control.name) {
|
||||
(void) pv_snprintf(content, sizeof(content), string_format, state->control.name);
|
||||
if (args->state->control.name) {
|
||||
(void) pv_snprintf(content, sizeof(content), string_format, args->state->control.name);
|
||||
}
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
@@ -14,37 +14,35 @@
|
||||
/*
|
||||
* Display the previously written line.
|
||||
*/
|
||||
size_t pv_formatter_previous_line( /*@unused@ */
|
||||
__attribute__((unused)) pvstate_t state, pvdisplay_t display,
|
||||
pvdisplay_segment_t segment, char *buffer, size_t buffer_size,
|
||||
size_t offset)
|
||||
size_t pv_formatter_previous_line(pvformatter_args_t args)
|
||||
{
|
||||
size_t bytes_to_show, read_offset, remaining;
|
||||
size_t bytes_to_show, read_offset, write_offset, remaining;
|
||||
|
||||
display->showing_previous_line = true;
|
||||
args->display->showing_previous_line = true;
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
bytes_to_show = segment->chosen_size;
|
||||
bytes_to_show = args->segment->chosen_size;
|
||||
if (0 == bytes_to_show)
|
||||
bytes_to_show = segment->width;
|
||||
bytes_to_show = args->segment->width;
|
||||
if (0 == bytes_to_show)
|
||||
return 0;
|
||||
|
||||
if (bytes_to_show > PV_SIZEOF_PREVLINE_BUFFER)
|
||||
bytes_to_show = PV_SIZEOF_PREVLINE_BUFFER;
|
||||
|
||||
if (offset + bytes_to_show >= buffer_size)
|
||||
if (args->offset + bytes_to_show >= args->buffer_size)
|
||||
return 0;
|
||||
|
||||
segment->offset = offset;
|
||||
segment->bytes = bytes_to_show;
|
||||
args->segment->offset = args->offset;
|
||||
args->segment->bytes = bytes_to_show;
|
||||
|
||||
read_offset = 0;
|
||||
write_offset = args->offset;
|
||||
for (remaining = bytes_to_show; remaining > 0; remaining--) {
|
||||
char display_char = display->previous_line[read_offset++];
|
||||
buffer[offset++] = pv_isprint(display_char) ? display_char : ' ';
|
||||
char display_char = args->display->previous_line[read_offset++];
|
||||
args->buffer[write_offset++] = pv_isprint(display_char) ? display_char : ' ';
|
||||
}
|
||||
|
||||
return bytes_to_show;
|
||||
|
||||
+17
-20
@@ -233,82 +233,79 @@ static size_t pv_formatter_progress_unknownsize(pvstate_t state, /*@unused@ */
|
||||
/*
|
||||
* Progress bar.
|
||||
*/
|
||||
size_t pv_formatter_progress(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment, char *buffer,
|
||||
size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_progress(pvformatter_args_t args)
|
||||
{
|
||||
char content[1024]; /* flawfinder: ignore - always bounded */
|
||||
size_t bytes;
|
||||
|
||||
content[0] = '\0';
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
if (state->control.size > 0 || state->control.rate_gauge) {
|
||||
if (args->state->control.size > 0 || args->state->control.rate_gauge) {
|
||||
/* Known size or rate gauge - bar with percentage. */
|
||||
bytes =
|
||||
pv_formatter_progress_knownsize(state, display, content, sizeof(content), segment->width, true, true,
|
||||
pv_formatter_progress_knownsize(args->state, args->display, content, sizeof(content), args->segment->width, true, true,
|
||||
true);
|
||||
} else {
|
||||
/* Unknown size - back-and-forth moving indicator. */
|
||||
bytes = pv_formatter_progress_unknownsize(state, display, content, sizeof(content), segment->width, true);
|
||||
bytes = pv_formatter_progress_unknownsize(args->state, args->display, content, sizeof(content), args->segment->width, true);
|
||||
}
|
||||
|
||||
content[bytes] = '\0';
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Progress bar, without sides and without a number afterwards.
|
||||
*/
|
||||
size_t pv_formatter_progress_bar_only(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment,
|
||||
char *buffer, size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_progress_bar_only(pvformatter_args_t args)
|
||||
{
|
||||
char content[1024]; /* flawfinder: ignore - always bounded */
|
||||
size_t bytes;
|
||||
|
||||
content[0] = '\0';
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
if (state->control.size > 0 || state->control.rate_gauge) {
|
||||
if (args->state->control.size > 0 || args->state->control.rate_gauge) {
|
||||
/* Known size or rate gauge - bar with percentage. */
|
||||
bytes =
|
||||
pv_formatter_progress_knownsize(state, display, content, sizeof(content), segment->width, false, true,
|
||||
pv_formatter_progress_knownsize(args->state, args->display, content, sizeof(content), args->segment->width, false, true,
|
||||
false);
|
||||
} else {
|
||||
/* Unknown size - back-and-forth moving indicator. */
|
||||
bytes =
|
||||
pv_formatter_progress_unknownsize(state, display, content, sizeof(content), segment->width, false);
|
||||
pv_formatter_progress_unknownsize(args->state, args->display, content, sizeof(content), args->segment->width, false);
|
||||
}
|
||||
|
||||
content[bytes] = '\0';
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The number after the progress bar.
|
||||
*/
|
||||
size_t pv_formatter_progress_amount_only(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment,
|
||||
char *buffer, size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_progress_amount_only(pvformatter_args_t args)
|
||||
{
|
||||
char content[256]; /* flawfinder: ignore - always bounded */
|
||||
size_t bytes;
|
||||
|
||||
content[0] = '\0';
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
if (state->control.size > 0 || state->control.rate_gauge) {
|
||||
if (args->state->control.size > 0 || args->state->control.rate_gauge) {
|
||||
/* Known size or rate gauge - percentage or rate. */
|
||||
bytes =
|
||||
pv_formatter_progress_knownsize(state, display, content, sizeof(content), segment->width, false,
|
||||
pv_formatter_progress_knownsize(args->state, args->display, content, sizeof(content), args->segment->width, false,
|
||||
false, true);
|
||||
} else {
|
||||
/* Unknown size - no number. */
|
||||
@@ -317,5 +314,5 @@ size_t pv_formatter_progress_amount_only(pvstate_t state, pvdisplay_t display, p
|
||||
|
||||
content[bytes] = '\0';
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
@@ -14,29 +14,28 @@
|
||||
/*
|
||||
* Transfer rate.
|
||||
*/
|
||||
size_t pv_formatter_rate(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment, char *buffer,
|
||||
size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_rate(pvformatter_args_t args)
|
||||
{
|
||||
char content[128]; /* flawfinder: ignore - always bounded */
|
||||
|
||||
display->showing_rate = true;
|
||||
args->display->showing_rate = true;
|
||||
|
||||
content[0] = '\0';
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
/*@-mustfreefresh@ */
|
||||
if (state->control.bits && !state->control.linemode) {
|
||||
if (args->state->control.bits && !args->state->control.linemode) {
|
||||
/* bits per second */
|
||||
pv_describe_amount(content, sizeof(content), "[%s]",
|
||||
8 * state->calc.transfer_rate, "", _("b/s"), display->count_type);
|
||||
8 * args->state->calc.transfer_rate, "", _("b/s"), args->display->count_type);
|
||||
} else {
|
||||
/* bytes or lines per second */
|
||||
pv_describe_amount(content, sizeof(content),
|
||||
"[%s]", state->calc.transfer_rate, _("/s"), _("B/s"), display->count_type);
|
||||
"[%s]", args->state->calc.transfer_rate, _("/s"), _("B/s"), args->display->count_type);
|
||||
}
|
||||
/*@+mustfreefresh@ *//* splint: see above. */
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
+14
-15
@@ -14,16 +14,15 @@
|
||||
/*
|
||||
* Elapsed time.
|
||||
*/
|
||||
size_t pv_formatter_timer(pvstate_t state, pvdisplay_t display, pvdisplay_segment_t segment, char *buffer,
|
||||
size_t buffer_size, size_t offset)
|
||||
size_t pv_formatter_timer(pvformatter_args_t args)
|
||||
{
|
||||
char content[128]; /* flawfinder: ignore - always bounded */
|
||||
|
||||
display->showing_timer = true;
|
||||
args->display->showing_timer = true;
|
||||
|
||||
content[0] = '\0';
|
||||
|
||||
if (0 == buffer_size)
|
||||
if (0 == args->buffer_size)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
@@ -31,29 +30,29 @@ size_t pv_formatter_timer(pvstate_t state, pvdisplay_t display, pvdisplay_segmen
|
||||
* mean that the timer will stop at a 100,000 hours, but since
|
||||
* that's 11 years, it shouldn't be a problem.
|
||||
*/
|
||||
if (state->transfer.elapsed_seconds > (long double) 360000000.0L)
|
||||
state->transfer.elapsed_seconds = (long double) 360000000.0L;
|
||||
if (args->state->transfer.elapsed_seconds > (long double) 360000000.0L)
|
||||
args->state->transfer.elapsed_seconds = (long double) 360000000.0L;
|
||||
|
||||
/*
|
||||
* If the elapsed time is more than a day, include a day count as
|
||||
* well as hours, minutes, and seconds.
|
||||
*/
|
||||
if (state->transfer.elapsed_seconds > (long double) 86400.0L) {
|
||||
if (args->state->transfer.elapsed_seconds > (long double) 86400.0L) {
|
||||
(void) pv_snprintf(content,
|
||||
sizeof(content),
|
||||
"%ld:%02ld:%02ld:%02ld",
|
||||
((long) (state->transfer.elapsed_seconds)) / 86400,
|
||||
(((long) (state->transfer.elapsed_seconds)) / 3600) %
|
||||
24, (((long) (state->transfer.elapsed_seconds)) / 60) % 60,
|
||||
((long) (state->transfer.elapsed_seconds)) % 60);
|
||||
((long) (args->state->transfer.elapsed_seconds)) / 86400,
|
||||
(((long) (args->state->transfer.elapsed_seconds)) / 3600) %
|
||||
24, (((long) (args->state->transfer.elapsed_seconds)) / 60) % 60,
|
||||
((long) (args->state->transfer.elapsed_seconds)) % 60);
|
||||
} else {
|
||||
(void) pv_snprintf(content,
|
||||
sizeof(content),
|
||||
"%ld:%02ld:%02ld",
|
||||
((long) (state->transfer.elapsed_seconds)) / 3600,
|
||||
(((long) (state->transfer.elapsed_seconds)) / 60) % 60,
|
||||
((long) (state->transfer.elapsed_seconds)) % 60);
|
||||
((long) (args->state->transfer.elapsed_seconds)) / 3600,
|
||||
(((long) (args->state->transfer.elapsed_seconds)) / 60) % 60,
|
||||
((long) (args->state->transfer.elapsed_seconds)) % 60);
|
||||
}
|
||||
|
||||
return pv_formatter_segmentcontent(content, segment, buffer, buffer_size, offset);
|
||||
return pv_formatter_segmentcontent(content, args);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user