|
|
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, 1993
7: Free Software Foundation, Inc.
8:
9: This program is free software; you can redistribute it and/or
10: modify it under the terms of the GNU Library General Public License
11: as published by the Free Software Foundation; either version 2, or
12: (at your option) any later version.
13:
14: This program is distributed in the hope that it will be useful,
15: but WITHOUT ANY WARRANTY; without even the implied warranty of
16: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17: GNU Library General Public License for more details.
18:
19: You should have received a copy of the GNU Library General Public License
20: along with this program; if not, write to the Free Software
21: Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
22:
23: #ifdef HAVE_CONFIG_H
24: #include "config.h"
25: #endif
26:
27: #ifndef __STDC__
28: /* This is a separate conditional since some stdc systems
29: reject `defined (const)'. */
30: #ifndef const
31: #define const
32: #endif
33: #endif
34:
35: /* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */
36: #ifndef _NO_PROTO
37: #define _NO_PROTO
38: #endif
39:
40: #include <stdio.h>
41:
42: /* Comment out all this code if we are using the GNU C Library, and are not
43: actually compiling the library itself. This code is part of the GNU C
44: Library, but also included in many other GNU distributions. Compiling
45: and linking in this code is a waste when using the GNU C library
46: (especially if it is a shared library). Rather than having every GNU
47: program understand `configure --with-gnu-libc' and omit the object files,
48: it is simpler to just do this in the source for each such file. */
49:
50: #if defined (_LIBC) || !defined (__GNU_LIBRARY__)
51:
52:
53: /* This needs to come after some library #include
54: to get __GNU_LIBRARY__ defined. */
55: #ifdef __GNU_LIBRARY__
56: /* Don't include stdlib.h for non-GNU C libraries because some of them
57: contain conflicting prototypes for getopt. */
58: #include <stdlib.h>
59: #endif /* GNU C library. */
60:
61: /* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
62: long-named option. Because this is not POSIX.2 compliant, it is
63: being phased out. */
64: /* #define GETOPT_COMPAT */
65:
66: /* This version of `getopt' appears to the caller like standard Unix `getopt'
67: but it behaves differently for the user, since it allows the user
68: to intersperse the options with the other arguments.
69:
70: As `getopt' works, it permutes the elements of ARGV so that,
71: when it is done, all the options precede everything else. Thus
72: all application programs are extended to handle flexible argument order.
73:
74: Setting the environment variable POSIXLY_CORRECT disables permutation.
75: Then the behavior is completely standard.
76:
77: GNU application programs can use a third alternative mode in which
78: they can distinguish the relative order of options and other arguments. */
79:
80: #include "getopt.h"
81:
82: /* For communication from `getopt' to the caller.
83: When `getopt' finds an option that takes an argument,
84: the argument value is returned here.
85: Also, when `ordering' is RETURN_IN_ORDER,
86: each non-option ARGV-element is returned here. */
87:
88: char *optarg = 0;
89:
90: /* Index in ARGV of the next element to be scanned.
91: This is used for communication to and from the caller
92: and for communication between successive calls to `getopt'.
93:
94: On entry to `getopt', zero means this is the first call; initialize.
95:
96: When `getopt' returns EOF, this is the index of the first of the
97: non-option elements that the caller should itself scan.
98:
99: Otherwise, `optind' communicates from one call to the next
100: how much of ARGV has been scanned so far. */
101:
102: /* XXX 1003.2 says this must be 1 before any call. */
103: int optind = 0;
104:
105: /* The next char to be scanned in the option-element
106: in which the last option character we returned was found.
107: This allows us to pick up the scan where we left off.
108:
109: If this is zero, or a null string, it means resume the scan
110: by advancing to the next ARGV-element. */
111:
112: static char *nextchar;
113:
114: /* Callers store zero here to inhibit the error message
115: for unrecognized options. */
116:
117: int opterr = 1;
118:
119: /* Set to an option character which was unrecognized.
120: This must be initialized on some systems to avoid linking in the
121: system's own getopt implementation. */
122:
123: int optopt = '?';
124:
125: /* Describe how to deal with options that follow non-option ARGV-elements.
126:
127: If the caller did not specify anything,
128: the default is REQUIRE_ORDER if the environment variable
129: POSIXLY_CORRECT is defined, PERMUTE otherwise.
130:
131: REQUIRE_ORDER means don't recognize them as options;
132: stop option processing when the first non-option is seen.
133: This is what Unix does.
134: This mode of operation is selected by either setting the environment
135: variable POSIXLY_CORRECT, or using `+' as the first character
136: of the list of option characters.
137:
138: PERMUTE is the default. We permute the contents of ARGV as we scan,
139: so that eventually all the non-options are at the end. This allows options
140: to be given in any order, even with programs that were not written to
141: expect this.
142:
143: RETURN_IN_ORDER is an option available to programs that were written
144: to expect options and other ARGV-elements in any order and that care about
145: the ordering of the two. We describe each non-option ARGV-element
146: as if it were the argument of an option with character code 1.
147: Using `-' as the first character of the list of option characters
148: selects this mode of operation.
149:
150: The special argument `--' forces an end of option-scanning regardless
151: of the value of `ordering'. In the case of RETURN_IN_ORDER, only
152: `--' can cause `getopt' to return EOF with `optind' != ARGC. */
153:
154: static enum
155: {
156: REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
157: } ordering;
158:
159: #ifdef __GNU_LIBRARY__
160: /* We want to avoid inclusion of string.h with non-GNU libraries
161: because there are many ways it can cause trouble.
162: On some systems, it contains special magic macros that don't work
163: in GCC. */
164: #include <string.h>
165: #define my_index strchr
166: #else
167:
168: /* Avoid depending on library functions or files
169: whose names are inconsistent. */
170:
171: char *getenv ();
172:
173: static char *
174: my_index (str, chr)
175: const char *str;
176: int chr;
177: {
178: while (*str)
179: {
180: if (*str == chr)
181: return (char *) str;
182: str++;
183: }
184: return 0;
185: }
186:
187: /* If using GCC, we can safely declare strlen this way.
188: If not using GCC, it is ok not to declare it.
189: (Supposedly there are some machines where it might get a warning,
190: but changing this conditional to __STDC__ is too risky.) */
191: #ifdef __GNUC__
192: #ifdef IN_GCC
193: #include "gstddef.h"
194: #else
195: #include <stddef.h>
196: #endif
197: extern size_t strlen (const char *);
198: #endif
199:
200: #endif /* GNU C library. */
201:
202: /* Handle permutation of arguments. */
203:
204: /* Describe the part of ARGV that contains non-options that have
205: been skipped. `first_nonopt' is the index in ARGV of the first of them;
206: `last_nonopt' is the index after the last of them. */
207:
208: static int first_nonopt;
209: static int last_nonopt;
210:
211: /* Exchange two adjacent subsequences of ARGV.
212: One subsequence is elements [first_nonopt,last_nonopt)
213: which contains all the non-options that have been skipped so far.
214: The other is elements [last_nonopt,optind), which contains all
215: the options processed since those non-options were skipped.
216:
217: `first_nonopt' and `last_nonopt' are relocated so that they describe
218: the new indices of the non-options in ARGV after they are moved. */
219:
220: static void
221: exchange (argv)
222: char **argv;
223: {
224: int bottom = first_nonopt;
225: int middle = last_nonopt;
226: int top = optind;
227: char *tem;
228:
229: /* Exchange the shorter segment with the far end of the longer segment.
230: That puts the shorter segment into the right place.
231: It leaves the longer segment in the right place overall,
232: but it consists of two parts that need to be swapped next. */
233:
234: while (top > middle && middle > bottom)
235: {
236: if (top - middle > middle - bottom)
237: {
238: /* Bottom segment is the short one. */
239: int len = middle - bottom;
240: register int i;
241:
242: /* Swap it with the top part of the top segment. */
243: for (i = 0; i < len; i++)
244: {
245: tem = argv[bottom + i];
246: argv[bottom + i] = argv[top - (middle - bottom) + i];
247: argv[top - (middle - bottom) + i] = tem;
248: }
249: /* Exclude the moved bottom segment from further swapping. */
250: top -= len;
251: }
252: else
253: {
254: /* Top segment is the short one. */
255: int len = top - middle;
256: register int i;
257:
258: /* Swap it with the bottom part of the bottom segment. */
259: for (i = 0; i < len; i++)
260: {
261: tem = argv[bottom + i];
262: argv[bottom + i] = argv[middle + i];
263: argv[middle + i] = tem;
264: }
265: /* Exclude the moved top segment from further swapping. */
266: bottom += len;
267: }
268: }
269:
270: /* Update records for the slots the non-options now occupy. */
271:
272: first_nonopt += (optind - last_nonopt);
273: last_nonopt = optind;
274: }
275:
276: /* Scan elements of ARGV (whose length is ARGC) for option characters
277: given in OPTSTRING.
278:
279: If an element of ARGV starts with '-', and is not exactly "-" or "--",
280: then it is an option element. The characters of this element
281: (aside from the initial '-') are option characters. If `getopt'
282: is called repeatedly, it returns successively each of the option characters
283: from each of the option elements.
284:
285: If `getopt' finds another option character, it returns that character,
286: updating `optind' and `nextchar' so that the next call to `getopt' can
287: resume the scan with the following option character or ARGV-element.
288:
289: If there are no more option characters, `getopt' returns `EOF'.
290: Then `optind' is the index in ARGV of the first ARGV-element
291: that is not an option. (The ARGV-elements have been permuted
292: so that those that are not options now come last.)
293:
294: OPTSTRING is a string containing the legitimate option characters.
295: If an option character is seen that is not listed in OPTSTRING,
296: return '?' after printing an error message. If you set `opterr' to
297: zero, the error message is suppressed but we still return '?'.
298:
299: If a char in OPTSTRING is followed by a colon, that means it wants an arg,
300: so the following text in the same ARGV-element, or the text of the following
301: ARGV-element, is returned in `optarg'. Two colons mean an option that
302: wants an optional arg; if there is text in the current ARGV-element,
303: it is returned in `optarg', otherwise `optarg' is set to zero.
304:
305: If OPTSTRING starts with `-' or `+', it requests different methods of
306: handling the non-option ARGV-elements.
307: See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
308:
309: Long-named options begin with `--' instead of `-'.
310: Their names may be abbreviated as long as the abbreviation is unique
311: or is an exact match for some defined option. If they have an
312: argument, it follows the option name in the same ARGV-element, separated
313: from the option name by a `=', or else the in next ARGV-element.
314: When `getopt' finds a long-named option, it returns 0 if that option's
315: `flag' field is nonzero, the value of the option's `val' field
316: if the `flag' field is zero.
317:
318: The elements of ARGV aren't really const, because we permute them.
319: But we pretend they're const in the prototype to be compatible
320: with other systems.
321:
322: LONGOPTS is a vector of `struct option' terminated by an
323: element containing a name which is zero.
324:
325: LONGIND returns the index in LONGOPT of the long-named option found.
326: It is only valid when a long-named option has been found by the most
327: recent call.
328:
329: If LONG_ONLY is nonzero, '-' as well as '--' can introduce
330: long-named options. */
331:
332: int
333: _getopt_internal (argc, argv, optstring, longopts, longind, long_only)
334: int argc;
335: char *const *argv;
336: const char *optstring;
337: const struct option *longopts;
338: int *longind;
339: int long_only;
340: {
341: int option_index;
342:
343: optarg = 0;
344:
345: /* Initialize the internal data when the first call is made.
346: Start processing options with ARGV-element 1 (since ARGV-element 0
347: is the program name); the sequence of previously skipped
348: non-option ARGV-elements is empty. */
349:
350: if (optind == 0)
351: {
352: first_nonopt = last_nonopt = optind = 1;
353:
354: nextchar = NULL;
355:
356: /* Determine how to handle the ordering of options and nonoptions. */
357:
358: if (optstring[0] == '-')
359: {
360: ordering = RETURN_IN_ORDER;
361: ++optstring;
362: }
363: else if (optstring[0] == '+')
364: {
365: ordering = REQUIRE_ORDER;
366: ++optstring;
367: }
368: else if (getenv ("POSIXLY_CORRECT") != NULL)
369: ordering = REQUIRE_ORDER;
370: else
371: ordering = PERMUTE;
372: }
373:
374: if (nextchar == NULL || *nextchar == '\0')
375: {
376: if (ordering == PERMUTE)
377: {
378: /* If we have just processed some options following some non-options,
379: exchange them so that the options come first. */
380:
381: if (first_nonopt != last_nonopt && last_nonopt != optind)
382: exchange ((char **) argv);
383: else if (last_nonopt != optind)
384: first_nonopt = optind;
385:
386: /* Now skip any additional non-options
387: and extend the range of non-options previously skipped. */
388:
389: while (optind < argc
390: && (argv[optind][0] != '-' || argv[optind][1] == '\0')
391: #ifdef GETOPT_COMPAT
392: && (longopts == NULL
393: || argv[optind][0] != '+' || argv[optind][1] == '\0')
394: #endif /* GETOPT_COMPAT */
395: )
396: optind++;
397: last_nonopt = optind;
398: }
399:
400: /* Special ARGV-element `--' means premature end of options.
401: Skip it like a null option,
402: then exchange with previous non-options as if it were an option,
403: then skip everything else like a non-option. */
404:
405: if (optind != argc && !strcmp (argv[optind], "--"))
406: {
407: optind++;
408:
409: if (first_nonopt != last_nonopt && last_nonopt != optind)
410: exchange ((char **) argv);
411: else if (first_nonopt == last_nonopt)
412: first_nonopt = optind;
413: last_nonopt = argc;
414:
415: optind = argc;
416: }
417:
418: /* If we have done all the ARGV-elements, stop the scan
419: and back over any non-options that we skipped and permuted. */
420:
421: if (optind == argc)
422: {
423: /* Set the next-arg-index to point at the non-options
424: that we previously skipped, so the caller will digest them. */
425: if (first_nonopt != last_nonopt)
426: optind = first_nonopt;
427: return EOF;
428: }
429:
430: /* If we have come to a non-option and did not permute it,
431: either stop the scan or describe it to the caller and pass it by. */
432:
433: if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
434: #ifdef GETOPT_COMPAT
435: && (longopts == NULL
436: || argv[optind][0] != '+' || argv[optind][1] == '\0')
437: #endif /* GETOPT_COMPAT */
438: )
439: {
440: if (ordering == REQUIRE_ORDER)
441: return EOF;
442: optarg = argv[optind++];
443: return 1;
444: }
445:
446: /* We have found another option-ARGV-element.
447: Start decoding its characters. */
448:
449: nextchar = (argv[optind] + 1
450: + (longopts != NULL && argv[optind][1] == '-'));
451: }
452:
453: if (longopts != NULL
454: && ((argv[optind][0] == '-'
455: && (argv[optind][1] == '-' || long_only))
456: #ifdef GETOPT_COMPAT
457: || argv[optind][0] == '+'
458: #endif /* GETOPT_COMPAT */
459: ))
460: {
461: const struct option *p;
462: char *s = nextchar;
463: int exact = 0;
464: int ambig = 0;
465: const struct option *pfound = NULL;
466: int indfound;
467:
468: while (*s && *s != '=')
469: s++;
470:
471: /* Test all options for either exact match or abbreviated matches. */
472: for (p = longopts, option_index = 0; p->name;
473: p++, option_index++)
474: if (!strncmp (p->name, nextchar, s - nextchar))
475: {
476: if (s - nextchar == strlen (p->name))
477: {
478: /* Exact match found. */
479: pfound = p;
480: indfound = option_index;
481: exact = 1;
482: break;
483: }
484: else if (pfound == NULL)
485: {
486: /* First nonexact match found. */
487: pfound = p;
488: indfound = option_index;
489: }
490: else
491: /* Second nonexact match found. */
492: ambig = 1;
493: }
494:
495: if (ambig && !exact)
496: {
497: if (opterr)
498: fprintf (stderr, "%s: option `%s' is ambiguous\n",
499: argv[0], argv[optind]);
500: nextchar += strlen (nextchar);
501: optind++;
502: return '?';
503: }
504:
505: if (pfound != NULL)
506: {
507: option_index = indfound;
508: optind++;
509: if (*s)
510: {
511: /* Don't test has_arg with >, because some C compilers don't
512: allow it to be used on enums. */
513: if (pfound->has_arg)
514: optarg = s + 1;
515: else
516: {
517: if (opterr)
518: {
519: if (argv[optind - 1][1] == '-')
520: /* --option */
521: fprintf (stderr,
522: "%s: option `--%s' doesn't allow an argument\n",
523: argv[0], pfound->name);
524: else
525: /* +option or -option */
526: fprintf (stderr,
527: "%s: option `%c%s' doesn't allow an argument\n",
528: argv[0], argv[optind - 1][0], pfound->name);
529: }
530: nextchar += strlen (nextchar);
531: return '?';
532: }
533: }
534: else if (pfound->has_arg == 1)
535: {
536: if (optind < argc)
537: optarg = argv[optind++];
538: else
539: {
540: if (opterr)
541: fprintf (stderr, "%s: option `%s' requires an argument\n",
542: argv[0], argv[optind - 1]);
543: nextchar += strlen (nextchar);
544: return optstring[0] == ':' ? ':' : '?';
545: }
546: }
547: nextchar += strlen (nextchar);
548: if (longind != NULL)
549: *longind = option_index;
550: if (pfound->flag)
551: {
552: *(pfound->flag) = pfound->val;
553: return 0;
554: }
555: return pfound->val;
556: }
557: /* Can't find it as a long option. If this is not getopt_long_only,
558: or the option starts with '--' or is not a valid short
559: option, then it's an error.
560: Otherwise interpret it as a short option. */
561: if (!long_only || argv[optind][1] == '-'
562: #ifdef GETOPT_COMPAT
563: || argv[optind][0] == '+'
564: #endif /* GETOPT_COMPAT */
565: || my_index (optstring, *nextchar) == NULL)
566: {
567: if (opterr)
568: {
569: if (argv[optind][1] == '-')
570: /* --option */
571: fprintf (stderr, "%s: unrecognized option `--%s'\n",
572: argv[0], nextchar);
573: else
574: /* +option or -option */
575: fprintf (stderr, "%s: unrecognized option `%c%s'\n",
576: argv[0], argv[optind][0], nextchar);
577: }
578: nextchar = (char *) "";
579: optind++;
580: return '?';
581: }
582: }
583:
584: /* Look at and handle the next option-character. */
585:
586: {
587: char c = *nextchar++;
588: char *temp = my_index (optstring, c);
589:
590: /* Increment `optind' when we start to process its last character. */
591: if (*nextchar == '\0')
592: ++optind;
593:
594: if (temp == NULL || c == ':')
595: {
596: if (opterr)
597: {
598: #if 0
599: if (c < 040 || c >= 0177)
600: fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
601: argv[0], c);
602: else
603: fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c);
604: #else
605: /* 1003.2 specifies the format of this message. */
606: fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
607: #endif
608: }
609: optopt = c;
610: return '?';
611: }
612: if (temp[1] == ':')
613: {
614: if (temp[2] == ':')
615: {
616: /* This is an option that accepts an argument optionally. */
617: if (*nextchar != '\0')
618: {
619: optarg = nextchar;
620: optind++;
621: }
622: else
623: optarg = 0;
624: nextchar = NULL;
625: }
626: else
627: {
628: /* This is an option that requires an argument. */
629: if (*nextchar != '\0')
630: {
631: optarg = nextchar;
632: /* If we end this ARGV-element by taking the rest as an arg,
633: we must advance to the next element now. */
634: optind++;
635: }
636: else if (optind == argc)
637: {
638: if (opterr)
639: {
640: #if 0
641: fprintf (stderr, "%s: option `-%c' requires an argument\n",
642: argv[0], c);
643: #else
644: /* 1003.2 specifies the format of this message. */
645: fprintf (stderr, "%s: option requires an argument -- %c\n",
646: argv[0], c);
647: #endif
648: }
649: optopt = c;
650: if (optstring[0] == ':')
651: c = ':';
652: else
653: c = '?';
654: }
655: else
656: /* We already incremented `optind' once;
657: increment it again when taking next ARGV-elt as argument. */
658: optarg = argv[optind++];
659: nextchar = NULL;
660: }
661: }
662: return c;
663: }
664: }
665:
666: int
667: getopt (argc, argv, optstring)
668: int argc;
669: char *const *argv;
670: const char *optstring;
671: {
672: return _getopt_internal (argc, argv, optstring,
673: (const struct option *) 0,
674: (int *) 0,
675: 0);
676: }
677:
678: #endif /* _LIBC or not __GNU_LIBRARY__. */
679:
680: #ifdef TEST
681:
682: /* Compile with -DTEST to make an executable for use in testing
683: the above definition of `getopt'. */
684:
685: int
686: main (argc, argv)
687: int argc;
688: char **argv;
689: {
690: int c;
691: int digit_optind = 0;
692:
693: while (1)
694: {
695: int this_option_optind = optind ? optind : 1;
696:
697: c = getopt (argc, argv, "abc:d:0123456789");
698: if (c == EOF)
699: break;
700:
701: switch (c)
702: {
703: case '0':
704: case '1':
705: case '2':
706: case '3':
707: case '4':
708: case '5':
709: case '6':
710: case '7':
711: case '8':
712: case '9':
713: if (digit_optind != 0 && digit_optind != this_option_optind)
714: printf ("digits occur in two different argv-elements.\n");
715: digit_optind = this_option_optind;
716: printf ("option %c\n", c);
717: break;
718:
719: case 'a':
720: printf ("option a\n");
721: break;
722:
723: case 'b':
724: printf ("option b\n");
725: break;
726:
727: case 'c':
728: printf ("option c with value `%s'\n", optarg);
729: break;
730:
731: case '?':
732: break;
733:
734: default:
735: printf ("?? getopt returned character code 0%o ??\n", c);
736: }
737: }
738:
739: if (optind < argc)
740: {
741: printf ("non-option ARGV-elements: ");
742: while (optind < argc)
743: printf ("%s ", argv[optind++]);
744: printf ("\n");
745: }
746:
747: exit (0);
748: }
749:
750: #endif /* TEST */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.