Hi Antonio,
> I think that it would be better to fix the problem for good by deprecating
> getopt_long and recommending instead something that defines the options in
> one place, as Arg_parser does. Even if this implies some minor changes in
> the programs to adapt to the new (simpler) interface.
Thanks for the suggestion. But in fact, it's only the API of getopt_long()
that is problematic. Its inner workings are fine. And in order not to add
much extra binary code size to programs on GNU systems, I think it's
reasonable to keep using getopt_long() under the hood.
> See this fragment of main.c from GNU ed showing how it defines the options
> for Arg_parser:
>
> const ap_Option options[] =
> {
> { 'E', "extended-regexp", ap_no },
> { 'G', "traditional", ap_no },
> { 'h', "help", ap_no },
> { 'l', "loose-exit-status", ap_no },
> { 'p', "prompt", ap_yes },
Thanks for the pointer to Arg_parser. These is indeed some commonality:
<getopt.h> <argp.h> carg_parser
struct option argp_option ap_Option
const char *name; const char *name; const char *long_name;
int key; int code;
int has_arg; flags & OPTION_ARG_OPTIONAL ap_Has_arg has_arg;
int *flag;
int val; (overloaded)
The no_argument / required_argument / optional_argument part of <getopt.h>
is fine. I see no reason to replace that with different names (btw.
what is the difference between ap_yes and ap_yme in Arg_parser?).
Bruno