~ubuntu-branches/ubuntu/natty/ntop/natty

« back to all changes in this revision

Viewing changes to getopt.c

  • Committer: Bazaar Package Importer
  • Author(s): Ludovico Cavedon, Jordan Metzmeier, Ludovico Cavedon
  • Date: 2010-12-15 20:06:19 UTC
  • mfrom: (5.1.5 sid)
  • Revision ID: james.westby@ubuntu.com-20101215200619-0ojz3iak95ihibun
Tags: 3:4.0.3+dfsg1-1
[ Jordan Metzmeier ]
* New upstream release (Closes: #522042)
* Move data files to /usr/share/ntop (Closes: #595450).
* Package architecture independent data in a separate ntop-data package.
* Use debhelper 7.
* Update Standards-Version to 3.9.1.
* Depend on python-mako.
* Do not include ntop.txt in binary packages as it is a copy of the man
  page.
* Do not include NEWS, as it is outdated.
* Switch to package source version 3.0 (quilt).
* Add password creation to debconf
* Changed init script to fix localization problems (thanks to Alejandro
  Varas <alej0varas@gmail.com>, LP: #257466)
* Remove manual update-rc.d calls from postrm and postinst. debhelper adds
  this for us.
* Add pre-depends on adduser for postinst script.
* Fix errors in the manpages: fix-manpage-errors.patch.
* Added fixes for matching active interfaces.
* Added a watch file.

[ Ludovico Cavedon ]
* Remove direct changes to upstream tree, and move them into specific patch
  files:
  - fix-manpage-errors.patch: fix typos in ntop.8.
  - dot-path.patch: fix path of /usr/bin/dot executable
* Add patches:
  - reduce-autogen-purged-files.patch: prevent agutogen.sh from reamoving
  too many files during cleanup.
  - Add build-without-ntop-darwin.patch, to fix compilation without
  ntop_darwin.c.
* No longer add faq.html, as it is not distributed in the upstream tarball.
* Use ${source:Version} in control file. Have ntop-data recommend
  ntop.
* Rename dirs to ntop.dirs and keep only empty directories that need
  to be created.
* Remove var/lib from ntop.install file, as it is empty (keeping it in
  ntop.dirs).
* Update po files.
* Breaks and Replaces instead of Conflitcs for ntop-data.
* Use a longer package description.
* Remove useless configure options from debian/rules.
* Move private shared libraries libraries in /usr/lib/ntop.
* Add change-plugin-dir.patch for adjusting plugin directory.
* Remove development files.
* Use system library for MochiKit.js.
* Rewrite DEP5 copyright file.
* Repackage upstream tarball in order to remove non-DFSG-compliant code. Add
  get-orig-source.sh script and get-orig-source target in debian/rules.
* Add explanation to README.Debian why geolocation is no longer working.
* Add avoid-copy-maxmind-db.patch to prevent copying of Geo*.dat
  files.
* Remove old unused patches.

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