Merge branch 'master' of ssh://git.indexdata.com/home/git/pub/yaz
[yaz-moved-to-github.git] / src / options.c
index ca9511f..6abfb6f 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2008 Index Data
+ * Copyright (C) Index Data
  * See the file LICENSE for details.
  */
 /**
 #include <yaz/options.h>
 
 static int arg_no = 1;
-static int arg_off = 0;
+static size_t arg_off = 0;
+static int eof_options = 0;
 
-int options (const char *desc, char **argv, int argc, char **arg)
+int options(const char *desc, char **argv, int argc, char **arg)
 {
     const char *opt_buf = 0;
     size_t i = 0;
     int ch = 0;
-    
+
     if (arg_no >= argc)
-        return -2;
+        return YAZ_OPTIONS_EOF;
     if (arg_off == 0)
     {
         while (argv[arg_no][0] == '\0')
         {
             arg_no++;
             if (arg_no >= argc)
-                return -2;
+                return YAZ_OPTIONS_EOF;
         }
-        if (argv[arg_no][0] != '-' || argv[arg_no][1] == '\0')
+        if (argv[arg_no][0] != '-' || argv[arg_no][1] == '\0' || eof_options)
         {
             *arg = argv[arg_no++];
             return 0;
         }
         arg_off++; /* skip - */
     }
+    /* we're in option mode */
     if (argv[arg_no][1] == '-')
     {   /* long opt */
+        if (argv[arg_no][2] == '\0') /* -- : end of options */
+        {
+            eof_options = 1;
+            arg_off = 0;
+            ++arg_no;
+            if (arg_no >= argc)
+                return YAZ_OPTIONS_EOF;
+            *arg = argv[arg_no++];
+            return 0;
+        }
         opt_buf = argv[arg_no]+2;
         arg_off = strlen(argv[arg_no]);
     }
@@ -66,10 +78,10 @@ int options (const char *desc, char **argv, int argc, char **arg)
         }
         if (desc[i] == ':')
         {       /* option with string argument */
-                type = desc[i++];
+            type = desc[i++];
         }
         if (desc_char == ch)
-        { 
+        {
             if (type) /* option with argument */
             {
                 if (argv[arg_no][arg_off])
@@ -90,25 +102,24 @@ int options (const char *desc, char **argv, int argc, char **arg)
             }
             else /* option with no argument */
             {
-                if (argv[arg_no][arg_off])
-                    arg_off++;
-                else
+                if (!argv[arg_no][arg_off])
                 {
                     arg_off = 0;
                     arg_no++;
                 }
             }
             return ch;
-        }               
+        }
     }
     *arg = argv[arg_no]+arg_off-1;
     arg_no = arg_no + 1;
     arg_off = 0;
-    return -1;
+    return YAZ_OPTIONS_ERROR;
 }
 /*
  * Local variables:
  * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
  * indent-tabs-mode: nil
  * End:
  * vim: shiftwidth=4 tabstop=8 expandtab