xref: /dragonfly/contrib/grep/lib/getopt.c (revision 7ff0fc30)
1 /* Getopt for GNU.
2    Copyright (C) 1987-2020 Free Software Foundation, Inc.
3    This file is part of the GNU C Library and is also part of gnulib.
4    Patches to this file should be submitted to both projects.
5 
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU General Public
8    License as published by the Free Software Foundation; either
9    version 3 of the License, or (at your option) any later version.
10 
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    General Public License for more details.
15 
16    You should have received a copy of the GNU General Public
17    License along with the GNU C Library; if not, see
18    <https://www.gnu.org/licenses/>.  */
19 
20 #ifndef _LIBC
21 # include <config.h>
22 #endif
23 
24 #include "getopt.h"
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <unistd.h>
30 
31 #ifdef _LIBC
32 /* When used as part of glibc, error printing must be done differently
33    for standards compliance.  getopt is not a cancellation point, so
34    it must not call functions that are, and it is specified by an
35    older standard than stdio locking, so it must not refer to
36    functions in the "user namespace" related to stdio locking.
37    Finally, it must use glibc's internal message translation so that
38    the messages are looked up in the proper text domain.  */
39 # include <libintl.h>
40 # define fprintf __fxprintf_nocancel
41 # define flockfile(fp) _IO_flockfile (fp)
42 # define funlockfile(fp) _IO_funlockfile (fp)
43 #else
44 # include "gettext.h"
45 # define _(msgid) gettext (msgid)
46 /* When used standalone, flockfile and funlockfile might not be
47    available.  */
48 # if (!defined _POSIX_THREAD_SAFE_FUNCTIONS \
49       || (defined _WIN32 && ! defined __CYGWIN__))
50 #  define flockfile(fp) /* nop */
51 #  define funlockfile(fp) /* nop */
52 # endif
53 /* When used standalone, do not attempt to use alloca.  */
54 # define __libc_use_alloca(size) 0
55 # undef alloca
56 # define alloca(size) (abort (), (void *)0)
57 #endif
58 
59 /* This implementation of 'getopt' has three modes for handling
60    options interspersed with non-option arguments.  It can stop
61    scanning for options at the first non-option argument encountered,
62    as POSIX specifies.  It can continue scanning for options after the
63    first non-option argument, but permute 'argv' as it goes so that,
64    after 'getopt' is done, all the options precede all the non-option
65    arguments and 'optind' points to the first non-option argument.
66    Or, it can report non-option arguments as if they were arguments to
67    the option character '\x01'.
68 
69    The default behavior of 'getopt_long' is to permute the argument list.
70    When this implementation is used standalone, the default behavior of
71    'getopt' is to stop at the first non-option argument, but when it is
72    used as part of GNU libc it also permutes the argument list.  In both
73    cases, setting the environment variable POSIXLY_CORRECT to any value
74    disables permutation.
75 
76    If the first character of the OPTSTRING argument to 'getopt' or
77    'getopt_long' is '+', both functions will stop at the first
78    non-option argument.  If it is '-', both functions will report
79    non-option arguments as arguments to the option character '\x01'.  */
80 
81 #include "getopt_int.h"
82 
83 /* For communication from 'getopt' to the caller.
84    When 'getopt' finds an option that takes an argument,
85    the argument value is returned here.
86    Also, when 'ordering' is RETURN_IN_ORDER,
87    each non-option ARGV-element is returned here.  */
88 
89 char *optarg;
90 
91 /* Index in ARGV of the next element to be scanned.
92    This is used for communication to and from the caller
93    and for communication between successive calls to 'getopt'.
94 
95    On entry to 'getopt', zero means this is the first call; initialize.
96 
97    When 'getopt' returns -1, this is the index of the first of the
98    non-option elements that the caller should itself scan.
99 
100    Otherwise, 'optind' communicates from one call to the next
101    how much of ARGV has been scanned so far.  */
102 
103 /* 1003.2 says this must be 1 before any call.  */
104 int optind = 1;
105 
106 /* Callers store zero here to inhibit the error message
107    for unrecognized options.  */
108 
109 int opterr = 1;
110 
111 /* Set to an option character which was unrecognized.
112    This must be initialized on some systems to avoid linking in the
113    system's own getopt implementation.  */
114 
115 int optopt = '?';
116 
117 /* Keep a global copy of all internal members of getopt_data.  */
118 
119 static struct _getopt_data getopt_data;
120 
121 /* Exchange two adjacent subsequences of ARGV.
122    One subsequence is elements [first_nonopt,last_nonopt)
123    which contains all the non-options that have been skipped so far.
124    The other is elements [last_nonopt,optind), which contains all
125    the options processed since those non-options were skipped.
126 
127    'first_nonopt' and 'last_nonopt' are relocated so that they describe
128    the new indices of the non-options in ARGV after they are moved.  */
129 
130 static void
131 exchange (char **argv, struct _getopt_data *d)
132 {
133   int bottom = d->__first_nonopt;
134   int middle = d->__last_nonopt;
135   int top = d->optind;
136   char *tem;
137 
138   /* Exchange the shorter segment with the far end of the longer segment.
139      That puts the shorter segment into the right place.
140      It leaves the longer segment in the right place overall,
141      but it consists of two parts that need to be swapped next.  */
142 
143   while (top > middle && middle > bottom)
144     {
145       if (top - middle > middle - bottom)
146 	{
147 	  /* Bottom segment is the short one.  */
148 	  int len = middle - bottom;
149 	  int i;
150 
151 	  /* Swap it with the top part of the top segment.  */
152 	  for (i = 0; i < len; i++)
153 	    {
154 	      tem = argv[bottom + i];
155 	      argv[bottom + i] = argv[top - (middle - bottom) + i];
156 	      argv[top - (middle - bottom) + i] = tem;
157 	    }
158 	  /* Exclude the moved bottom segment from further swapping.  */
159 	  top -= len;
160 	}
161       else
162 	{
163 	  /* Top segment is the short one.  */
164 	  int len = top - middle;
165 	  int i;
166 
167 	  /* Swap it with the bottom part of the bottom segment.  */
168 	  for (i = 0; i < len; i++)
169 	    {
170 	      tem = argv[bottom + i];
171 	      argv[bottom + i] = argv[middle + i];
172 	      argv[middle + i] = tem;
173 	    }
174 	  /* Exclude the moved top segment from further swapping.  */
175 	  bottom += len;
176 	}
177     }
178 
179   /* Update records for the slots the non-options now occupy.  */
180 
181   d->__first_nonopt += (d->optind - d->__last_nonopt);
182   d->__last_nonopt = d->optind;
183 }
184 
185 /* Process the argument starting with d->__nextchar as a long option.
186    d->optind should *not* have been advanced over this argument.
187 
188    If the value returned is -1, it was not actually a long option, the
189    state is unchanged, and the argument should be processed as a set
190    of short options (this can only happen when long_only is true).
191    Otherwise, the option (and its argument, if any) have been consumed
192    and the return value is the value to return from _getopt_internal_r.  */
193 static int
194 process_long_option (int argc, char **argv, const char *optstring,
195 		     const struct option *longopts, int *longind,
196 		     int long_only, struct _getopt_data *d,
197 		     int print_errors, const char *prefix)
198 {
199   char *nameend;
200   size_t namelen;
201   const struct option *p;
202   const struct option *pfound = NULL;
203   int n_options;
204   int option_index;
205 
206   for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++)
207     /* Do nothing.  */ ;
208   namelen = nameend - d->__nextchar;
209 
210   /* First look for an exact match, counting the options as a side
211      effect.  */
212   for (p = longopts, n_options = 0; p->name; p++, n_options++)
213     if (!strncmp (p->name, d->__nextchar, namelen)
214 	&& namelen == strlen (p->name))
215       {
216 	/* Exact match found.  */
217 	pfound = p;
218 	option_index = n_options;
219 	break;
220       }
221 
222   if (pfound == NULL)
223     {
224       /* Didn't find an exact match, so look for abbreviations.  */
225       unsigned char *ambig_set = NULL;
226       int ambig_malloced = 0;
227       int ambig_fallback = 0;
228       int indfound = -1;
229 
230       for (p = longopts, option_index = 0; p->name; p++, option_index++)
231 	if (!strncmp (p->name, d->__nextchar, namelen))
232 	  {
233 	    if (pfound == NULL)
234 	      {
235 		/* First nonexact match found.  */
236 		pfound = p;
237 		indfound = option_index;
238 	      }
239 	    else if (long_only
240 		     || pfound->has_arg != p->has_arg
241 		     || pfound->flag != p->flag
242 		     || pfound->val != p->val)
243 	      {
244 		/* Second or later nonexact match found.  */
245 		if (!ambig_fallback)
246 		  {
247 		    if (!print_errors)
248 		      /* Don't waste effort tracking the ambig set if
249 			 we're not going to print it anyway.  */
250 		      ambig_fallback = 1;
251 		    else if (!ambig_set)
252 		      {
253 			if (__libc_use_alloca (n_options))
254 			  ambig_set = alloca (n_options);
255 			else if ((ambig_set = malloc (n_options)) == NULL)
256 			  /* Fall back to simpler error message.  */
257 			  ambig_fallback = 1;
258 			else
259 			  ambig_malloced = 1;
260 
261 			if (ambig_set)
262 			  {
263 			    memset (ambig_set, 0, n_options);
264 			    ambig_set[indfound] = 1;
265 			  }
266 		      }
267 		    if (ambig_set)
268 		      ambig_set[option_index] = 1;
269 		  }
270 	      }
271 	  }
272 
273       if (ambig_set || ambig_fallback)
274 	{
275 	  if (print_errors)
276 	    {
277 	      if (ambig_fallback)
278 		fprintf (stderr, _("%s: option '%s%s' is ambiguous\n"),
279 			 argv[0], prefix, d->__nextchar);
280 	      else
281 		{
282 		  flockfile (stderr);
283 		  fprintf (stderr,
284 			   _("%s: option '%s%s' is ambiguous; possibilities:"),
285 			   argv[0], prefix, d->__nextchar);
286 
287 		  for (option_index = 0; option_index < n_options; option_index++)
288 		    if (ambig_set[option_index])
289 		      fprintf (stderr, " '%s%s'",
290 			       prefix, longopts[option_index].name);
291 
292 		  /* This must use 'fprintf' even though it's only
293 		     printing a single character, so that it goes through
294 		     __fxprintf_nocancel when compiled as part of glibc.  */
295 		  fprintf (stderr, "\n");
296 		  funlockfile (stderr);
297 		}
298 	    }
299 	  if (ambig_malloced)
300 	    free (ambig_set);
301 	  d->__nextchar += strlen (d->__nextchar);
302 	  d->optind++;
303 	  d->optopt = 0;
304 	  return '?';
305 	}
306 
307       option_index = indfound;
308     }
309 
310   if (pfound == NULL)
311     {
312       /* Can't find it as a long option.  If this is not getopt_long_only,
313 	 or the option starts with '--' or is not a valid short option,
314 	 then it's an error.  */
315       if (!long_only || argv[d->optind][1] == '-'
316 	  || strchr (optstring, *d->__nextchar) == NULL)
317 	{
318 	  if (print_errors)
319 	    fprintf (stderr, _("%s: unrecognized option '%s%s'\n"),
320 		     argv[0], prefix, d->__nextchar);
321 
322 	  d->__nextchar = NULL;
323 	  d->optind++;
324 	  d->optopt = 0;
325 	  return '?';
326 	}
327 
328       /* Otherwise interpret it as a short option.  */
329       return -1;
330     }
331 
332   /* We have found a matching long option.  Consume it.  */
333   d->optind++;
334   d->__nextchar = NULL;
335   if (*nameend)
336     {
337       /* Don't test has_arg with >, because some C compilers don't
338 	 allow it to be used on enums.  */
339       if (pfound->has_arg)
340 	d->optarg = nameend + 1;
341       else
342 	{
343 	  if (print_errors)
344 	    fprintf (stderr,
345 		     _("%s: option '%s%s' doesn't allow an argument\n"),
346 		     argv[0], prefix, pfound->name);
347 
348 	  d->optopt = pfound->val;
349 	  return '?';
350 	}
351     }
352   else if (pfound->has_arg == 1)
353     {
354       if (d->optind < argc)
355 	d->optarg = argv[d->optind++];
356       else
357 	{
358 	  if (print_errors)
359 	    fprintf (stderr,
360 		     _("%s: option '%s%s' requires an argument\n"),
361 		     argv[0], prefix, pfound->name);
362 
363 	  d->optopt = pfound->val;
364 	  return optstring[0] == ':' ? ':' : '?';
365 	}
366     }
367 
368   if (longind != NULL)
369     *longind = option_index;
370   if (pfound->flag)
371     {
372       *(pfound->flag) = pfound->val;
373       return 0;
374     }
375   return pfound->val;
376 }
377 
378 /* Initialize internal data upon the first call to getopt.  */
379 
380 static const char *
381 _getopt_initialize (int argc _GL_UNUSED,
382 		    char **argv _GL_UNUSED, const char *optstring,
383 		    struct _getopt_data *d, int posixly_correct)
384 {
385   /* Start processing options with ARGV-element 1 (since ARGV-element 0
386      is the program name); the sequence of previously skipped
387      non-option ARGV-elements is empty.  */
388   if (d->optind == 0)
389     d->optind = 1;
390 
391   d->__first_nonopt = d->__last_nonopt = d->optind;
392   d->__nextchar = NULL;
393 
394   /* Determine how to handle the ordering of options and nonoptions.  */
395   if (optstring[0] == '-')
396     {
397       d->__ordering = RETURN_IN_ORDER;
398       ++optstring;
399     }
400   else if (optstring[0] == '+')
401     {
402       d->__ordering = REQUIRE_ORDER;
403       ++optstring;
404     }
405   else if (posixly_correct || !!getenv ("POSIXLY_CORRECT"))
406     d->__ordering = REQUIRE_ORDER;
407   else
408     d->__ordering = PERMUTE;
409 
410   d->__initialized = 1;
411   return optstring;
412 }
413 
414 /* Scan elements of ARGV (whose length is ARGC) for option characters
415    given in OPTSTRING.
416 
417    If an element of ARGV starts with '-', and is not exactly "-" or "--",
418    then it is an option element.  The characters of this element
419    (aside from the initial '-') are option characters.  If 'getopt'
420    is called repeatedly, it returns successively each of the option characters
421    from each of the option elements.
422 
423    If 'getopt' finds another option character, it returns that character,
424    updating 'optind' and 'nextchar' so that the next call to 'getopt' can
425    resume the scan with the following option character or ARGV-element.
426 
427    If there are no more option characters, 'getopt' returns -1.
428    Then 'optind' is the index in ARGV of the first ARGV-element
429    that is not an option.  (The ARGV-elements have been permuted
430    so that those that are not options now come last.)
431 
432    OPTSTRING is a string containing the legitimate option characters.
433    If an option character is seen that is not listed in OPTSTRING,
434    return '?' after printing an error message.  If you set 'opterr' to
435    zero, the error message is suppressed but we still return '?'.
436 
437    If a char in OPTSTRING is followed by a colon, that means it wants an arg,
438    so the following text in the same ARGV-element, or the text of the following
439    ARGV-element, is returned in 'optarg'.  Two colons mean an option that
440    wants an optional arg; if there is text in the current ARGV-element,
441    it is returned in 'optarg', otherwise 'optarg' is set to zero.
442 
443    If OPTSTRING starts with '-' or '+', it requests different methods of
444    handling the non-option ARGV-elements.
445    See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
446 
447    Long-named options begin with '--' instead of '-'.
448    Their names may be abbreviated as long as the abbreviation is unique
449    or is an exact match for some defined option.  If they have an
450    argument, it follows the option name in the same ARGV-element, separated
451    from the option name by a '=', or else the in next ARGV-element.
452    When 'getopt' finds a long-named option, it returns 0 if that option's
453    'flag' field is nonzero, the value of the option's 'val' field
454    if the 'flag' field is zero.
455 
456    The elements of ARGV aren't really const, because we permute them.
457    But we pretend they're const in the prototype to be compatible
458    with other systems.
459 
460    LONGOPTS is a vector of 'struct option' terminated by an
461    element containing a name which is zero.
462 
463    LONGIND returns the index in LONGOPT of the long-named option found.
464    It is only valid when a long-named option has been found by the most
465    recent call.
466 
467    If LONG_ONLY is nonzero, '-' as well as '--' can introduce
468    long-named options.  */
469 
470 int
471 _getopt_internal_r (int argc, char **argv, const char *optstring,
472 		    const struct option *longopts, int *longind,
473 		    int long_only, struct _getopt_data *d, int posixly_correct)
474 {
475   int print_errors = d->opterr;
476 
477   if (argc < 1)
478     return -1;
479 
480   d->optarg = NULL;
481 
482   if (d->optind == 0 || !d->__initialized)
483     optstring = _getopt_initialize (argc, argv, optstring, d, posixly_correct);
484   else if (optstring[0] == '-' || optstring[0] == '+')
485     optstring++;
486 
487   if (optstring[0] == ':')
488     print_errors = 0;
489 
490   /* Test whether ARGV[optind] points to a non-option argument.  */
491 #define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')
492 
493   if (d->__nextchar == NULL || *d->__nextchar == '\0')
494     {
495       /* Advance to the next ARGV-element.  */
496 
497       /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been
498 	 moved back by the user (who may also have changed the arguments).  */
499       if (d->__last_nonopt > d->optind)
500 	d->__last_nonopt = d->optind;
501       if (d->__first_nonopt > d->optind)
502 	d->__first_nonopt = d->optind;
503 
504       if (d->__ordering == PERMUTE)
505 	{
506 	  /* If we have just processed some options following some non-options,
507 	     exchange them so that the options come first.  */
508 
509 	  if (d->__first_nonopt != d->__last_nonopt
510 	      && d->__last_nonopt != d->optind)
511 	    exchange (argv, d);
512 	  else if (d->__last_nonopt != d->optind)
513 	    d->__first_nonopt = d->optind;
514 
515 	  /* Skip any additional non-options
516 	     and extend the range of non-options previously skipped.  */
517 
518 	  while (d->optind < argc && NONOPTION_P)
519 	    d->optind++;
520 	  d->__last_nonopt = d->optind;
521 	}
522 
523       /* The special ARGV-element '--' means premature end of options.
524 	 Skip it like a null option,
525 	 then exchange with previous non-options as if it were an option,
526 	 then skip everything else like a non-option.  */
527 
528       if (d->optind != argc && !strcmp (argv[d->optind], "--"))
529 	{
530 	  d->optind++;
531 
532 	  if (d->__first_nonopt != d->__last_nonopt
533 	      && d->__last_nonopt != d->optind)
534 	    exchange (argv, d);
535 	  else if (d->__first_nonopt == d->__last_nonopt)
536 	    d->__first_nonopt = d->optind;
537 	  d->__last_nonopt = argc;
538 
539 	  d->optind = argc;
540 	}
541 
542       /* If we have done all the ARGV-elements, stop the scan
543 	 and back over any non-options that we skipped and permuted.  */
544 
545       if (d->optind == argc)
546 	{
547 	  /* Set the next-arg-index to point at the non-options
548 	     that we previously skipped, so the caller will digest them.  */
549 	  if (d->__first_nonopt != d->__last_nonopt)
550 	    d->optind = d->__first_nonopt;
551 	  return -1;
552 	}
553 
554       /* If we have come to a non-option and did not permute it,
555 	 either stop the scan or describe it to the caller and pass it by.  */
556 
557       if (NONOPTION_P)
558 	{
559 	  if (d->__ordering == REQUIRE_ORDER)
560 	    return -1;
561 	  d->optarg = argv[d->optind++];
562 	  return 1;
563 	}
564 
565       /* We have found another option-ARGV-element.
566 	 Check whether it might be a long option.  */
567       if (longopts)
568 	{
569 	  if (argv[d->optind][1] == '-')
570 	    {
571 	      /* "--foo" is always a long option.  The special option
572 		 "--" was handled above.  */
573 	      d->__nextchar = argv[d->optind] + 2;
574 	      return process_long_option (argc, argv, optstring, longopts,
575 					  longind, long_only, d,
576 					  print_errors, "--");
577 	    }
578 
579 	  /* If long_only and the ARGV-element has the form "-f",
580 	     where f is a valid short option, don't consider it an
581 	     abbreviated form of a long option that starts with f.
582 	     Otherwise there would be no way to give the -f short
583 	     option.
584 
585 	     On the other hand, if there's a long option "fubar" and
586 	     the ARGV-element is "-fu", do consider that an
587 	     abbreviation of the long option, just like "--fu", and
588 	     not "-f" with arg "u".
589 
590 	     This distinction seems to be the most useful approach.  */
591 	  if (long_only && (argv[d->optind][2]
592 			    || !strchr (optstring, argv[d->optind][1])))
593 	    {
594 	      int code;
595 	      d->__nextchar = argv[d->optind] + 1;
596 	      code = process_long_option (argc, argv, optstring, longopts,
597 					  longind, long_only, d,
598 					  print_errors, "-");
599 	      if (code != -1)
600 		return code;
601 	    }
602 	}
603 
604       /* It is not a long option.  Skip the initial punctuation.  */
605       d->__nextchar = argv[d->optind] + 1;
606     }
607 
608   /* Look at and handle the next short option-character.  */
609 
610   {
611     char c = *d->__nextchar++;
612     const char *temp = strchr (optstring, c);
613 
614     /* Increment 'optind' when we start to process its last character.  */
615     if (*d->__nextchar == '\0')
616       ++d->optind;
617 
618     if (temp == NULL || c == ':' || c == ';')
619       {
620 	if (print_errors)
621 	  fprintf (stderr, _("%s: invalid option -- '%c'\n"), argv[0], c);
622 	d->optopt = c;
623 	return '?';
624       }
625 
626     /* Convenience. Treat POSIX -W foo same as long option --foo */
627     if (temp[0] == 'W' && temp[1] == ';' && longopts != NULL)
628       {
629 	/* This is an option that requires an argument.  */
630 	if (*d->__nextchar != '\0')
631 	  d->optarg = d->__nextchar;
632 	else if (d->optind == argc)
633 	  {
634 	    if (print_errors)
635 	      fprintf (stderr,
636 		       _("%s: option requires an argument -- '%c'\n"),
637 		       argv[0], c);
638 
639 	    d->optopt = c;
640 	    if (optstring[0] == ':')
641 	      c = ':';
642 	    else
643 	      c = '?';
644 	    return c;
645 	  }
646 	else
647 	  d->optarg = argv[d->optind];
648 
649 	d->__nextchar = d->optarg;
650 	d->optarg = NULL;
651 	return process_long_option (argc, argv, optstring, longopts, longind,
652 				    0 /* long_only */, d, print_errors, "-W ");
653       }
654     if (temp[1] == ':')
655       {
656 	if (temp[2] == ':')
657 	  {
658 	    /* This is an option that accepts an argument optionally.  */
659 	    if (*d->__nextchar != '\0')
660 	      {
661 		d->optarg = d->__nextchar;
662 		d->optind++;
663 	      }
664 	    else
665 	      d->optarg = NULL;
666 	    d->__nextchar = NULL;
667 	  }
668 	else
669 	  {
670 	    /* This is an option that requires an argument.  */
671 	    if (*d->__nextchar != '\0')
672 	      {
673 		d->optarg = d->__nextchar;
674 		/* If we end this ARGV-element by taking the rest as an arg,
675 		   we must advance to the next element now.  */
676 		d->optind++;
677 	      }
678 	    else if (d->optind == argc)
679 	      {
680 		if (print_errors)
681 		  fprintf (stderr,
682 			   _("%s: option requires an argument -- '%c'\n"),
683 			   argv[0], c);
684 
685 		d->optopt = c;
686 		if (optstring[0] == ':')
687 		  c = ':';
688 		else
689 		  c = '?';
690 	      }
691 	    else
692 	      /* We already incremented 'optind' once;
693 		 increment it again when taking next ARGV-elt as argument.  */
694 	      d->optarg = argv[d->optind++];
695 	    d->__nextchar = NULL;
696 	  }
697       }
698     return c;
699   }
700 }
701 
702 int
703 _getopt_internal (int argc, char **argv, const char *optstring,
704 		  const struct option *longopts, int *longind, int long_only,
705 		  int posixly_correct)
706 {
707   int result;
708 
709   getopt_data.optind = optind;
710   getopt_data.opterr = opterr;
711 
712   result = _getopt_internal_r (argc, argv, optstring, longopts,
713 			       longind, long_only, &getopt_data,
714 			       posixly_correct);
715 
716   optind = getopt_data.optind;
717   optarg = getopt_data.optarg;
718   optopt = getopt_data.optopt;
719 
720   return result;
721 }
722 
723 /* glibc gets a LSB-compliant getopt and a POSIX-complaint __posix_getopt.
724    Standalone applications just get a POSIX-compliant getopt.
725    POSIX and LSB both require these functions to take 'char *const *argv'
726    even though this is incorrect (because of the permutation).  */
727 #define GETOPT_ENTRY(NAME, POSIXLY_CORRECT)			\
728   int								\
729   NAME (int argc, char *const *argv, const char *optstring)	\
730   {								\
731     return _getopt_internal (argc, (char **)argv, optstring,	\
732 			     0, 0, 0, POSIXLY_CORRECT);		\
733   }
734 
735 #ifdef _LIBC
736 GETOPT_ENTRY(getopt, 0)
737 GETOPT_ENTRY(__posix_getopt, 1)
738 #else
739 GETOPT_ENTRY(getopt, 1)
740 #endif
741 
742 
743 #ifdef TEST
744 
745 /* Compile with -DTEST to make an executable for use in testing
746    the above definition of 'getopt'.  */
747 
748 int
749 main (int argc, char **argv)
750 {
751   int c;
752   int digit_optind = 0;
753 
754   while (1)
755     {
756       int this_option_optind = optind ? optind : 1;
757 
758       c = getopt (argc, argv, "abc:d:0123456789");
759       if (c == -1)
760 	break;
761 
762       switch (c)
763 	{
764 	case '0':
765 	case '1':
766 	case '2':
767 	case '3':
768 	case '4':
769 	case '5':
770 	case '6':
771 	case '7':
772 	case '8':
773 	case '9':
774 	  if (digit_optind != 0 && digit_optind != this_option_optind)
775 	    printf ("digits occur in two different argv-elements.\n");
776 	  digit_optind = this_option_optind;
777 	  printf ("option %c\n", c);
778 	  break;
779 
780 	case 'a':
781 	  printf ("option a\n");
782 	  break;
783 
784 	case 'b':
785 	  printf ("option b\n");
786 	  break;
787 
788 	case 'c':
789 	  printf ("option c with value '%s'\n", optarg);
790 	  break;
791 
792 	case '?':
793 	  break;
794 
795 	default:
796 	  printf ("?? getopt returned character code 0%o ??\n", c);
797 	}
798     }
799 
800   if (optind < argc)
801     {
802       printf ("non-option ARGV-elements: ");
803       while (optind < argc)
804 	printf ("%s ", argv[optind++]);
805       printf ("\n");
806     }
807 
808   exit (0);
809 }
810 
811 #endif /* TEST */
812