"Fossies" - the Fresh Open Source Software Archive

Member "bc-1.06.95/lib/getopt1.c" (27 May 2005, 4348 Bytes) of package /linux/misc/old/bc-1.06.95.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. For more information about "getopt1.c" see the Fossies "Dox" file reference documentation.

    1 /* getopt_long and getopt_long_only entry points for GNU getopt.
    2 
    3    Copyright (C) 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996,
    4    1997, 1998, 2003 Free Software Foundation, Inc.
    5 
    6    This file is part of the GNU C Library.
    7 
    8    This program is free software; you can redistribute it and/or modify
    9    it under the terms of the GNU General Public License as published by
   10    the Free Software Foundation; either version 2, or (at your option)
   11    any later version.
   12 
   13    This program is distributed in the hope that it will be useful,
   14    but WITHOUT ANY WARRANTY; without even the implied warranty of
   15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   16    GNU General Public License for more details.
   17 
   18    You should have received a copy of the GNU General Public License along
   19    with this program; if not, write to the Free Software Foundation,
   20    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.  */
   21 
   22 #ifdef HAVE_CONFIG_H
   23 #include <config.h>
   24 #endif
   25 
   26 #ifdef _LIBC
   27 # include <getopt.h>
   28 #else
   29 # include "getopt.h"
   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 (int argc,
   65          char *const *argv,
   66          const char *options,
   67          const struct option *long_options,
   68          int *opt_index)
   69 {
   70   return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
   71 }
   72 
   73 /* Like getopt_long, but '-' as well as '--' can indicate a long option.
   74    If an option that starts with '-' (not '--') doesn't match a long option,
   75    but does match a short option, it is parsed as a short option
   76    instead.  */
   77 
   78 int
   79 getopt_long_only (int argc,
   80           char *const *argv,
   81           const char *options,
   82           const struct option *long_options,
   83           int *opt_index)
   84 {
   85   return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
   86 }
   87 
   88 # ifdef _LIBC
   89 libc_hidden_def (getopt_long)
   90 libc_hidden_def (getopt_long_only)
   91 # endif
   92 
   93 #endif  /* Not ELIDE_CODE.  */
   94 
   95 #ifdef TEST
   96 
   97 #include <stdio.h>
   98 
   99 int
  100 main (int argc, char **argv)
  101 {
  102   int c;
  103   int digit_optind = 0;
  104 
  105   while (1)
  106     {
  107       int this_option_optind = optind ? optind : 1;
  108       int option_index = 0;
  109       static struct option long_options[] =
  110       {
  111     {"add", 1, 0, 0},
  112     {"append", 0, 0, 0},
  113     {"delete", 1, 0, 0},
  114     {"verbose", 0, 0, 0},
  115     {"create", 0, 0, 0},
  116     {"file", 1, 0, 0},
  117     {0, 0, 0, 0}
  118       };
  119 
  120       c = getopt_long (argc, argv, "abc:d:0123456789",
  121                long_options, &option_index);
  122       if (c == -1)
  123     break;
  124 
  125       switch (c)
  126     {
  127     case 0:
  128       printf ("option %s", long_options[option_index].name);
  129       if (optarg)
  130         printf (" with arg %s", optarg);
  131       printf ("\n");
  132       break;
  133 
  134     case '0':
  135     case '1':
  136     case '2':
  137     case '3':
  138     case '4':
  139     case '5':
  140     case '6':
  141     case '7':
  142     case '8':
  143     case '9':
  144       if (digit_optind != 0 && digit_optind != this_option_optind)
  145         printf ("digits occur in two different argv-elements.\n");
  146       digit_optind = this_option_optind;
  147       printf ("option %c\n", c);
  148       break;
  149 
  150     case 'a':
  151       printf ("option a\n");
  152       break;
  153 
  154     case 'b':
  155       printf ("option b\n");
  156       break;
  157 
  158     case 'c':
  159       printf ("option c with value `%s'\n", optarg);
  160       break;
  161 
  162     case 'd':
  163       printf ("option d with value `%s'\n", optarg);
  164       break;
  165 
  166     case '?':
  167       break;
  168 
  169     default:
  170       printf ("?? getopt returned character code 0%o ??\n", c);
  171     }
  172     }
  173 
  174   if (optind < argc)
  175     {
  176       printf ("non-option ARGV-elements: ");
  177       while (optind < argc)
  178     printf ("%s ", argv[optind++]);
  179       printf ("\n");
  180     }
  181 
  182   exit (0);
  183 }
  184 
  185 #endif /* TEST */