~ubuntu-branches/ubuntu/raring/smartmontools/raring

« back to all changes in this revision

Viewing changes to posix/getopt.c

  • Committer: Bazaar Package Importer
  • Author(s): Giuseppe Iuculano
  • Date: 2010-07-13 13:16:54 UTC
  • mfrom: (2.2.13 sid)
  • Revision ID: james.westby@ubuntu.com-20100713131654-k5wd1maqujl2uufp
Tags: 5.39.1+svn3124-1
* [1e46e09] Set state and attribute file directory to
  /var/lib/smartmontools/ (Closes: #582158)
* [e20147c] Don't warn about being disabled unless verbose (Closes: #583386)
* [3390c07] Fixed example path in man pages (Closes: #588134)
* [e9583e0] Imported Upstream version 5.39.1+svn3124
* [789e123] Refreshed patches
* [cbecf14] Bump to Standards-Version 3.9.0, no changes needed

Show diffs side-by-side

added added

removed removed

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