Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / msvc / getopt.c
1 /* $PostgreSQL: pgsql/src/port/getopt.c,v 1.11 2007/03/26 21:44:11 momjian Exp $ */
2
3 /* This is used by psql under Win32 */
4
5 /*
6  * Copyright (c) 1987, 1993, 1994
7  *      The Regents of the University of California.  All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *        notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *        notice, this list of conditions and the following disclaimer in the
16  *        documentation and/or other materials provided with the distribution.
17  * 3. Neither the name of the University nor the names of its contributors
18  *        may be used to endorse or promote products derived from this software
19  *        without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.      IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  */
32
33 #include <stdio.h>
34 #include <string.h>
35
36 #ifdef _MSC_VER
37 /* disable the following warnings 
38  * C4706: assignment within conditional expression
39 */
40 #pragma warning(disable:4706)
41 #endif
42
43
44
45 int                     opterr = 1,                     /* if error message should be printed */
46                         optind = 1,                     /* index into parent argv vector */
47                         optopt,                         /* character checked for validity */
48                         optreset;                       /* reset getopt */
49 char       *optarg;                             /* argument associated with option */
50
51 #define BADCH   (int)'?'
52 #define BADARG  (int)':'
53 #define EMSG    ""
54
55 /*
56  * getopt
57  *      Parse argc/argv argument vector.
58  */
59 int
60 getopt(int nargc, char * const *nargv, const char *ostr)
61 {
62         static char *place = EMSG;      /* option letter processing */
63         char       *oli;                        /* option letter list index */
64
65         if (optreset || !*place)
66         {                                                       /* update scanning pointer */
67                 optreset = 0;
68                 if (optind >= nargc || *(place = nargv[optind]) != '-')
69                 {
70                         place = EMSG;
71                         return -1;
72                 }
73                 if (place[1] && *++place == '-' && place[1] == '\0')
74                 {                                               /* found "--" */
75                         ++optind;
76                         place = EMSG;
77                         return -1;
78                 }
79         }                                                       /* option letter okay? */
80         if ((optopt = (int) *place++) == (int) ':' ||
81                 !(oli = strchr(ostr, optopt)))
82         {
83                 /*
84                  * if the user didn't specify '-' as an option, assume it means -1.
85                  */
86                 if (optopt == (int) '-')
87                         return -1;
88                 if (!*place)
89                         ++optind;
90                 if (opterr && *ostr != ':')
91                         (void) fprintf(stderr,
92                                                    "illegal option -- %c\n", optopt);
93                 return BADCH;
94         }
95         if (*++oli != ':')
96         {                                                       /* don't need argument */
97                 optarg = NULL;
98                 if (!*place)
99                         ++optind;
100         }
101         else
102         {                                                       /* need an argument */
103                 if (*place)                             /* no white space */
104                         optarg = place;
105                 else if (nargc <= ++optind)
106                 {                                               /* no arg */
107                         place = EMSG;
108                         if (*ostr == ':')
109                                 return BADARG;
110                         if (opterr)
111                                 (void) fprintf(stderr,
112                                                            "option requires an argument -- %c\n",
113                                                            optopt);
114                         return BADCH;
115                 }
116                 else
117                         /* white space */
118                         optarg = nargv[optind];
119                 place = EMSG;
120                 ++optind;
121         }
122         return optopt;                          /* dump back option letter */
123 }