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
70int
71getopt_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
86int
87getopt_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
98libc_hidden_def (getopt_long)
99libc_hidden_def (getopt_long_only)
100# endif
101
102#endif	/* Not ELIDE_CODE.  */
103
104#ifdef TEST
105
106#include <stdio.h>
107
108int
109main (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 */
197