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
This commit is contained in:
Gustavo Sverzut Barbieri 2012-12-10 18:43:36 +00:00
parent 0ca0b36df1
commit c5667e3802
4 changed files with 46 additions and 2 deletions

View File

@ -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.

1
NEWS
View File

@ -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:

View File

@ -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)}

View File

@ -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;
}