annotate lib-src/getopt.c @ 5258:1ed4cefddd12

Add a couple of extra docstring backslashes, #'format-time-string 2010-09-05 Aidan Kehoe <kehoea@parhasard.net> * editfns.c (Fformat_time_string): Use two backslashes so that there is at least one present in the output of describe function, when describing the Roman month number syntax in this function's docstring. Thanks for provoking me to look at this, Stephen Turnbull.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 05 Sep 2010 19:22:37 +0100
parents abe6d1db359e
children 061f4f90f874
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* Getopt for GNU.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 NOTE: getopt is now part of the C library, so if you don't know what
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 before changing it!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 NOTE: The canonical source of this file is maintained with the GNU C Library.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 Bugs can be reported to bug-glibc@prep.ai.mit.edu.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 This program is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 This program is distributed in the hope that it will be useful,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 GNU General Public License for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 along with this program; if not, write to the Free Software
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 Ditto for AIX 3.2 and <stdlib.h>. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #ifndef _NO_PROTO
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #define _NO_PROTO
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #ifdef HAVE_CONFIG_H
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 428
diff changeset
34 #include <config.h>
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include <stdio.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include <string.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 /* Comment out all this code if we are using the GNU C Library, and are not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 actually compiling the library itself. This code is part of the GNU C
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 Library, but also included in many other GNU distributions. Compiling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 and linking in this code is a waste when using the GNU C library
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 (especially if it is a shared library). Rather than having every GNU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 program understand `configure --with-gnu-libc' and omit the object files,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 it is simpler to just do this in the source for each such file. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 #define GETOPT_INTERFACE_VERSION 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 #if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 #include <gnu-versions.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 #define ELIDE_CODE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 #ifndef ELIDE_CODE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 /* This needs to come after some library #include
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 to get __GNU_LIBRARY__ defined. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 #ifdef __GNU_LIBRARY__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 /* Don't include stdlib.h for non-GNU C libraries because some of them
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 contain conflicting prototypes for getopt. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 #include <stdlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 #include <unistd.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 #endif /* GNU C library. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 #ifdef VMS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 #include <unixlib.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 #if HAVE_STRING_H - 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 #include <string.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 438
diff changeset
76 #if defined (WIN32_NATIVE) && !defined (CYGWIN)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 /* It's not Unix, really. See? Capital letters. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 #include <windows.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 #undef getpid
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 #define getpid() GetCurrentProcessId()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 #ifndef _
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 /* This is for other GNU distributions with internationalized messages.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 When compiling libc, the _ macro is predefined. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 #ifdef HAVE_LIBINTL_H
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 # include <libintl.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 # define _(msgid) gettext (msgid)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 # define _(msgid) (msgid)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 /* This version of `getopt' appears to the caller like standard Unix `getopt'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 but it behaves differently for the user, since it allows the user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 to intersperse the options with the other arguments.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 As `getopt' works, it permutes the elements of ARGV so that,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 when it is done, all the options precede everything else. Thus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 all application programs are extended to handle flexible argument order.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 Setting the environment variable POSIXLY_CORRECT disables permutation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 Then the behavior is completely standard.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 GNU application programs can use a third alternative mode in which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 they can distinguish the relative order of options and other arguments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 #include "getopt.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 /* For communication from `getopt' to the caller.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 When `getopt' finds an option that takes an argument,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 the argument value is returned here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 Also, when `ordering' is RETURN_IN_ORDER,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 each non-option ARGV-element is returned here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 char *optarg = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 /* Index in ARGV of the next element to be scanned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 This is used for communication to and from the caller
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 and for communication between successive calls to `getopt'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 On entry to `getopt', zero means this is the first call; initialize.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 When `getopt' returns -1, this is the index of the first of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 non-option elements that the caller should itself scan.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 Otherwise, `optind' communicates from one call to the next
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 how much of ARGV has been scanned so far. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 /* 1003.2 says this must be 1 before any call. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 int optind = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 /* Formerly, initialization of getopt depended on optind==0, which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 causes problems with re-calling getopt as programs generally don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 know that. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 int __getopt_initialized = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 /* The next char to be scanned in the option-element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 in which the last option character we returned was found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 This allows us to pick up the scan where we left off.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 If this is zero, or a null string, it means resume the scan
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 by advancing to the next ARGV-element. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 static char *nextchar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 /* Callers store zero here to inhibit the error message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 for unrecognized options. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 int opterr = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 /* Set to an option character which was unrecognized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 This must be initialized on some systems to avoid linking in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 system's own getopt implementation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 int optopt = '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 /* Describe how to deal with options that follow non-option ARGV-elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 If the caller did not specify anything,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 the default is REQUIRE_ORDER if the environment variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 POSIXLY_CORRECT is defined, PERMUTE otherwise.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 REQUIRE_ORDER means don't recognize them as options;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 stop option processing when the first non-option is seen.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 This is what Unix does.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 This mode of operation is selected by either setting the environment
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 variable POSIXLY_CORRECT, or using `+' as the first character
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 of the list of option characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 PERMUTE is the default. We permute the contents of ARGV as we scan,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 so that eventually all the non-options are at the end. This allows options
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 to be given in any order, even with programs that were not written to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 expect this.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 RETURN_IN_ORDER is an option available to programs that were written
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 to expect options and other ARGV-elements in any order and that care about
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 the ordering of the two. We describe each non-option ARGV-element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 as if it were the argument of an option with character code 1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 Using `-' as the first character of the list of option characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 selects this mode of operation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 The special argument `--' forces an end of option-scanning regardless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 of the value of `ordering'. In the case of RETURN_IN_ORDER, only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 `--' can cause `getopt' to return -1 with `optind' != ARGC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 static enum
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 } ordering;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 /* Value of POSIXLY_CORRECT environment variable. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 static char *posixly_correct;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 #ifdef __GNU_LIBRARY__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 /* We want to avoid inclusion of string.h with non-GNU libraries
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 because there are many ways it can cause trouble.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 On some systems, it contains special magic macros that don't work
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 in GCC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 #include <string.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 #define my_index strchr
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 static char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 my_index (const char *str, int chr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 while (*str)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 if (*str == chr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 return (char *) str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 str++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 /* If using GCC, we can safely declare strlen this way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 If not using GCC, it is ok not to declare it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 #ifdef __GNUC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 That was relevant to code that was here before. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 #if !defined (__STDC__) || !__STDC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 /* gcc with -traditional declares the built-in strlen to return int,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 and has done so at least since version 2.4.5. -- rms. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 extern int strlen (const char *);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 #endif /* not __STDC__ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 #endif /* __GNUC__ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 #endif /* not __GNU_LIBRARY__ */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 /* Handle permutation of arguments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 /* Describe the part of ARGV that contains non-options that have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 been skipped. `first_nonopt' is the index in ARGV of the first of them;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 `last_nonopt' is the index after the last of them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 static int first_nonopt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 static int last_nonopt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 #ifdef _LIBC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 /* Bash 2.0 gives us an environment variable containing flags
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 indicating ARGV elements that should not be considered arguments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 /* Defined in getopt_init.c */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 extern char *__getopt_nonoption_flags;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 static int nonoption_flags_max_len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 static int nonoption_flags_len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 static int original_argc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 static char *const *original_argv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 extern pid_t __libc_pid;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 /* Make sure the environment variable bash 2.0 puts in the environment
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 is valid for the getopt call we must make sure that the ARGV passed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 to getopt is that one passed to the process. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 __attribute__ ((unused))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 store_args_and_env (int argc, char *const *argv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 /* XXX This is no good solution. We should rather copy the args so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 that we can compare them later. But we must not use malloc(3). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 original_argc = argc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 original_argv = argv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 text_set_element (__libc_subinit, store_args_and_env);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 # define SWAP_FLAGS(ch1, ch2) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 if (nonoption_flags_len > 0) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 char __tmp = __getopt_nonoption_flags[ch1]; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 __getopt_nonoption_flags[ch2] = __tmp; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 #else /* !_LIBC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 # define SWAP_FLAGS(ch1, ch2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 #endif /* _LIBC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 /* Exchange two adjacent subsequences of ARGV.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 One subsequence is elements [first_nonopt,last_nonopt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 which contains all the non-options that have been skipped so far.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 The other is elements [last_nonopt,optind), which contains all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 the options processed since those non-options were skipped.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 `first_nonopt' and `last_nonopt' are relocated so that they describe
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 the new indices of the non-options in ARGV after they are moved. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 #if defined (__STDC__) && __STDC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 static void exchange (char **);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 exchange (char **argv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 int bottom = first_nonopt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 int middle = last_nonopt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 int top = optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 char *tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 /* Exchange the shorter segment with the far end of the longer segment.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 That puts the shorter segment into the right place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 It leaves the longer segment in the right place overall,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 but it consists of two parts that need to be swapped next. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 #ifdef _LIBC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 /* First make sure the handling of the `__getopt_nonoption_flags'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 string can work normally. Our top argument must be in the range
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 of the string. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 /* We must extend the array. The user plays games with us and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 presents new arguments. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 char *new_str = malloc (top + 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 if (new_str == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 nonoption_flags_len = nonoption_flags_max_len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 memcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 memset (&new_str[nonoption_flags_max_len], '\0',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 top + 1 - nonoption_flags_max_len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 nonoption_flags_max_len = top + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 __getopt_nonoption_flags = new_str;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 while (top > middle && middle > bottom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 if (top - middle > middle - bottom)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 /* Bottom segment is the short one. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 int len = middle - bottom;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 register int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 /* Swap it with the top part of the top segment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 for (i = 0; i < len; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 tem = argv[bottom + i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 argv[bottom + i] = argv[top - (middle - bottom) + i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 argv[top - (middle - bottom) + i] = tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 SWAP_FLAGS (bottom + i, top - (middle - bottom) + i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 /* Exclude the moved bottom segment from further swapping. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 top -= len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 /* Top segment is the short one. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 int len = top - middle;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 register int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 /* Swap it with the bottom part of the bottom segment. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 for (i = 0; i < len; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 tem = argv[bottom + i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 argv[bottom + i] = argv[middle + i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 argv[middle + i] = tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 SWAP_FLAGS (bottom + i, middle + i);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 /* Exclude the moved top segment from further swapping. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 bottom += len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 /* Update records for the slots the non-options now occupy. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 first_nonopt += (optind - last_nonopt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 last_nonopt = optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 /* Initialize the internal data when the first call is made. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 #if defined (__STDC__) && __STDC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 static const char *_getopt_initialize (int, char *const *, const char *);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 static const char *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 _getopt_initialize (int argc, char *const *argv, const char *optstring)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 /* Start processing options with ARGV-element 1 (since ARGV-element 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 is the program name); the sequence of previously skipped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 non-option ARGV-elements is empty. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 first_nonopt = last_nonopt = optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 nextchar = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388 posixly_correct = getenv ("POSIXLY_CORRECT");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 /* Determine how to handle the ordering of options and nonoptions. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 if (optstring[0] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 ordering = RETURN_IN_ORDER;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 ++optstring;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 else if (optstring[0] == '+')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 ordering = REQUIRE_ORDER;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 ++optstring;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 else if (posixly_correct != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 ordering = REQUIRE_ORDER;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 ordering = PERMUTE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 #ifdef _LIBC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 if (posixly_correct == NULL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 && argc == original_argc && argv == original_argv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 if (nonoption_flags_max_len == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 if (__getopt_nonoption_flags == NULL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 || __getopt_nonoption_flags[0] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 nonoption_flags_max_len = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 const char *orig_str = __getopt_nonoption_flags;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 int len = nonoption_flags_max_len = strlen (orig_str);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 if (nonoption_flags_max_len < argc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 nonoption_flags_max_len = argc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 __getopt_nonoption_flags =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 (char *) malloc (nonoption_flags_max_len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 if (__getopt_nonoption_flags == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 nonoption_flags_max_len = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 memcpy (__getopt_nonoption_flags, orig_str, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 memset (&__getopt_nonoption_flags[len], '\0',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 nonoption_flags_max_len - len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 nonoption_flags_len = nonoption_flags_max_len;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 nonoption_flags_len = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 return optstring;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 /* Scan elements of ARGV (whose length is ARGC) for option characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 given in OPTSTRING.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 If an element of ARGV starts with '-', and is not exactly "-" or "--",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 then it is an option element. The characters of this element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 (aside from the initial '-') are option characters. If `getopt'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 is called repeatedly, it returns successively each of the option characters
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 from each of the option elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 If `getopt' finds another option character, it returns that character,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 updating `optind' and `nextchar' so that the next call to `getopt' can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 resume the scan with the following option character or ARGV-element.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 If there are no more option characters, `getopt' returns -1.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 Then `optind' is the index in ARGV of the first ARGV-element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 that is not an option. (The ARGV-elements have been permuted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 so that those that are not options now come last.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 OPTSTRING is a string containing the legitimate option characters.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 If an option character is seen that is not listed in OPTSTRING,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 return '?' after printing an error message. If you set `opterr' to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 zero, the error message is suppressed but we still return '?'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 If a char in OPTSTRING is followed by a colon, that means it wants an arg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 so the following text in the same ARGV-element, or the text of the following
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 ARGV-element, is returned in `optarg'. Two colons mean an option that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 wants an optional arg; if there is text in the current ARGV-element,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 it is returned in `optarg', otherwise `optarg' is set to zero.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 If OPTSTRING starts with `-' or `+', it requests different methods of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 handling the non-option ARGV-elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 Long-named options begin with `--' instead of `-'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 Their names may be abbreviated as long as the abbreviation is unique
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 or is an exact match for some defined option. If they have an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 argument, it follows the option name in the same ARGV-element, separated
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 from the option name by a `=', or else the in next ARGV-element.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 When `getopt' finds a long-named option, it returns 0 if that option's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 `flag' field is nonzero, the value of the option's `val' field
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 if the `flag' field is zero.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 The elements of ARGV aren't really const, because we permute them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 But we pretend they're const in the prototype to be compatible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 with other systems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 LONGOPTS is a vector of `struct option' terminated by an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 element containing a name which is zero.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 LONGIND returns the index in LONGOPT of the long-named option found.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 It is only valid when a long-named option has been found by the most
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 recent call.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 If LONG_ONLY is nonzero, '-' as well as '--' can introduce
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 long-named options. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 _getopt_internal (int argc, char *const *argv, const char *optstring,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 const struct option *longopts, int *longind, int long_only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 optarg = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 if (optind == 0 || !__getopt_initialized)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 if (optind == 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 optind = 1; /* Don't scan ARGV[0], the program name. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 optstring = _getopt_initialize (argc, argv, optstring);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 __getopt_initialized = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 /* Test whether ARGV[optind] points to a non-option argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 Either it does not have option syntax, or there is an environment flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 from the shell indicating it is not an option. The later information
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 is only used when the used in the GNU libc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 #ifdef _LIBC
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 #define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 || (optind < nonoption_flags_len \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 && __getopt_nonoption_flags[optind] == '1'))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 #define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 if (nextchar == NULL || *nextchar == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 /* Advance to the next ARGV-element. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 moved back by the user (who may also have changed the arguments). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 if (last_nonopt > optind)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 last_nonopt = optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 if (first_nonopt > optind)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 first_nonopt = optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 if (ordering == PERMUTE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 /* If we have just processed some options following some non-options,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 exchange them so that the options come first. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 if (first_nonopt != last_nonopt && last_nonopt != optind)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 exchange ((char **) argv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 else if (last_nonopt != optind)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 first_nonopt = optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 /* Skip any additional non-options
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 and extend the range of non-options previously skipped. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 while (optind < argc && NONOPTION_P)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 optind++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 last_nonopt = optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 /* The special ARGV-element `--' means premature end of options.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 Skip it like a null option,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 then exchange with previous non-options as if it were an option,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 then skip everything else like a non-option. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 if (optind != argc && !strcmp (argv[optind], "--"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 optind++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 if (first_nonopt != last_nonopt && last_nonopt != optind)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 exchange ((char **) argv);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 else if (first_nonopt == last_nonopt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 first_nonopt = optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 last_nonopt = argc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 optind = argc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 /* If we have done all the ARGV-elements, stop the scan
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 and back over any non-options that we skipped and permuted. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 if (optind == argc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 /* Set the next-arg-index to point at the non-options
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 that we previously skipped, so the caller will digest them. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 if (first_nonopt != last_nonopt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 optind = first_nonopt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 /* If we have come to a non-option and did not permute it,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 either stop the scan or describe it to the caller and pass it by. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 if (NONOPTION_P)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 if (ordering == REQUIRE_ORDER)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 return -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 optarg = argv[optind++];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 /* We have found another option-ARGV-element.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 Skip the initial punctuation. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 nextchar = (argv[optind] + 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 + (longopts != NULL && argv[optind][1] == '-'));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 /* Decode the current option-ARGV-element. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 /* Check whether the ARGV-element is a long option.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 If long_only and the ARGV-element has the form "-f", where f is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 a valid short option, don't consider it an abbreviated form of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 a long option that starts with f. Otherwise there would be no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 way to give the -f short option.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 On the other hand, if there's a long option "fubar" and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 the ARGV-element is "-fu", do consider that an abbreviation of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 the long option, just like "--fu", and not "-f" with arg "u".
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 This distinction seems to be the most useful approach. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 if (longopts != NULL
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 && (argv[optind][1] == '-'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1])))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 char *nameend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 const struct option *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 const struct option *pfound = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 int exact = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 int ambig = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 int indfound = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 int option_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 for (nameend = nextchar; *nameend && *nameend != '='; nameend++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 /* Do nothing. */ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 /* Test all long options for either exact match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 or abbreviated matches. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 for (p = longopts, option_index = 0; p->name; p++, option_index++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 if (!strncmp (p->name, nextchar, nameend - nextchar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 if ((unsigned int) (nameend - nextchar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 == (unsigned int) strlen (p->name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 /* Exact match found. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 pfound = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 indfound = option_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 exact = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 else if (pfound == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 /* First nonexact match found. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 pfound = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 indfound = option_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 /* Second or later nonexact match found. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 ambig = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 if (ambig && !exact)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 if (opterr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 fprintf (stderr, _("%s: option `%s' is ambiguous\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 argv[0], argv[optind]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 nextchar += strlen (nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 optind++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 optopt = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 return '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 if (pfound != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 option_index = indfound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 optind++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 if (*nameend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 /* Don't test has_arg with >, because some C compilers don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 allow it to be used on enums. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 if (pfound->has_arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 optarg = nameend + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 if (opterr) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 if (argv[optind - 1][1] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 /* --option */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 fprintf (stderr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 _("%s: option `--%s' doesn't allow an argument\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 argv[0], pfound->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 /* +option or -option */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 fprintf (stderr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 _("%s: option `%c%s' doesn't allow an argument\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 argv[0], argv[optind - 1][0], pfound->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 nextchar += strlen (nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 optopt = pfound->val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 return '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 else if (pfound->has_arg == 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 if (optind < argc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 optarg = argv[optind++];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 if (opterr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 fprintf (stderr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 _("%s: option `%s' requires an argument\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 argv[0], argv[optind - 1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 nextchar += strlen (nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 optopt = pfound->val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 return optstring[0] == ':' ? ':' : '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 nextchar += strlen (nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 if (longind != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 *longind = option_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 if (pfound->flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 *(pfound->flag) = pfound->val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 return pfound->val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 /* Can't find it as a long option. If this is not getopt_long_only,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 or the option starts with '--' or is not a valid short
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 option, then it's an error.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 Otherwise interpret it as a short option. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 if (!long_only || argv[optind][1] == '-'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 || my_index (optstring, *nextchar) == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 if (opterr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 if (argv[optind][1] == '-')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 /* --option */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 fprintf (stderr, _("%s: unrecognized option `--%s'\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 argv[0], nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 /* +option or -option */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 fprintf (stderr, _("%s: unrecognized option `%c%s'\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 argv[0], argv[optind][0], nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 nextchar = (char *) "";
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 optind++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 optopt = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 return '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 /* Look at and handle the next short option-character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 char c = *nextchar++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 char *temp = my_index (optstring, c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 /* Increment `optind' when we start to process its last character. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 if (*nextchar == '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 ++optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 if (temp == NULL || c == ':')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 if (opterr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 if (posixly_correct)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 /* 1003.2 specifies the format of this message. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 fprintf (stderr, _("%s: illegal option -- %c\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 argv[0], c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 fprintf (stderr, _("%s: invalid option -- %c\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 argv[0], c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 optopt = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 return '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 /* Convenience. Treat POSIX -W foo same as long option --foo */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 if (temp[0] == 'W' && temp[1] == ';')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 char *nameend;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 const struct option *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 const struct option *pfound = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 int exact = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 int ambig = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 int indfound = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 int option_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 /* This is an option that requires an argument. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 if (*nextchar != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 optarg = nextchar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 /* If we end this ARGV-element by taking the rest as an arg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 we must advance to the next element now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 optind++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 else if (optind == argc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 if (opterr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 /* 1003.2 specifies the format of this message. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 fprintf (stderr, _("%s: option requires an argument -- %c\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 argv[0], c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 optopt = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 if (optstring[0] == ':')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 c = ':';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 c = '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 return c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 /* We already incremented `optind' once;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 increment it again when taking next ARGV-elt as argument. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 optarg = argv[optind++];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 /* optarg is now the argument, see if it's in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 table of longopts. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 /* Do nothing. */ ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 /* Test all long options for either exact match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 or abbreviated matches. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 for (p = longopts, option_index = 0; p->name; p++, option_index++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 if (!strncmp (p->name, nextchar, nameend - nextchar))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 if ((unsigned int) (nameend - nextchar) == strlen (p->name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 /* Exact match found. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 pfound = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 indfound = option_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 exact = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 else if (pfound == NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 /* First nonexact match found. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 pfound = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 indfound = option_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 /* Second or later nonexact match found. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 ambig = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 if (ambig && !exact)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 if (opterr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 argv[0], argv[optind]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 nextchar += strlen (nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 optind++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 return '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 if (pfound != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 option_index = indfound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 if (*nameend)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 /* Don't test has_arg with >, because some C compilers don't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 allow it to be used on enums. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 if (pfound->has_arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 optarg = nameend + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 if (opterr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 fprintf (stderr, _("\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 %s: option `-W %s' doesn't allow an argument\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 argv[0], pfound->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 nextchar += strlen (nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 return '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 else if (pfound->has_arg == 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 if (optind < argc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 optarg = argv[optind++];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 if (opterr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 fprintf (stderr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 _("%s: option `%s' requires an argument\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 argv[0], argv[optind - 1]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 nextchar += strlen (nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 return optstring[0] == ':' ? ':' : '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 nextchar += strlen (nextchar);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 if (longind != NULL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 *longind = option_index;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 if (pfound->flag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 *(pfound->flag) = pfound->val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 return pfound->val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 nextchar = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 return 'W'; /* Let the application handle it. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 if (temp[1] == ':')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 if (temp[2] == ':')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 /* This is an option that accepts an argument optionally. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 if (*nextchar != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 optarg = nextchar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 optind++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 optarg = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 nextchar = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 /* This is an option that requires an argument. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 if (*nextchar != '\0')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 optarg = nextchar;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 /* If we end this ARGV-element by taking the rest as an arg,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 we must advance to the next element now. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 optind++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 else if (optind == argc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 if (opterr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 /* 1003.2 specifies the format of this message. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 fprintf (stderr,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 _("%s: option requires an argument -- %c\n"),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 argv[0], c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 optopt = c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 if (optstring[0] == ':')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 c = ':';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 c = '?';
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 /* We already incremented `optind' once;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 increment it again when taking next ARGV-elt as argument. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 optarg = argv[optind++];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 nextchar = NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 return c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 getopt (int argc, char *const *argv, const char *optstring)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 return _getopt_internal (argc, argv, optstring,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 (const struct option *) 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953 (int *) 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 #endif /* Not ELIDE_CODE. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 #ifdef TEST
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 /* Compile with -DTEST to make an executable for use in testing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 the above definition of `getopt'. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 main (int argc, char **argv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 int c;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 int digit_optind = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 while (1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 int this_option_optind = optind ? optind : 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 c = getopt (argc, argv, "abc:d:0123456789");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 if (c == -1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 switch (c)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 case '0':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 case '1':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 case '2':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 case '3':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 case '4':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 case '5':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 case '6':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 case '7':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 case '8':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 case '9':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 if (digit_optind != 0 && digit_optind != this_option_optind)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 printf ("digits occur in two different argv-elements.\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 digit_optind = this_option_optind;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 printf ("option %c\n", c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 case 'a':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 printf ("option a\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 case 'b':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 printf ("option b\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 case 'c':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 printf ("option c with value `%s'\n", optarg);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 case '?':
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 printf ("?? getopt returned character code 0%o ??\n", c);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 if (optind < argc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 printf ("non-option ARGV-elements: ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 while (optind < argc)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 printf ("%s ", argv[optind++]);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 printf ("\n");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 exit (0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 #endif /* TEST */