]> git.ozlabs.org Git - ccan/blobdiff - ccan/opt/parse.c
opt: add new parse_early_args_incomplete.
[ccan] / ccan / opt / parse.c
index 14c7afbb083b3a0cc9eb5e5f88d46ba105464ebd..d227f7bca2ab679033dd920fe426983dc0ea9314 100644 (file)
@@ -1,4 +1,4 @@
-/* Licensed under GPLv3+ - see LICENSE file for details */
+/* Licensed under GPLv2+ - see LICENSE file for details */
 /* Actual code to parse commandline. */
 #include <ccan/opt/opt.h>
 #include <string.h>
@@ -30,7 +30,7 @@ static void consume_option(int *argc, char *argv[], unsigned optnum)
 
 /* Returns 1 if argument consumed, 0 if all done, -1 on error. */
 int parse_one(int *argc, char *argv[], enum opt_type is_early, unsigned *offset,
-             void (*errlog)(const char *fmt, ...))
+             void (*errlog)(const char *fmt, ...), bool unknown_ok)
 {
        unsigned i, arg, len;
        const char *o, *optarg = NULL;
@@ -67,10 +67,13 @@ int parse_one(int *argc, char *argv[], enum opt_type is_early, unsigned *offset,
                                continue;
                        break;
                }
-               if (!o)
+               if (!o) {
+                       if (unknown_ok)
+                               goto ok;
                        return parse_err(errlog, argv[0],
                                         argv[arg], strlen(argv[arg]),
                                         "unrecognized option");
+               }
                /* For error messages, we include the leading '--' */
                o -= 2;
                len += 2;
@@ -82,10 +85,15 @@ int parse_one(int *argc, char *argv[], enum opt_type is_early, unsigned *offset,
                        (*offset)++;
                        break;
                }
-               if (!o)
+               if (!o) {
+                       if (unknown_ok) {
+                               (*offset)++;
+                               goto ok;
+                       }
                        return parse_err(errlog, argv[0],
                                         argv[arg], strlen(argv[arg]),
                                         "unrecognized option");
+               }
                /* For error messages, we include the leading '-' */
                o--;
                len = 2;
@@ -120,6 +128,7 @@ int parse_one(int *argc, char *argv[], enum opt_type is_early, unsigned *offset,
                return -1;
        }
 
+ok:
        /* If no more letters in that short opt, reset offset. */
        if (*offset && !argv[arg][*offset + 1])
                *offset = 0;