efl/ecore_getopt: add ECORE_GETOPT_ACTION_BREAK.
authorGustavo Sverzut Barbieri <barbieri@gmail.com>
Mon, 10 Dec 2012 18:43:36 +0000 (18:43 +0000)
committerGustavo Sverzut Barbieri <barbieri@gmail.com>
Mon, 10 Dec 2012 18:43:36 +0000 (18:43 +0000)
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
NEWS
src/lib/ecore/Ecore_Getopt.h
src/lib/ecore/ecore_getopt.c

index e9353a4..2658538 100644 (file)
--- 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 a691df2..2c735fa 100644 (file)
--- 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:
index 0a11787..3574ba5 100644 (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)}
index 42e43e8..f31f7c2 100644 (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++;
@@ -1408,6 +1420,18 @@ _ecore_getopt_parse_license(const Ecore_Getopt      *parser,
 }
 
 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,
                           Ecore_Getopt_Value      *value,
@@ -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;
      }