140 lines
3.8 KiB
C
140 lines
3.8 KiB
C
/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING
|
|
file accompanying popt source distributions, available from
|
|
ftp://ftp.redhat.com/pub/code/popt */
|
|
|
|
#include "system.h"
|
|
|
|
static int pass2 = 0;
|
|
static void option_callback(poptContext con, enum poptCallbackReason reason,
|
|
const struct poptOption * opt,
|
|
char * arg, void * data) {
|
|
if (pass2)
|
|
fprintf(stdout, "callback: %c %s %s ", opt->val, (char *) data, arg);
|
|
}
|
|
|
|
int arg1 = 0;
|
|
char * arg2 = "(none)";
|
|
int arg3 = 0;
|
|
int inc = 0;
|
|
int shortopt = 0;
|
|
int singleDash = 0;
|
|
|
|
static struct poptOption moreCallbackArgs[] = {
|
|
{ NULL, '\0', POPT_ARG_CALLBACK | POPT_CBFLAG_INC_DATA,
|
|
(void *)option_callback, 0, NULL },
|
|
{ "cb2", 'c', POPT_ARG_STRING, NULL, 'c', "Test argument callbacks" },
|
|
{ NULL, '\0', 0, NULL, 0 }
|
|
};
|
|
static struct poptOption callbackArgs[] = {
|
|
{ NULL, '\0', POPT_ARG_CALLBACK, (void *)option_callback, 0, "sampledata" },
|
|
{ "cb", 'c', POPT_ARG_STRING, NULL, 'c', "Test argument callbacks" },
|
|
{ "long", '\0', 0, NULL, 'l', "Unused option for help testing" },
|
|
{ NULL, '\0', 0, NULL, 0 }
|
|
};
|
|
static struct poptOption moreArgs[] = {
|
|
{ "inc", 'i', 0, &inc, 0, "An included argument" },
|
|
{ NULL, '\0', 0, NULL, 0 }
|
|
};
|
|
static struct poptOption options[] = {
|
|
{ NULL, '\0', POPT_ARG_INCLUDE_TABLE, &moreCallbackArgs, 0, "arg for cb2" },
|
|
{ "arg1", '\0', 0, &arg1, 0, "First argument with a really long"
|
|
" description. After all, we have to test argument help"
|
|
" wrapping somehow, right?", NULL },
|
|
{ "arg2", '2', POPT_ARG_STRING, &arg2, 0, "Another argument", "ARG" },
|
|
{ "arg3", '3', POPT_ARG_INT, &arg3, 0, "A third argument", "ANARG" },
|
|
{ "shortoption", '\0', POPT_ARGFLAG_ONEDASH, &shortopt, 0,
|
|
"Needs a single -", NULL },
|
|
{ "hidden", '\0', POPT_ARG_STRING | POPT_ARGFLAG_DOC_HIDDEN, NULL, 0,
|
|
"This shouldn't show up", NULL },
|
|
{ "unused", '\0', POPT_ARG_STRING, NULL, 0,
|
|
"Unused option for help testing", "UNUSED" },
|
|
{ NULL, '-', POPT_ARG_NONE | POPT_ARGFLAG_DOC_HIDDEN, &singleDash, 0 },
|
|
{ NULL, '\0', POPT_ARG_INCLUDE_TABLE, &moreArgs, 0, NULL },
|
|
{ NULL, '\0', POPT_ARG_INCLUDE_TABLE, &callbackArgs, 0, "Callback arguments" },
|
|
POPT_AUTOHELP
|
|
{ NULL, '\0', 0, NULL, 0 }
|
|
};
|
|
|
|
static void resetVars(void)
|
|
{
|
|
arg1 = 0;
|
|
arg2 = "(none)";
|
|
arg3 = 0;
|
|
inc = 0;
|
|
shortopt = 0;
|
|
singleDash = 0;
|
|
pass2 = 0;
|
|
}
|
|
|
|
int main(int argc, const char ** argv) {
|
|
int rc;
|
|
int ec = 0;
|
|
poptContext optCon;
|
|
const char ** rest;
|
|
int help = 0;
|
|
int usage = 0;
|
|
|
|
#if HAVE_MCHECK_H && HAVE_MTRACE
|
|
mtrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
|
|
#endif
|
|
|
|
resetVars();
|
|
optCon = poptGetContext("test1", argc, argv, options, 0);
|
|
poptReadConfigFile(optCon, "./test-poptrc");
|
|
|
|
#if 1
|
|
while ((rc = poptGetNextOpt(optCon)) > 0) /* Read all the options ... */
|
|
;
|
|
|
|
poptResetContext(optCon); /* ... and then start over. */
|
|
resetVars();
|
|
#endif
|
|
|
|
pass2 = 1;
|
|
if ((rc = poptGetNextOpt(optCon)) < -1) {
|
|
fprintf(stderr, "test1: bad argument %s: %s\n",
|
|
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
|
|
poptStrerror(rc));
|
|
ec = 2;
|
|
goto exit;
|
|
}
|
|
|
|
if (help) {
|
|
poptPrintHelp(optCon, stdout, 0);
|
|
goto exit;
|
|
}
|
|
if (usage) {
|
|
poptPrintUsage(optCon, stdout, 0);
|
|
goto exit;
|
|
}
|
|
|
|
fprintf(stdout, "arg1: %d arg2: %s", arg1, arg2);
|
|
|
|
if (arg3)
|
|
fprintf(stdout, " arg3: %d", arg3);
|
|
if (inc)
|
|
fprintf(stdout, " inc: %d", inc);
|
|
if (shortopt)
|
|
fprintf(stdout, " short: %d", shortopt);
|
|
if (singleDash)
|
|
fprintf(stdout, " -");
|
|
|
|
rest = poptGetArgs(optCon);
|
|
if (rest) {
|
|
fprintf(stdout, " rest:");
|
|
while (*rest) {
|
|
fprintf(stdout, " %s", *rest);
|
|
rest++;
|
|
}
|
|
}
|
|
|
|
fprintf(stdout, "\n");
|
|
|
|
exit:
|
|
poptFreeContext(optCon);
|
|
#if HAVE_MCHECK_H && HAVE_MTRACE
|
|
muntrace(); /* Trace malloc only if MALLOC_TRACE=mtrace-output-file. */
|
|
#endif
|
|
return ec;
|
|
}
|