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