message.c File Reference

Printing messages. More...

`#include "private.h"`
`#include <stdarg.h>`

## Functions

void | message_init (void)
| Initializes the message functions. More...
void | message_verbosity_increase (void)
| Increase verbosity level by one step unless it was at maximum. More...
void | message_verbosity_decrease (void)
| Decrease verbosity level by one step unless it was at minimum. More...
enum message_verbosity | message_verbosity_get (void)
| Get the current verbosity level. More...
void | message_set_files (unsigned int files)
| Set the total number of files to be processed. More...
static void | print_filename (void)
void | message_filename (const char *src_name)
| Set the name of the current file and possibly print it too. More...
void | message_progress_start (lzma_stream *strm, bool is_passthru, uint64_t in_size)
| Start progress info handling. More...
static const char * | progress_percentage (uint64_t in_pos)
| Make the string indicating completion percentage. More...
static const char * | progress_sizes (uint64_t compressed_pos, uint64_t uncompressed_pos, bool final)
static const char * | progress_speed (uint64_t uncompressed_pos, uint64_t elapsed)
| Make the string containing the processing speed of uncompressed data. More...
static const char * | progress_time (uint64_t mseconds)
static const char * | progress_remaining (uint64_t in_pos, uint64_t elapsed)
static void | progress_pos (uint64_t *in_pos, uint64_t *compressed_pos, uint64_t *uncompressed_pos)
| Get how much uncompressed and compressed data has been processed. More...
void | message_progress_update (void)
static void | progress_flush (bool finished)
void | message_progress_end (bool success)
| Finishes the progress message if we were in verbose mode. More...
static void | vmessage (enum message_verbosity v, const char *fmt, va_list ap)
void | message (enum message_verbosity v, const char *fmt,...)
void | message_warning (const char *fmt,...)
void | message_error (const char *fmt,...)
void | message_fatal (const char *fmt,...)
void | message_bug (void)
void | message_signal_handler (void)
const char * | message_strm (lzma_ret code)
| Convert lzma_ret to a string. More...
void | message_mem_needed (enum message_verbosity v, uint64_t memusage)
| Display how much memory was needed and how much the limit was. More...
static const char * | uint32_to_optstr (uint32_t num)
| Convert uint32_t to a nice string for –lzma[12]=dict=SIZE. More...
void | message_filters_to_str (char buf[FILTERS_STR_SIZE], const lzma_filter *filters, bool all_known)
| Get the filter chain as a string. More...
void | message_filters_show (enum message_verbosity v, const lzma_filter *filters)
| Print the filter chain. More...
void | message_try_help (void)
| Print a message that user should try –help. More...
void | message_version (void)
| Prints the version number to stdout and exits with exit status SUCCESS. More...
void | message_help (bool long_help)
| Print the help message. More...

## Variables

static unsigned int | files_pos = 0
| Number of the current file. More...
static unsigned int | files_total
| Total number of input files; zero if unknown. More...
static enum message_verbosity | verbosity = V_WARNING
| Verbosity level. More...
static const char * | filename
| Filename which we will print with the verbose messages. More...
static bool | first_filename_printed = false
static bool | current_filename_printed = false
static bool | progress_automatic
static bool | progress_started = false
static bool | progress_active = false
static lzma_stream * | progress_strm
| Pointer to lzma_stream used to do the encoding or decoding. More...
static bool | progress_is_from_passthru
static uint64_t | expected_in_size
static bool | progress_needs_updating = false
static uint64_t | progress_next_update
| Elapsed time when the next progress message update should be done. More...

## Detailed Description

Printing messages.

## Function Documentation

## message_init()

void message_init | ( | void |  | ) |

Initializes the message functions.

If an error occurs, this function doesn't return.

References progress_automatic.

## message_verbosity_increase()

void message_verbosity_increase | ( | void |  | ) |

Increase verbosity level by one step unless it was at maximum.

References V_DEBUG, and verbosity.

## message_verbosity_decrease()

void message_verbosity_decrease | ( | void |  | ) |

Decrease verbosity level by one step unless it was at minimum.

References V_SILENT, and verbosity.

## message_verbosity_get()

enum message_verbosity message_verbosity_get | ( | void |  | ) |

Get the current verbosity level.

## message_set_files()

void message_set_files | ( | unsigned int | files | ) |

Set the total number of files to be processed.

Standard input is counted as a file here. This is used when printing the filename via message_filename().

## print_filename()

static void print_filename | ( | void |  | ) |

