opt: relicense to GPLv2+ (from GPLv3+)
[ccan] / ccan / opt / parse.c
index b92bcb14871eed40e4873e8473ac1c359e46d5e7..94d75ad1fbe02ee77cd522f8615b7dff36998056 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>
 /* Actual code to parse commandline. */
 #include <ccan/opt/opt.h>
 #include <string.h>
@@ -29,12 +29,12 @@ static void consume_option(int *argc, char *argv[], unsigned optnum)
 }
 
 /* Returns 1 if argument consumed, 0 if all done, -1 on error. */
 }
 
 /* Returns 1 if argument consumed, 0 if all done, -1 on error. */
-int parse_one(int *argc, char *argv[], unsigned *offset,
+int parse_one(int *argc, char *argv[], enum opt_type is_early, unsigned *offset,
              void (*errlog)(const char *fmt, ...))
 {
        unsigned i, arg, len;
        const char *o, *optarg = NULL;
              void (*errlog)(const char *fmt, ...))
 {
        unsigned i, arg, len;
        const char *o, *optarg = NULL;
-       char *problem;
+       char *problem = NULL;
 
        if (getenv("POSIXLY_CORRECT")) {
                /* Don't find options after non-options. */
 
        if (getenv("POSIXLY_CORRECT")) {
                /* Don't find options after non-options. */
@@ -91,11 +91,12 @@ int parse_one(int *argc, char *argv[], unsigned *offset,
                len = 2;
        }
 
                len = 2;
        }
 
-       if (opt_table[i].type == OPT_NOARG) {
+       if ((opt_table[i].type & ~OPT_EARLY) == OPT_NOARG) {
                if (optarg)
                        return parse_err(errlog, argv[0], o, len,
                                         "doesn't allow an argument");
                if (optarg)
                        return parse_err(errlog, argv[0], o, len,
                                         "doesn't allow an argument");
-               problem = opt_table[i].cb(opt_table[i].u.arg);
+               if ((opt_table[i].type & OPT_EARLY) == is_early)
+                       problem = opt_table[i].cb(opt_table[i].u.arg);
        } else {
                if (!optarg) {
                        /* Swallow any short options as optarg, eg -afile */
        } else {
                if (!optarg) {
                        /* Swallow any short options as optarg, eg -afile */
@@ -108,12 +109,14 @@ int parse_one(int *argc, char *argv[], unsigned *offset,
                if (!optarg)
                        return parse_err(errlog, argv[0], o, len,
                                         "requires an argument");
                if (!optarg)
                        return parse_err(errlog, argv[0], o, len,
                                         "requires an argument");
-               problem = opt_table[i].cb_arg(optarg, opt_table[i].u.arg);
+               if ((opt_table[i].type & OPT_EARLY) == is_early)
+                       problem = opt_table[i].cb_arg(optarg,
+                                                     opt_table[i].u.arg);
        }
 
        if (problem) {
                parse_err(errlog, argv[0], o, len, problem);
        }
 
        if (problem) {
                parse_err(errlog, argv[0], o, len, problem);
-               free(problem);
+               opt_alloc.free(problem);
                return -1;
        }
 
                return -1;
        }