Changeset 419c434


Ignore:
Timestamp:
Aug 12, 2020, 3:31:51 PM (4 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
d9265a2
Parents:
cd02108
Message:

Added support for printing the usage as parseargs would,
without the option --help or an error in parsing args.

Location:
libcfa/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/parseargs.cfa

    rcd02108 r419c434  
    2929extern char ** cfa_args_envp;
    3030
    31 void printopt(FILE * out, int width, int max, char sn, const char * ln, const char * help) {
    32         int hwidth = max - (11 + width);
    33         if(hwidth <= 0) hwidth = max;
    34 
    35         fprintf(out, "  -%c, --%-*s   %.*s\n", sn, width, ln, hwidth, help);
    36         for() {
    37                 help += min(strlen(help), hwidth);
    38                 if('\0' == *help) break;
    39                 fprintf(out, "%*s%.*s\n", width + 11, "", hwidth, help);
    40         }
    41 }
     31static void usage(char * cmd, cfa_option options[], size_t opt_count, const char * usage, FILE * out)  __attribute__ ((noreturn));
    4232
    4333void parse_args( cfa_option options[], size_t opt_count, const char * usage, char ** & left ) {
     
    4535}
    4636
     37//-----------------------------------------------------------------------------
     38// getopt_long wrapping
    4739void parse_args(
    4840        int argc,
     
    5446) {
    5547        struct option optarr[opt_count + 2];
    56         int width = 0;
    57         int max_width = 1_000_000;
    5848        {
    5949                int idx = 0;
     
    7060                                }
    7161                                idx++;
    72 
    73                                 int w = strlen(options[i].long_name);
    74                                 if(w > width) width = w;
    7562                        }
    7663                }
     
    10794                                out = stdout;
    10895                        case '?':
    109                                 goto USAGE;
     96                                usage(argv[0], options, opt_count, usage, out);
    11097                        default:
    11198                                for(i; opt_count) {
     
    116103
    117104                                                fprintf(out, "Argument '%s' for option %c could not be parsed\n\n", arg, (char)opt);
    118                                                 goto USAGE;
     105                                                usage(argv[0], options, opt_count, usage, out);
    119106                                        }
    120107                                }
     
    123110
    124111        }
    125 
    126         USAGE:;
     112}
     113
     114//-----------------------------------------------------------------------------
     115// Print usage
     116static 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
     128void 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
     132void 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
     136static void usage(char * cmd, cfa_option options[], size_t opt_count, const char * help, FILE * out) __attribute__((noreturn)) {
     137        int width = 0;
     138        {
     139                int idx = 0;
     140                for(i; opt_count) {
     141                        if(options[i].long_name) {
     142                                int w = strlen(options[i].long_name);
     143                                if(w > width) width = w;
     144                        }
     145                }
     146        }
     147
     148        int max_width = 1_000_000;
    127149        int outfd = fileno(out);
    128150        if(isatty(outfd)) {
     
    133155        }
    134156
    135         fprintf(out, "Usage:\n  %s %s\n", argv[0], usage);
     157        fprintf(out, "Usage:\n  %s %s\n", cmd, help);
    136158
    137159        for(i; opt_count) {
     
    142164}
    143165
     166//-----------------------------------------------------------------------------
     167// Typed argument parsing
    144168bool parse_yesno(const char * arg, bool & value ) {
    145169        if(strcmp(arg, "yes") == 0) {
  • libcfa/src/parseargs.hfa

    rcd02108 r419c434  
    3434void parse_args( int argc, char * argv[], cfa_option options[], size_t opt_count, const char * usage, char ** & left );
    3535
     36void print_args_usage(cfa_option options[], size_t opt_count, const char * usage, bool error)  __attribute__ ((noreturn));
     37void print_args_usage(int argc, char * argv[], cfa_option options[], size_t opt_count, const char * usage, bool error)  __attribute__ ((noreturn));
     38
    3639bool parse_yesno   (const char *, bool & );
    3740bool parse_settrue (const char *, bool & );
Note: See TracChangeset for help on using the changeset viewer.