Subversion Repositories Kolibri OS

Rev

Rev 6660 | Details | Compare with Previous | Last modification | View Log | RSS feed

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