Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/stand/libsa/getopt.c
34677 views
1
/*
2
* Copyright (c) 1987, 1993, 1994
3
* The Regents of the University of California. All rights reserved.
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
* 3. Neither the name of the University nor the names of its contributors
14
* may be used to endorse or promote products derived from this software
15
* without specific prior written permission.
16
*
17
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
* SUCH DAMAGE.
28
*/
29
30
#include "stand.h"
31
#include <string.h>
32
33
int opterr = 1, /* if error message should be printed */
34
optind = 1, /* index into parent argv vector */
35
optopt, /* character checked for validity */
36
optreset; /* reset getopt */
37
char *optarg; /* argument associated with option */
38
39
#define BADCH (int)'?'
40
#define BADARG (int)':'
41
#define EMSG ""
42
43
/*
44
* getopt --
45
* Parse argc/argv argument vector.
46
*/
47
int
48
getopt(int nargc, char * const *nargv, const char *ostr)
49
{
50
static char *place = EMSG; /* option letter processing */
51
char *oli; /* option letter list index */
52
53
if (optreset || !*place) { /* update scanning pointer */
54
optreset = 0;
55
if (optind >= nargc || *(place = nargv[optind]) != '-') {
56
place = EMSG;
57
return (-1);
58
}
59
if (place[1] && *++place == '-') { /* found "--" */
60
++optind;
61
place = EMSG;
62
return (-1);
63
}
64
} /* option letter okay? */
65
if ((optopt = (int)*place++) == (int)':' ||
66
!(oli = strchr(ostr, optopt))) {
67
/*
68
* if the user didn't specify '-' as an option,
69
* assume it means -1.
70
*/
71
if (optopt == (int)'-')
72
return (-1);
73
if (!*place)
74
++optind;
75
if (opterr && *ostr != ':')
76
(void)printf("illegal option -- %c\n", optopt);
77
return (BADCH);
78
}
79
if (*++oli != ':') { /* don't need argument */
80
optarg = NULL;
81
if (!*place)
82
++optind;
83
}
84
else { /* need an argument */
85
if (*place) /* no white space */
86
optarg = place;
87
else if (nargc <= ++optind) { /* no arg */
88
place = EMSG;
89
if (*ostr == ':')
90
return (BADARG);
91
if (opterr)
92
(void)printf("option requires an argument -- %c\n", optopt);
93
return (BADCH);
94
}
95
else /* white space */
96
optarg = nargv[optind];
97
place = EMSG;
98
++optind;
99
}
100
return (optopt); /* dump back option letter */
101
}
102
103