args.c

Go to the documentation of this file.
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 /* <Gasp!>  Another global variable!  And a shameless hack at that! */
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", "" },
00533         { "red", "" },
00534         { "green", "" },
00535         { "yellow", "" },
00536         { "blue", "" },
00537         { "magenta", "" },
00538         { "cyan", "" },
00539         { "white", "" },
00540         { 0, 0 }
00541 };
00542 
00543 colors_list bg_colors[] = {
00544         { "black", "" },
00545         { "red", "" },
00546         { "green", "" },
00547         { "yellow", "" },
00548         { "blue", "" },
00549         { "magenta", "" },
00550         { "cyan", "" },
00551         { "white", "" },
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          * Print out short option usage:
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          * Print out long option usage:
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          * Print out help text
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