4 * Copyright (c) 1987, 1993, 1994
5 * The Regents of the University of California. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
36#if defined(LIBC_SCCS) && !defined(lint)
37static char sccsid[] =
"@(#)getopt.c 8.3 (Berkeley) 4/27/95";
38#endif /* LIBC_SCCS and not lint */
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.)
48#ifndef HAVE_INT_OPTERR
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 */
57 #define BADCH (int)'?'
58 #define BADARG (int)':'
63 * Parse argc/argv argument vector.
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
72 getopt(
int nargc,
char *
const *nargv,
const char *ostr)
74 static char *place =
EMSG;
/* option letter processing */
75 char *oli;
/* option letter list index */
78 {
/* update scanning pointer */
84 if (place[1] && *++place ==
'-' && place[1] ==
'0円')
90 }
/* option letter okay? */
91 if ((
optopt = (
int) *place++) == (
int)
':' ||
92 !(oli = strchr(ostr,
optopt)))
95 * if the user didn't specify '-' as an option, assume it means -1.
104 if (
opterr && *ostr !=
':')
106 "illegal option -- %c\n",
optopt);
110 {
/* don't need argument */
116 {
/* need an argument */
117 if (*place)
/* no white space */
119 else if (nargc <= ++
optind)
126 "option requires an argument -- %c\n",
136 return optopt;
/* dump back option letter */
#define fprintf(file, fmt, msg)
int getopt(int nargc, char *const *nargv, const char *ostr)