From c5667e38029a6f3d6377f9a26b2f2dcbac5a1d6b Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Mon, 10 Dec 2012 18:43:36 +0000 Subject: [PATCH] efl/ecore_getopt: add ECORE_GETOPT_ACTION_BREAK. Thanks to PrinceAMD (Deon Thomas) for bugging me to implement this, then test and add a fix, now we can implement something similar to "xterm -e" in terminology. ECORE_GETOPT_ACTION_BREAK will allow generic options to behave the same as GNU's --, breaking out of argument parsing logic. SVN revision: 80619 --- ChangeLog | 5 +++++ NEWS | 1 + src/lib/ecore/Ecore_Getopt.h | 13 ++++++++++++- src/lib/ecore/ecore_getopt.c | 29 ++++++++++++++++++++++++++++- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index e9353a4601..2658538090 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2012-12-10 Gustavo Sverzut Barbieri (k-s) + + * Added ECORE_GETOPT_ACTION_BREAK to force breaking out of argument + parsing logic (will behabe same as GNU's "--", useful for xterm -e) + 2012-12-07 Cedric Bail * Don't leak fd on exec. diff --git a/NEWS b/NEWS index a691df2710..2c735fa90b 100644 --- a/NEWS +++ b/NEWS @@ -38,6 +38,7 @@ Additions: - Add window profile support. * ecore_evas_buffer: - Add window profile support. + * ecore_getopt: add ECORE_GETOPT_ACTION_BREAK Deprecations: * ecore_x: diff --git a/src/lib/ecore/Ecore_Getopt.h b/src/lib/ecore/Ecore_Getopt.h index 0a11787d4d..3574ba5bfa 100644 --- a/src/lib/ecore/Ecore_Getopt.h +++ b/src/lib/ecore/Ecore_Getopt.h @@ -64,7 +64,8 @@ typedef enum { ECORE_GETOPT_ACTION_HELP, ECORE_GETOPT_ACTION_VERSION, ECORE_GETOPT_ACTION_COPYRIGHT, - ECORE_GETOPT_ACTION_LICENSE + ECORE_GETOPT_ACTION_LICENSE, + ECORE_GETOPT_ACTION_BREAK } Ecore_Getopt_Action; typedef enum { @@ -369,6 +370,16 @@ struct _Ecore_Getopt ECORE_GETOPT_ACTION_LICENSE, \ {.dummy = NULL}} +#define ECORE_GETOPT_BREAK(shortname, longname) \ + {shortname, longname, "stop parsing options.", NULL, \ + ECORE_GETOPT_ACTION_BREAK, \ + {.dummy = NULL}} + +#define ECORE_GETOPT_BREAK_STR(shortname, longname, help) \ + {shortname, longname, help, NULL, \ + ECORE_GETOPT_ACTION_BREAK, \ + {.dummy = NULL}} + #define ECORE_GETOPT_SENTINEL {0, NULL, NULL, NULL, 0, {.dummy = NULL}} #define ECORE_GETOPT_VALUE_STR(val) {.strp = &(val)} diff --git a/src/lib/ecore/ecore_getopt.c b/src/lib/ecore/ecore_getopt.c index 42e43e8915..f31f7c2290 100644 --- a/src/lib/ecore/ecore_getopt.c +++ b/src/lib/ecore/ecore_getopt.c @@ -763,19 +763,26 @@ _ecore_getopt_parse_find_nonargs_base(const Ecore_Getopt *parser, char **argv) { char **nonargs; - int src, dst, used, base; + int src, dst, used, base, abreak; nonargs = alloca(sizeof(char *) * argc); src = 1; dst = 1; used = 0; base = 0; + abreak = 0; while (src < argc) { const Ecore_Getopt_Desc *desc; Ecore_Getopt_Desc_Arg_Requirement arg_req; char *arg = argv[src]; + if (abreak) + { + base = 1; + break; + } + if (arg[0] != '-') goto found_nonarg; @@ -806,6 +813,11 @@ _ecore_getopt_parse_find_nonargs_base(const Ecore_Getopt *parser, goto found_nonarg; } + + + if (desc->action == ECORE_GETOPT_ACTION_BREAK) + abreak = 1; + if (src != dst) argv[dst] = argv[src]; src++; @@ -1407,6 +1419,18 @@ _ecore_getopt_parse_license(const Ecore_Getopt *parser, return EINA_TRUE; } +static Eina_Bool +_ecore_getopt_parse_break(const Ecore_Getopt *parser EINA_UNUSED, + const Ecore_Getopt_Desc *desc EINA_UNUSED, + Ecore_Getopt_Value *val, + const char *arg_val EINA_UNUSED) +{ + if (val->boolp) + (*val->boolp) = EINA_TRUE; + + return EINA_TRUE; +} + static Eina_Bool _ecore_getopt_desc_handle(const Ecore_Getopt *parser, const Ecore_Getopt_Desc *desc, @@ -1451,6 +1475,9 @@ _ecore_getopt_desc_handle(const Ecore_Getopt *parser, case ECORE_GETOPT_ACTION_LICENSE: return _ecore_getopt_parse_license(parser, desc, value, arg_val); + case ECORE_GETOPT_ACTION_BREAK: + return _ecore_getopt_parse_break(parser, desc, value, arg_val); + default: return EINA_FALSE; }