libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

getopt1.c (4591B)


      1 /* getopt_long and getopt_long_only entry points for GNU getopt.
      2    Copyright Copyright (C) 1987,88,89,90,91,92,93,94,96,97 Free Software Foundation, Inc.
      3 
      4 NOTE: The canonical source of this file is maintained with the GNU C Library.
      5 Bugs can be reported to bug-glibc@prep.ai.mit.edu.
      6 
      7 This program is free software; you can redistribute it and/or modify it
      8 under the terms of the GNU General Public License as published by the
      9 Free Software Foundation; either version 2, or (at your option) any
     10 later version.
     11 
     12 This program is distributed in the hope that it will be useful,
     13 but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 GNU General Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with this program; if not, write to the Free Software
     19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
     20 USA.  */
     21 #include "config.h"
     22 #include "getopt.h"
     23 
     24 #if ! defined (__STDC__) || ! __STDC__
     25 /* This is a separate conditional since some stdc systems
     26    reject `defined (const)'.  */
     27 #ifndef const
     28 #define const
     29 #endif
     30 #endif
     31 
     32 #include <stdio.h>
     33 
     34 /* Comment out all this code if we are using the GNU C Library, and are not
     35    actually compiling the library itself.  This code is part of the GNU C
     36    Library, but also included in many other GNU distributions.  Compiling
     37    and linking in this code is a waste when using the GNU C library
     38    (especially if it is a shared library).  Rather than having every GNU
     39    program understand `configure --with-gnu-libc' and omit the object files,
     40    it is simpler to just do this in the source for each such file.  */
     41 
     42 #define GETOPT_INTERFACE_VERSION 2
     43 #if ! defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
     44 #include <gnu-versions.h>
     45 #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
     46 #define ELIDE_CODE
     47 #endif
     48 #endif
     49 
     50 #ifndef ELIDE_CODE
     51 
     52 
     53 /* This needs to come after some library #include
     54    to get __GNU_LIBRARY__ defined.  */
     55 #ifdef __GNU_LIBRARY__
     56 #include <stdlib.h>
     57 #endif
     58 
     59 #ifndef NULL
     60 #define NULL 0
     61 #endif
     62 
     63 int
     64 getopt_long (argc, argv, options, long_options, opt_index)
     65 int argc;
     66 
     67 char *const *argv;
     68 const char *options;
     69 const struct option *long_options;
     70 int *opt_index;
     71 {
     72   return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
     73 }
     74 
     75 /* Like getopt_long, but '-' as well as '--' can indicate a long option.
     76    If an option that starts with '-' (not '--') doesn't match a long option,
     77    but does match a short option, it is parsed as a short option
     78    instead.  */
     79 
     80 int
     81 getopt_long_only (argc, argv, options, long_options, opt_index)
     82 int argc;
     83 
     84 char *const *argv;
     85 const char *options;
     86 const struct option *long_options;
     87 int *opt_index;
     88 {
     89   return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
     90 }
     91 
     92 
     93 #endif /* Not ELIDE_CODE.  */
     94 
     95 #ifdef TEST
     96 
     97 #include <stdio.h>
     98 
     99 int
    100 main (argc, argv)
    101 int argc;
    102 
    103 char **argv;
    104 {
    105   int c;
    106   int digit_optind = 0;
    107 
    108   while (1)
    109   {
    110     int this_option_optind = optind ? optind : 1;
    111     int option_index = 0;
    112     static struct option long_options[] = {
    113       {"add", 1, 0, 0},
    114       {"append", 0, 0, 0},
    115       {"delete", 1, 0, 0},
    116       {"verbose", 0, 0, 0},
    117       {"create", 0, 0, 0},
    118       {"file", 1, 0, 0},
    119       {0, 0, 0, 0}
    120     };
    121 
    122     c = getopt_long (argc, argv, "abc:d:0123456789",
    123                      long_options, &option_index);
    124     if (c == -1)
    125       break;
    126 
    127     switch (c)
    128     {
    129     case 0:
    130       printf ("option %s", long_options[option_index].name);
    131       if (optarg)
    132         printf (" with arg %s", optarg);
    133       printf ("\n");
    134       break;
    135 
    136     case '0':
    137     case '1':
    138     case '2':
    139     case '3':
    140     case '4':
    141     case '5':
    142     case '6':
    143     case '7':
    144     case '8':
    145     case '9':
    146       if ((digit_optind != 0) && (digit_optind != this_option_optind) )
    147         printf ("digits occur in two different argv-elements.\n");
    148       digit_optind = this_option_optind;
    149       printf ("option %c\n", c);
    150       break;
    151 
    152     case 'a':
    153       printf ("option a\n");
    154       break;
    155 
    156     case 'b':
    157       printf ("option b\n");
    158       break;
    159 
    160     case 'c':
    161       printf ("option c with value `%s'\n", optarg);
    162       break;
    163 
    164     case 'd':
    165       printf ("option d with value `%s'\n", optarg);
    166       break;
    167 
    168     case '?':
    169       break;
    170 
    171     default:
    172       printf ("?? getopt returned character code 0%o ??\n", c);
    173     }
    174   }
    175 
    176   if (optind < argc)
    177   {
    178     printf ("non-option ARGV-elements: ");
    179     while (optind < argc)
    180       printf ("%s ", argv[optind++]);
    181     printf ("\n");
    182   }
    183 
    184   exit (0);
    185 }
    186 
    187 #endif /* TEST */