1 /////////////////////////////////////////////////////////////////////////////// 2 // 3 /// \file message.h 4 /// \brief Printing messages to stderr 5 // 6 // Author: Lasse Collin 7 // 8 // This file has been put into the public domain. 9 // You can do whatever you want with this file. 10 // 11 /////////////////////////////////////////////////////////////////////////////// 12 13 /// Verbosity levels 14 enum message_verbosity { 15 V_SILENT, ///< No messages 16 V_ERROR, ///< Only error messages 17 V_WARNING, ///< Errors and warnings 18 V_VERBOSE, ///< Errors, warnings, and verbose statistics 19 V_DEBUG, ///< Debugging, FIXME remove? 20 }; 21 22 23 /// \brief Initializes the message functions 24 /// 25 /// If an error occurs, this function doesn't return. 26 /// 27 extern void message_init(void); 28 29 30 /// Increase verbosity level by one step unless it was at maximum. 31 extern void message_verbosity_increase(void); 32 33 /// Decrease verbosity level by one step unless it was at minimum. 34 extern void message_verbosity_decrease(void); 35 36 /// Get the current verbosity level. 37 extern enum message_verbosity message_verbosity_get(void); 38 39 40 /// \brief Print a message if verbosity level is at least "verbosity" 41 /// 42 /// This doesn't touch the exit status. 43 extern void message(enum message_verbosity verbosity, const char *fmt, ...) 44 lzma_attribute((format(printf, 2, 3))); 45 46 47 /// \brief Prints a warning and possibly sets exit status 48 /// 49 /// The message is printed only if verbosity level is at least V_WARNING. 50 /// The exit status is set to WARNING unless it was already at ERROR. 51 extern void message_warning(const char *fmt, ...) 52 lzma_attribute((format(printf, 1, 2))); 53 54 55 /// \brief Prints an error message and sets exit status 56 /// 57 /// The message is printed only if verbosity level is at least V_ERROR. 58 /// The exit status is set to ERROR. 59 extern void message_error(const char *fmt, ...) 60 lzma_attribute((format(printf, 1, 2))); 61 62 63 /// \brief Prints an error message and exits with EXIT_ERROR 64 /// 65 /// The message is printed only if verbosity level is at least V_ERROR. 66 extern void message_fatal(const char *fmt, ...) 67 lzma_attribute((format(printf, 1, 2))) 68 lzma_attribute((noreturn)); 69 70 71 /// Print an error message that an internal error occurred and exit with 72 /// EXIT_ERROR. 73 extern void message_bug(void) lzma_attribute((noreturn)); 74 75 76 /// Print a message that establishing signal handlers failed, and exit with 77 /// exit status ERROR. 78 extern void message_signal_handler(void) lzma_attribute((noreturn)); 79 80 81 /// Convert lzma_ret to a string. 82 extern const char *message_strm(lzma_ret code); 83 84 85 /// Display how much memory was needed and how much the limit was. 86 extern void message_mem_needed(enum message_verbosity v, uint64_t memusage); 87 88 89 /// Buffer size for message_filters_to_str() 90 #define FILTERS_STR_SIZE 512 91 92 93 /// \brief Get the filter chain as a string 94 /// 95 /// \param buf Pointer to caller allocated buffer to hold 96 /// the filter chain string 97 /// \param filters Pointer to the filter chain 98 /// \param all_known If true, all filter options are printed. 99 /// If false, only the options that get stored 100 /// into .xz headers are printed. 101 extern void message_filters_to_str(char buf[FILTERS_STR_SIZE], 102 const lzma_filter *filters, bool all_known); 103 104 105 /// Print the filter chain. 106 extern void message_filters_show( 107 enum message_verbosity v, const lzma_filter *filters); 108 109 110 /// Print a message that user should try --help. 111 extern void message_try_help(void); 112 113 114 /// Prints the version number to stdout and exits with exit status SUCCESS. 115 extern void message_version(void) lzma_attribute((noreturn)); 116 117 118 /// Print the help message. 119 extern void message_help(bool long_help) lzma_attribute((noreturn)); 120 121 122 /// \brief Set the total number of files to be processed 123 /// 124 /// Standard input is counted as a file here. This is used when printing 125 /// the filename via message_filename(). 126 extern void message_set_files(unsigned int files); 127 128 129 /// \brief Set the name of the current file and possibly print it too 130 /// 131 /// The name is printed immediately if --list was used or if --verbose 132 /// was used and stderr is a terminal. Even when the filename isn't printed, 133 /// it is stored so that it can be printed later if needed for progress 134 /// messages. 135 extern void message_filename(const char *src_name); 136 137 138 /// \brief Start progress info handling 139 /// 140 /// message_filename() must be called before this function to set 141 /// the filename. 142 /// 143 /// This must be paired with a call to message_progress_end() before the 144 /// given *strm becomes invalid. 145 /// 146 /// \param strm Pointer to lzma_stream used for the coding. 147 /// \param in_size Size of the input file, or zero if unknown. 148 /// 149 extern void message_progress_start(lzma_stream *strm, uint64_t in_size); 150 151 152 /// Update the progress info if in verbose mode and enough time has passed 153 /// since the previous update. This can be called only when 154 /// message_progress_start() has already been used. 155 extern void message_progress_update(void); 156 157 158 /// \brief Finishes the progress message if we were in verbose mode 159 /// 160 /// \param finished True if the whole stream was successfully coded 161 /// and output written to the output stream. 162 /// 163 extern void message_progress_end(bool finished); 164