Home | History | Annotate | Download | only in oprofile
      1 /** \file popt/popt.h
      2  * \ingroup popt
      3  */
      4 
      5 /* (C) 1998-2000 Red Hat, Inc. -- Licensing details are in the COPYING
      6    file accompanying popt source distributions, available from
      7    ftp://ftp.rpm.org/pub/rpm/dist. */
      8 
      9 #ifndef H_POPT
     10 #define H_POPT
     11 
     12 #include <stdio.h>			/* for FILE * */
     13 
     14 #define POPT_OPTION_DEPTH	10
     15 
     16 /** \ingroup popt
     17  * \name Arg type identifiers
     18  */
     19 /*@{*/
     20 #define POPT_ARG_NONE		0	/*!< no arg */
     21 #define POPT_ARG_STRING		1	/*!< arg will be saved as string */
     22 #define POPT_ARG_INT		2	/*!< arg will be converted to int */
     23 #define POPT_ARG_LONG		3	/*!< arg will be converted to long */
     24 #define POPT_ARG_INCLUDE_TABLE	4	/*!< arg points to table */
     25 #define POPT_ARG_CALLBACK	5	/*!< table-wide callback... must be
     26 					   set first in table; arg points
     27 					   to callback, descrip points to
     28 					   callback data to pass */
     29 #define POPT_ARG_INTL_DOMAIN    6       /*!< set the translation domain
     30 					   for this table and any
     31 					   included tables; arg points
     32 					   to the domain string */
     33 #define POPT_ARG_VAL		7	/*!< arg should take value val */
     34 #define	POPT_ARG_FLOAT		8	/*!< arg will be converted to float */
     35 #define	POPT_ARG_DOUBLE		9	/*!< arg will be converted to double */
     36 
     37 #define POPT_ARG_MASK		0x0000FFFF
     38 /*@}*/
     39 
     40 /** \ingroup popt
     41  * \name Arg modifiers
     42  */
     43 /*@{*/
     44 #define POPT_ARGFLAG_ONEDASH	0x80000000  /*!< allow -longoption */
     45 #define POPT_ARGFLAG_DOC_HIDDEN 0x40000000  /*!< don't show in help/usage */
     46 #define POPT_ARGFLAG_STRIP	0x20000000  /*!< strip this arg from argv(only applies to long args) */
     47 #define	POPT_ARGFLAG_OPTIONAL	0x10000000  /*!< arg may be missing */
     48 
     49 #define	POPT_ARGFLAG_OR		0x08000000  /*!< arg will be or'ed */
     50 #define	POPT_ARGFLAG_NOR	0x09000000  /*!< arg will be nor'ed */
     51 #define	POPT_ARGFLAG_AND	0x04000000  /*!< arg will be and'ed */
     52 #define	POPT_ARGFLAG_NAND	0x05000000  /*!< arg will be nand'ed */
     53 #define	POPT_ARGFLAG_XOR	0x02000000  /*!< arg will be xor'ed */
     54 #define	POPT_ARGFLAG_NOT	0x01000000  /*!< arg will be negated */
     55 #define POPT_ARGFLAG_LOGICALOPS \
     56         (POPT_ARGFLAG_OR|POPT_ARGFLAG_AND|POPT_ARGFLAG_XOR)
     57 
     58 #define	POPT_BIT_SET	(POPT_ARG_VAL|POPT_ARGFLAG_OR)
     59 					/*!< set arg bit(s) */
     60 #define	POPT_BIT_CLR	(POPT_ARG_VAL|POPT_ARGFLAG_NAND)
     61 					/*!< clear arg bit(s) */
     62 
     63 #define	POPT_ARGFLAG_SHOW_DEFAULT 0x00800000 /*!< show default value in --help */
     64 
     65 /*@}*/
     66 
     67 /** \ingroup popt
     68  * \name Callback modifiers
     69  */
     70 /*@{*/
     71 #define POPT_CBFLAG_PRE		0x80000000  /*!< call the callback before parse */
     72 #define POPT_CBFLAG_POST	0x40000000  /*!< call the callback after parse */
     73 #define POPT_CBFLAG_INC_DATA	0x20000000  /*!< use data from the include line,
     74 					       not the subtable */
     75 #define POPT_CBFLAG_SKIPOPTION	0x10000000  /*!< don't callback with option */
     76 #define POPT_CBFLAG_CONTINUE	0x08000000  /*!< continue callbacks with option */
     77 /*@}*/
     78 
     79 /** \ingroup popt
     80  * \name Error return values
     81  */
     82 /*@{*/
     83 #define POPT_ERROR_NOARG	-10	/*!< missing argument */
     84 #define POPT_ERROR_BADOPT	-11	/*!< unknown option */
     85 #define POPT_ERROR_OPTSTOODEEP	-13	/*!< aliases nested too deeply */
     86 #define POPT_ERROR_BADQUOTE	-15	/*!< error in paramter quoting */
     87 #define POPT_ERROR_ERRNO	-16	/*!< errno set, use strerror(errno) */
     88 #define POPT_ERROR_BADNUMBER	-17	/*!< invalid numeric value */
     89 #define POPT_ERROR_OVERFLOW	-18	/*!< number too large or too small */
     90 #define	POPT_ERROR_BADOPERATION	-19	/*!< mutually exclusive logical operations requested */
     91 #define	POPT_ERROR_NULLARG	-20	/*!< opt->arg should not be NULL */
     92 #define	POPT_ERROR_MALLOC	-21	/*!< memory allocation failed */
     93 /*@}*/
     94 
     95 /** \ingroup popt
     96  * \name poptBadOption() flags
     97  */
     98 /*@{*/
     99 #define POPT_BADOPTION_NOALIAS  (1 << 0)  /*!< don't go into an alias */
    100 /*@}*/
    101 
    102 /** \ingroup popt
    103  * \name poptGetContext() flags
    104  */
    105 /*@{*/
    106 #define POPT_CONTEXT_NO_EXEC	(1 << 0)  /*!< ignore exec expansions */
    107 #define POPT_CONTEXT_KEEP_FIRST	(1 << 1)  /*!< pay attention to argv[0] */
    108 #define POPT_CONTEXT_POSIXMEHARDER (1 << 2) /*!< options can't follow args */
    109 #define POPT_CONTEXT_ARG_OPTS	(1 << 4) /*!< return args as options with value 0 */
    110 /*@}*/
    111 
    112 /** \ingroup popt
    113  */
    114 struct poptOption {
    115 /*@observer@*/ /*@null@*/
    116     const char * longName;	/*!< may be NULL */
    117     char shortName;		/*!< may be NUL */
    118     int argInfo;
    119 /*@shared@*/ /*@null@*/
    120     void * arg;			/*!< depends on argInfo */
    121     int val;			/*!< 0 means don't return, just update flag */
    122 /*@observer@*/ /*@null@*/
    123     const char * descrip;	/*!< description for autohelp -- may be NULL */
    124 /*@observer@*/ /*@null@*/
    125     const char * argDescrip;	/*!< argument description for autohelp */
    126 };
    127 
    128 /** \ingroup popt
    129  * A popt alias argument for poptAddAlias().
    130  */
    131 struct poptAlias {
    132 /*@owned@*/ /*@null@*/
    133     const char * longName;	/*!< may be NULL */
    134     char shortName;		/*!< may be NUL */
    135     int argc;
    136 /*@owned@*/
    137     const char ** argv;		/*!< must be free()able */
    138 };
    139 
    140 /** \ingroup popt
    141  * A popt alias or exec argument for poptAddItem().
    142  */
    143 /*@-exporttype@*/
    144 typedef struct poptItem_s {
    145     struct poptOption option;	/*!< alias/exec name(s) and description. */
    146     int argc;			/*!< (alias) no. of args. */
    147 /*@owned@*/
    148     const char ** argv;		/*!< (alias) args, must be free()able. */
    149 } * poptItem;
    150 /*@=exporttype@*/
    151 
    152 /** \ingroup popt
    153  * \name Auto-generated help/usage
    154  */
    155 /*@{*/
    156 
    157 /**
    158  * Empty table marker to enable displaying popt alias/exec options.
    159  */
    160 /*@-exportvar@*/
    161 /*@unchecked@*/ /*@observer@*/
    162 extern struct poptOption poptAliasOptions[];
    163 /*@=exportvar@*/
    164 #define POPT_AUTOALIAS { NULL, '\0', POPT_ARG_INCLUDE_TABLE, poptAliasOptions, \
    165 			0, "Options implemented via popt alias/exec:", NULL },
    166 
    167 /**
    168  * Auto help table options.
    169  */
    170 /*@-exportvar@*/
    171 /*@unchecked@*/ /*@observer@*/
    172 extern struct poptOption poptHelpOptions[];
    173 /*@=exportvar@*/
    174 
    175 /*@-exportvar@*/
    176 /*@unchecked@*/ /*@observer@*/
    177 extern struct poptOption * poptHelpOptionsI18N;
    178 /*@=exportvar@*/
    179 
    180 #define POPT_AUTOHELP { NULL, '\0', POPT_ARG_INCLUDE_TABLE, poptHelpOptions, \
    181 			0, "Help options:", NULL },
    182 
    183 #define POPT_TABLEEND { NULL, '\0', 0, 0, 0, NULL, NULL }
    184 /*@}*/
    185 
    186 /** \ingroup popt
    187  */
    188 /*@-exporttype@*/
    189 typedef /*@abstract@*/ struct poptContext_s * poptContext;
    190 /*@=exporttype@*/
    191 
    192 /** \ingroup popt
    193  */
    194 #ifndef __cplusplus
    195 /*@-exporttype -typeuse@*/
    196 typedef struct poptOption * poptOption;
    197 /*@=exporttype =typeuse@*/
    198 #endif
    199 
    200 /*@-exportconst@*/
    201 enum poptCallbackReason {
    202     POPT_CALLBACK_REASON_PRE	= 0,
    203     POPT_CALLBACK_REASON_POST	= 1,
    204     POPT_CALLBACK_REASON_OPTION = 2
    205 };
    206 /*@=exportconst@*/
    207 
    208 #ifdef __cplusplus
    209 extern "C" {
    210 #endif
    211 /*@-type@*/
    212 
    213 /** \ingroup popt
    214  * Table callback prototype.
    215  * @param con		context
    216  * @param reason	reason for callback
    217  * @param opt		option that triggered callback
    218  * @param arg		@todo Document.
    219  * @param data		@todo Document.
    220  */
    221 typedef void (*poptCallbackType) (poptContext con,
    222 		enum poptCallbackReason reason,
    223 		/*@null@*/ const struct poptOption * opt,
    224 		/*@null@*/ const char * arg,
    225 		/*@null@*/ const void * data)
    226 	/*@globals internalState @*/
    227 	/*@modifies internalState @*/;
    228 
    229 /** \ingroup popt
    230  * Initialize popt context.
    231  * @param name		context name (usually argv[0] program name)
    232  * @param argc		no. of arguments
    233  * @param argv		argument array
    234  * @param options	address of popt option table
    235  * @param flags		or'd POPT_CONTEXT_* bits
    236  * @return		initialized popt context
    237  */
    238 /*@only@*/ /*@null@*/
    239 poptContext poptGetContext(
    240 		/*@dependent@*/ /*@keep@*/ const char * name,
    241 		int argc, /*@dependent@*/ /*@keep@*/ const char ** argv,
    242 		/*@dependent@*/ /*@keep@*/ const struct poptOption * options,
    243 		int flags)
    244 	/*@*/;
    245 
    246 /** \ingroup popt
    247  * Reinitialize popt context.
    248  * @param con		context
    249  */
    250 /*@unused@*/
    251 void poptResetContext(/*@null@*/poptContext con)
    252 	/*@modifies con @*/;
    253 
    254 /** \ingroup popt
    255  * Return value of next option found.
    256  * @param con		context
    257  * @return		next option val, -1 on last item, POPT_ERROR_* on error
    258  */
    259 int poptGetNextOpt(/*@null@*/poptContext con)
    260 	/*@globals fileSystem, internalState @*/
    261 	/*@modifies con, fileSystem, internalState @*/;
    262 
    263 /** \ingroup popt
    264  * Return next option argument (if any).
    265  * @param con		context
    266  * @return		option argument, NULL if no argument is available
    267  */
    268 /*@observer@*/ /*@null@*/ /*@unused@*/
    269 const char * poptGetOptArg(/*@null@*/poptContext con)
    270 	/*@modifies con @*/;
    271 
    272 /** \ingroup popt
    273  * Return next argument.
    274  * @param con		context
    275  * @return		next argument, NULL if no argument is available
    276  */
    277 /*@observer@*/ /*@null@*/ /*@unused@*/
    278 const char * poptGetArg(/*@null@*/poptContext con)
    279 	/*@modifies con @*/;
    280 
    281 /** \ingroup popt
    282  * Peek at current argument.
    283  * @param con		context
    284  * @return		current argument, NULL if no argument is available
    285  */
    286 /*@observer@*/ /*@null@*/ /*@unused@*/
    287 const char * poptPeekArg(/*@null@*/poptContext con)
    288 	/*@*/;
    289 
    290 /** \ingroup popt
    291  * Return remaining arguments.
    292  * @param con		context
    293  * @return		argument array, NULL terminated
    294  */
    295 /*@observer@*/ /*@null@*/
    296 const char ** poptGetArgs(/*@null@*/poptContext con)
    297 	/*@modifies con @*/;
    298 
    299 /** \ingroup popt
    300  * Return the option which caused the most recent error.
    301  * @param con		context
    302  * @param flags
    303  * @return		offending option
    304  */
    305 /*@observer@*/
    306 const char * poptBadOption(/*@null@*/poptContext con, int flags)
    307 	/*@*/;
    308 
    309 /** \ingroup popt
    310  * Destroy context.
    311  * @param con		context
    312  * @return		NULL always
    313  */
    314 /*@null@*/
    315 poptContext poptFreeContext( /*@only@*/ /*@null@*/ poptContext con)
    316 	/*@modifies con @*/;
    317 
    318 /** \ingroup popt
    319  * Add arguments to context.
    320  * @param con		context
    321  * @param argv		argument array, NULL terminated
    322  * @return		0 on success, POPT_ERROR_OPTSTOODEEP on failure
    323  */
    324 /*@unused@*/
    325 int poptStuffArgs(poptContext con, /*@keep@*/ const char ** argv)
    326 	/*@modifies con @*/;
    327 
    328 /** \ingroup popt
    329  * Add alias to context.
    330  * @todo Pass alias by reference, not value.
    331  * @deprecated Use poptAddItem instead.
    332  * @param con		context
    333  * @param alias		alias to add
    334  * @param flags		(unused)
    335  * @return		0 on success
    336  */
    337 /*@unused@*/
    338 int poptAddAlias(poptContext con, struct poptAlias alias, int flags)
    339 	/*@modifies con @*/;
    340 
    341 /** \ingroup popt
    342  * Add alias/exec item to context.
    343  * @param con		context
    344  * @param newItem	alias/exec item to add
    345  * @param flags		0 for alias, 1 for exec
    346  * @return		0 on success
    347  */
    348 int poptAddItem(poptContext con, poptItem newItem, int flags)
    349 	/*@modifies con @*/;
    350 
    351 /** \ingroup popt
    352  * Read configuration file.
    353  * @param con		context
    354  * @param fn		file name to read
    355  * @return		0 on success, POPT_ERROR_ERRNO on failure
    356  */
    357 int poptReadConfigFile(poptContext con, const char * fn)
    358 	/*@globals errno, fileSystem, internalState @*/
    359 	/*@modifies con->execs, con->numExecs,
    360 		errno, fileSystem, internalState @*/;
    361 
    362 /** \ingroup popt
    363  * Read default configuration from /etc/popt and $HOME/.popt.
    364  * @param con		context
    365  * @param useEnv	(unused)
    366  * @return		0 on success, POPT_ERROR_ERRNO on failure
    367  */
    368 /*@unused@*/
    369 int poptReadDefaultConfig(poptContext con, /*@unused@*/ int useEnv)
    370 	/*@globals fileSystem, internalState @*/
    371 	/*@modifies con->execs, con->numExecs,
    372 		fileSystem, internalState @*/;
    373 
    374 /** \ingroup popt
    375  * Duplicate an argument array.
    376  * @note: The argument array is malloc'd as a single area, so only argv must
    377  * be free'd.
    378  *
    379  * @param argc		no. of arguments
    380  * @param argv		argument array
    381  * @retval argcPtr	address of returned no. of arguments
    382  * @retval argvPtr	address of returned argument array
    383  * @return		0 on success, POPT_ERROR_NOARG on failure
    384  */
    385 int poptDupArgv(int argc, /*@null@*/ const char **argv,
    386 		/*@null@*/ /*@out@*/ int * argcPtr,
    387 		/*@null@*/ /*@out@*/ const char *** argvPtr)
    388 	/*@modifies *argcPtr, *argvPtr @*/;
    389 
    390 /** \ingroup popt
    391  * Parse a string into an argument array.
    392  * The parse allows ', ", and \ quoting, but ' is treated the same as " and
    393  * both may include \ quotes.
    394  * @note: The argument array is malloc'd as a single area, so only argv must
    395  * be free'd.
    396  *
    397  * @param s		string to parse
    398  * @retval argcPtr	address of returned no. of arguments
    399  * @retval argvPtr	address of returned argument array
    400  */
    401 int poptParseArgvString(const char * s,
    402 		/*@out@*/ int * argcPtr, /*@out@*/ const char *** argvPtr)
    403 	/*@modifies *argcPtr, *argvPtr @*/;
    404 
    405 /** \ingroup popt
    406  * Parses an input configuration file and returns an string that is a
    407  * command line.  For use with popt.  You must free the return value when done.
    408  *
    409  * Given the file:
    410 \verbatim
    411 # this line is ignored
    412     #   this one too
    413 aaa
    414   bbb
    415     ccc
    416 bla=bla
    417 
    418 this_is   =   fdsafdas
    419      bad_line=
    420   reall bad line
    421   reall bad line  = again
    422 5555=   55555
    423   test = with lots of spaces
    424 \endverbatim
    425 *
    426 * The result is:
    427 \verbatim
    428 --aaa --bbb --ccc --bla="bla" --this_is="fdsafdas" --5555="55555" --test="with lots of spaces"
    429 \endverbatim
    430 *
    431 * Passing this to poptParseArgvString() yields an argv of:
    432 \verbatim
    433 '--aaa'
    434 '--bbb'
    435 '--ccc'
    436 '--bla=bla'
    437 '--this_is=fdsafdas'
    438 '--5555=55555'
    439 '--test=with lots of spaces'
    440 \endverbatim
    441  *
    442  * @bug NULL is returned if file line is too long.
    443  * @bug Silently ignores invalid lines.
    444  *
    445  * @param fp		file handle to read
    446  * @param *argstrp	return string of options (malloc'd)
    447  * @param flags		unused
    448  * @return		0 on success
    449  * @see			poptParseArgvString
    450  */
    451 /*@-fcnuse@*/
    452 int poptConfigFileToString(FILE *fp, /*@out@*/ char ** argstrp, int flags)
    453 	/*@globals fileSystem @*/
    454 	/*@modifies *fp, *argstrp, fileSystem @*/;
    455 /*@=fcnuse@*/
    456 
    457 /** \ingroup popt
    458  * Return formatted error string for popt failure.
    459  * @param error		popt error
    460  * @return		error string
    461  */
    462 /*@observer@*/
    463 const char * poptStrerror(const int error)
    464 	/*@*/;
    465 
    466 /** \ingroup popt
    467  * Limit search for executables.
    468  * @param con		context
    469  * @param path		single path to search for executables
    470  * @param allowAbsolute	absolute paths only?
    471  */
    472 /*@unused@*/
    473 void poptSetExecPath(poptContext con, const char * path, int allowAbsolute)
    474 	/*@modifies con @*/;
    475 
    476 /** \ingroup popt
    477  * Print detailed description of options.
    478  * @param con		context
    479  * @param fp		ouput file handle
    480  * @param flags		(unused)
    481  */
    482 void poptPrintHelp(poptContext con, FILE * fp, /*@unused@*/ int flags)
    483 	/*@globals fileSystem @*/
    484 	/*@modifies *fp, fileSystem @*/;
    485 
    486 /** \ingroup popt
    487  * Print terse description of options.
    488  * @param con		context
    489  * @param fp		ouput file handle
    490  * @param flags		(unused)
    491  */
    492 void poptPrintUsage(poptContext con, FILE * fp, /*@unused@*/ int flags)
    493 	/*@globals fileSystem @*/
    494 	/*@modifies *fp, fileSystem @*/;
    495 
    496 /** \ingroup popt
    497  * Provide text to replace default "[OPTION...]" in help/usage output.
    498  * @param con		context
    499  * @param text		replacement text
    500  */
    501 /*@-fcnuse@*/
    502 void poptSetOtherOptionHelp(poptContext con, const char * text)
    503 	/*@modifies con @*/;
    504 /*@=fcnuse@*/
    505 
    506 /** \ingroup popt
    507  * Return argv[0] from context.
    508  * @param con		context
    509  * @return		argv[0]
    510  */
    511 /*@-fcnuse@*/
    512 /*@observer@*/
    513 const char * poptGetInvocationName(poptContext con)
    514 	/*@*/;
    515 /*@=fcnuse@*/
    516 
    517 /** \ingroup popt
    518  * Shuffle argv pointers to remove stripped args, returns new argc.
    519  * @param con		context
    520  * @param argc		no. of args
    521  * @param argv		arg vector
    522  * @return		new argc
    523  */
    524 /*@-fcnuse@*/
    525 int poptStrippedArgv(poptContext con, int argc, char ** argv)
    526 	/*@modifies *argv @*/;
    527 /*@=fcnuse@*/
    528 
    529 /**
    530  * Save a long, performing logical operation with value.
    531  * @warning Alignment check may be too strict on certain platorms.
    532  * @param arg		integer pointer, aligned on int boundary.
    533  * @param argInfo	logical operation (see POPT_ARGFLAG_*)
    534  * @param aLong		value to use
    535  * @return		0 on success, POPT_ERROR_NULLARG/POPT_ERROR_BADOPERATION
    536  */
    537 /*@-incondefs@*/
    538 /*@unused@*/
    539 int poptSaveLong(/*@null@*/ long * arg, int argInfo, long aLong)
    540 	/*@modifies *arg @*/
    541 	/*@requires maxSet(arg) >= 0 /\ maxRead(arg) == 0 @*/;
    542 /*@=incondefs@*/
    543 
    544 /**
    545  * Save an integer, performing logical operation with value.
    546  * @warning Alignment check may be too strict on certain platorms.
    547  * @param arg		integer pointer, aligned on int boundary.
    548  * @param argInfo	logical operation (see POPT_ARGFLAG_*)
    549  * @param aLong		value to use
    550  * @return		0 on success, POPT_ERROR_NULLARG/POPT_ERROR_BADOPERATION
    551  */
    552 /*@-incondefs@*/
    553 /*@unused@*/
    554 int poptSaveInt(/*@null@*/ int * arg, int argInfo, long aLong)
    555 	/*@modifies *arg @*/
    556 	/*@requires maxSet(arg) >= 0 /\ maxRead(arg) == 0 @*/;
    557 /*@=incondefs@*/
    558 
    559 /*@=type@*/
    560 #ifdef  __cplusplus
    561 }
    562 #endif
    563 
    564 #endif
    565