00001 #include "config.h"
00002
00003 #include "headers.h"
00004 #include "error.h"
00005 #include "fd.h"
00006 #include "io.h"
00007 #include "display.h"
00008 #include "args.h"
00009
00010 #ifndef HAVE_SPRINTF
00011 # error *** ERROR: This system does not have sprintf()
00012 #endif
00013
00014 struct _options_list {
00015 char *short_option1;
00016 char *short_option2;
00017 char *long_option1;
00018 char *long_option2;
00019 char *rc_option;
00020 char *arg_description;
00021 char *description;
00022 int (*cl_func)(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00023 int (*rc_func)(FILE *ferr, char *filename, int line, char *tag, char *value);
00024 };
00025
00026 typedef struct _options_list options_list;
00027
00028 struct _colors_list {
00029 char *name;
00030 char *code;
00031 };
00032
00033 typedef struct _colors_list colors_list;
00034
00035
00036 char _parsing_blocks = 0;
00037
00038 int parse_infile_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00039 int parse_outfile_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00040 int parse_size_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00041 int parse_completed_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00042 int parse_throttle_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00043 int parse_buffer_size_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00044 int parse_block_size_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00045 int parse_interval_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00046 int parse_timeout_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00047 int parse_kilo_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00048 int parse_width_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00049 int parse_minus_one_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00050 int parse_twiddle_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00051 int parse_count_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00052 int parse_throughput_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00053 int parse_time_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00054 int parse_elapsed_only_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00055 int parse_percent_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00056 int parse_bar_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00057 int parse_summary_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00058 int parse_ansi_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00059 int parse_displays_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00060 int parse_help_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00061 int parse_version_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00062 int parse_throughput_bits_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00063 int parse_count_bits_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00064 int parse_title_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00065 int parse_display_title_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00066 int parse_total_percent_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00067
00068 int parse_space_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00069 int parse_twiddle_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00070 int parse_twiddle_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00071 int parse_twiddle_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00072 int parse_title_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00073 int parse_title_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00074 int parse_title_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00075 int parse_count_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00076 int parse_count_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00077 int parse_count_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00078 int parse_throughput_label_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00079 int parse_throughput_label_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00080 int parse_throughput_label_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00081 int parse_throughput_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00082 int parse_throughput_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00083 int parse_throughput_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00084 int parse_time_label_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00085 int parse_time_label_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00086 int parse_time_label_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00087 int parse_time_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00088 int parse_time_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00089 int parse_time_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00090 int parse_percent_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00091 int parse_percent_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00092 int parse_percent_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00093 int parse_barbrace_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00094 int parse_barbrace_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00095 int parse_barbrace_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00096 int parse_bar_fg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00097 int parse_bar_bg_color_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00098 int parse_bar_fg_bold_commandline(FILE *ferr, int argc, char *argv[], int *arg_num, int option_num);
00099
00100 int parse_throttle_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00101 int parse_buffer_size_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00102 int parse_block_size_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00103 int parse_interval_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00104 int parse_timeout_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00105 int parse_kilo_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00106 int parse_width_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00107 int parse_minus_one_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00108 int parse_twiddle_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00109 int parse_count_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00110 int parse_throughput_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00111 int parse_time_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00112 int parse_elapsed_only_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00113 int parse_percent_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00114 int parse_bar_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00115 int parse_summary_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00116 int parse_ansi_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00117 int parse_throughput_bits_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00118 int parse_count_bits_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00119 int parse_title_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00120 int parse_display_title_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00121 int parse_total_percent_rc(FILE *ferr, char* filename, int line, char *tag, char *value);
00122
00123 int parse_space_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00124 int parse_twiddle_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00125 int parse_twiddle_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00126 int parse_twiddle_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00127 int parse_title_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00128 int parse_title_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00129 int parse_title_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00130 int parse_count_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00131 int parse_count_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00132 int parse_count_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00133 int parse_throughput_label_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00134 int parse_throughput_label_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00135 int parse_throughput_label_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00136 int parse_throughput_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00137 int parse_throughput_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00138 int parse_throughput_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00139 int parse_time_label_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00140 int parse_time_label_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00141 int parse_time_label_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00142 int parse_time_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00143 int parse_time_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00144 int parse_time_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00145 int parse_percent_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00146 int parse_percent_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00147 int parse_percent_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00148 int parse_barbrace_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00149 int parse_barbrace_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00150 int parse_barbrace_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00151 int parse_bar_fg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00152 int parse_bar_bg_color_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00153 int parse_bar_fg_bold_rc(FILE *ferr, char *filename, int line, char *tag, char *value);
00154
00155 options_list options[] = {
00156 {
00157 "-if", 0, "--in-file", 0, 0, "<file>",
00158 "Read input from <file>. Default: stdin",
00159 parse_infile_commandline,
00160 0
00161 },
00162 {
00163 "-of", 0, "--out-file", 0, 0, "<file>",
00164 "Write output to <file>. Default: stdout",
00165 parse_outfile_commandline,
00166 0
00167 },
00168 {
00169 "-s", 0, "--size", 0, 0, "<size>",
00170 "Expect an input stream of <size> bytes.",
00171 parse_size_commandline,
00172 0
00173 },
00174 {
00175 "-c", 0, "--completed", 0, 0, "<size>",
00176 "Expect to continue an input stream at <size> bytes.",
00177 parse_completed_commandline,
00178 0
00179 },
00180 {
00181 "-th", 0, "--throttle", 0, "throttle", "<rate>",
00182 "Throttle I/O rate to <rate> bytes per second.",
00183 parse_throttle_commandline,
00184 parse_throttle_rc,
00185 },
00186 {
00187 "-bs", 0, "--buffer-size", 0, "buffer-size", "<size>",
00188 "Allocate an I/O buffer of <size> bytes. Default: 1024",
00189 parse_buffer_size_commandline,
00190 parse_buffer_size_rc
00191 },
00192 {
00193 "-bl", 0, "--block-size", 0, "block-size", "<size>",
00194 "Assume blocks of <size> bytes when parsing sizes in blocks. Default: 1024",
00195 parse_block_size_commandline,
00196 parse_block_size_rc
00197 },
00198 {
00199 "-i", 0, "--interval", 0, "interval", "<secs>",
00200 "Update the display every <secs> seconds. Default: 1",
00201 parse_interval_commandline,
00202 parse_interval_rc
00203 },
00204 {
00205 "-t", 0, "--timeout", 0, "timeout", "<usecs>",
00206 "Wait <usecs> microseconds for a change in I/O. Default: 250000",
00207 parse_timeout_commandline,
00208 parse_timeout_rc
00209 },
00210 {
00211 "-k", 0, "--kilo", 0, "kilobyte", "1000|1024",
00212 "Use 1000 or 1024 as the size of a kilobyte. Default: 1024",
00213 parse_kilo_commandline,
00214 parse_kilo_rc
00215 },
00216 {
00217 "-sw", 0, "--screen-width", 0, "screen-width", "<width>",
00218 "Assume a screen width of <width> characters. Default: 80",
00219 parse_width_commandline,
00220 parse_width_rc
00221 },
00222 {
00223 "-sw-1", "-sw-0", "--screen-width-minus-one", "--screen-width-minus-zero", "screen-width-minus-one", 0,
00224 "Use one character less than the maximum screen width. Default: off",
00225 parse_minus_one_commandline,
00226 parse_minus_one_rc
00227 },
00228 {
00229 "-ti", 0, "--title", 0, "title", "<string>",
00230 "Title string to be displayed in the status line.",
00231 parse_title_commandline,
00232 parse_title_rc
00233 },
00234 {
00235 "-dti", "-nti", "--display-title", "--no-title", "display-title", 0,
00236 "Display title string. Default: on",
00237 parse_display_title_commandline,
00238 parse_display_title_rc
00239 },
00240 {
00241 "-dtw", "-ntw", "--display-twiddle", "--no-twiddle", "display-twiddle", 0,
00242 "Turn on/off the twiddle in the display. Default: on",
00243 parse_twiddle_commandline,
00244 parse_twiddle_rc
00245 },
00246 {
00247 "-dc", "-nc", "--display-count", "--no-count", "display-count", 0,
00248 "Turn on/off the data count in the display. Default: on",
00249 parse_count_commandline,
00250 parse_count_rc
00251 },
00252 {
00253 "-dcb", "-ncb", "--display-count-bits", "--no-count-bits", "display-count-bits", 0,
00254 "Display the data count as bits instead of bytes. Default: off",
00255 parse_count_bits_commandline,
00256 parse_count_bits_rc,
00257 },
00258 {
00259 "-dth", "-nth", "--display-throughput", "--no-throughput", "display-throughput", 0,
00260 "Turn on/off the data throughput in the display. Default: on",
00261 parse_throughput_commandline,
00262 parse_throughput_rc
00263 },
00264 {
00265 "-dthb", "-nthb", "--display-throughput-bits", "--no-throughput-bits", "display-throughput-bits", 0,
00266 "Display throughput as bits/sec instead of bytes/sec. Default: off",
00267 parse_throughput_bits_commandline,
00268 parse_throughput_bits_rc,
00269 },
00270 {
00271 "-dt", "-nt", "--display-time", "--no-time", "display-time", 0,
00272 "Turn on/off the time in the display. Default: on",
00273 parse_time_commandline,
00274 parse_time_rc
00275 },
00276 {
00277 "-de", "-ne", "--display-elapsed-only", "--no-elapsed-only", "display-elapsed-only", 0,
00278 "Turn on/off displaying time as elapsed only (no eta). Default: off",
00279 parse_elapsed_only_commandline,
00280 parse_elapsed_only_rc
00281 },
00282 {
00283 "-dp", "-np", "--display-percent", "--no-percent", "display-percent", 0,
00284 "Turn on/off the percent complete in the display. Default: on",
00285 parse_percent_commandline,
00286 parse_percent_rc
00287 },
00288 {
00289 "-db", "-nb", "--display-bar", "--no-bar", "display-bar", 0,
00290 "Turn on/off the progress bar in the display. Default: on",
00291 parse_bar_commandline,
00292 parse_bar_rc
00293 },
00294 {
00295 "-dtp", "-ntp", "--display-total-percent", "--no-total-percent", "display-total-percent", 0,
00296 "Turn on/off the percent of expected data in the summary. Default: on",
00297 parse_total_percent_commandline,
00298 parse_total_percent_rc
00299 },
00300 {
00301 "-ds", "-ns", "--display-summary", "--no-summary", "display-summary", 0,
00302 "Turn on/off the summary information when complete. Default: on",
00303 parse_summary_commandline,
00304 parse_summary_rc
00305 },
00306 {
00307 "-da", "-dn", "--display-all", "--display-none", 0, 0,
00308 "Turn on/off all displays. Default: all on",
00309 parse_displays_commandline,
00310 0
00311 },
00312 {
00313 "-dan", "-nan", "--display-ansi", "--no-ansi", "display-ansi", 0,
00314 "Turn on/off the use of ansi color codes in the display. Default is: off",
00315 parse_ansi_commandline,
00316 parse_ansi_rc
00317 },
00318
00319 {
00320 "-spbg", 0, "--space-background", 0, "space-background", "<color>",
00321 "Use <color> as the background for spacing between display objects.",
00322 parse_space_bg_color_commandline,
00323 parse_space_bg_color_rc
00324 },
00325
00326 {
00327 "-twfg", 0, "--twiddle-foreground", 0, "twiddle-foreground", "<color>",
00328 "Use <color> as the twiddle foreground.",
00329 parse_twiddle_fg_color_commandline,
00330 parse_twiddle_fg_color_rc
00331 },
00332 {
00333 "-twbg", 0, "--twiddle-background", 0, "twiddle-background", "<color>",
00334 "Use <color> as the twiddle background.",
00335 parse_twiddle_bg_color_commandline,
00336 parse_twiddle_bg_color_rc
00337 },
00338 {
00339 "-twb", "-twn", "--twiddle-bold", "--twiddle-normal", "twiddle-bold", 0,
00340 "Display the twiddle ansi foreground color in bold or normal.",
00341 parse_twiddle_fg_bold_commandline,
00342 parse_twiddle_fg_bold_rc
00343 },
00344
00345 {
00346 "-tifg", 0, "--title-foreground", 0, "title-foreground", "<color>",
00347 "Use <color> as the title foreground.",
00348 parse_title_fg_color_commandline,
00349 parse_title_fg_color_rc
00350 },
00351 {
00352 "-tibg", 0, "--title-background", 0, "title-background", "<color>",
00353 "Use <color> as the title background.",
00354 parse_title_bg_color_commandline,
00355 parse_title_bg_color_rc
00356 },
00357 {
00358 "-tib", "-tin", "--title-bold", "--title-normal", "title-bold", 0,
00359 "Display the title ansi foreground color in bold or normal.",
00360 parse_title_fg_bold_commandline,
00361 parse_title_fg_bold_rc
00362 },
00363
00364 {
00365 "-cfg", 0, "--count-foreground", 0, "count-foreground", "<color>",
00366 "Use <color> as the count foreground.",
00367 parse_count_fg_color_commandline,
00368 parse_count_fg_color_rc
00369 },
00370 {
00371 "-cbg", 0, "--count-background", 0, "count-background", "<color>",
00372 "Use <color> as the count background.",
00373 parse_count_bg_color_commandline,
00374 parse_count_bg_color_rc
00375 },
00376 {
00377 "-cb", "-cn", "--count-bold", "--count-normal", "count-bold", 0,
00378 "Display the count ansi foreground color in bold or normal.",
00379 parse_count_fg_bold_commandline,
00380 parse_count_fg_bold_rc
00381 },
00382
00383 {
00384 "-thfg", 0, "--throughput-foreground", 0, "throughput-foreground", "<color>",
00385 "Use <color> as the throughput foreground.",
00386 parse_throughput_fg_color_commandline,
00387 parse_throughput_fg_color_rc
00388 },
00389 {
00390 "-thbg", 0, "--throughput-background", 0, "throughput-background", "<color>",
00391 "Use <color> as the throughput background.",
00392 parse_throughput_bg_color_commandline,
00393 parse_throughput_bg_color_rc
00394 },
00395 {
00396 "-thb", "-thn", "--throughput-bold", "--throughput-normal", "throughput-bold", 0,
00397 "Display the throughput ansi foreground color in bold or normal.",
00398 parse_throughput_fg_bold_commandline,
00399 parse_throughput_fg_bold_rc
00400 },
00401
00402 {
00403 "-thlfg", 0, "--throughput-label-foreground", 0, "throughput-label-foreground", "<color>",
00404 "Use <color> as the throughput label foreground.",
00405 parse_throughput_label_fg_color_commandline,
00406 parse_throughput_label_fg_color_rc
00407 },
00408 {
00409 "-thlbg", 0, "--throughput-label-background", 0, "throughput-label-background", "<color>",
00410 "Use <color> as the throughput label background.",
00411 parse_throughput_label_bg_color_commandline,
00412 parse_throughput_label_bg_color_rc
00413 },
00414 {
00415 "-thlb", "-thln", "--throughput-label-bold", "--throughput-label-normal", "throughput-label-bold", 0,
00416 "Display the throughput label ansi foreground color in bold or normal.",
00417 parse_throughput_label_fg_bold_commandline,
00418 parse_throughput_label_fg_bold_rc
00419 },
00420
00421 {
00422 "-tfg", 0, "--time-foreground", 0, "time-foreground", "<color>",
00423 "Use <color> as the time foreground.",
00424 parse_time_fg_color_commandline,
00425 parse_time_fg_color_rc
00426 },
00427 {
00428 "-tbg", 0, "--time-background", 0, "time-background", "<color>",
00429 "Use <color> as the time background.",
00430 parse_time_bg_color_commandline,
00431 parse_time_bg_color_rc
00432 },
00433 {
00434 "-tb", "-tn", "--time-bold", "--time-normal", "time-bold", 0,
00435 "Display the time ansi foreground color in bold or normal.",
00436 parse_time_fg_bold_commandline,
00437 parse_time_fg_bold_rc
00438 },
00439
00440 {
00441 "-tlfg", 0, "--time-label-foreground", 0, "time-label-foreground", "<color>",
00442 "Use <color> as the time label foreground.",
00443 parse_time_label_fg_color_commandline,
00444 parse_time_label_fg_color_rc
00445 },
00446 {
00447 "-tlbg", 0, "--time-label-background", 0, "time-label-background", "<color>",
00448 "Use <color> as the time label background.",
00449 parse_time_label_bg_color_commandline,
00450 parse_time_label_bg_color_rc
00451 },
00452 {
00453 "-tlb", "-tln", "--time-label-bold", "--time-label-normal", "time-label-bold", 0,
00454 "Display the time label ansi foreground color in bold or normal.",
00455 parse_time_label_fg_bold_commandline,
00456 parse_time_label_fg_bold_rc
00457 },
00458
00459 {
00460 "-pfg", 0, "--percent-foreground", 0, "percent-foreground", "<color>",
00461 "Use <color> as the percent foreground.",
00462 parse_percent_fg_color_commandline,
00463 parse_percent_fg_color_rc
00464 },
00465 {
00466 "-pbg", 0, "--percent-background", 0, "percent-background", "<color>",
00467 "Use <color> as the percent background.",
00468 parse_percent_bg_color_commandline,
00469 parse_percent_bg_color_rc
00470 },
00471 {
00472 "-pb", "-pn", "--percent-bold", "--percent-normal", "percent-bold", 0,
00473 "Display the percent ansi foreground color in bold or normal.",
00474 parse_percent_fg_bold_commandline,
00475 parse_percent_fg_bold_rc
00476 },
00477
00478 {
00479 "-bbfg", 0, "--bar-brace-foreground", 0, "bar-brace-foreground", "<color>",
00480 "Use <color> as the foreground color for the braces on the progress bar.",
00481 parse_barbrace_fg_color_commandline,
00482 parse_barbrace_fg_color_rc
00483 },
00484 {
00485 "-bbbg", 0, "--bar-brace-background", 0, "bar-brace-background", "<color>",
00486 "Use <color> as the background color for the braces on the progress bar.",
00487 parse_barbrace_bg_color_commandline,
00488 parse_barbrace_bg_color_rc
00489 },
00490 {
00491 "-bbb", "-bbn", "--bar-brace-bold", "--bar-brace-normal", "bar-brace-bold", 0,
00492 "Display the progress bar braces' ansi foreground color in bold or normal.",
00493 parse_barbrace_fg_bold_commandline,
00494 parse_barbrace_fg_bold_rc
00495 },
00496
00497 {
00498 "-bfg", 0, "--bar-foreground", 0, "bar-foreground", "<color>",
00499 "Use <color> as the foreground color for the progress bar.",
00500 parse_bar_fg_color_commandline,
00501 parse_bar_fg_color_rc
00502 },
00503 {
00504 "-bbg", 0, "--bar-background", 0, "bar-background", "<color>",
00505 "Use <color> as the background color for the progress bar.",
00506 parse_bar_bg_color_commandline,
00507 parse_bar_bg_color_rc
00508 },
00509 {
00510 "-bb", "-bn", "--bar-bold", "--bar-normal", "bar-bold", 0,
00511 "Display the progress bar ansi foreground color in bold or normal.",
00512 parse_bar_fg_bold_commandline,
00513 parse_bar_fg_bold_rc
00514 },
00515
00516 {
00517 "-h", 0, "--help", 0, 0, 0,
00518 "Display this help text and exit.",
00519 parse_help_commandline,
00520 0
00521 },
00522 {
00523 "-v", 0, "--version", 0, 0, 0,
00524 "Display version and exit.",
00525 parse_version_commandline,
00526 0
00527 },
00528 { 0, 0, 0, 0, 0, 0, 0 }
00529 };
00530
00531 colors_list fg_colors[] = {
00532 { "black", "[30m" },
00533 { "red", "[31m" },
00534 { "green", "[32m" },
00535 { "yellow", "[33m" },
00536 { "blue", "[34m" },
00537 { "magenta", "[35m" },
00538 { "cyan", "[36m" },
00539 { "white", "[37m" },
00540 { 0, 0 }
00541 };
00542
00543 colors_list bg_colors[] = {
00544 { "black", "[40m" },
00545 { "red", "[41m" },
00546 { "green", "[42m" },
00547 { "yellow", "[43m" },
00548 { "blue", "[44m" },
00549 { "magenta", "[45m" },
00550 { "cyan", "[46m" },
00551 { "white", "[47m" },
00552 { 0, 0 }
00553 };
00554
00555 void version(FILE *out)
00556 {
00557 fprintf(out, "%s version %s\n", PACKAGE, VERSION);
00558 }
00559
00560 void help(FILE *out)
00561 {
00562 int o = 0;
00563 int screen_used = 0;
00564 char option_buffer[256];
00565
00566 fprintf(out, "Usage:\n");
00567 fprintf(out, "\n");
00568
00569
00570
00571
00572 fprintf(out, " bar ");
00573 screen_used = 7;
00574 for (o = 0; options[o].cl_func != 0; o++) {
00575 char *short_option1 = options[o].short_option1;
00576 char *short_option2 = options[o].short_option2;
00577 char *arg_description = options[o].arg_description;
00578
00579 sprintf(option_buffer, "[ %s%s%s%s%s ]",
00580 short_option1,
00581 (short_option2 != 0) ? "|" : "",
00582 (short_option2 != 0) ? short_option2 : "",
00583 (arg_description != 0) ? " " : "",
00584 (arg_description != 0) ? arg_description : ""
00585 );
00586 if (d.screen_width - screen_used < strlen(option_buffer)) {
00587 fprintf(out, "\n ");
00588 screen_used = 7;
00589 }
00590 fprintf(out, option_buffer);
00591 screen_used += strlen(option_buffer);
00592 }
00593
00594 fprintf(out, "\n");
00595 fprintf(out, "\n");
00596
00597
00598
00599
00600 fprintf(out, " bar ");
00601 screen_used = 7;
00602 for (o = 0; options[o].cl_func != 0; o++) {
00603 char *long_option1 = options[o].long_option1;
00604 char *long_option2 = options[o].long_option2;
00605 char *arg_description = options[o].arg_description;
00606
00607 sprintf(option_buffer, "[ %s%s%s%s%s ]",
00608 long_option1,
00609 (long_option2 != 0) ? "|" : "",
00610 (long_option2 != 0) ? long_option2 : "",
00611 (arg_description != 0) ? " " : "",
00612 (arg_description != 0) ? arg_description : ""
00613 );
00614 if (d.screen_width - screen_used < strlen(option_buffer)) {
00615 fprintf(out, "\n ");
00616 screen_used = 7;
00617 }
00618 fprintf(out, option_buffer);
00619 screen_used += strlen(option_buffer);
00620 }
00621
00622 fprintf(out, "\n");
00623 fprintf(out, "\n");
00624
00625
00626
00627
00628 for (o = 0; options[o].cl_func != 0; o++) {
00629 char *short_option1 = options[o].short_option1;
00630 char *short_option2 = options[o].short_option2;
00631 char *long_option1 = options[o].long_option1;
00632 char *long_option2 = options[o].long_option2;
00633 char *arg_description = options[o].arg_description;
00634 char *description = options[o].description;
00635
00636 fprintf(out, " %s %s\n",
00637 short_option1,
00638 (arg_description != 0) ? arg_description : ""
00639 );
00640 if (short_option2 != 0) {
00641 fprintf(out, " %s %s\n",
00642 short_option2,
00643 (arg_description != 0) ? arg_description : ""
00644 );
00645 }
00646 fprintf(out, " %s %s\n",
00647 long_option1,
00648 (arg_description != 0) ? arg_description : ""
00649 );
00650 if (long_option2 != 0) {
00651 fprintf(out, " %s %s\n",
00652 long_option2,
00653 (arg_description != 0) ? arg_description : ""
00654 );
00655 }
00656 fprintf(out, "\n");
00657 fprintf(out, " %s\n", description);
00658 fprintf(out, "\n");
00659 }
00660 }
00661
00662 int isOpt(char *s)
00663 {
00664 int o = 0;
00665
00666 while (options[o].cl_func != 0) {
00667 if (strcmp(s, options[o].short_option1) == 0)
00668 return(o);
00669 if ((options[o].short_option2 != 0)
00670 && (strcmp(s, options[o].short_option2) == 0))
00671 return(o);
00672 if (strcmp(s, options[o].long_option1) == 0)
00673 return(o);
00674 if ((options[o].long_option2 != 0)
00675 && (strcmp(s, options[o].long_option2) == 0))
00676 return(o);
00677 if ((options[o].rc_option != 0)
00678 && (strcasecmp(s, options[o].rc_option) == 0))
00679 return(o);
00680 o++;
00681 }
00682 return(-1);
00683 }
00684
00685 int safe_add(uint64 *n, uint64 a)
00686 {
00687 uint64 t = *n;
00688
00689 if (MAX_UINT64 - t < a)
00690 return(1);
00691 t += a;
00692 *n = t;
00693 return(0);
00694 }
00695
00696 int safe_mul(uint64 *n, uint64 x)
00697 {
00698 uint64 a1, a2;
00699 uint64 t = 0;
00700 uint64 multiplier;
00701
00702 if (x < *n) {
00703 a1 = *n;
00704 a2 = x;
00705 }
00706 else {
00707 a2 = *n;
00708 a1 = x;
00709 }
00710
00711 multiplier = 1;
00712 multiplier *= 1000;
00713 multiplier *= 1000;
00714 multiplier *= 1000;
00715 multiplier *= 1000;
00716 multiplier *= 1000;
00717 multiplier *= 1000;
00718 while (a2 > 0) {
00719 while (multiplier > a2)
00720 multiplier /= 10;
00721 if (safe_add(&t, a1*multiplier) != 0)
00722 return(1);
00723 a2 -= multiplier;
00724 }
00725 *n = t;
00726 return(0);
00727 }
00728
00729 int parse_num(FILE *ferr, char *s, uint64 *n, uint64 min, uint64 max)
00730 {
00731 char *ptr_decimal = 0;
00732 char *ptr_unit = 0;
00733 char *ptr_start = 0;
00734 char *ptr_end = 0;
00735 char *ptr = 0;
00736 uint64 w = 0;
00737 uint64 f = 0;
00738 uint64 unit_multiplier = 1;
00739 uint64 multiplier = 0;
00740 uint64 tmp = 0;
00741 uint64 new_n = 0;
00742 size_t num_whole_part = 0;
00743 size_t num_fractional_part = 0;
00744
00745 *n = 0;
00746
00747 if (strlen(s) == 0)
00748 return(0);
00749
00750 ptr_decimal = s;
00751 while ((*ptr_decimal != '\0') && (*ptr_decimal != '.'))
00752 ptr_decimal++;
00753
00754 ptr_unit = s;
00755 while ((*ptr_unit != '\0') && (isdigit((int)*ptr_unit) || (*ptr_unit == '.')))
00756 ptr_unit++;
00757 if ((*ptr_unit != '\0') && (*(ptr_unit+1) != '\0')) {
00758 print_error(ferr, "Could not parse number: %s", s);
00759 print_esup(ferr, "Unit multiplier parse error at: \"%s\"", ptr_unit);
00760 print_esup(ferr, "Unit multiplier should be the last character");
00761 return(1);
00762 }
00763
00764 if (*ptr_decimal != '\0') {
00765 num_whole_part = (size_t)(ptr_decimal - s);
00766 num_fractional_part = (size_t)(ptr_unit - ptr_decimal - 1);
00767 }
00768 else if (*ptr_unit != '\0') {
00769 num_whole_part = (size_t)(ptr_unit - s);
00770 }
00771 else {
00772 num_whole_part = strlen(s);
00773 }
00774
00775 if ((num_whole_part == 0) && (num_fractional_part == 0)) {
00776 print_error(ferr, "Could not parse number: %s", s);
00777 print_esup(ferr, "No digits found");
00778 return(1);
00779 }
00780
00781 switch (toupper(*ptr_unit)) {
00782 case '\0':
00783 break;
00784 case 'K':
00785 unit_multiplier *= (uint64)d.k;
00786 break;
00787 case 'M':
00788 unit_multiplier *= (uint64)d.k;
00789 unit_multiplier *= (uint64)d.k;
00790 break;
00791 case 'G':
00792 unit_multiplier *= (uint64)d.k;
00793 unit_multiplier *= (uint64)d.k;
00794 unit_multiplier *= (uint64)d.k;
00795 break;
00796 case 'T':
00797 unit_multiplier *= (uint64)d.k;
00798 unit_multiplier *= (uint64)d.k;
00799 unit_multiplier *= (uint64)d.k;
00800 unit_multiplier *= (uint64)d.k;
00801 break;
00802 case 'P':
00803 unit_multiplier *= (uint64)d.k;
00804 unit_multiplier *= (uint64)d.k;
00805 unit_multiplier *= (uint64)d.k;
00806 unit_multiplier *= (uint64)d.k;
00807 unit_multiplier *= (uint64)d.k;
00808 break;
00809 case 'E':
00810 unit_multiplier *= (uint64)d.k;
00811 unit_multiplier *= (uint64)d.k;
00812 unit_multiplier *= (uint64)d.k;
00813 unit_multiplier *= (uint64)d.k;
00814 unit_multiplier *= (uint64)d.k;
00815 unit_multiplier *= (uint64)d.k;
00816 break;
00817 case 'B':
00818 if (_parsing_blocks == 0) {
00819 unit_multiplier *= (uint64)io.block_size;
00820 }
00821 else {
00822 print_error(ferr, "Cannot specify block size in terms of blocks");
00823 print_esup(ferr, "Expected: 'k', 'm', 'g', 't', 'p', or 'e'");
00824 return(1);
00825 }
00826 break;
00827 default:
00828 print_error(ferr, "Cannot parse number: %s", s);
00829 print_esup(ferr, "Invalid unit multiplier: '%c'", *ptr_unit);
00830 print_esup(ferr, "Expected: 'b', 'k', 'm', 'g', 't', 'p', or 'e'");
00831 return(1);
00832 break;
00833 }
00834
00835 ptr_star