static

Prints the name of the current file if it hasn't been printed already, except if we are processing exactly one stream from stdin to stdout. I think it looks nicer to not print "(stdin)" when –verbose is used in a pipe and no other files are processed.

Referenced by message_progress_update().

## message_filename()

void message_filename | ( | const char * | src_name | ) |

Set the name of the current file and possibly print it too.

The name is printed immediately if –list was used or if –verbose was used and stderr is a terminal. Even when the filename isn't printed, it is stored so that it can be printed later if needed for progress messages.

References filename, files_pos, opt_mode, progress_automatic, V_VERBOSE, and verbosity.

Referenced by coder_run().

## message_progress_start()

void message_progress_start | ( | lzma_stream * | strm,
|  | bool | is_passthru,
|  | uint64_t | in_size
| ) |  |

Start progress info handling.

message_filename() must be called before this function to set the filename.

This must be paired with a call to message_progress_end() before the given *strm becomes invalid.

Parameters

  strm | Pointer to lzma_stream used for the coding.
  in_size | Size of the input file, or zero if unknown.

References expected_in_size, progress_automatic, progress_is_from_passthru, progress_needs_updating, progress_next_update, progress_started, progress_strm, strm, V_VERBOSE, and verbosity.

## progress_percentage()

static const char* progress_percentage | ( | uint64_t | in_pos | ) |

static

Make the string indicating completion percentage.

References expected_in_size.

Referenced by message_progress_update().

## progress_sizes()

static const char* progress_sizes | ( | uint64_t | compressed_pos,
|  | uint64_t | uncompressed_pos,
|  | bool | final
| ) |  |

static

Make the string containing the amount of input processed, amount of output produced, and the compression ratio.

Referenced by message_progress_update().

## progress_speed()

static const char* progress_speed | ( | uint64_t | uncompressed_pos,
|  | uint64_t | elapsed
| ) |  |

static

Make the string containing the processing speed of uncompressed data.

Referenced by message_progress_update().

## progress_time()

static const char* progress_time | ( | uint64_t | mseconds | ) |

static

Make a string indicating elapsed time. The format is either M:SS or H:MM:SS depending on if the time is an hour or more.

Referenced by message_progress_update().

## progress_remaining()

static const char* progress_remaining | ( | uint64_t | in_pos,
|  | uint64_t | elapsed
| ) |  |

static

Return a string containing estimated remaining time when reasonably possible.

References expected_in_size.

Referenced by message_progress_update().

## progress_pos()

static void progress_pos | ( | uint64_t * | in_pos,
|  | uint64_t * | compressed_pos,
|  | uint64_t * | uncompressed_pos
| ) |  |

static

Get how much uncompressed and compressed data has been processed.

References lzma_get_progress(), progress_is_from_passthru, progress_strm, lzma_stream::total_in, and lzma_stream::total_out.

Referenced by message_progress_update().

## message_progress_update()

void message_progress_update | ( | void |  | ) |

Update the progress info if in verbose mode and enough time has passed since the previous update. This can be called only when message_progress_start() has already been used.

References current_filename_printed, mytime_get_elapsed(), print_filename(), progress_needs_updating, progress_next_update, progress_percentage(), progress_pos(), progress_remaining(), progress_sizes(), progress_speed(), progress_time(), and signals_block().

Referenced by coder_passthru().

## message_progress_end()

void message_progress_end | ( | bool | finished | ) |

Finishes the progress message if we were in verbose mode.

Parameters

  finished | True if the whole stream was successfully coded and output written to the output stream.

## message_bug()

void message_bug | ( | void |  | ) |

Print an error message that an internal error occurred and exit with EXIT_ERROR.

References message_fatal().

## message_signal_handler()

void message_signal_handler | ( | void |  | ) |

Print a message that establishing signal handlers failed, and exit with exit status ERROR.

References message_fatal().

## message_strm()

const char* message_strm | ( | lzma_ret | code | ) |

Convert lzma_ret to a string.

References LZMA_NO_CHECK.

## message_mem_needed()

void message_mem_needed | ( | enum message_verbosity | v,
|  | uint64_t | memusage
| ) |  |

Display how much memory was needed and how much the limit was.

References hardware_memlimit_get(), opt_mode, round_up_to_mib(), and verbosity.

## uint32_to_optstr()

static const char* uint32_to_optstr | ( | uint32_t | num | ) |

static

Convert uint32_t to a nice string for –lzma[12]=dict=SIZE.

