2 * SPDX-License-Identifier: MIT
4 * Copyright (c) 2019-2021 Philippe Proulx <pproulx@efficios.com>
5 * Copyright (c) 2020-2021 Simon Marchi <simon.marchi@efficios.com>
8 #ifndef ARGPAR_ARGPAR_H
9 #define ARGPAR_ARGPAR_H
16 See the \ref api module.
18 @addtogroup api argpar API
21 argpar is a library which provides an iterator-based API to parse
22 command-line arguments.
24 The argpar parser supports:
28 Short options without an argument, possibly tied together:
35 Short options with arguments:
38 -b 45 -f/mein/file -xyzhello
42 Long options without an argument:
45 --five-guys --burger-king --pizza-hut --subway
49 Long options with arguments (two original arguments or a single
50 one with a <code>=</code> character):
53 --security enable --time=18.56
57 Non-option arguments (anything else, including
58 <code>-</code> and <code>\--</code>).
60 A non-option argument cannot have the form of an option, for example
61 if you need to pass the exact relative path
62 <code>\--component</code>. In that case, you would need to pass
63 <code>./\--component</code>. There's no generic way to escape
64 <code>-</code> as of this version.
67 Create a parsing iterator with argpar_iter_create(), then repeatedly
68 call argpar_iter_next() to access the parsing results (items), until one
71 - There are no more arguments.
73 - The argument parser encounters an error (for example, an unknown
78 argpar_iter_create() accepts duplicate option descriptors in
79 \p descrs (argpar_iter_next() produces one item for each
82 A parsing item (the result of argpar_iter_next()) has the type
85 Get the type (option or non-option) of an item with
86 argpar_item_type(). Each item type has its set of dedicated functions
87 (\c argpar_item_opt_ and \c argpar_item_non_opt_ prefixes).
89 argpar_iter_next() produces the items in the same order that it parses
90 original arguments, including non-option arguments. This means, for
94 --hello --count=23 /path/to/file -ab --type file -- magie
97 argpar_iter_next() produces the following items, in this order:
99 -# Option item (<code>\--hello</code>).
100 -# Option item (<code>\--count</code> with argument <code>23</code>).
101 -# Non-option item (<code>/path/to/file</code>).
102 -# Option item (<code>-a</code>).
103 -# Option item (<code>-b</code>).
104 -# Option item (<code>\--type</code> with argument <code>file</code>).
105 -# Non-option item (<code>\--</code>).
106 -# Non-option item (<code>magie</code>).
110 * If argpar is used in some shared library, we don't want said library
111 * to export its symbols, so mark them as "hidden".
113 * On Windows, symbols are local unless explicitly exported; see
114 * <https://gcc.gnu.org/wiki/Visibility>.
116 #if defined(_WIN32) || defined(__CYGWIN__)
117 # define ARGPAR_HIDDEN
119 # define ARGPAR_HIDDEN __attribute__((visibility("hidden")))
122 struct argpar_opt_descr
;
131 Type of a parsing item, as returned by argpar_item_type().
133 enum argpar_item_type
{
135 ARGPAR_ITEM_TYPE_OPT
,
138 ARGPAR_ITEM_TYPE_NON_OPT
,
145 Opaque parsing item type
147 argpar_iter_next() sets a pointer to such a type.
153 Returns the type of the parsing item \p item.
156 Parsing item of which to get the type.
162 \p item is not \c NULL.
164 /// @cond hidden_macro
167 enum argpar_item_type
argpar_item_type(const struct argpar_item
*item
);
171 Returns the option descriptor of the option parsing item \p item.
174 Option parsing item of which to get the option descriptor.
177 Option descriptor of \p item.
180 \p item is not \c NULL.
182 \p item has the type #ARGPAR_ITEM_TYPE_OPT.
184 /// @cond hidden_macro
187 const struct argpar_opt_descr
*argpar_item_opt_descr(
188 const struct argpar_item
*item
);
192 Returns the argument of the option parsing item \p item, or
196 Option parsing item of which to get the argument.
199 Argument of \p item, or \c NULL if none.
202 \p item is not \c NULL.
204 \p item has the type #ARGPAR_ITEM_TYPE_OPT.
206 /// @cond hidden_macro
209 const char *argpar_item_opt_arg(const struct argpar_item
*item
);
213 Returns the complete original argument, pointing to one of the
214 entries of the original arguments (in \p argv, as passed to
215 argpar_iter_create()), of the non-option parsing item \p item.
218 Non-option parsing item of which to get the complete original
222 Complete original argument of \p item.
225 \p item is not \c NULL.
227 \p item has the type #ARGPAR_ITEM_TYPE_NON_OPT.
229 /// @cond hidden_macro
232 const char *argpar_item_non_opt_arg(const struct argpar_item
*item
);
236 Returns the index, within \em all the original arguments (in
237 \p argv, as passed to argpar_iter_create()), of the non-option
238 parsing item \p item.
240 For example, with the following command line (all options have no
244 -f -m meow --jus mix --kilo
247 The original argument index of \c meow is 2 while the original
248 argument index of \c mix is 4.
251 Non-option parsing item of which to get the original argument index.
254 Original argument index of \p item.
257 \p item is not \c NULL.
259 \p item has the type #ARGPAR_ITEM_TYPE_NON_OPT.
262 argpar_item_non_opt_non_opt_index() -- Returns the non-option index
263 of a non-option parsing item.
265 /// @cond hidden_macro
268 unsigned int argpar_item_non_opt_orig_index(const struct argpar_item
*item
);
272 Returns the index, within the parsed non-option parsing items, of
273 the non-option parsing item \p item.
275 For example, with the following command line (all options have no
279 -f -m meow --jus mix --kilo
282 The non-option index of \c meow is 0 while the original
283 argument index of \c mix is 1.
286 Non-option parsing item of which to get the non-option index.
289 Non-option index of \p item.
292 \p item is not \c NULL.
294 \p item has the type #ARGPAR_ITEM_TYPE_NON_OPT.
297 argpar_item_non_opt_orig_index() -- Returns the original argument
298 index of a non-option parsing item.
300 /// @cond hidden_macro
303 unsigned int argpar_item_non_opt_non_opt_index(const struct argpar_item
*item
);
307 Destroys the parsing item \p item.
310 Parsing item to destroy (may be \c NULL).
312 /// @cond hidden_macro
315 void argpar_item_destroy(const struct argpar_item
*item
);
318 @def ARGPAR_ITEM_DESTROY_AND_RESET(_item)
321 Calls argpar_item_destroy() with \p _item, and then sets \p _item
325 Item to destroy and variable to reset
326 (<code>const struct argpar_item *</code> type).
328 #define ARGPAR_ITEM_DESTROY_AND_RESET(_item) \
330 argpar_item_destroy(_item); \
341 enum argpar_error_type
{
342 /// Unknown option error
343 ARGPAR_ERROR_TYPE_UNKNOWN_OPT
,
345 /// Missing option argument error
346 ARGPAR_ERROR_TYPE_MISSING_OPT_ARG
,
348 /// Unexpected option argument error
349 ARGPAR_ERROR_TYPE_UNEXPECTED_OPT_ARG
,
356 Opaque parsing error type
361 enum argpar_error_type
argpar_error_type(
362 const struct argpar_error
*error
);
366 Returns the index of the original argument (in \p argv, as passed to
367 argpar_iter_create()) for which the parsing error described by
371 Parsing error of which to get the original argument index.
374 Original argument index of \p error.
377 \p error is not \c NULL.
379 /// @cond hidden_macro
382 unsigned int argpar_error_orig_index(const struct argpar_error
*error
);
386 Returns the name of the unknown option for which the parsing error
387 described by \p error occurred.
389 The returned name includes any <code>-</code> or <code>\--</code>
392 With the long option with argument form, for example
393 <code>\--mireille=deyglun</code>, this function only returns the name
394 part (<code>\--mireille</code> in the last example).
396 You may only call this function if the call to argpar_iter_next() which
397 set \p error returned #ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT.
400 Parsing error of which to get the name of the unknown option.
403 Name of the unknown option of \p error.
406 \p error is not \c NULL.
408 The call to argpar_iter_next() which set \p error returned
409 #ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT.
411 /// @cond hidden_macro
414 const char *argpar_error_unknown_opt_name(const struct argpar_error
*error
);
418 Returns the descriptor of the option for which the parsing error
419 described by \p error occurred.
421 You may only call this function if the call to argpar_iter_next() which
422 set \p error returned #ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG or
423 #ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPG_ARG.
426 Parsing error of which to get the option descriptor.
429 If not \c NULL, this function sets \p *is_short to:
431 - \c true if the option for which \p error occurred is a short
434 - \c false if the option for which \p error occurred is a long
439 Descriptor of the option of \p error.
442 \p error is not \c NULL.
444 The call to argpar_iter_next() which set \p error returned
445 #ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG or
446 #ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPG_ARG.
448 /// @cond hidden_macro
451 const struct argpar_opt_descr
*argpar_error_opt_descr(
452 const struct argpar_error
*error
, bool *is_short
);
456 Destroys the parsing error \p error.
459 Parsing error to destroy (may be \c NULL).
461 /// @cond hidden_macro
464 void argpar_error_destroy(const struct argpar_error
*error
);
477 argpar_iter_create() accepts an array of instances of such a type,
478 terminated with #ARGPAR_OPT_DESCR_SENTINEL, as its \p descrs parameter.
480 The typical usage is, for example:
483 const struct argpar_opt_descr descrs[] = {
484 { 0, 'd', NULL, false },
485 { 1, '\0', "squeeze", true },
486 { 2, 'm', "meow", true },
487 ARGPAR_OPT_DESCR_SENTINEL,
491 struct argpar_opt_descr
{
492 /// Numeric ID, to uniquely identify this descriptor
495 /// Short option character, or <code>'\0'</code>
496 const char short_name
;
498 /// Long option name (without the <code>\--</code> prefix), or \c NULL
499 const char * const long_name
;
501 /// \c true if this option has an argument
507 Sentinel for an option descriptor array
509 The typical usage is, for example:
512 const struct argpar_opt_descr descrs[] = {
513 { 0, 'd', NULL, false },
514 { 1, '\0', "squeeze", true },
515 { 2, 'm', "meow", true },
516 ARGPAR_OPT_DESCR_SENTINEL,
520 #define ARGPAR_OPT_DESCR_SENTINEL { -1, '\0', NULL, false }
526 Opaque argpar iterator type
528 argpar_iter_create() returns a pointer to such a type.
534 Creates and returns an argument parsing iterator to parse the
535 original arguments \p argv of which the count is \p argc using the
536 option descriptors \p descrs.
538 This function initializes the returned structure, but doesn't actually
539 start parsing the arguments.
541 argpar considers \em all the elements of \p argv, including the first
542 one, so that you would typically pass <code>(argc - 1)</code> as \p argc
543 and <code>\&argv[1]</code> as \p argv from what <code>main()</code>
544 receives, or ignore the parsing item of the first call to
547 \p *argv and \p *descrs must \em not change for all of:
549 - The lifetime of the returned iterator (until you call
550 argpar_iter_destroy()).
552 - The lifetime of any parsing item (until you call
553 argpar_item_destroy()) which argpar_iter_next() creates from the
556 - The lifetime of any parsing error (until you call
557 argpar_error_destroy()) which argpar_iter_next() creates from the
561 Number of original arguments to parse in \p argv.
563 Original arguments to parse, of which the count is \p argc.
566 Option descriptor array, terminated with #ARGPAR_OPT_DESCR_SENTINEL.
568 May contain duplicate entries.
572 New argument parsing iterator, or \c NULL on memory error.
575 \p argc is greater than 0.
577 \p argv is not \c NULL.
579 The first \p argc elements of \p argv are not \c NULL.
581 \p descrs is not \c NULL.
584 argpar_iter_destroy() -- Destroys an argument parsing iterator.
586 /// @cond hidden_macro
589 struct argpar_iter
*argpar_iter_create(unsigned int argc
,
590 const char * const *argv
,
591 const struct argpar_opt_descr
*descrs
);
595 Destroys the argument parsing iterator \p iter.
598 Argument parsing iterator to destroy (may be \c NULL).
601 argpar_iter_create() -- Creates an argument parsing iterator.
603 /// @cond hidden_macro
606 void argpar_iter_destroy(struct argpar_iter
*iter
);
610 Return type of argpar_iter_next().
612 Error status enumerators have a negative value.
614 enum argpar_iter_next_status
{
616 ARGPAR_ITER_NEXT_STATUS_OK
,
618 /// End of iteration (no more original arguments to parse)
619 ARGPAR_ITER_NEXT_STATUS_END
,
622 ARGPAR_ITER_NEXT_STATUS_ERROR
= -1,
625 ARGPAR_ITER_NEXT_STATUS_ERROR_MEMORY
= -12,
630 Sets \p *item to the next item of the argument parsing iterator
631 \p iter and advances \p iter.
633 If there are no more original arguments to parse, this function returns
634 #ARGPAR_ITER_NEXT_STATUS_END.
637 Argument parsing iterator from which to get the next parsing item.
640 On success, \p *item is the next parsing item of \p iter.
642 Destroy \p *item with argpar_item_destroy().
646 When this function returns
647 #ARGPAR_ITER_NEXT_STATUS_ERROR_UNKNOWN_OPT,
648 #ARGPAR_ITER_NEXT_STATUS_ERROR_MISSING_OPT_ARG, or
649 #ARGPAR_ITER_NEXT_STATUS_ERROR_UNEXPECTED_OPG_ARG, if this parameter
651 \p *error contains details about the error.
653 Destroy \p *error with argpar_error_destroy().
660 \p iter is not \c NULL.
662 \p item is not \c NULL.
664 /// @cond hidden_macro
667 enum argpar_iter_next_status
argpar_iter_next(
668 struct argpar_iter
*iter
, const struct argpar_item
**item
,
669 const struct argpar_error
**error
);
672 * Returns the number of ingested elements from `argv`, as passed to
673 * argpar_iter_create() to create `*iter`, that were required to produce
674 * the previously returned items.
679 Returns the number of ingested original arguments (in
680 \p argv, as passed to argpar_iter_create() to create \p iter) that
681 the parser ingested to produce the \em previous parsing items.
684 Argument parsing iterator of which to get the number of ingested
688 Number of original arguments which \p iter ingested.
691 \p iter is not \c NULL.
693 /// @cond hidden_macro
696 unsigned int argpar_iter_ingested_orig_args(const struct argpar_iter
*iter
);
702 #endif /* ARGPAR_ARGPAR_H */