X-Git-Url: http://git.efficios.com/?p=argpar.git;a=blobdiff_plain;f=argpar%2Fargpar.h;h=27503c56fd56944207b4cf60869196bf1ae51c64;hp=22ecaabe89526c98aa2259375bc79d3ed2604e42;hb=1c88181255c1d2516b035f678ae7e6929cb9bf76;hpb=9e2c879bb10c35749cab090dbc89161698caf4e5 diff --git a/argpar/argpar.h b/argpar/argpar.h index 22ecaab..27503c5 100644 --- a/argpar/argpar.h +++ b/argpar/argpar.h @@ -83,7 +83,8 @@ A parsing item (the result of argpar_iter_next()) has the type #argpar_item. Get the type (option or non-option) of an item with -argpar_item_type(). Each item type has its set of dedicated functions +\link argpar_item_type(const struct argpar_item *) argpar_item_type()\endlink. +Each item type has its set of dedicated functions (\c argpar_item_opt_ and \c argpar_item_non_opt_ prefixes). argpar_iter_next() produces the items in the same order that it parses @@ -128,7 +129,8 @@ struct argpar_opt_descr; /*! @brief - Type of a parsing item, as returned by argpar_item_type(). + Type of a parsing item, as returned by + \link argpar_item_type(const struct argpar_item *) argpar_item_type()\endlink. */ enum argpar_item_type { /// Option @@ -211,7 +213,7 @@ const char *argpar_item_opt_arg(const struct argpar_item *item); /*! @brief Returns the complete original argument, pointing to one of the - entries of the original arguments (\p argv as passed to + entries of the original arguments (in \p argv, as passed to argpar_iter_create()), of the non-option parsing item \p item. @param[in] item @@ -233,9 +235,9 @@ const char *argpar_item_non_opt_arg(const struct argpar_item *item); /*! @brief - Returns the index, within \em all the original arguments (\p argv - as passed to argpar_iter_create()), of the non-option parsing item - \p item. + Returns the index, within \em all the original arguments (in + \p argv, as passed to argpar_iter_create()), of the non-option + parsing item \p item. For example, with the following command line (all options have no argument): @@ -333,6 +335,152 @@ void argpar_item_destroy(const struct argpar_item *item); /// @} +/*! +@name Error API +@{ +*/ + +/*! +@brief + Parsing error type, as returned by + \link argpar_error_type(const struct argpar_error *) argpar_error_type()\endlink. +*/ +enum argpar_error_type { + /// Unknown option error + ARGPAR_ERROR_TYPE_UNKNOWN_OPT, + + /// Missing option argument error + ARGPAR_ERROR_TYPE_MISSING_OPT_ARG, + + /// Unexpected option argument error + ARGPAR_ERROR_TYPE_UNEXPECTED_OPT_ARG, +}; + +/*! +@struct argpar_error + +@brief + Opaque parsing error type +*/ +struct argpar_error; + +/*! +@brief + Returns the type of the parsing error object \p error. + +@param[in] error + Parsing error of which to get the type. + +@returns + Type of \p error. + +@pre + \p error is not \c NULL. +*/ +/// @cond hidden_macro +ARGPAR_HIDDEN +/// @endcond +enum argpar_error_type argpar_error_type(const struct argpar_error *error); + +/*! +@brief + Returns the index of the original argument (in \p argv, as passed to + argpar_iter_create()) for which the parsing error described by + \p error occurred. + +@param[in] error + Parsing error of which to get the original argument index. + +@returns + Original argument index of \p error. + +@pre + \p error is not \c NULL. +*/ +/// @cond hidden_macro +ARGPAR_HIDDEN +/// @endcond +unsigned int argpar_error_orig_index(const struct argpar_error *error); + +/*! +@brief + Returns the name of the unknown option for which the parsing error + described by \p error occurred. + +The returned name includes any - or \-- +prefix. + +With the long option with argument form, for example +\--mireille=deyglun, this function only returns the name +part (\--mireille in the last example). + +@param[in] error + Parsing error of which to get the name of the unknown option. + +@returns + Name of the unknown option of \p error. + +@pre + \p error is not \c NULL. +@pre + The type of \p error, as returned by + \link argpar_error_type(const struct argpar_error *) argpar_error_type()\endlink, + is #ARGPAR_ERROR_TYPE_UNKNOWN_OPT. +*/ +/// @cond hidden_macro +ARGPAR_HIDDEN +/// @endcond +const char *argpar_error_unknown_opt_name(const struct argpar_error *error); + +/*! +@brief + Returns the descriptor of the option for which the parsing error + described by \p error occurred. + +@param[in] error + Parsing error of which to get the option descriptor. +@param[out] is_short + @parblock + If not \c NULL, this function sets \p *is_short to: + + - \c true if the option for which \p error occurred is a short + option. + + - \c false if the option for which \p error occurred is a long + option. + @endparblock + +@returns + Descriptor of the option of \p error. + +@pre + \p error is not \c NULL. +@pre + The type of \p error, as returned by + \link argpar_error_type(const struct argpar_error *) argpar_error_type()\endlink, + is #ARGPAR_ERROR_TYPE_MISSING_OPT_ARG or + #ARGPAR_ERROR_TYPE_UNEXPECTED_OPT_ARG. +*/ +/// @cond hidden_macro +ARGPAR_HIDDEN +/// @endcond +const struct argpar_opt_descr *argpar_error_opt_descr( + const struct argpar_error *error, bool *is_short); + +/*! +@brief + Destroys the parsing error \p error. + +@param[in] error + Parsing error to destroy (may be \c NULL). +*/ +/// @cond hidden_macro +ARGPAR_HIDDEN +/// @endcond +void argpar_error_destroy(const struct argpar_error *error); + +/// @} + /*! @name Iterator API @{ @@ -412,10 +560,18 @@ and \&argv[1] as \p argv from what main() receives, or ignore the parsing item of the first call to argpar_iter_next(). -\p *argv and \p *descrs must \em not change for the lifetime of the -returned iterator (until you call argpar_iter_destroy()) and for the -lifetime of any parsing item (until you call argpar_item_destroy()) -which argpar_iter_next() creates from the returned iterator. +\p *argv and \p *descrs must \em not change for all of: + +- The lifetime of the returned iterator (until you call + argpar_iter_destroy()). + +- The lifetime of any parsing item (until you call + argpar_item_destroy()) which argpar_iter_next() creates from the + returned iterator. + +- The lifetime of any parsing error (until you call + argpar_error_destroy()) which argpar_iter_next() creates from the + returned iterator. @param[in] argc Number of original arguments to parse in \p argv. @@ -468,6 +624,8 @@ void argpar_iter_destroy(struct argpar_iter *iter); /*! @brief Return type of argpar_iter_next(). + +Error status enumerators have a negative value. */ enum argpar_iter_next_status { /// Success @@ -476,17 +634,11 @@ enum argpar_iter_next_status { /// End of iteration (no more original arguments to parse) ARGPAR_ITER_NEXT_STATUS_END, - /// Unknown option error - ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT, - - /// Missing option argument error - ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG, - - /// Unexpected option argument error - ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG, + /// Parsing error + ARGPAR_ITER_NEXT_STATUS_ERROR = -1, /// Memory error - ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY, + ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY = -12, }; /*! @@ -507,14 +659,11 @@ If there are no more original arguments to parse, this function returns @endparblock @param[out] error @parblock - When this function returns - #ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT, - #ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG, or - #ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPG_ARG, if this parameter - is not \c NULL, - \p *error is a string which explains the parsing error in English. - - Free \p *error with free(). + When this function returns #ARGPAR_ITER_NEXT_STATUS_ERROR, + if this parameter is not \c NULL, \p *error contains details about + the error. + + Destroy \p *error with argpar_error_destroy(). @endparblock @returns @@ -530,7 +679,7 @@ ARGPAR_HIDDEN /// @endcond enum argpar_iter_next_status argpar_iter_next( struct argpar_iter *iter, const struct argpar_item **item, - char **error); + const struct argpar_error **error); /* * Returns the number of ingested elements from `argv`, as passed to @@ -541,7 +690,7 @@ enum argpar_iter_next_status argpar_iter_next( /*! @brief Returns the number of ingested original arguments (in - \p argv as passed to argpar_iter_create() to create \p iter) that + \p argv, as passed to argpar_iter_create() to create \p iter) that the parser ingested to produce the \em previous parsing items. @param[in] iter