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