1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
/* transcript/src/getopt.c
*
* public domain getopt from mod.sources
* RCSID: $Header: getopt.c,v 2.1 85/11/24 11:49:10 shore Rel $
*/
/*
** This is a public domain version of getopt(3).
** Bugs, fixes to:
** Keith Bostic
** ARPA: keith@seismo
** UUCP: seismo!keith
** Added NO_STDIO, opterr handling, Rich $alz (mirror!rs).
*/
#include <stdio.h>
#include <string.h>
/*
** Error macro. Maybe we want stdio, maybe we don't.
** The (undocumented?) variable opterr tells us whether or not
** to print errors.
*/
#ifdef NO_STDIO
#define tell(s) \
if (opterr) \
{ \
char ebuf[2]; \
(void)write(2, nargv, (unsigned int)strlen(nargv)); \
(void)write(2, s, (unsigned int)strlen(s)); \
ebuf[0] = optopt; \
ebuf[1] = '\n'; \
(void)write(2, ebuf, 2); \
}
#else
#define tell(s) \
if (opterr) \
(void)fputs(*nargv, stderr), \
(void)fputs(s,stderr), \
(void)fputc(optopt, stderr), \
(void)fputc('\n', stderr)
#endif
/* Global variables. */
static char EMSG[] = "";
int opterr = 1; /* undocumented error-suppressor*/
int optind = 1; /* index into argv vector */
int optopt; /* char checked for validity */
char *optarg; /* arg associated with option */
getopt(nargc, nargv, ostr)
int nargc;
char **nargv;
char *ostr;
{
static char *place = EMSG; /* option letter processing */
register char *oli; /* option letter list index */
if (!*place) /* update scanning pointer */
{
if (optind >= nargc || *(place = nargv[optind]) != '-' || !*++place)
return(EOF);
if (*place == '-') /* found "--" */
{
optind++;
return(EOF);
}
}
/* option letter okay? */
if ((optopt = *place++) == ':' || (oli = strchr(ostr, optopt)) == NULL)
{
if (!*place)
optind++;
tell(": illegal option -- ");
goto Bad;
}
if (*++oli != ':') /* don't need argument */
{
optarg = NULL;
if (!*place)
optind++;
}
else /* need an argument */
{
if (*place)
optarg = place; /* no white space */
else
if (nargc <= ++optind)
{
place = EMSG;
tell(": option requires an argument -- ");
goto Bad;
}
else
optarg = nargv[optind]; /* white space */
place = EMSG;
optind++;
}
return(optopt); /* dump back option letter */
Bad:
return('?');
}
|