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