tap: import some changes
[argpar.git] / argpar / argpar.h
index 07ec8c47071f8f0f850e7d41020faa8d66361688..d11a764a9ad3410e0399a848d0d937ab30620d90 100644 (file)
@@ -1,8 +1,7 @@
 /*
  * SPDX-License-Identifier: MIT
- *
- * Copyright (c) 2019-2021 Philippe Proulx <pproulx@efficios.com>
- * Copyright (c) 2020-2021 Simon Marchi <simon.marchi@efficios.com>
+ * SPDX-FileCopyrightText: 2019-2024 Philippe Proulx <pproulx@efficios.com>
+ * SPDX-FileCopyrightText: 2020-2024 Simon Marchi <simon.marchi@efficios.com>
  */
 
 #ifndef ARGPAR_ARGPAR_H
@@ -10,6 +9,10 @@
 
 #include <stdbool.h>
 
+#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 (<code>\--hello</code>).
--# Option item (<code>\--count</code> with argument <code>23</code>).
--# Non-option item (<code>/path/to/file</code>).
--# Option item (<code>-a</code>).
--# Option item (<code>-b</code>).
--# Option item (<code>\--type</code> with argument <code>file</code>).
--# Non-option item (<code>\--</code>).
--# Non-option item (<code>magie</code>).
+-# Option item: <code>\--hello</code>.
+-# Option item: <code>\--count</code> with argument <code>23</code>.
+-# Non-option item: <code>/path/to/file</code>.
+-# Option item: <code>-a</code>.
+-# Option item: <code>-b</code>.
+-# Option item: <code>\--type</code> with argument <code>file</code>.
+-# Non-option item: <code>\--</code>.
+-# Non-option item: <code>magie</code>.
 */
 
-/*
- * 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
- * <https://gcc.gnu.org/wiki/Visibility>.
- */
-#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&nbsp;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&nbsp;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
-    (<code>const struct argpar_item *</code> type).
+    (<code>const argpar_item_t *</code> 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
 <code>\--mireille=deyglun</code>, this function only returns the name
 part (<code>\--mireille</code> 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 <code>'\0'</code>
-       const char short_name;
+    /// Short option character, or <code>'\0'</code>
+    const char short_name;
 
-       /// Long option name (without the <code>\--</code> prefix), or \c NULL
-       const char * const long_name;
+    /// Long option name (without the <code>\--</code> 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 */
This page took 0.028749 seconds and 4 git commands to generate.