argpar.h: make all the functions `noexcept` with C++ ≥ 11
[argpar.git] / argpar / argpar.h
index 3340d90f593031756a6e8d80f5a704ddff6f89a1..4698c2dd660052388241fb0addcf11008f19fad0 100644 (file)
 
 #include <stdbool.h>
 
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /*!
 @mainpage
 
@@ -83,7 +87,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
@@ -96,14 +101,14 @@ 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>.
 */
 
 /*
@@ -119,6 +124,13 @@ argpar_iter_next() produces the following items, in this order:
 # define ARGPAR_HIDDEN __attribute__((visibility("hidden")))
 #endif
 
+/* Internal: `noexcept` specifier if C++ ≥ 11 */
+#if defined(__cplusplus) && (__cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900))
+# define ARGPAR_NOEXCEPT noexcept
+#else
+# define ARGPAR_NOEXCEPT
+#endif
+
 struct argpar_opt_descr;
 
 /*!
@@ -128,7 +140,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
@@ -164,7 +177,8 @@ struct argpar_item;
 /// @cond hidden_macro
 ARGPAR_HIDDEN
 /// @endcond
-enum argpar_item_type argpar_item_type(const struct argpar_item *item);
+enum argpar_item_type argpar_item_type(
+               const struct argpar_item *item) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -185,7 +199,7 @@ enum argpar_item_type argpar_item_type(const struct argpar_item *item);
 ARGPAR_HIDDEN
 /// @endcond
 const struct argpar_opt_descr *argpar_item_opt_descr(
-               const struct argpar_item *item);
+               const struct argpar_item *item) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -206,7 +220,7 @@ const struct argpar_opt_descr *argpar_item_opt_descr(
 /// @cond hidden_macro
 ARGPAR_HIDDEN
 /// @endcond
-const char *argpar_item_opt_arg(const struct argpar_item *item);
+const char *argpar_item_opt_arg(const struct argpar_item *item) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -229,7 +243,8 @@ const char *argpar_item_opt_arg(const struct argpar_item *item);
 /// @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 struct argpar_item *item) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -265,7 +280,8 @@ argument index of \c mix is&nbsp;4.
 /// @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 struct argpar_item *item) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -300,7 +316,8 @@ argument index of \c mix is&nbsp;1.
 /// @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 struct argpar_item *item) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -312,7 +329,7 @@ unsigned int argpar_item_non_opt_non_opt_index(const struct argpar_item *item);
 /// @cond hidden_macro
 ARGPAR_HIDDEN
 /// @endcond
-void argpar_item_destroy(const struct argpar_item *item);
+void argpar_item_destroy(const struct argpar_item *item) ARGPAR_NOEXCEPT;
 
 /*!
 @def ARGPAR_ITEM_DESTROY_AND_RESET(_item)
@@ -338,6 +355,22 @@ void argpar_item_destroy(const struct argpar_item *item);
 @{
 */
 
+/*!
+@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
 
@@ -346,6 +379,25 @@ void argpar_item_destroy(const struct argpar_item *item);
 */
 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) ARGPAR_NOEXCEPT;
+
 /*!
 @brief
     Returns the index of the original argument (in \p argv, as passed to
@@ -364,7 +416,8 @@ struct argpar_error;
 /// @cond hidden_macro
 ARGPAR_HIDDEN
 /// @endcond
-unsigned int argpar_error_orig_index(const struct argpar_error *error);
+unsigned int argpar_error_orig_index(
+               const struct argpar_error *error) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -378,9 +431,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.
 
@@ -390,23 +440,21 @@ 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 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);
+const char *argpar_error_unknown_opt_name(
+               const struct argpar_error *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
@@ -426,15 +474,17 @@ 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 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);
+               const struct argpar_error *error,
+               bool *is_short) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -446,7 +496,7 @@ const struct argpar_opt_descr *argpar_error_opt_descr(
 /// @cond hidden_macro
 ARGPAR_HIDDEN
 /// @endcond
-void argpar_error_destroy(const struct argpar_error *error);
+void argpar_error_destroy(const struct argpar_error *error) ARGPAR_NOEXCEPT;
 
 /// @}
 
@@ -573,7 +623,7 @@ ARGPAR_HIDDEN
 /// @endcond
 struct argpar_iter *argpar_iter_create(unsigned int argc,
                const char * const *argv,
-               const struct argpar_opt_descr *descrs);
+               const struct argpar_opt_descr *descrs) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -588,7 +638,7 @@ struct argpar_iter *argpar_iter_create(unsigned int argc,
 /// @cond hidden_macro
 ARGPAR_HIDDEN
 /// @endcond
-void argpar_iter_destroy(struct argpar_iter *iter);
+void argpar_iter_destroy(struct argpar_iter *iter) ARGPAR_NOEXCEPT;
 
 /*!
 @brief
@@ -603,14 +653,8 @@ 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 = -1,
-
-       /// Missing option argument error
-       ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG = -2,
-
-       /// Unexpected option argument error
-       ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPT_ARG = -3,
+       /// Parsing error
+       ARGPAR_ITER_NEXT_STATUS_ERROR = -1,
 
        /// Memory error
        ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY = -12,
@@ -634,12 +678,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
@@ -657,7 +698,7 @@ 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);
+               const struct argpar_error **error) ARGPAR_NOEXCEPT;
 
 /*
  * Returns the number of ingested elements from `argv`, as passed to
@@ -684,10 +725,15 @@ enum argpar_iter_next_status argpar_iter_next(
 /// @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 struct argpar_iter *iter) ARGPAR_NOEXCEPT;
 
 /// @}
 
 /// @}
 
+#if defined(__cplusplus)
+}
+#endif
+
 #endif /* ARGPAR_ARGPAR_H */
This page took 0.027844 seconds and 4 git commands to generate.