PostgreSQL Source Code
git master
Loading...
Searching...
No Matches
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
const
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
fprintf
#define fprintf(file, fmt, msg)
Definition
cubescan.l:21
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
fb
static int fb(int x)
Definition
preproc-init.c:92
src
port
getopt.c
Generated on Tue Jan 27 2026 06:13:18 for PostgreSQL Source Code by
1.9.8