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#include "port/pg_getopt_ctx.h"
36
37/*
38 * On OpenBSD and some versions of Solaris, opterr and friends are defined in
39 * core libc rather than in a separate getopt module. Define these variables
40 * only if configure found they aren't there by default; otherwise, this
41 * module and its callers will just use libc's variables. (We assume that
42 * testing opterr is sufficient for all of these.)
43 */
44#ifndef HAVE_INT_OPTERR
45
46int opterr = 1, /* if error message should be printed */
47 optind = 1, /* index into parent argv vector */
48 optopt; /* character checked for validity */
49char *optarg; /* argument associated with option */
50
51#endif
52
53/*
54 * getopt
55 * Parse argc/argv argument vector.
56 *
57 * We use the re-entrant pg_getopt_start/next() functions under the hood, but
58 * expose the standard non re-entrant API.
59 *
60 * This implementation does not use optreset. Instead, we guarantee that
61 * it can be restarted on a new argv array after a previous call returned -1,
62 * if the caller resets optind to 1 before the first call of the new series.
63 * (Internally, this means we must be sure to reset "active" before
64 * returning -1.)
65 */
66int
67getopt(int nargc, char *const *nargv, const char *ostr)
68{
69 static bool active = false;
70 static pg_getopt_ctx ctx;
71 int result;
72
73 if (!active)
74 {
75 pg_getopt_start(&ctx, nargc, nargv, ostr);
76 ctx.opterr = opterr;
77 active = true;
78 }
79
80 result = pg_getopt_next(&ctx);
81 opterr = ctx.opterr;
82 optind = ctx.optind;
83 optopt = ctx.optopt;
84 optarg = ctx.optarg;
85 if (result == -1)
86 active = false;
87 return result;
88}
uint32 result
int optopt
Definition getopt.c:48
int getopt(int nargc, char *const *nargv, const char *ostr)
Definition getopt.c:67
int optind
Definition getopt.c:47
char * optarg
Definition getopt.c:49
int opterr
Definition getopt.c:46
int pg_getopt_next(pg_getopt_ctx *ctx)
void pg_getopt_start(pg_getopt_ctx *ctx, int nargc, char *const *nargv, const char *ostr)