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