]> granicus.if.org Git - postgresql/blobdiff - src/port/getopt.c
Optimize pg_comp_crc32c_sse42 routine slightly, and also use it on x86.
[postgresql] / src / port / getopt.c
index 8451a872aa1e4197f961bbd68c1df481e62b7a43..f1ad93d7d6a99a592e555c999df1fbde2b09c540 100644 (file)
@@ -1,3 +1,5 @@
+/* src/port/getopt.c */
+
 /* This is used by psql under Win32 */
 
 /*
  * 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
+ * 3. 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
+ * 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)
 
 #include "c.h"
 
+#include "pg_getopt.h"
 
 #if defined(LIBC_SCCS) && !defined(lint)
 static char sccsid[] = "@(#)getopt.c   8.3 (Berkeley) 4/27/95";
 #endif   /* LIBC_SCCS and not lint */
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+
+/*
+ * On some versions of Solaris, opterr and friends are defined in core libc
+ * rather than in a separate getopt module.  Define these variables only
+ * if configure found they aren't there by default.  (We assume that testing
+ * opterr is sufficient for all of these.)
+ */
+#ifndef HAVE_INT_OPTERR
 
 int                    opterr = 1,                     /* if error message should be printed */
                        optind = 1,                     /* index into parent argv vector */
-                       optopt,                         /* character checked for validity */
-                       optreset;                       /* reset getopt */
+                       optopt;                         /* character checked for validity */
 char      *optarg;                             /* argument associated with option */
 
+#endif
+
 #define BADCH  (int)'?'
 #define BADARG (int)':'
 #define EMSG   ""
@@ -56,19 +61,21 @@ char           *optarg;                             /* argument associated with option */
 /*
  * getopt
  *     Parse argc/argv argument vector.
+ *
+ * This implementation does not use optreset.  Instead, we guarantee that
+ * it can be restarted on a new argv array after a previous call returned -1,
+ * if the caller resets optind to 1 before the first call of the new series.
+ * (Internally, this means we must be sure to reset "place" to EMSG before
+ * returning -1.)
  */
 int
-getopt(nargc, nargv, ostr)
-int                    nargc;
-char      *const * nargv;
-const char *ostr;
+getopt(int nargc, char *const * nargv, const char *ostr)
 {
        static char *place = EMSG;      /* option letter processing */
        char       *oli;                        /* option letter list index */
 
-       if (optreset || !*place)
+       if (!*place)
        {                                                       /* update scanning pointer */
-               optreset = 0;
                if (optind >= nargc || *(place = nargv[optind]) != '-')
                {
                        place = EMSG;
@@ -85,11 +92,13 @@ const char *ostr;
                !(oli = strchr(ostr, optopt)))
        {
                /*
-                * if the user didn't specify '-' as an option, assume it means
-                * -1.
+                * if the user didn't specify '-' as an option, assume it means -1.
                 */
                if (optopt == (int) '-')
+               {
+                       place = EMSG;
                        return -1;
+               }
                if (!*place)
                        ++optind;
                if (opterr && *ostr != ':')