PostgreSQL Source Code
git master
getopt.c
Go to the documentation of this file.
1
/* src/port/getopt.c */
2
3
/*
4
* Copyright (c) 1987, 1993, 1994
5
* The Regents of the University of California. All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
* 3. Neither the name of the University nor the names of its contributors
16
* may be used to endorse or promote products derived from this software
17
* without specific prior written permission.
18
*
19
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
* SUCH DAMAGE.
30
*/
31
32
#include "
c.h
"
33
34
#include "
pg_getopt.h
"
35
36
#if defined(LIBC_SCCS) && !defined(lint)
37
static
char
sccsid[] =
"@(#)getopt.c 8.3 (Berkeley) 4/27/95"
;
38
#endif
/* LIBC_SCCS and not lint */
39
40
41
/*
42
* On OpenBSD and some versions of Solaris, opterr and friends are defined in
43
* core libc rather than in a separate getopt module. Define these variables
44
* only if configure found they aren't there by default; otherwise, this
45
* module and its callers will just use libc's variables. (We assume that
46
* testing opterr is sufficient for all of these.)
47
*/
48
#ifndef HAVE_INT_OPTERR
49
50
int
opterr
= 1,
/* if error message should be printed */
51
optind
= 1,
/* index into parent argv vector */
52
optopt
;
/* character checked for validity */
53
char
*
optarg
;
/* argument associated with option */
54
55
#endif
56
57
#define BADCH (int)'?'
58
#define BADARG (int)':'
59
#define EMSG ""
60
61
/*
62
* getopt
63
* Parse argc/argv argument vector.
64
*
65
* This implementation does not use optreset. Instead, we guarantee that
66
* it can be restarted on a new argv array after a previous call returned -1,
67
* if the caller resets optind to 1 before the first call of the new series.
68
* (Internally, this means we must be sure to reset "place" to EMSG before
69
* returning -1.)
70
*/
71
int
72
getopt
(
int
nargc,
char
*
const
*nargv,
const
char
*ostr)
73
{
74
static
char
*place =
EMSG
;
/* option letter processing */
75
char
*oli;
/* option letter list index */
76
77
if
(!*place)
78
{
/* update scanning pointer */
79
if
(
optind
>= nargc || *(place = nargv[
optind
]) !=
'-'
)
80
{
81
place =
EMSG
;
82
return
-1;
83
}
84
if
(place[1] && *++place ==
'-'
&& place[1] ==
'\0'
)
85
{
/* found "--" */
86
++
optind
;
87
place =
EMSG
;
88
return
-1;
89
}
90
}
/* option letter okay? */
91
if
((
optopt
= (
int
) *place++) == (
int
)
':'
||
92
!(oli = strchr(ostr,
optopt
)))
93
{
94
/*
95
* if the user didn't specify '-' as an option, assume it means -1.
96
*/
97
if
(
optopt
== (
int
)
'-'
)
98
{
99
place =
EMSG
;
100
return
-1;
101
}
102
if
(!*place)
103
++
optind
;
104
if
(
opterr
&& *ostr !=
':'
)
105
(void)
fprintf
(stderr,
106
"illegal option -- %c\n"
,
optopt
);
107
return
BADCH
;
108
}
109
if
(*++oli !=
':'
)
110
{
/* don't need argument */
111
optarg
= NULL;
112
if
(!*place)
113
++
optind
;
114
}
115
else
116
{
/* need an argument */
117
if
(*place)
/* no white space */
118
optarg
= place;
119
else
if
(nargc <= ++
optind
)
120
{
/* no arg */
121
place =
EMSG
;
122
if
(*ostr ==
':'
)
123
return
BADARG
;
124
if
(
opterr
)
125
(void)
fprintf
(stderr,
126
"option requires an argument -- %c\n"
,
127
optopt
);
128
return
BADCH
;
129
}
130
else
131
/* white space */
132
optarg
= nargv[
optind
];
133
place =
EMSG
;
134
++
optind
;
135
}
136
return
optopt
;
/* dump back option letter */
137
}
c.h
BADCH
#define BADCH
Definition:
getopt.c:57
optopt
int optopt
Definition:
getopt.c:52
BADARG
#define BADARG
Definition:
getopt.c:58
EMSG
#define EMSG
Definition:
getopt.c:59
getopt
int getopt(int nargc, char *const *nargv, const char *ostr)
Definition:
getopt.c:72
optind
int optind
Definition:
getopt.c:51
optarg
char * optarg
Definition:
getopt.c:53
opterr
int opterr
Definition:
getopt.c:50
pg_getopt.h
fprintf
#define fprintf
Definition:
port.h:242
src
port
getopt.c
Generated on Tue Dec 3 2024 06:13:27 for PostgreSQL Source Code by
1.9.1