popt.h | popt.h | |||
---|---|---|---|---|
/* (C) 1998 Red Hat Software, Inc. -- Licensing details are in the COPYING | /** \file popt/popt.h | |||
* \ingroup popt | ||||
*/ | ||||
/* (C) 1998-2000 Red Hat, Inc. -- Licensing details are in the COPYING | ||||
file accompanying popt source distributions, available from | file accompanying popt source distributions, available from | |||
ftp://ftp.redhat.com/pub/code/popt */ | ftp://ftp.rpm.org/pub/rpm/dist. */ | |||
#ifndef H_POPT | #ifndef H_POPT | |||
#define H_POPT | #define H_POPT | |||
#ifdef __cplusplus | #ifdef __cplusplus | |||
extern "C" { | extern "C" { | |||
#endif | #endif | |||
#include <stdio.h> /* for FILE * */ | #include <stdio.h> /* for FILE * */ | |||
#define POPT_OPTION_DEPTH 10 | #define POPT_OPTION_DEPTH 10 | |||
#define POPT_ARG_NONE 0 | /** \ingroup popt | |||
#define POPT_ARG_STRING 1 | * \name Arg type identifiers | |||
#define POPT_ARG_INT 2 | */ | |||
#define POPT_ARG_LONG 3 | /*@{*/ | |||
#define POPT_ARG_INCLUDE_TABLE 4 /* arg points to table */ | #define POPT_ARG_NONE 0 /*!< no arg */ | |||
#define POPT_ARG_CALLBACK 5 /* table-wide callback... must be | #define POPT_ARG_STRING 1 /*!< arg will be saved as st | |||
ring */ | ||||
#define POPT_ARG_INT 2 /*!< arg will be converted to int */ | ||||
#define POPT_ARG_LONG 3 /*!< arg will be converted to long * | ||||
/ | ||||
#define POPT_ARG_INCLUDE_TABLE 4 /*!< arg points to table */ | ||||
#define POPT_ARG_CALLBACK 5 /*!< table-wide callback... must be | ||||
set first in table; arg points | set first in table; arg points | |||
to callback, descrip points to | to callback, descrip points to | |||
callback data to pass */ | callback data to pass */ | |||
#define POPT_ARG_INTL_DOMAIN 6 /* set the translation domain | #define POPT_ARG_INTL_DOMAIN 6 /*!< set the translation domain | |||
for this table and any | for this table and any | |||
included tables; arg points | included tables; arg points | |||
to the domain string */ | to the domain string */ | |||
#define POPT_ARG_VAL 7 /* arg should take value val */ | #define POPT_ARG_VAL 7 /*!< arg should take value val */ | |||
#define POPT_ARG_FLOAT 8 /*!< arg will be converted t | ||||
o float */ | ||||
#define POPT_ARG_DOUBLE 9 /*!< arg will be converted t | ||||
o double */ | ||||
#define POPT_ARG_MASK 0x0000FFFF | #define POPT_ARG_MASK 0x0000FFFF | |||
#define POPT_ARGFLAG_ONEDASH 0x80000000 /* allow -longoption */ | /*@}*/ | |||
#define POPT_ARGFLAG_DOC_HIDDEN 0x40000000 /* don't show in help/usage */ | ||||
#define POPT_ARGFLAG_STRIP 0x20000000 /* strip this arg from argv (onl | /** \ingroup popt | |||
y applies to long args) */ | * \name Arg modifiers | |||
#define POPT_CBFLAG_PRE 0x80000000 /* call the callback bef | */ | |||
ore parse */ | /*@{*/ | |||
#define POPT_CBFLAG_POST 0x40000000 /* call the callback after parse | #define POPT_ARGFLAG_ONEDASH 0x80000000 /*!< allow -longoption */ | |||
*/ | #define POPT_ARGFLAG_DOC_HIDDEN 0x40000000 /*!< don't show in help/usage * | |||
#define POPT_CBFLAG_INC_DATA 0x20000000 /* use data from the include lin | / | |||
e, | #define POPT_ARGFLAG_STRIP 0x20000000 /*!< strip this arg from argv(on | |||
ly applies to long args) */ | ||||
#define POPT_ARGFLAG_OPTIONAL 0x10000000 /*!< arg may be missing | ||||
*/ | ||||
#define POPT_ARGFLAG_OR 0x08000000 /*!< arg will be or'ed * | ||||
/ | ||||
#define POPT_ARGFLAG_NOR 0x09000000 /*!< arg will be nor'ed | ||||
*/ | ||||
#define POPT_ARGFLAG_AND 0x04000000 /*!< arg will be and'ed | ||||
*/ | ||||
#define POPT_ARGFLAG_NAND 0x05000000 /*!< arg will be nand'ed | ||||
*/ | ||||
#define POPT_ARGFLAG_XOR 0x02000000 /*!< arg will be xor'ed | ||||
*/ | ||||
#define POPT_ARGFLAG_NOT 0x01000000 /*!< arg will be negated | ||||
*/ | ||||
#define POPT_ARGFLAG_LOGICALOPS \ | ||||
(POPT_ARGFLAG_OR|POPT_ARGFLAG_AND|POPT_ARGFLAG_XOR) | ||||
/*@}*/ | ||||
/** \ingroup popt | ||||
* \name Callback modifiers | ||||
*/ | ||||
/*@{*/ | ||||
#define POPT_CBFLAG_PRE 0x80000000 /*!< call the callback b | ||||
efore parse */ | ||||
#define POPT_CBFLAG_POST 0x40000000 /*!< call the callback after par | ||||
se */ | ||||
#define POPT_CBFLAG_INC_DATA 0x20000000 /*!< use data from the include l | ||||
ine, | ||||
not the subtable */ | not the subtable */ | |||
#define POPT_CBFLAG_SKIPOPTION 0x10000000 /*!< don't callback with option | ||||
*/ | ||||
#define POPT_CBFLAG_CONTINUE 0x08000000 /*!< continue callbacks with opt | ||||
ion */ | ||||
/*@}*/ | ||||
#define POPT_ERROR_NOARG -10 | /** \ingroup popt | |||
#define POPT_ERROR_BADOPT -11 | * \name Error return values | |||
#define POPT_ERROR_OPTSTOODEEP -13 | */ | |||
#define POPT_ERROR_BADQUOTE -15 /* only from poptParseArgString() */ | /*@{*/ | |||
#define POPT_ERROR_ERRNO -16 /* only from poptParseArgString() */ | #define POPT_ERROR_NOARG -10 /*!< missing argument */ | |||
#define POPT_ERROR_BADNUMBER -17 | #define POPT_ERROR_BADOPT -11 /*!< unknown option */ | |||
#define POPT_ERROR_OVERFLOW -18 | #define POPT_ERROR_OPTSTOODEEP -13 /*!< aliases nested too deeply */ | |||
#define POPT_ERROR_BADQUOTE -15 /*!< error in paramter quoting */ | ||||
#define POPT_ERROR_ERRNO -16 /*!< errno set, use strerror(errno) | ||||
*/ | ||||
#define POPT_ERROR_BADNUMBER -17 /*!< invalid numeric value */ | ||||
#define POPT_ERROR_OVERFLOW -18 /*!< number too large or too small * | ||||
/ | ||||
#define POPT_ERROR_BADOPERATION -19 /*!< mutually exclusive logi | ||||
cal operations requested */ | ||||
/*@}*/ | ||||
/* poptBadOption() flags */ | /** \ingroup popt | |||
#define POPT_BADOPTION_NOALIAS (1 << 0) /* don't go into an alias */ | * \name poptBadOption() flags | |||
*/ | ||||
/*@{*/ | ||||
#define POPT_BADOPTION_NOALIAS (1 << 0) /*!< don't go into an alias */ | ||||
/*@}*/ | ||||
/* poptGetContext() flags */ | /** \ingroup popt | |||
#define POPT_CONTEXT_NO_EXEC (1 << 0) /* ignore exec expansions */ | * \name poptGetContext() flags | |||
#define POPT_CONTEXT_KEEP_FIRST (1 << 1) /* pay attention to argv[0 | */ | |||
] */ | /*@{*/ | |||
#define POPT_CONTEXT_POSIXMEHARDER (1 << 2) /* options can't follow args */ | #define POPT_CONTEXT_NO_EXEC (1 << 0) /*!< ignore exec expansions */ | |||
#define POPT_CONTEXT_KEEP_FIRST (1 << 1) /*!< pay attention to argv | ||||
[0] */ | ||||
#define POPT_CONTEXT_POSIXMEHARDER (1 << 2) /*!< options can't follow args | ||||
*/ | ||||
/*@}*/ | ||||
/** \ingroup popt | ||||
*/ | ||||
struct poptOption { | struct poptOption { | |||
/*@observer@*/ /*@null@*/ const char * longName; /* may be NULL */ | /*@observer@*/ /*@null@*/ const char * longName; /*!< may be NULL */ | |||
char shortName; /* may be '\0' */ | char shortName; /*!< may be '\0' */ | |||
int argInfo; | int argInfo; | |||
/*@shared@*/ /*@null@*/ void * arg; /* depends on argInf | /*@shared@*/ /*@null@*/ void * arg; /*!< depends on argInfo */ | |||
o */ | int val; /*!< 0 means don't return, just update flag | |||
int val; /* 0 means don't return, just update flag */ | */ | |||
/*@shared@*/ /*@null@*/ const char * descrip; /* description for a | /*@shared@*/ /*@null@*/ const char * descrip; /*!< description for autohel | |||
utohelp -- may be NULL */ | p -- may be NULL */ | |||
/*@shared@*/ /*@null@*/ const char * argDescrip; /* argument descript | /*@shared@*/ /*@null@*/ const char * argDescrip; /*!< argument description | |||
ion for autohelp */ | for autohelp */ | |||
}; | }; | |||
/** \ingroup popt | ||||
*/ | ||||
struct poptAlias { | struct poptAlias { | |||
/*@owned@*/ /*@null@*/ const char * longName; /* may be NULL */ | /*@owned@*/ /*@null@*/ const char * longName; /*!< may be NULL */ | |||
char shortName; /* may be '\0' */ | char shortName; /*!< may be '\0' */ | |||
int argc; | int argc; | |||
/*@owned@*/ const char ** argv; /* must be free()able */ | /*@owned@*/ const char ** argv; /*!< must be free()able */ | |||
}; | }; | |||
/** \ingroup popt | ||||
* \name Auto-generated help/usage | ||||
*/ | ||||
/*@{*/ | ||||
extern struct poptOption poptHelpOptions[]; | extern struct poptOption poptHelpOptions[]; | |||
#define POPT_AUTOHELP { NULL, '\0', POPT_ARG_INCLUDE_TABLE, poptHelpOptions , \ | #define POPT_AUTOHELP { NULL, '\0', POPT_ARG_INCLUDE_TABLE, poptHelpOptions , \ | |||
0, "Help options", NULL }, | 0, "Help options:", NULL }, | |||
#define POPT_TABLEEND { NULL, '\0', 0, 0, 0, NULL, NULL } | ||||
/*@}*/ | ||||
/** \ingroup popt | ||||
*/ | ||||
typedef struct poptContext_s * poptContext; | typedef struct poptContext_s * poptContext; | |||
/** \ingroup popt | ||||
*/ | ||||
#ifndef __cplusplus | #ifndef __cplusplus | |||
typedef struct poptOption * poptOption; | typedef struct poptOption * poptOption; | |||
#endif | #endif | |||
enum poptCallbackReason { POPT_CALLBACK_REASON_PRE, | enum poptCallbackReason { POPT_CALLBACK_REASON_PRE, | |||
POPT_CALLBACK_REASON_POST, | POPT_CALLBACK_REASON_POST, | |||
POPT_CALLBACK_REASON_OPTION }; | POPT_CALLBACK_REASON_OPTION }; | |||
typedef void (*poptCallbackType)(poptContext con, | ||||
/** \ingroup popt | ||||
* Table callback prototype. | ||||
* @param con context | ||||
* @param reason reason for callback | ||||
* @param opt option that triggered callback | ||||
* @param arg @todo Document. | ||||
* @param data @todo Document. | ||||
*/ | ||||
typedef void (*poptCallbackType) (poptContext con, | ||||
enum poptCallbackReason reason, | enum poptCallbackReason reason, | |||
const struct poptOption * opt, | const struct poptOption * opt, | |||
const char * arg, const void * data); | const char * arg, const void * data); | |||
/** \ingroup popt | ||||
* Initialize popt context. | ||||
* @param name | ||||
* @param argc no. of arguments | ||||
* @param argv argument array | ||||
* @param options address of popt option table | ||||
* @param flags or'd POPT_CONTEXT_* bits | ||||
* @return initialized popt context | ||||
*/ | ||||
/*@only@*/ poptContext poptGetContext(/*@keep@*/ const char * name, | /*@only@*/ poptContext poptGetContext(/*@keep@*/ const char * name, | |||
int argc, /*@keep@*/ const char ** argv, | int argc, /*@keep@*/ const char ** argv, | |||
/*@keep@*/ const struct poptOption * options, int flags); | /*@keep@*/ const struct poptOption * options, int flags); | |||
/** \ingroup popt | ||||
* Reinitialize popt context. | ||||
* @param con context | ||||
*/ | ||||
void poptResetContext(poptContext con); | void poptResetContext(poptContext con); | |||
/* returns 'val' element, -1 on last item, POPT_ERROR_* on error */ | /** \ingroup popt | |||
* Return value of next option found. | ||||
* @param con context | ||||
* @return next option val, -1 on last item, POPT_ERROR_* on er | ||||
ror | ||||
*/ | ||||
int poptGetNextOpt(poptContext con); | int poptGetNextOpt(poptContext con); | |||
/* returns NULL if no argument is available */ | /* returns NULL if no argument is available */ | |||
/** \ingroup popt | ||||
* @param con context | ||||
*/ | ||||
/*@observer@*/ /*@null@*/ const char * poptGetOptArg(poptContext con); | /*@observer@*/ /*@null@*/ const char * poptGetOptArg(poptContext con); | |||
/* returns NULL if no more options are available */ | ||||
/** \ingroup popt | ||||
* Return current option's argument. | ||||
* @param con context | ||||
* @return option argument, NULL if no more options are availab | ||||
le | ||||
*/ | ||||
/*@observer@*/ /*@null@*/ const char * poptGetArg(poptContext con); | /*@observer@*/ /*@null@*/ const char * poptGetArg(poptContext con); | |||
/** \ingroup popt | ||||
* Peek at current option's argument. | ||||
* @param con context | ||||
* @return option argument | ||||
*/ | ||||
/*@observer@*/ /*@null@*/ const char * poptPeekArg(poptContext con); | /*@observer@*/ /*@null@*/ const char * poptPeekArg(poptContext con); | |||
/** \ingroup popt | ||||
* Return remaining arguments. | ||||
* @param con context | ||||
* @return argument array, terminated with NULL | ||||
*/ | ||||
/*@observer@*/ /*@null@*/ const char ** poptGetArgs(poptContext con); | /*@observer@*/ /*@null@*/ const char ** poptGetArgs(poptContext con); | |||
/* returns the option which caused the most recent error */ | ||||
/** \ingroup popt | ||||
* Return the option which caused the most recent error. | ||||
* @param con context | ||||
* @return offending option | ||||
*/ | ||||
/*@observer@*/ const char * poptBadOption(poptContext con, int flags); | /*@observer@*/ const char * poptBadOption(poptContext con, int flags); | |||
/** \ingroup popt | ||||
* Destroy context. | ||||
* @param con context | ||||
*/ | ||||
void poptFreeContext( /*@only@*/ poptContext con); | void poptFreeContext( /*@only@*/ poptContext con); | |||
/** \ingroup popt | ||||
* Add arguments to context. | ||||
* @param con context | ||||
* @param argv argument array, NULL terminated | ||||
* @return 0 on success, POPT_ERROR_OPTSTOODEEP on failure | ||||
*/ | ||||
int poptStuffArgs(poptContext con, /*@keep@*/ const char ** argv); | int poptStuffArgs(poptContext con, /*@keep@*/ const char ** argv); | |||
/** \ingroup popt | ||||
* Add alias to context. | ||||
* @todo Pass alias by reference, not value. | ||||
* @param con context | ||||
* @param alias alias to add | ||||
* @param flags (unused) | ||||
* @return 0 always | ||||
*/ | ||||
int poptAddAlias(poptContext con, struct poptAlias alias, int flags); | int poptAddAlias(poptContext con, struct poptAlias alias, int flags); | |||
/** \ingroup popt | ||||
* Read configuration file. | ||||
* @param con context | ||||
* @param fn file name to read | ||||
* @return 0 on success, POPT_ERROR_ERRNO on failure | ||||
*/ | ||||
int poptReadConfigFile(poptContext con, const char * fn); | int poptReadConfigFile(poptContext con, const char * fn); | |||
/* like above, but reads /etc/popt and $HOME/.popt along with environment | ||||
vars */ | /** \ingroup popt | |||
int poptReadDefaultConfig(poptContext con, int useEnv); | * Read default configuration from /etc/popt and $HOME/.popt. | |||
/* argv should be freed -- this allows ', ", and \ quoting, but ' is treate | * @param con context | |||
d | * @param useEnv (unused) | |||
the same as " and both may include \ quotes */ | * @return 0 on success, POPT_ERROR_ERRNO on failure | |||
*/ | ||||
int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv); | ||||
/** \ingroup popt | ||||
* Duplicate an argument array. | ||||
* @note: The argument array is malloc'd as a single area, so only argv mus | ||||
t | ||||
* be free'd. | ||||
* | ||||
* @param argc no. of arguments | ||||
* @param argv argument array | ||||
* @retval argcPtr address of returned no. of arguments | ||||
* @retval argvPtr address of returned argument array | ||||
* @return 0 on success, POPT_ERROR_NOARG on failure | ||||
*/ | ||||
int poptDupArgv(int argc, const char **argv, | int poptDupArgv(int argc, const char **argv, | |||
/*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr); | /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr); | |||
/** \ingroup popt | ||||
* Parse a string into an argument array. | ||||
* The parse allows ', ", and \ quoting, but ' is treated the same as " and | ||||
* both may include \ quotes. | ||||
* @note: The argument array is malloc'd as a single area, so only argv mus | ||||
t | ||||
* be free'd. | ||||
* | ||||
* @param s string to parse | ||||
* @retval argcPtr address of returned no. of arguments | ||||
* @retval argvPtr address of returned argument array | ||||
*/ | ||||
int poptParseArgvString(const char * s, | int poptParseArgvString(const char * s, | |||
/*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr); | /*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr); | |||
/** \ingroup popt | ||||
* Return formatted error string for popt failure. | ||||
* @param error popt error | ||||
* @return error string | ||||
*/ | ||||
/*@observer@*/ const char *const poptStrerror(const int error); | /*@observer@*/ const char *const poptStrerror(const int error); | |||
/** \ingroup popt | ||||
* Limit search for executables. | ||||
* @param con context | ||||
* @param path single path to search for executables | ||||
* @param allowAbsolute absolute paths only? | ||||
*/ | ||||
void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) ; | void poptSetExecPath(poptContext con, const char * path, int allowAbsolute) ; | |||
void poptPrintHelp(poptContext con, FILE * f, int flags); | ||||
void poptPrintUsage(poptContext con, FILE * f, int flags); | /** \ingroup popt | |||
* Print detailed description of options. | ||||
* @param con context | ||||
* @param f ouput file handle | ||||
* @param flags (unused) | ||||
*/ | ||||
void poptPrintHelp(poptContext con, FILE * f, /*@unused@*/ int flags); | ||||
/** \ingroup popt | ||||
* Print terse description of options. | ||||
* @param con context | ||||
* @param f ouput file handle | ||||
* @param flags (unused) | ||||
*/ | ||||
void poptPrintUsage(poptContext con, FILE * f, /*@unused@*/ int flags); | ||||
/** \ingroup popt | ||||
* Provide text to replace default "[OPTION...]" in help/usage output. | ||||
* @param con context | ||||
* @param text replacement text | ||||
*/ | ||||
void poptSetOtherOptionHelp(poptContext con, const char * text); | void poptSetOtherOptionHelp(poptContext con, const char * text); | |||
/** \ingroup popt | ||||
* Return argv[0] from context. | ||||
* @param con context | ||||
*/ | ||||
/*@observer@*/ const char * poptGetInvocationName(poptContext con); | /*@observer@*/ const char * poptGetInvocationName(poptContext con); | |||
/* shuffles argv pointers to remove stripped args, returns new argc */ | ||||
/** \ingroup popt | ||||
* Shuffle argv pointers to remove stripped args, returns new argc. | ||||
* @param con context | ||||
* @return new argc | ||||
*/ | ||||
int poptStrippedArgv(poptContext con, int argc, char **argv); | int poptStrippedArgv(poptContext con, int argc, char **argv); | |||
#ifdef __cplusplus | #ifdef __cplusplus | |||
} | } | |||
#endif | #endif | |||
#endif | #endif | |||
End of changes. 40 change blocks. | ||||
60 lines changed or deleted | 297 lines changed or added | |||