chiark / gitweb /
move getopt implementation to separate files
authorAmro <amroamroamro@gmail.com>
Fri, 29 Jul 2016 17:37:35 +0000 (20:37 +0300)
committerJulien Schueller <schueller@phimeca.com>
Thu, 24 Aug 2017 08:33:43 +0000 (10:33 +0200)
test/testopt.cpp
util/nlopt-getopt.c [new file with mode: 0644]
util/nlopt-getopt.h [new file with mode: 0644]

index c3c145fcd9888a5ac4b4a07d686a14d07e4879fc..fa69dca7b2875cdd56f80df49bac5546a19a7cd1 100644 (file)
 #ifdef HAVE_GETOPT_H
 #  include <getopt.h>
 #else
-int     opterr = 1,             /* if error message should be printed */
-  optind = 1,             /* index into parent argv vector */
-  optopt,                 /* character checked for validity */
-  optreset;               /* reset getopt */
-char    *optarg;                /* argument associated with option */
-
-#define BADCH   (int)'?'
-#define BADARG  (int)':'
-#define EMSG    ""
-
-/*
-* getopt --
-*      Parse argc/argv argument vector.
-*/
-int
-  getopt(int nargc, char * const nargv[], const char *ostr)
-{
-  static char *place = EMSG;              /* option letter processing */
-  const char *oli;                        /* option letter list index */
-
-  if (optreset || !*place) {              /* update scanning pointer */
-    optreset = 0;
-    if (optind >= nargc || *(place = nargv[optind]) != '-') {
-      place = EMSG;
-      return (-1);
-    }
-    if (place[1] && *++place == '-') {      /* found "--" */
-      ++optind;
-      place = EMSG;
-      return (-1);
-    }
-  }                                       /* option letter okay? */
-  if ((optopt = (int)*place++) == (int)':' ||
-    !(oli = strchr(ostr, optopt))) {
-      /*
-      * if the user didn't specify '-' as an option,
-      * assume it means -1.
-      */
-      if (optopt == (int)'-')
-        return (-1);
-      if (!*place)
-        ++optind;
-      if (opterr && *ostr != ':')
-        (void)printf("illegal option -- %c\n", optopt);
-      return (BADCH);
-  }
-  if (*++oli != ':') {                    /* don't need argument */
-    optarg = NULL;
-    if (!*place)
-      ++optind;
-  }
-  else {                                  /* need an argument */
-    if (*place)                     /* no white space */
-      optarg = place;
-    else if (nargc <= ++optind) {   /* no arg */
-      place = EMSG;
-      if (*ostr == ':')
-        return (BADARG);
-      if (opterr)
-        (void)printf("option requires an argument -- %c\n", optopt);
-      return (BADCH);
-    }
-    else                            /* white space */
-      optarg = nargv[optind];
-    place = EMSG;
-    ++optind;
-  }
-  return (optopt);                        /* dump back option letter */
-}
+#  include "nlopt-getopt.h"
 #endif
 
 #define USE_FEENABLEEXCEPT 0
diff --git a/util/nlopt-getopt.c b/util/nlopt-getopt.c
new file mode 100644 (file)
index 0000000..7c00124
--- /dev/null
@@ -0,0 +1,67 @@
+#include <stdio.h>
+#include <string.h>
+#include "nlopt-getopt.h"
+
+int opterr = 1,             /* if error message should be printed */
+    optind = 1,             /* index into parent argv vector */
+    optopt,                 /* character checked for validity */
+    optreset;               /* reset getopt */
+char *optarg;               /* argument associated with option */
+
+#define BADCH   (int)'?'
+#define BADARG  (int)':'
+#define EMSG    ""
+
+/*
+ * getopt --
+ *      Parse argc/argv argument vector.
+ */
+int getopt(int nargc, char * const nargv[], const char *ostr)
+{
+    static char *place = EMSG;              /* option letter processing */
+    const char *oli;                        /* option letter list index */
+    if (optreset || !*place) {              /* update scanning pointer */
+        optreset = 0;
+        if (optind >= nargc || *(place = nargv[optind]) != '-') {
+            place = EMSG;
+            return (-1);
+        }
+        if (place[1] && *++place == '-') {  /* found "--" */
+            ++optind;
+            place = EMSG;
+            return (-1);
+        }
+    }                                       /* option letter okay? */
+    if ((optopt = (int)*place++) == (int)':' || !(oli = strchr(ostr, optopt))) {
+        /* if the user didn't specify '-' as an option, assume it means -1. */
+        if (optopt == (int)'-')
+            return (-1);
+        if (!*place)
+            ++optind;
+        if (opterr && *ostr != ':')
+            (void) printf("illegal option -- %c\n", optopt);
+        return (BADCH);
+    }
+    if (*++oli != ':') {                    /* don't need argument */
+        optarg = NULL;
+        if (!*place)
+            ++optind;
+    }
+    else {                                  /* need an argument */
+        if (*place)                         /* no white space */
+            optarg = place;
+        else if (nargc <= ++optind) {       /* no arg */
+            place = EMSG;
+            if (*ostr == ':')
+                return (BADARG);
+            if (opterr)
+                (void) printf("option requires an argument -- %c\n", optopt);
+            return (BADCH);
+        }
+        else                                /* white space */
+            optarg = nargv[optind];
+        place = EMSG;
+        ++optind;
+    }
+    return (optopt);                        /* dump back option letter */
+}
diff --git a/util/nlopt-getopt.h b/util/nlopt-getopt.h
new file mode 100644 (file)
index 0000000..8a125f4
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1987, 1993, 1994
+ *      The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef NLOPT_GETOPT_H
+#define NLOPT_GETOPT_H
+
+#ifdef  __cplusplus
+extern "C"
+{
+#endif
+
+extern int opterr, optind, optopt, optreset;
+extern char *optarg;
+
+extern int getopt(int nargc, char * const nargv[], const char *ostr);
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif