summaryrefslogtreecommitdiff
path: root/support/popt.c
diff options
context:
space:
mode:
authorErik Troan <ewt@src.gnome.org>1998-10-21 21:44:21 +0000
committerErik Troan <ewt@src.gnome.org>1998-10-21 21:44:21 +0000
commit0fe1a70475dfa7889d61c1b58b277d9317c79934 (patch)
tree399df9da5158539223f908a98836d1f5d3b277ef /support/popt.c
parentc01ab27ea73e74fe353df354b8e7e0bb9fde01e7 (diff)
downloadshared-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.c24
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;