PageRenderTime 24ms CodeModel.GetById 11ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/src/compat/getopt1.c

https://code.google.com/
C | 185 lines | 124 code | 28 blank | 33 comment | 14 complexity | 7046d39b5054d58b664a4426e3ad39e9 MD5 | raw file
  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, Inc.,
 20   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
 63int
 64getopt_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
 78int
 79getopt_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
 89libc_hidden_def (getopt_long)
 90libc_hidden_def (getopt_long_only)
 91# endif
 92
 93#endif	/* Not ELIDE_CODE.  */
 94
 95#ifdef TEST
 96
 97#include <stdio.h>
 98
 99int
100main (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 */