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