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
*/
30
31
#include "
c.h
"
32
33
#include "
pg_getopt.h
"
34
35
#if defined(LIBC_SCCS) && !defined(lint)
36
static
char
sccsid[] =
"@(#)getopt.c 8.3 (Berkeley) 4/27/95"
;
37
#endif
/* LIBC_SCCS and not lint */
38
39
40
/*
41
* On OpenBSD and some versions of Solaris, opterr and friends are defined in
42
* core libc rather than in a separate getopt module. Define these variables
43
* only if configure found they aren't there by default; otherwise, this
44
* module and its callers will just use libc's variables. (We assume that
45
* testing opterr is sufficient for all of these.)
46
*/
47
#ifndef HAVE_INT_OPTERR
48
49
int
opterr
= 1,
/* if error message should be printed */
50
optind
= 1,
/* index into parent argv vector */
51
optopt
;
/* character checked for validity */
52
char
*
optarg
;
/* argument associated with option */
53
54
#endif
55
56
#define BADCH (int)'?'
57
#define BADARG (int)':'
58
#define EMSG ""
59
60
/*
61
* getopt
62
* Parse argc/argv argument vector.
63
*
64
* This implementation does not use optreset. Instead, we guarantee that
65
* it can be restarted on a new argv array after a previous call returned -1,
66
* if the caller resets optind to 1 before the first call of the new series.
67
* (Internally, this means we must be sure to reset "place" to EMSG before
68
* returning -1.)
69
*/
70
int
71
getopt
(
int
nargc,
char
*
const
*nargv,
const
char
*ostr)
72
{
73
static
char
*place =
EMSG
;
/* option letter processing */
74
char
*oli;
/* option letter list index */
75
76
if
(!*place)
77
{
/* update scanning pointer */
78
if
(
optind
>= nargc || *(place = nargv[
optind
]) !=
'-'
)
79
{
80
place =
EMSG
;
81
return
-1;
82
}
83
if
(place[1] && *++place ==
'-'
&& place[1] ==
'\0'
)
84
{
/* found "--" */
85
++
optind
;
86
place =
EMSG
;
87
return
-1;
88
}
89
}
/* option letter okay? */
90
if
((
optopt
= (
int
) *place++) == (
int
)
':'
||
91
!(oli = strchr(ostr,
optopt
)))
92
{
93
/*
94
* if the user didn't specify '-' as an option, assume it means -1.
95
*/
96
if
(
optopt
== (
int
)
'-'
)
97
{
98
place =
EMSG
;
99
return
-1;
100
}
101
if
(!*place)
102
++
optind
;
103
if
(
opterr
&& *ostr !=
':'
)
104
(void)
fprintf
(stderr,
105
"illegal option -- %c\n"
,
optopt
);
106
return
BADCH
;
107
}
108
if
(*++oli !=
':'
)
109
{
/* don't need argument */
110
optarg
= NULL;
111
if
(!*place)
112
++
optind
;
113
}
114
else
115
{
/* need an argument */
116
if
(*place)
/* no white space */
117
optarg
= place;
118
else
if
(nargc <= ++
optind
)
119
{
/* no arg */
120
place =
EMSG
;
121
if
(*ostr ==
':'
)
122
return
BADARG
;
123
if
(
opterr
)
124
(void)
fprintf
(stderr,
125
"option requires an argument -- %c\n"
,
126
optopt
);
127
return
BADCH
;
128
}
129
else
130
/* white space */
131
optarg
= nargv[
optind
];
132
place =
EMSG
;
133
++
optind
;
134
}
135
return
optopt
;
/* dump back option letter */
136
}
c.h
BADCH
#define BADCH
Definition:
getopt.c:56
optopt
int optopt
Definition:
getopt.c:51
BADARG
#define BADARG
Definition:
getopt.c:57
EMSG
#define EMSG
Definition:
getopt.c:58
getopt
int getopt(int nargc, char *const *nargv, const char *ostr)
Definition:
getopt.c:71
optind
int optind
Definition:
getopt.c:50
optarg
char * optarg
Definition:
getopt.c:52
opterr
int opterr
Definition:
getopt.c:49
pg_getopt.h
fprintf
#define fprintf
Definition:
port.h:242
src
port
getopt.c
Generated on Wed Sep 18 2024 06:13:27 for PostgreSQL Source Code by
1.9.1