]> git.ipfire.org Git - thirdparty/gcc.git/blame - libiberty/getopt1.c
* cplus-dem.c: Add license exception to copyright notice.
[thirdparty/gcc.git] / libiberty / getopt1.c
CommitLineData
6599da04 1/* getopt_long and getopt_long_only entry points for GNU getopt.
7520c31b
JL
2 Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
3 Free Software Foundation, Inc.
6599da04 4
584932e9
DD
5 NOTE: This source is derived from an old version taken from the GNU C
6 Library (glibc).
b134508b
ILT
7
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any
11 later version.
6599da04
JM
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
b134508b 16 GNU General Public License for more details.
6599da04 17
b134508b 18 You should have received a copy of the GNU General Public License
6599da04 19 along with this program; if not, write to the Free Software
b134508b
ILT
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
21 USA. */
6599da04
JM
22\f
23#ifdef HAVE_CONFIG_H
6599da04 24#include <config.h>
6599da04
JM
25#endif
26
27#include "getopt.h"
28
7520c31b 29#if !defined __STDC__ || !__STDC__
6599da04
JM
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. */
6599da04 46
b134508b 47#define GETOPT_INTERFACE_VERSION 2
7520c31b 48#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
b134508b
ILT
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
6599da04
JM
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>
6599da04
JM
62#endif
63
64#ifndef NULL
65#define NULL 0
66#endif
67
68int
69getopt_long (argc, argv, options, long_options, opt_index)
70 int argc;
71 char *const *argv;
72 const char *options;
73 const struct option *long_options;
74 int *opt_index;
75{
76 return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
77}
78
79/* Like getopt_long, but '-' as well as '--' can indicate a long option.
80 If an option that starts with '-' (not '--') doesn't match a long option,
81 but does match a short option, it is parsed as a short option
82 instead. */
83
84int
85getopt_long_only (argc, argv, options, long_options, opt_index)
86 int argc;
87 char *const *argv;
88 const char *options;
89 const struct option *long_options;
90 int *opt_index;
91{
92 return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
93}
94
95
b134508b 96#endif /* Not ELIDE_CODE. */
6599da04
JM
97\f
98#ifdef TEST
99
100#include <stdio.h>
101
102int
103main (argc, argv)
104 int argc;
105 char **argv;
106{
107 int c;
108 int digit_optind = 0;
109
110 while (1)
111 {
112 int this_option_optind = optind ? optind : 1;
113 int option_index = 0;
114 static struct option long_options[] =
115 {
116 {"add", 1, 0, 0},
117 {"append", 0, 0, 0},
118 {"delete", 1, 0, 0},
119 {"verbose", 0, 0, 0},
120 {"create", 0, 0, 0},
121 {"file", 1, 0, 0},
122 {0, 0, 0, 0}
123 };
124
125 c = getopt_long (argc, argv, "abc:d:0123456789",
126 long_options, &option_index);
b134508b 127 if (c == -1)
6599da04
JM
128 break;
129
130 switch (c)
131 {
132 case 0:
133 printf ("option %s", long_options[option_index].name);
134 if (optarg)
135 printf (" with arg %s", optarg);
136 printf ("\n");
137 break;
138
139 case '0':
140 case '1':
141 case '2':
142 case '3':
143 case '4':
144 case '5':
145 case '6':
146 case '7':
147 case '8':
148 case '9':
149 if (digit_optind != 0 && digit_optind != this_option_optind)
150 printf ("digits occur in two different argv-elements.\n");
151 digit_optind = this_option_optind;
152 printf ("option %c\n", c);
153 break;
154
155 case 'a':
156 printf ("option a\n");
157 break;
158
159 case 'b':
160 printf ("option b\n");
161 break;
162
163 case 'c':
164 printf ("option c with value `%s'\n", optarg);
165 break;
166
167 case 'd':
168 printf ("option d with value `%s'\n", optarg);
169 break;
170
171 case '?':
172 break;
173
174 default:
175 printf ("?? getopt returned character code 0%o ??\n", c);
176 }
177 }
178
179 if (optind < argc)
180 {
181 printf ("non-option ARGV-elements: ");
182 while (optind < argc)
183 printf ("%s ", argv[optind++]);
184 printf ("\n");
185 }
186
187 exit (0);
188}
189
190#endif /* TEST */