"Fossies" - the Fresh Open Source Software Archive

Member "portfwd-0.29/getopt/getopt1.c" (7 Sep 2002, 4520 Bytes) of package /linux/privat/old/portfwd-0.29.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

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