add support for non-option arguments extension to getopt
authorGianluca Anzolin <gianluca@sottospazio.it>
Tue, 25 Nov 2014 07:56:03 +0000 (08:56 +0100)
committerRich Felker <dalias@aerifal.cx>
Wed, 3 Dec 2014 00:03:04 +0000 (19:03 -0500)
this is a GNU extension, activated by including '-' as the first
character of the options string, whereby non-option arguments are
processed as if they were arguments to an option character '\1' rather
than ending option processing.

src/misc/getopt.c
src/misc/getopt_long.c

index f94c4f7..a698c8d 100644 (file)
@@ -24,8 +24,20 @@ int getopt(int argc, char * const argv[], const char *optstring)
                optind = 1;
        }
 
-       if (optind >= argc || !argv[optind] || argv[optind][0] != '-' || !argv[optind][1])
+       if (optind >= argc || !argv[optind])
                return -1;
+
+       if (argv[optind][0] != '-') {
+               if (optstring[0] == '-') {
+                       optarg = argv[optind++];
+                       return 1;
+               }
+               return -1;
+       }
+
+       if (!argv[optind][1])
+               return -1;
+
        if (argv[optind][1] == '-' && !argv[optind][2])
                return optind++, -1;
 
@@ -43,6 +55,9 @@ int getopt(int argc, char * const argv[], const char *optstring)
                optpos = 0;
        }
 
+       if (optstring[0] == '-')
+               optstring++;
+
        for (i=0; (l = mbtowc(&d, optstring+i, MB_LEN_MAX)) && d!=c; i+=l>0?l:1);
 
        if (d != c) {
index 4ef5a5c..3d318ce 100644 (file)
@@ -12,9 +12,10 @@ static int __getopt_long(int argc, char *const *argv, const char *optstring, con
                __optpos = 0;
                optind = 1;
        }
-       if (optind >= argc || !argv[optind] || argv[optind][0] != '-') return -1;
-       if ((longonly && argv[optind][1]) ||
-               (argv[optind][1] == '-' && argv[optind][2]))
+       if (optind >= argc || !argv[optind]) return -1;
+       if (argv[optind][0] == '-' &&
+               ((longonly && argv[optind][1]) ||
+                (argv[optind][1] == '-' && argv[optind][2])))
        {
                int i;
                for (i=0; longopts[i].name; i++) {