1283407Sdchagin/* getopt_long and getopt_long_only entry points for GNU getopt.
2283407Sdchagin   Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
3283407Sdchagin     Free Software Foundation, Inc.
4283407Sdchagin   This file is part of the GNU C Library.
5283407Sdchagin
6283407Sdchagin   The GNU C Library is free software; you can redistribute it and/or
7283407Sdchagin   modify it under the terms of the GNU Lesser General Public
8283407Sdchagin   License as published by the Free Software Foundation; either
9283407Sdchagin   version 2.1 of the License, or (at your option) any later version.
10283407Sdchagin
11283407Sdchagin   The GNU C Library is distributed in the hope that it will be useful,
12283407Sdchagin   but WITHOUT ANY WARRANTY; without even the implied warranty of
13283407Sdchagin   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14283407Sdchagin   Lesser General Public License for more details.
15283407Sdchagin
16283407Sdchagin   You should have received a copy of the GNU Lesser General Public
17283407Sdchagin   License along with the GNU C Library; if not, write to the Free
18283407Sdchagin   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19283407Sdchagin   02111-1307 USA.  */
20283407Sdchagin
21283407Sdchagin#ifdef HAVE_CONFIG_H
22283407Sdchagin#include <config.h>
23283407Sdchagin#endif
24283407Sdchagin
25283407Sdchagin#ifdef _LIBC
26283407Sdchagin# include <getopt.h>
27283407Sdchagin#else
28283407Sdchagin# include "getopt.h"
29283407Sdchagin#endif
30283407Sdchagin
31283407Sdchagin#if !defined __STDC__ || !__STDC__
32283407Sdchagin/* This is a separate conditional since some stdc systems
33283407Sdchagin   reject `defined (const)'.  */
34283407Sdchagin#ifndef const
35283407Sdchagin#define const
36283407Sdchagin#endif
37283407Sdchagin#endif
38283407Sdchagin
39283407Sdchagin#include <stdio.h>
40283407Sdchagin
41283407Sdchagin/* Comment out all this code if we are using the GNU C Library, and are not
42283407Sdchagin   actually compiling the library itself.  This code is part of the GNU C
43283407Sdchagin   Library, but also included in many other GNU distributions.  Compiling
44283407Sdchagin   and linking in this code is a waste when using the GNU C library
45283407Sdchagin   (especially if it is a shared library).  Rather than having every GNU
46283407Sdchagin   program understand `configure --with-gnu-libc' and omit the object files,
47283407Sdchagin   it is simpler to just do this in the source for each such file.  */
48283407Sdchagin
49283407Sdchagin#define GETOPT_INTERFACE_VERSION 2
50283407Sdchagin#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
51283407Sdchagin#include <gnu-versions.h>
52283407Sdchagin#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
53283407Sdchagin#define ELIDE_CODE
54283407Sdchagin#endif
55283407Sdchagin#endif
56283407Sdchagin
57283407Sdchagin#ifndef ELIDE_CODE
58283407Sdchagin
59283407Sdchagin
60283407Sdchagin/* This needs to come after some library #include
61283407Sdchagin   to get __GNU_LIBRARY__ defined.  */
62283407Sdchagin#ifdef __GNU_LIBRARY__
63293516Sdchagin#include <stdlib.h>
64283407Sdchagin#endif
65283407Sdchagin
66283407Sdchagin#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