diff options
author | Erik Troan <ewt@src.gnome.org> | 1998-10-21 21:44:21 +0000 |
---|---|---|
committer | Erik Troan <ewt@src.gnome.org> | 1998-10-21 21:44:21 +0000 |
commit | 0fe1a70475dfa7889d61c1b58b277d9317c79934 (patch) | |
tree | 399df9da5158539223f908a98836d1f5d3b277ef /support/popt.c | |
parent | c01ab27ea73e74fe353df354b8e7e0bb9fde01e7 (diff) | |
download | shared-mime-info-0fe1a70475dfa7889d61c1b58b277d9317c79934.tar.gz |
implemented POPT_ARGFLAG_DOC_HIDDEN, POPT_CBFLAG_PRE, POPT_CBFLAG_POST
svn path=/trunk/; revision=451
Diffstat (limited to 'support/popt.c')
-rw-r--r-- | support/popt.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/support/popt.c b/support/popt.c index 22d5e089..ec29c5f1 100644 --- a/support/popt.c +++ b/support/popt.c @@ -41,6 +41,25 @@ void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) { con->execAbsolute = allowAbsolute; } +static void invokeCallbacks(poptContext con, const struct poptOption * table, + int post) { + const struct poptOption * opt = table; + poptCallbackType cb; + + while (opt->longName || opt->shortName || opt->arg) { + if ((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_INCLUDE_TABLE) { + invokeCallbacks(con, opt->arg, post); + } else if (((opt->argInfo & POPT_ARG_MASK) == POPT_ARG_CALLBACK) && + ((!post && (opt->argInfo & POPT_CBFLAG_PRE)) || + ( post && (opt->argInfo & POPT_CBFLAG_POST)))) { + cb = opt->arg; + cb(con, post ? POPT_CALLBACK_REASON_POST : POPT_CALLBACK_REASON_PRE, + NULL, NULL, opt->descrip); + } + opt++; + } +} + poptContext poptGetContext(char * name, int argc, char ** argv, const struct poptOption * options, int flags) { poptContext con = malloc(sizeof(*con)); @@ -67,6 +86,8 @@ poptContext poptGetContext(char * name, int argc, char ** argv, if (name) con->appName = strcpy(malloc(strlen(name) + 1), name); + invokeCallbacks(con, con->options, 0); + return con; } @@ -264,6 +285,7 @@ int poptGetNextOpt(poptContext con) { && con->os > con->optionStack) con->os--; if (!con->os->nextCharArg && con->os->next == con->os->argc) { + invokeCallbacks(con, con->options, 1); if (con->doExec) execCommand(con); return -1; } @@ -391,7 +413,7 @@ int poptGetNextOpt(poptContext con) { } if (cb) - cb(con, opt, con->os->nextArg, cbData); + cb(con, POPT_CALLBACK_REASON_OPTION, opt, con->os->nextArg, cbData); else if (opt->val) done = 1; |