X-Git-Url: http://git.efficios.com/?p=argpar.git;a=blobdiff_plain;f=argpar%2Fargpar.h;h=f8575c8ebca9db16e28638424af5cd2cbe265301;hp=07ec8c47071f8f0f850e7d41020faa8d66361688;hb=HEAD;hpb=10aefab2119c89f4afa4f46a619eae20d6be7512 diff --git a/argpar/argpar.h b/argpar/argpar.h index 07ec8c4..d11a764 100644 --- a/argpar/argpar.h +++ b/argpar/argpar.h @@ -1,8 +1,7 @@ /* * SPDX-License-Identifier: MIT - * - * Copyright (c) 2019-2021 Philippe Proulx - * Copyright (c) 2020-2021 Simon Marchi + * SPDX-FileCopyrightText: 2019-2024 Philippe Proulx + * SPDX-FileCopyrightText: 2020-2024 Simon Marchi */ #ifndef ARGPAR_ARGPAR_H @@ -10,6 +9,10 @@ #include +#if defined(__cplusplus) +extern "C" { +#endif + /*! @mainpage @@ -83,7 +86,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 argpar_item_t *) 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 @@ -96,30 +100,24 @@ example, that for: argpar_iter_next() produces the following items, in this order: --# Option item (\--hello). --# Option item (\--count with argument 23). --# Non-option item (/path/to/file). --# Option item (-a). --# Option item (-b). --# Option item (\--type with argument file). --# Non-option item (\--). --# Non-option item (magie). +-# Option item: \--hello. +-# Option item: \--count with argument 23. +-# Non-option item: /path/to/file. +-# Option item: -a. +-# Option item: -b. +-# Option item: \--type with argument file. +-# Non-option item: \--. +-# Non-option item: magie. */ -/* - * If argpar is used in some shared library, we don't want said library - * to export its symbols, so mark them as "hidden". - * - * On Windows, symbols are local unless explicitly exported; see - * . - */ -#if defined(_WIN32) || defined(__CYGWIN__) -# define ARGPAR_HIDDEN +/* Internal: `noexcept` specifier if C++ ≥ 11 */ +#if defined(__cplusplus) && (__cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)) +# define ARGPAR_NOEXCEPT noexcept #else -# define ARGPAR_HIDDEN __attribute__((visibility("hidden"))) +# define ARGPAR_NOEXCEPT #endif -struct argpar_opt_descr; +typedef struct argpar_opt_descr argpar_opt_descr_t; /*! @name Item API @@ -128,15 +126,17 @@ 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 argpar_item *) argpar_item_type()\endlink. */ -enum argpar_item_type { - /// Option - ARGPAR_ITEM_TYPE_OPT, +typedef enum argpar_item_type +{ + /// Option + ARGPAR_ITEM_TYPE_OPT, - /// Non-option - ARGPAR_ITEM_TYPE_NON_OPT, -}; + /// Non-option + ARGPAR_ITEM_TYPE_NON_OPT, +} argpar_item_type_t; /*! @struct argpar_item @@ -146,7 +146,7 @@ enum argpar_item_type { argpar_iter_next() sets a pointer to such a type. */ -struct argpar_item; +typedef struct argpar_item argpar_item_t; /*! @brief @@ -161,10 +161,7 @@ struct argpar_item; @pre \p item is not \c NULL. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -enum argpar_item_type argpar_item_type(const struct argpar_item *item); +argpar_item_type_t argpar_item_type(const argpar_item_t *item) ARGPAR_NOEXCEPT; /*! @brief @@ -181,11 +178,7 @@ enum argpar_item_type argpar_item_type(const struct argpar_item *item); @pre \p item has the type #ARGPAR_ITEM_TYPE_OPT. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -const struct argpar_opt_descr *argpar_item_opt_descr( - const struct argpar_item *item); +const argpar_opt_descr_t *argpar_item_opt_descr(const argpar_item_t *item) ARGPAR_NOEXCEPT; /*! @brief @@ -203,10 +196,7 @@ const struct argpar_opt_descr *argpar_item_opt_descr( @pre \p item has the type #ARGPAR_ITEM_TYPE_OPT. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -const char *argpar_item_opt_arg(const struct argpar_item *item); +const char *argpar_item_opt_arg(const argpar_item_t *item) ARGPAR_NOEXCEPT; /*! @brief @@ -226,10 +216,7 @@ const char *argpar_item_opt_arg(const struct argpar_item *item); @pre \p item has the type #ARGPAR_ITEM_TYPE_NON_OPT. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -const char *argpar_item_non_opt_arg(const struct argpar_item *item); +const char *argpar_item_non_opt_arg(const argpar_item_t *item) ARGPAR_NOEXCEPT; /*! @brief @@ -262,10 +249,7 @@ argument index of \c mix is 4. argpar_item_non_opt_non_opt_index() -- Returns the non-option index of a non-option parsing item. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -unsigned int argpar_item_non_opt_orig_index(const struct argpar_item *item); +unsigned int argpar_item_non_opt_orig_index(const argpar_item_t *item) ARGPAR_NOEXCEPT; /*! @brief @@ -297,10 +281,7 @@ argument index of \c mix is 1. argpar_item_non_opt_orig_index() -- Returns the original argument index of a non-option parsing item. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -unsigned int argpar_item_non_opt_non_opt_index(const struct argpar_item *item); +unsigned int argpar_item_non_opt_non_opt_index(const argpar_item_t *item) ARGPAR_NOEXCEPT; /*! @brief @@ -309,10 +290,7 @@ unsigned int argpar_item_non_opt_non_opt_index(const struct argpar_item *item); @param[in] item Parsing item to destroy (may be \c NULL). */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -void argpar_item_destroy(const struct argpar_item *item); +void argpar_item_destroy(const argpar_item_t *item) ARGPAR_NOEXCEPT; /*! @def ARGPAR_ITEM_DESTROY_AND_RESET(_item) @@ -323,13 +301,13 @@ void argpar_item_destroy(const struct argpar_item *item); @param[in] _item Item to destroy and variable to reset - (const struct argpar_item * type). + (const argpar_item_t * type). */ -#define ARGPAR_ITEM_DESTROY_AND_RESET(_item) \ - { \ - argpar_item_destroy(_item); \ - _item = NULL; \ - } +#define ARGPAR_ITEM_DESTROY_AND_RESET(_item) \ + { \ + argpar_item_destroy(_item); \ + (_item) = NULL; \ + } /// @} @@ -338,16 +316,22 @@ void argpar_item_destroy(const struct argpar_item *item); @{ */ -enum argpar_error_type { - /// Unknown option error - ARGPAR_ERROR_TYPE_UNKNOWN_OPT, +/*! +@brief + Parsing error type, as returned by + \link argpar_error_type(const argpar_error_t *) argpar_error_type()\endlink. +*/ +typedef enum argpar_error_type +{ + /// Unknown option error + ARGPAR_ERROR_TYPE_UNKNOWN_OPT, - /// Missing option argument error - ARGPAR_ERROR_TYPE_MISSING_OPT_ARG, + /// Missing option argument error + ARGPAR_ERROR_TYPE_MISSING_OPT_ARG, - /// Unexpected option argument error - ARGPAR_ERROR_TYPE_UNEXPECTED_OPT_ARG, -}; + /// Unexpected option argument error + ARGPAR_ERROR_TYPE_UNEXPECTED_OPT_ARG, +} argpar_error_type_t; /*! @struct argpar_error @@ -355,11 +339,22 @@ enum argpar_error_type { @brief Opaque parsing error type */ -struct argpar_error; +typedef struct argpar_error argpar_error_t; + +/*! +@brief + Returns the type of the parsing error object \p error. -ARGPAR_HIDDEN -enum argpar_error_type argpar_error_type( - const struct argpar_error *error); +@param[in] error + Parsing error of which to get the type. + +@returns + Type of \p error. + +@pre + \p error is not \c NULL. +*/ +argpar_error_type_t argpar_error_type(const argpar_error_t *error) ARGPAR_NOEXCEPT; /*! @brief @@ -376,10 +371,7 @@ enum argpar_error_type argpar_error_type( @pre \p error is not \c NULL. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -unsigned int argpar_error_orig_index(const struct argpar_error *error); +unsigned int argpar_error_orig_index(const argpar_error_t *error) ARGPAR_NOEXCEPT; /*! @brief @@ -393,9 +385,6 @@ With the long option with argument form, for example \--mireille=deyglun, this function only returns the name part (\--mireille in the last example). -You may only call this function if the call to argpar_iter_next() which -set \p error returned #ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT. - @param[in] error Parsing error of which to get the name of the unknown option. @@ -405,23 +394,17 @@ set \p error returned #ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT. @pre \p error is not \c NULL. @pre - The call to argpar_iter_next() which set \p error returned - #ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT. + The type of \p error, as returned by + \link argpar_error_type(const argpar_error_t *) 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); +const char *argpar_error_unknown_opt_name(const argpar_error_t *error) ARGPAR_NOEXCEPT; /*! @brief Returns the descriptor of the option for which the parsing error described by \p error occurred. -You may only call this function if the call to argpar_iter_next() which -set \p error returned #ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG or -#ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPG_ARG. - @param[in] error Parsing error of which to get the option descriptor. @param[out] is_short @@ -441,15 +424,13 @@ set \p error returned #ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG or @pre \p error is not \c NULL. @pre - The call to argpar_iter_next() which set \p error returned - #ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG or - #ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPG_ARG. + The type of \p error, as returned by + \link argpar_error_type(const argpar_error_t *) 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); +const argpar_opt_descr_t *argpar_error_opt_descr(const argpar_error_t *error, + bool *is_short) ARGPAR_NOEXCEPT; /*! @brief @@ -458,10 +439,7 @@ const struct argpar_opt_descr *argpar_error_opt_descr( @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); +void argpar_error_destroy(const argpar_error_t *error) ARGPAR_NOEXCEPT; /// @} @@ -480,7 +458,7 @@ terminated with #ARGPAR_OPT_DESCR_SENTINEL, as its \p descrs parameter. The typical usage is, for example: @code -const struct argpar_opt_descr descrs[] = { +const argpar_opt_descr_t descrs[] = { { 0, 'd', NULL, false }, { 1, '\0', "squeeze", true }, { 2, 'm', "meow", true }, @@ -488,19 +466,20 @@ const struct argpar_opt_descr descrs[] = { }; @endcode */ -struct argpar_opt_descr { - /// Numeric ID, to uniquely identify this descriptor - const int id; +typedef struct argpar_opt_descr +{ + /// Numeric ID, to uniquely identify this descriptor + const int id; - /// Short option character, or '\0' - const char short_name; + /// Short option character, or '\0' + const char short_name; - /// Long option name (without the \-- prefix), or \c NULL - const char * const long_name; + /// Long option name (without the \-- prefix), or \c NULL + const char * const long_name; - /// \c true if this option has an argument - const bool with_arg; -}; + /// \c true if this option has an argument + const bool with_arg; +} argpar_opt_descr_t; /*! @brief @@ -509,7 +488,7 @@ struct argpar_opt_descr { The typical usage is, for example: @code -const struct argpar_opt_descr descrs[] = { +const argpar_opt_descr_t descrs[] = { { 0, 'd', NULL, false }, { 1, '\0', "squeeze", true }, { 2, 'm', "meow", true }, @@ -517,7 +496,10 @@ const struct argpar_opt_descr descrs[] = { }; @endcode */ -#define ARGPAR_OPT_DESCR_SENTINEL { -1, '\0', NULL, false } +#define ARGPAR_OPT_DESCR_SENTINEL \ + { \ + -1, '\0', NULL, false \ + } /*! @struct argpar_iter @@ -527,7 +509,7 @@ const struct argpar_opt_descr descrs[] = { argpar_iter_create() returns a pointer to such a type. */ -struct argpar_iter; +typedef struct argpar_iter argpar_iter_t; /*! @brief @@ -583,12 +565,8 @@ argpar_iter_next(). @sa argpar_iter_destroy() -- Destroys an argument parsing iterator. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -struct argpar_iter *argpar_iter_create(unsigned int argc, - const char * const *argv, - const struct argpar_opt_descr *descrs); +argpar_iter_t *argpar_iter_create(unsigned int argc, const char * const *argv, + const argpar_opt_descr_t *descrs) ARGPAR_NOEXCEPT; /*! @brief @@ -600,10 +578,7 @@ struct argpar_iter *argpar_iter_create(unsigned int argc, @sa argpar_iter_create() -- Creates an argument parsing iterator. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -void argpar_iter_destroy(struct argpar_iter *iter); +void argpar_iter_destroy(argpar_iter_t *iter) ARGPAR_NOEXCEPT; /*! @brief @@ -611,19 +586,20 @@ void argpar_iter_destroy(struct argpar_iter *iter); Error status enumerators have a negative value. */ -enum argpar_iter_next_status { - /// Success - ARGPAR_ITER_NEXT_STATUS_OK, +typedef enum argpar_iter_next_status +{ + /// Success + ARGPAR_ITER_NEXT_STATUS_OK, - /// End of iteration (no more original arguments to parse) - ARGPAR_ITER_NEXT_STATUS_END, + /// End of iteration (no more original arguments to parse) + ARGPAR_ITER_NEXT_STATUS_END, - /// Argument error - ARGPAR_ITER_NEXT_STATUS_ERROR = -1, + /// Parsing error + ARGPAR_ITER_NEXT_STATUS_ERROR = -1, - /// Memory error - ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY = -12, -}; + /// Memory error + ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY = -12, +} argpar_iter_next_status_t; /*! @brief @@ -643,12 +619,9 @@ 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 contains details about the error. + 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 @@ -661,12 +634,8 @@ If there are no more original arguments to parse, this function returns @pre \p item is not \c NULL. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -enum argpar_iter_next_status argpar_iter_next( - struct argpar_iter *iter, const struct argpar_item **item, - const struct argpar_error **error); +argpar_iter_next_status_t argpar_iter_next(argpar_iter_t *iter, const argpar_item_t **item, + const argpar_error_t **error) ARGPAR_NOEXCEPT; /* * Returns the number of ingested elements from `argv`, as passed to @@ -690,13 +659,14 @@ enum argpar_iter_next_status argpar_iter_next( @pre \p iter is not \c NULL. */ -/// @cond hidden_macro -ARGPAR_HIDDEN -/// @endcond -unsigned int argpar_iter_ingested_orig_args(const struct argpar_iter *iter); +unsigned int argpar_iter_ingested_orig_args(const argpar_iter_t *iter) ARGPAR_NOEXCEPT; /// @} /// @} +#if defined(__cplusplus) +} +#endif + #endif /* ARGPAR_ARGPAR_H */