Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/parseargs.cfa

    rfa5e0112 r56e8cb3  
    1919        extern          long long int strtoll (const char* str, char** endptr, int base);
    2020        extern unsigned long long int strtoull(const char* str, char** endptr, int base);
    21         extern                 double strtod  (const char* str, char** endptr);
    2221}
    2322
     
    2524#include "limits.hfa"
    2625
    27 extern int cfa_args_argc;
    28 extern char ** cfa_args_argv;
    29 extern char ** cfa_args_envp;
    30 
    31 static void usage(char * cmd, cfa_option options[], size_t opt_count, const char * usage, FILE * out)  __attribute__ ((noreturn));
    32 
    33 void parse_args( cfa_option options[], size_t opt_count, const char * usage, char ** & left ) {
    34         parse_args(cfa_args_argc, cfa_args_argv, options, opt_count, usage, left );
    35 }
    36 
    37 //-----------------------------------------------------------------------------
    38 // getopt_long wrapping
     26void printopt(FILE * out, int width, int max, char sn, const char * ln, const char * help) {
     27        int hwidth = max - (11 + width);
     28        if(hwidth <= 0) hwidth = max;
     29
     30        fprintf(out, "  -%c, --%-*s   %.*s\n", sn, width, ln, hwidth, help);
     31        for() {
     32                help += min(strlen(help), hwidth);
     33                if('\0' == *help) break;
     34                fprintf(out, "%*s%.*s\n", width + 11, "", hwidth, help);
     35        }
     36}
     37
    3938void parse_args(
    4039        int argc,
     
    4645) {
    4746        struct option optarr[opt_count + 2];
     47        int width = 0;
     48        int max_width = 1_000_000;
    4849        {
    4950                int idx = 0;
     
    6061                                }
    6162                                idx++;
     63
     64                                int w = strlen(options[i].long_name);
     65                                if(w > width) width = w;
    6266                        }
    6367                }
     
    9498                                out = stdout;
    9599                        case '?':
    96                                 usage(argv[0], options, opt_count, usage, out);
     100                                goto USAGE;
    97101                        default:
    98102                                for(i; opt_count) {
     
    103107
    104108                                                fprintf(out, "Argument '%s' for option %c could not be parsed\n\n", arg, (char)opt);
    105                                                 usage(argv[0], options, opt_count, usage, out);
     109                                                goto USAGE;
    106110                                        }
    107111                                }
     
    110114
    111115        }
    112 }
    113 
    114 //-----------------------------------------------------------------------------
    115 // Print usage
    116 static void printopt(FILE * out, int width, int max, char sn, const char * ln, const char * help) {
    117         int hwidth = max - (11 + width);
    118         if(hwidth <= 0) hwidth = max;
    119 
    120         fprintf(out, "  -%c, --%-*s   %.*s\n", sn, width, ln, hwidth, help);
    121         for() {
    122                 help += min(strlen(help), hwidth);
    123                 if('\0' == *help) break;
    124                 fprintf(out, "%*s%.*s\n", width + 11, "", hwidth, help);
    125         }
    126 }
    127 
    128 void print_args_usage(cfa_option options[], size_t opt_count, const char * usage, bool error)  __attribute__ ((noreturn)) {
    129         usage(cfa_args_argv[0], options, opt_count, usage, error ? stderr : stdout);
    130 }
    131 
    132 void print_args_usage(int , char * argv[], cfa_option options[], size_t opt_count, const char * usage, bool error)  __attribute__ ((noreturn)) {
    133         usage(argv[0], options, opt_count, usage, error ? stderr : stdout);
    134 }
    135 
    136 static void usage(char * cmd, cfa_option options[], size_t opt_count, const char * help, FILE * out) __attribute__((noreturn)) {
    137         int width = 0;
    138         {
    139                 for(i; opt_count) {
    140                         if(options[i].long_name) {
    141                                 int w = strlen(options[i].long_name);
    142                                 if(w > width) width = w;
    143                         }
    144                 }
    145         }
    146 
    147         int max_width = 1_000_000;
     116
     117        USAGE:;
    148118        int outfd = fileno(out);
    149119        if(isatty(outfd)) {
     
    154124        }
    155125
    156         fprintf(out, "Usage:\n  %s %s\n", cmd, help);
     126        fprintf(out, "Usage:\n  %s %s\n", argv[0], usage);
    157127
    158128        for(i; opt_count) {
     
    163133}
    164134
    165 //-----------------------------------------------------------------------------
    166 // Typed argument parsing
    167135bool parse_yesno(const char * arg, bool & value ) {
    168136        if(strcmp(arg, "yes") == 0) {
     
    191159bool parse(const char * arg, const char * & value ) {
    192160        value = arg;
    193         return true;
    194 }
    195 
    196 bool parse(const char * arg, int & value) {
    197         char * end;
    198         int r = strtoll(arg, &end, 10);
    199         if(*end != '\0') return false;
    200 
    201         value = r;
    202161        return true;
    203162}
     
    233192}
    234193
    235 bool parse(const char * arg, double & value) {
     194bool parse(const char * arg, int & value) {
    236195        char * end;
    237         double r = strtod(arg, &end);
     196        int r = strtoll(arg, &end, 10);
    238197        if(*end != '\0') return false;
    239198
Note: See TracChangeset for help on using the changeset viewer.