+/*!
+@mainpage
+
+See the \ref api module.
+
+@addtogroup api argpar API
+@{
+
+argpar is a library which provides an iterator-based API to parse
+command-line arguments.
+
+The argpar parser supports:
+
+<ul>
+ <li>
+ Short options without an argument, possibly tied together:
+
+ @code{.unparsed}
+ -f -auf -n
+ @endcode
+
+ <li>
+ Short options with arguments:
+
+ @code{.unparsed}
+ -b 45 -f/mein/file -xyzhello
+ @endcode
+
+ <li>
+ Long options without an argument:
+
+ @code{.unparsed}
+ --five-guys --burger-king --pizza-hut --subway
+ @endcode
+
+ <li>
+ Long options with arguments (two original arguments or a single
+ one with a <code>=</code> character):
+
+ @code{.unparsed}
+ --security enable --time=18.56
+ @endcode
+
+ <li>
+ Non-option arguments (anything else, including
+ <code>-</code> and <code>\--</code>).
+
+ A non-option argument cannot have the form of an option, for example
+ if you need to pass the exact relative path
+ <code>\--component</code>. In that case, you would need to pass
+ <code>./\--component</code>. There's no generic way to escape
+ <code>-</code> as of this version.
+</ul>
+
+Create a parsing iterator with argpar_iter_create(), then repeatedly
+call argpar_iter_next() to access the parsing results (items), until one
+of:
+
+- There are no more arguments.
+
+- The argument parser encounters an error (for example, an unknown
+ option).
+
+- You need to stop.
+
+argpar_iter_create() accepts duplicate option descriptors in
+\p descrs (argpar_iter_next() produces one item for each
+instance).
+
+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
+(\c argpar_item_opt_ and \c argpar_item_non_opt_ prefixes).
+
+argpar_iter_next() produces the items in the same order that it parses
+original arguments, including non-option arguments. This means, for
+example, that for:
+
+@code{.unparsed}
+--hello --count=23 /path/to/file -ab --type file -- magie
+@endcode
+
+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>).
+*/
+
+/*
+ * 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
+#else
+# define ARGPAR_HIDDEN __attribute__((visibility("hidden")))
+#endif
+
+struct argpar_opt_descr;
+
+/*!
+@name Item API
+@{
+*/
+
+/*!
+@brief
+ Type of a parsing item, as returned by argpar_item_type().
+*/
+enum argpar_item_type {
+ /// Option
+ ARGPAR_ITEM_TYPE_OPT,
+
+ /// Non-option
+ ARGPAR_ITEM_TYPE_NON_OPT,
+};
+
+/*!
+@struct argpar_item
+
+@brief
+ Opaque parsing item type
+
+argpar_iter_next() sets a pointer to such a type.
+*/
+struct argpar_item;
+
+/*!
+@brief
+ Returns the type of the parsing item \p item.
+
+@param[in] item
+ Parsing item of which to get the type.
+
+@returns
+ Type of \p 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);
+
+/*!
+@brief
+ Returns the option descriptor of the option parsing item \p item.
+
+@param[in] item
+ Option parsing item of which to get the option descriptor.
+
+@returns
+ Option descriptor of \p item.
+
+@pre
+ \p item is not \c NULL.
+@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);
+
+/*!
+@brief
+ Returns the argument of the option parsing item \p item, or
+ \c NULL if none.
+
+@param[in] item
+ Option parsing item of which to get the argument.
+
+@returns
+ Argument of \p item, or \c NULL if none.
+
+@pre
+ \p item is not \c NULL.
+@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);
+
+/*!
+@brief
+ Returns the complete original argument, pointing to one of the
+ 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
+ Non-option parsing item of which to get the complete original
+ argument.
+
+@returns
+ Complete original argument of \p item.
+
+@pre
+ \p item is not \c NULL.
+@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);
+
+/*!
+@brief
+ 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):
+
+@code{.unparsed}
+-f -m meow --jus mix --kilo
+@endcode
+
+The original argument index of \c meow is 2 while the original
+argument index of \c mix is 4.
+
+@param[in] item
+ Non-option parsing item of which to get the original argument index.
+
+@returns
+ Original argument index of \p item.
+
+@pre
+ \p item is not \c NULL.
+@pre
+ \p item has the type #ARGPAR_ITEM_TYPE_NON_OPT.
+
+@sa
+ 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);
+
+/*!
+@brief
+ Returns the index, within the parsed non-option parsing items, of
+ the non-option parsing item \p item.
+
+For example, with the following command line (all options have no
+argument):
+
+@code{.unparsed}
+-f -m meow --jus mix --kilo
+@endcode
+
+The non-option index of \c meow is 0 while the original
+argument index of \c mix is 1.
+
+@param[in] item
+ Non-option parsing item of which to get the non-option index.
+
+@returns
+ Non-option index of \p item.
+
+@pre
+ \p item is not \c NULL.
+@pre
+ \p item has the type #ARGPAR_ITEM_TYPE_NON_OPT.
+
+@sa
+ 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);
+
+/*!
+@brief
+ Destroys the parsing item \p 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);
+
+/*!
+@def ARGPAR_ITEM_DESTROY_AND_RESET(_item)
+
+@brief
+ Calls argpar_item_destroy() with \p _item, and then sets \p _item
+ to \c NULL.
+
+@param[in] _item
+ Item to destroy and variable to reset
+ (<code>const struct argpar_item *</code> type).
+*/
+#define ARGPAR_ITEM_DESTROY_AND_RESET(_item) \
+ { \
+ argpar_item_destroy(_item); \
+ _item = NULL; \
+ }
+
+/// @}
+
+/*!
+@name Error API
+@{
+*/
+
+/*!
+@struct argpar_error
+
+@brief
+ Opaque parsing error type
+*/
+struct argpar_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.