File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / smartmontools / getopt / getopt1.c
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:32:16 2012 UTC (12 years, 4 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    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: #ifdef _LIBC
   26: # include <getopt.h>
   27: #else
   28: # include "getopt.h"
   29: #endif
   30: 
   31: #if !defined __STDC__ || !__STDC__
   32: /* This is a separate conditional since some stdc systems
   33:    reject `defined (const)'.  */
   34: #ifndef const
   35: #define const
   36: #endif
   37: #endif
   38: 
   39: #include <stdio.h>
   40: 
   41: /* Comment out all this code if we are using the GNU C Library, and are not
   42:    actually compiling the library itself.  This code is part of the GNU C
   43:    Library, but also included in many other GNU distributions.  Compiling
   44:    and linking in this code is a waste when using the GNU C library
   45:    (especially if it is a shared library).  Rather than having every GNU
   46:    program understand `configure --with-gnu-libc' and omit the object files,
   47:    it is simpler to just do this in the source for each such file.  */
   48: 
   49: #define GETOPT_INTERFACE_VERSION 2
   50: #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
   51: #include <gnu-versions.h>
   52: #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
   53: #define ELIDE_CODE
   54: #endif
   55: #endif
   56: 
   57: #ifndef ELIDE_CODE
   58: 
   59: 
   60: /* This needs to come after some library #include
   61:    to get __GNU_LIBRARY__ defined.  */
   62: #ifdef __GNU_LIBRARY__
   63: #include <stdlib.h>
   64: #endif
   65: 
   66: #ifndef	NULL
   67: #define NULL 0
   68: #endif
   69: 
   70: int
   71: getopt_long (argc, argv, options, long_options, opt_index)
   72:      int argc;
   73:      char *const *argv;
   74:      const char *options;
   75:      const struct option *long_options;
   76:      int *opt_index;
   77: {
   78:   return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
   79: }
   80: 
   81: /* Like getopt_long, but '-' as well as '--' can indicate a long option.
   82:    If an option that starts with '-' (not '--') doesn't match a long option,
   83:    but does match a short option, it is parsed as a short option
   84:    instead.  */
   85: 
   86: int
   87: getopt_long_only (argc, argv, options, long_options, opt_index)
   88:      int argc;
   89:      char *const *argv;
   90:      const char *options;
   91:      const struct option *long_options;
   92:      int *opt_index;
   93: {
   94:   return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
   95: }
   96: 
   97: # ifdef _LIBC
   98: libc_hidden_def (getopt_long)
   99: libc_hidden_def (getopt_long_only)
  100: # endif
  101: 
  102: #endif	/* Not ELIDE_CODE.  */
  103: 
  104: #ifdef TEST
  105: 
  106: #include <stdio.h>
  107: 
  108: int
  109: main (argc, argv)
  110:      int argc;
  111:      char **argv;
  112: {
  113:   int c;
  114:   int digit_optind = 0;
  115: 
  116:   while (1)
  117:     {
  118:       int this_option_optind = optind ? optind : 1;
  119:       int option_index = 0;
  120:       static struct option long_options[] =
  121:       {
  122: 	{"add", 1, 0, 0},
  123: 	{"append", 0, 0, 0},
  124: 	{"delete", 1, 0, 0},
  125: 	{"verbose", 0, 0, 0},
  126: 	{"create", 0, 0, 0},
  127: 	{"file", 1, 0, 0},
  128: 	{0, 0, 0, 0}
  129:       };
  130: 
  131:       c = getopt_long (argc, argv, "abc:d:0123456789",
  132: 		       long_options, &option_index);
  133:       if (c == -1)
  134: 	break;
  135: 
  136:       switch (c)
  137: 	{
  138: 	case 0:
  139: 	  printf ("option %s", long_options[option_index].name);
  140: 	  if (optarg)
  141: 	    printf (" with arg %s", optarg);
  142: 	  printf ("\n");
  143: 	  break;
  144: 
  145: 	case '0':
  146: 	case '1':
  147: 	case '2':
  148: 	case '3':
  149: 	case '4':
  150: 	case '5':
  151: 	case '6':
  152: 	case '7':
  153: 	case '8':
  154: 	case '9':
  155: 	  if (digit_optind != 0 && digit_optind != this_option_optind)
  156: 	    printf ("digits occur in two different argv-elements.\n");
  157: 	  digit_optind = this_option_optind;
  158: 	  printf ("option %c\n", c);
  159: 	  break;
  160: 
  161: 	case 'a':
  162: 	  printf ("option a\n");
  163: 	  break;
  164: 
  165: 	case 'b':
  166: 	  printf ("option b\n");
  167: 	  break;
  168: 
  169: 	case 'c':
  170: 	  printf ("option c with value `%s'\n", optarg);
  171: 	  break;
  172: 
  173: 	case 'd':
  174: 	  printf ("option d with value `%s'\n", optarg);
  175: 	  break;
  176: 
  177: 	case '?':
  178: 	  break;
  179: 
  180: 	default:
  181: 	  printf ("?? getopt returned character code 0%o ??\n", c);
  182: 	}
  183:     }
  184: 
  185:   if (optind < argc)
  186:     {
  187:       printf ("non-option ARGV-elements: ");
  188:       while (optind < argc)
  189: 	printf ("%s ", argv[optind++]);
  190:       printf ("\n");
  191:     }
  192: 
  193:   exit (0);
  194: }
  195: 
  196: #endif /* TEST */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>