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. All advertising materials mentioning features or use of this software
14
+ * must display the following acknowledgement:
15
+ * This product includes software developed by the University of
16
+ * California, Berkeley and its contributors.
17
+ * 4. Neither the name of the University nor the names of its contributors
18
+ * may be used to endorse or promote products derived from this software
19
+ * without specific prior written permission.
20
+ *
21
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
+ * SUCH DAMAGE.
32
+ */
33
+
34
+ #include "getopt.h"
35
+ #include <string.h>
36
+ #include <stdio.h>
37
+
38
+ int opterr = 1 , /* if error message should be printed */
39
+ optind = 1 , /* index into parent argv vector */
40
+ optopt , /* character checked for validity */
41
+ optreset ; /* reset getopt */
42
+ char * optarg ; /* argument associated with option */
43
+
44
+ #define BADCH (int)'?'
45
+ #define BADARG (int)':'
46
+ #define EMSG ""
47
+
48
+ /*
49
+ * getopt --
50
+ * Parse argc/argv argument vector.
51
+ *
52
+ * Note: Unlike GNU getopt(), after a non-option argument, all further
53
+ * arguments are considered also non-options. This is similar to
54
+ * the way non-GNU Unix systems work.
55
+ */
56
+ int getopt (int nargc , char * const nargv [], const char * ostr )
57
+ {
58
+ static char * place = EMSG ; /* option letter processing */
59
+ const char * oli ; /* option letter list index */
60
+
61
+ if (optreset || !* place ) { /* update scanning pointer */
62
+ optreset = 0 ;
63
+ if (optind >= nargc || * (place = nargv [optind ]) != '-' ) {
64
+ place = EMSG ;
65
+ return (-1 );
66
+ }
67
+ if (place [1 ] && * ++ place == '-' ) { /* found "--" */
68
+ ++ optind ;
69
+ place = EMSG ;
70
+ return (-1 );
71
+ }
72
+ } /* option letter okay? */
73
+ if ((optopt = (int )* place ++ ) == (int )':' ||
74
+ !(oli = strchr (ostr , optopt ))) {
75
+ /*
76
+ * if the user didn't specify '-' as an option,
77
+ * assume it means -1.
78
+ */
79
+ if (optopt == (int )'-' )
80
+ return (-1 );
81
+ if (!* place )
82
+ ++ optind ;
83
+ if (opterr && * ostr != ':' )
84
+ (void )printf ("illegal option -- %c\n" , optopt );
85
+ return (BADCH );
86
+ }
87
+ if (* ++ oli != ':' ) { /* don't need argument */
88
+ optarg = NULL ;
89
+ if (!* place )
90
+ ++ optind ;
91
+ }
92
+ else { /* need an argument */
93
+ if (* place ) /* no white space */
94
+ optarg = place ;
95
+ else if (nargc <= ++ optind ) { /* no arg */
96
+ place = EMSG ;
97
+ if (* ostr == ':' )
98
+ return (BADARG );
99
+ if (opterr )
100
+ (void )printf ("option requires an argument -- %c\n" , optopt );
101
+ return (BADCH );
102
+ }
103
+ else /* white space */
104
+ optarg = nargv [optind ];
105
+ place = EMSG ;
106
+ ++ optind ;
107
+ }
108
+ return (optopt ); /* dump back option letter */
109
+ }
110
+
0 commit comments