parseopt: add PARSE_OPT_KEEP_UNKNOWN
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>
Sun, 8 Mar 2009 18:12:47 +0000 (19:12 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 8 Mar 2009 20:36:09 +0000 (13:36 -0700)
Add a parseopt flag, PARSE_OPT_KEEP_UNKNOWN, that can be used to keep
unknown options in argv, similar to the existing KEEP flags.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
parse-options.c
parse-options.h

index 4c5d09dd25aede8ea7e14886f5c17ed847a8f0d9..39808ae45850c7dc96f6288b969ba34be1556c39 100644 (file)
@@ -274,7 +274,7 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
                        case -1:
                                return parse_options_usage(usagestr, options);
                        case -2:
-                               return PARSE_OPT_UNKNOWN;
+                               goto unknown;
                        }
                        if (ctx->opt)
                                check_typos(arg + 1, options);
@@ -292,7 +292,7 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
                                         */
                                        ctx->argv[0] = xstrdup(ctx->opt - 1);
                                        *(char *)ctx->argv[0] = '-';
-                                       return PARSE_OPT_UNKNOWN;
+                                       goto unknown;
                                }
                        }
                        continue;
@@ -314,8 +314,14 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
                case -1:
                        return parse_options_usage(usagestr, options);
                case -2:
-                       return PARSE_OPT_UNKNOWN;
+                       goto unknown;
                }
+               continue;
+unknown:
+               if (!(ctx->flags & PARSE_OPT_KEEP_UNKNOWN))
+                       return PARSE_OPT_UNKNOWN;
+               ctx->out[ctx->cpidx++] = ctx->argv[0];
+               ctx->opt = NULL;
        }
        return PARSE_OPT_DONE;
 }
index 912290549bcbb03b7e82750a40297fb1a70b8206..b7d08b13d1493c0091f2431962a8bcb86ed035a8 100644 (file)
@@ -21,6 +21,7 @@ enum parse_opt_flags {
        PARSE_OPT_KEEP_DASHDASH = 1,
        PARSE_OPT_STOP_AT_NON_OPTION = 2,
        PARSE_OPT_KEEP_ARGV0 = 4,
+       PARSE_OPT_KEEP_UNKNOWN = 8,
 };
 
 enum parse_opt_option_flags {