Hi Andreas,
therefore i like to leave all common options in
common/main.c.
additional options i like to put in the individual app_*.c files. each
options i like to check at the individual app file. if it doesn't exist
there, the main.c checks if the option is a common option:
...
c = l23_app_handle_options();
if (c == -1)
c = getopt_long(argc, argv, "hs:S:a:i:v:d:",
long_options, &option_index);
if (c == -1)
break;
...
To be honest, I don't like the idea of calling two different "instances"
of getopt/getopt_long. But that's just me, probably.
What about a app-specific function to call early where the application
can register the relevant options:
/* in app.c, called before getopt is started */
l32_app_setup_options(){
l32_add_option('q',"quux",1); /* short, long, hasarg */
l32_add_option('d',"debug",0);
}
/* in common/main.c */
l32_add_option(char short,char *long,int hasarg){
/* append short to a global getopts-type-string */
/* append long opts to global table of long opts */
/* mark long-opt index in table (for long-only opts)
so that we know to call l32_app_option */
}
And a callback if the option is given:
l32_app_option(char short,char *long,char *val){
if(short == 'q' or !strcmp(long,"quux")){
quux = 42 + atoi(val);
}
if(short == 'd' or !strcmp(long,"debug")){
debugflag++;
}
}
I think that makes for even shorter apps with less getopt branching.
Of course it makes it more difficult to handle options where the meaning
is position dependant, you have to keep state in global structures then.
But we don't want to recreate ffmpeg, do we?
Chris