The idea is to use KiB or MiB suffix when possible.

Referenced by message_filters_to_str().

## message_filters_to_str()

void message_filters_to_str | ( | char | buf[FILTERS_STR_SIZE],
|  | const lzma_filter * | filters,
|  | bool | all_known
| ) |  |

Get the filter chain as a string.

Parameters

  buf | Pointer to caller allocated buffer to hold the filter chain string
  filters | Pointer to the filter chain
  all_known | If true, all filter options are printed. If false, only the options that get stored into .xz headers are printed.

References lzma_options_lzma::dict_size, filters, FILTERS_STR_SIZE, lzma_filter::id, LZMA_FILTER_LZMA1, LZMA_FILTER_LZMA2, LZMA_MF_BT2, LZMA_MF_BT3, LZMA_MF_BT4, LZMA_MF_HC3, LZMA_MF_HC4, LZMA_MODE_FAST, LZMA_MODE_NORMAL, LZMA_VLI_UNKNOWN, lzma_options_lzma::mf, lzma_options_lzma::mode, my_snprintf(), lzma_filter::options, and uint32_to_optstr().

Referenced by message_filters_show().

## message_filters_show()

void message_filters_show | ( | enum message_verbosity | v,
|  | const lzma_filter * | filters
| ) |  |

Print the filter chain.

References filters, FILTERS_STR_SIZE, message_filters_to_str(), and verbosity.

## message_try_help()

void message_try_help | ( | void |  | ) |

Print a message that user should try –help.

References message(), and V_WARNING.

## message_version()

void message_version | ( | void |  | ) |

Prints the version number to stdout and exits with exit status SUCCESS.

## message_help()

void message_help | ( | bool | long_help | ) |

Print the help message.

## Variable Documentation

## files_pos

unsigned int files_pos = 0

static

Number of the current file.

Referenced by message_filename().

## files_total

unsigned int files_total

static

Total number of input files; zero if unknown.

## verbosity

enum message_verbosity verbosity = V_WARNING

static

Verbosity level.

Referenced by message_filename(), message_filters_show(), message_mem_needed(), message_progress_start(), message_verbosity_decrease(), and message_verbosity_increase().

## filename

const char* filename

static

Filename which we will print with the verbose messages.

Referenced by coder_run(), is_empty_filename(), and message_filename().

## first_filename_printed

bool first_filename_printed = false

static

True once the a filename has been printed to stderr as part of progress message. If automatic progress updating isn't enabled, this becomes true after the first progress message has been printed due to user sending SIGINFO, SIGUSR1, or SIGALRM. Once this variable is true, we will print an empty line before the next filename to make the output more readable.

## current_filename_printed

bool current_filename_printed = false

static

This is set to true when we have printed the current filename to stderr as part of a progress message. This variable is useful only if not updating progress automatically: if user sends many SIGINFO, SIGUSR1, or SIGALRM signals, we won't print the name of the same file multiple times.

Referenced by message_progress_update().

## progress_automatic

bool progress_automatic

static

True if we should print progress indicator and update it automatically if also verbose >= V_VERBOSE.

Referenced by message_filename(), message_init(), and message_progress_start().

## progress_started

bool progress_started = false

static

True if message_progress_start() has been called but message_progress_end() hasn't been called yet.

Referenced by message_progress_start().

## progress_active

bool progress_active = false

static

This is true when a progress message was printed and the cursor is still on the same line with the progress message. In that case, a newline has to be printed before any error messages.

## progress_strm

lzma_stream* progress_strm

static

Pointer to lzma_stream used to do the encoding or decoding.

Referenced by message_progress_start(), and progress_pos().

## progress_is_from_passthru

bool progress_is_from_passthru

static

This is true if we are in passthru mode (not actually compressing or decompressing) and thus cannot use lzma_get_progress(progress_strm, ...). That is, we are using coder_passthru() in coder.c.

Referenced by message_progress_start(), and progress_pos().

## expected_in_size

uint64_t expected_in_size

static

Expected size of the input stream is needed to show completion percentage and estimate remaining time.

Referenced by message_progress_start(), progress_percentage(), and progress_remaining().

## progress_needs_updating

bool progress_needs_updating = false

static

This is true when progress message printing is wanted. Using the same variable name as above to avoid some ifdefs.

Referenced by message_progress_start(), and message_progress_update().

## progress_next_update

uint64_t progress_next_update

static

Elapsed time when the next progress message update should be done.

Referenced by message_progress_start(), and message_progress_update().