[vlc-devel] commit: getopt: remove optional argument support ( Rémi Denis-Courmont )

git version control git at videolan.org
Sun Feb 28 16:02:24 CET 2010


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Feb 28 16:10:34 2010 +0200| [68f6af6e769cd3022861c421a15a610b6227a301] | committer: Rémi Denis-Courmont 

getopt: remove optional argument support

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=68f6af6e769cd3022861c421a15a610b6227a301
---

 src/config/cmdline.c    |    7 ++---
 src/config/getopt.c     |   59 +++++++++++++++-------------------------------
 src/config/vlc_getopt.h |   15 ++---------
 3 files changed, 25 insertions(+), 56 deletions(-)

diff --git a/src/config/cmdline.c b/src/config/cmdline.c
index c721c45..73e51af 100644
--- a/src/config/cmdline.c
+++ b/src/config/cmdline.c
@@ -141,8 +141,7 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
             p_longopts[i_index].name = strdup( p_item->psz_name );
             if( p_longopts[i_index].name == NULL ) continue;
             p_longopts[i_index].has_arg =
-                (p_item->i_type == CONFIG_ITEM_BOOL) ? no_argument : 
-                                                       required_argument;
+                (p_item->i_type != CONFIG_ITEM_BOOL);
             p_longopts[i_index].flag = &flag;
             p_longopts[i_index].val = 0;
             i_index++;
@@ -157,7 +156,7 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
                 strcat( psz_name, p_item->psz_name );
 
                 p_longopts[i_index].name = psz_name;
-                p_longopts[i_index].has_arg = no_argument;
+                p_longopts[i_index].has_arg = false;
                 p_longopts[i_index].flag = &flag;
                 p_longopts[i_index].val = 1;
                 i_index++;
@@ -168,7 +167,7 @@ int config_LoadCmdLine( vlc_object_t *p_this, int *pi_argc,
                 strcat( psz_name, p_item->psz_name );
 
                 p_longopts[i_index].name = psz_name;
-                p_longopts[i_index].has_arg = no_argument;
+                p_longopts[i_index].has_arg = false;
                 p_longopts[i_index].flag = &flag;
                 p_longopts[i_index].val = 1;
                 i_index++;
diff --git a/src/config/getopt.c b/src/config/getopt.c
index 08753f7..e1db101 100644
--- a/src/config/getopt.c
+++ b/src/config/getopt.c
@@ -267,9 +267,7 @@ static const char *
 
    If a char in OPTSTRING is followed by a colon, that means it wants an arg,
    so the following text in the same ARGV-element, or the text of the following
-   ARGV-element, is returned in `optarg'.  Two colons mean an option that
-   wants an optional arg; if there is text in the current ARGV-element,
-   it is returned in `optarg', otherwise `optarg' is set to zero.
+   ARGV-element, is returned in `optarg'.
 
    If OPTSTRING starts with `-' or `+', it requests different methods of
    handling the non-option ARGV-elements.
@@ -447,8 +445,6 @@ int
             optind++;
             if (*nameend)
             {
-                /* Don't test has_arg with >, because some C compilers don't
-                   allow it to be used on enums.  */
                 if (pfound->has_arg)
                     optarg = nameend + 1;
                 else
@@ -459,7 +455,7 @@ int
                     return '?';
                 }
             }
-            else if (pfound->has_arg == 1)
+            else if (pfound->has_arg)
             {
                 if (optind < argc)
                     optarg = argv[optind++];
@@ -575,8 +571,6 @@ int
                 option_index = indfound;
                 if (*nameend)
                 {
-                    /* Don't test has_arg with >, because some C compilers don't
-                       allow it to be used on enums.  */
                     if (pfound->has_arg)
                         optarg = nameend + 1;
                     else
@@ -585,7 +579,7 @@ int
                         return '?';
                     }
                 }
-                else if (pfound->has_arg == 1)
+                else if (pfound->has_arg)
                 {
                     if (optind < argc)
                         optarg = argv[optind++];
@@ -610,42 +604,27 @@ int
         }
         if (temp[1] == ':')
         {
-            if (temp[2] == ':')
+            /* This is an option that requires an argument.  */
+            if (*nextchar != '\0')
             {
-                /* This is an option that accepts an argument optionally.  */
-                if (*nextchar != '\0')
-                {
-                    optarg = nextchar;
-                    optind++;
-                }
-                else
-                    optarg = NULL;
-                nextchar = NULL;
+                optarg = nextchar;
+                /* If we end this ARGV-element by taking the rest as an arg,
+                   we must advance to the next element now.  */
+                optind++;
             }
-            else
+            else if (optind == argc)
             {
-                /* This is an option that requires an argument.  */
-                if (*nextchar != '\0')
-                {
-                    optarg = nextchar;
-                    /* If we end this ARGV-element by taking the rest as an arg,
-                       we must advance to the next element now.  */
-                    optind++;
-                }
-                else if (optind == argc)
-                {
-                    optopt = c;
-                    if (optstring[0] == ':')
-                        c = ':';
-                    else
-                        c = '?';
-                }
+                optopt = c;
+                if (optstring[0] == ':')
+                    c = ':';
                 else
-                    /* We already incremented `optind' once;
-                       increment it again when taking next ARGV-elt as argument.  */
-                    optarg = argv[optind++];
-                nextchar = NULL;
+                    c = '?';
             }
+            else
+                /* We already incremented `optind' once;
+                   increment it again when taking next ARGV-elt as argument.  */
+                optarg = argv[optind++];
+            nextchar = NULL;
         }
         return c;
     }
diff --git a/src/config/vlc_getopt.h b/src/config/vlc_getopt.h
index e6bf78d..72b2341 100644
--- a/src/config/vlc_getopt.h
+++ b/src/config/vlc_getopt.h
@@ -54,9 +54,8 @@
    zero.
 
    The field `has_arg' is:
-   no_argument          (or 0) if the option does not take an argument,
-   required_argument    (or 1) if the option requires an argument,
-   optional_argument    (or 2) if the option takes an optional argument.
+   false if the option does not take an argument,
+   true if the option requires an argument.
 
    If the field `flag' is not NULL, it points to a variable that is set
    to the value given in the field `val' when the option is found, but
@@ -72,19 +71,11 @@
     struct option
     {
         const char *name;
-        /* has_arg can't be an enum because some compilers complain about
-           type mismatches in all the code that assumes it is an int.  */
-        int has_arg;
+        bool has_arg;
         int *flag;
         int val;
     };
 
-/* Names for the values of the `has_arg' field of `struct option'.  */
-
-#define    no_argument        0
-#define required_argument    1
-#define optional_argument    2
-
     extern int vlc_getopt_long(int argc, char *const *argv, const char *shortopts,
                    const struct option *longopts, int *longind);
 




More information about the vlc-devel mailing list