(linenum→info "unix/slp.c:2238")

glibc/2.7/posix/getopt1.c

    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,2004
    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: ^L
   21: #ifdef HAVE_CONFIG_H
   22: #include <config.h>
   23: #endif
   24: 
   25: #ifdef _LIBC
   26: # include <getopt.h>
   27: #else
   28: # include "getopt.h"
   29: #endif
   30: #include "getopt_int.h"
   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, char *const *argv, const char *options,
   65:              const struct option *long_options, int *opt_index)
   66: {
   67:   return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
   68: }
   69: 
   70: int
   71: _getopt_long_r (int argc, char *const *argv, const char *options,
   72:                 const struct option *long_options, int *opt_index,
   73:                 struct _getopt_data *d)
   74: {
   75:   return _getopt_internal_r (argc, argv, options, long_options, opt_index,
   76:                              0, d);
   77: }
   78: 
   79: /* Like getopt_long, but '-' as well as '--' can indicate a long option.
   80:    If an option that starts with '-' (not '--') doesn't match a long option,
   81:    but does match a short option, it is parsed as a short option
   82:    instead.  */
   83: 
   84: int
   85: getopt_long_only (int argc, char *const *argv, const char *options,
   86:                   const struct option *long_options, int *opt_index)
   87: {
   88:   return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
   89: }
   90: 
   91: int
   92: _getopt_long_only_r (int argc, char *const *argv, const char *options,
   93:                      const struct option *long_options, int *opt_index,
   94:                      struct _getopt_data *d)
   95: {
   96:   return _getopt_internal_r (argc, argv, options, long_options, opt_index,
   97:                              1, d);
   98: }
   99: 
  100: #endif  /* Not ELIDE_CODE.  */
  101: ^L
  102: #ifdef TEST
  103: 
  104: #include <stdio.h>
  105: 
  106: int
  107: main (int argc, char **argv)
  108: {
  109:   int c;
  110:   int digit_optind = 0;
  111: 
  112:   while (1)
  113:     {
  114:       int this_option_optind = optind ? optind : 1;
  115:       int option_index = 0;
  116:       static struct option long_options[] =
  117:       {
  118:         {"add", 1, 0, 0},
  119:         {"append", 0, 0, 0},
  120:         {"delete", 1, 0, 0},
  121:         {"verbose", 0, 0, 0},
  122:         {"create", 0, 0, 0},
  123:         {"file", 1, 0, 0},
  124:         {0, 0, 0, 0}
  125:       };
  126: 
  127:       c = getopt_long (argc, argv, "abc:d:0123456789",
  128:                        long_options, &option_index);
  129:       if (c == -1)
  130:         break;
  131: 
  132:       switch (c)
  133:         {
  134:         case 0:
  135:           printf ("option %s", long_options[option_index].name);
  136:           if (optarg)
  137:             printf (" with arg %s", optarg);
  138:           printf ("\n");
  139:           break;
  140: 
  141:         case '0':
  142:         case '1':
  143:         case '2':
  144:         case '3':
  145:         case '4':
  146:         case '5':
  147:         case '6':
  148:         case '7':
  149:         case '8':
  150:         case '9':
  151:           if (digit_optind != 0 && digit_optind != this_option_optind)
  152:             printf ("digits occur in two different argv-elements.\n");
  153:           digit_optind = this_option_optind;
  154:           printf ("option %c\n", c);
  155:           break;
  156: 
  157:         case 'a':
  158:           printf ("option a\n");
  159:           break;
  160: 
  161:         case 'b':
  162:           printf ("option b\n");
  163:           break;
  164: 
  165:         case 'c':
  166:           printf ("option c with value `%s'\n", optarg);
  167:           break;
  168: 
  169:         case 'd':
  170:           printf ("option d with value `%s'\n", optarg);
  171:           break;
  172: 
  173:         case '?':
  174:           break;
  175: 
  176:         default:
  177:           printf ("?? getopt returned character code 0%o ??\n", c);
  178:         }
  179:     }
  180: 
  181:   if (optind < argc)
  182:     {
  183:       printf ("non-option ARGV-elements: ");
  184:       while (optind < argc)
  185:         printf ("%s ", argv[optind++]);
  186:       printf ("\n");
  187:     }
  188: 
  189:   exit (0);
  190: }
  191: 
  192: #endif /* TEST */
Syntax (Markdown)