Add NEWS for 5.4.6.
[xz.git] / lib / getopt1.c
blobfb99b4a0bd8a43396beab223bdd8e2e1ca77a063
1 /* getopt_long and getopt_long_only entry points for GNU getopt.
2 Copyright (C) 1987-2023 Free Software Foundation, Inc.
3 This file is part of the GNU C Library and is also part of gnulib.
4 Patches to this file should be submitted to both projects.
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.
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.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <https://www.gnu.org/licenses/>. */
20 #ifndef _LIBC
21 # ifdef HAVE_CONFIG_H
22 # include <config.h>
23 # endif
24 #endif
26 #include "getopt.h"
27 #include "getopt_int.h"
29 int
30 getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
31 const struct option *long_options, int *opt_index)
33 return _getopt_internal (argc, (char **) argv, options, long_options,
34 opt_index, 0, 0);
37 int
38 _getopt_long_r (int argc, char **argv, const char *options,
39 const struct option *long_options, int *opt_index,
40 struct _getopt_data *d)
42 return _getopt_internal_r (argc, argv, options, long_options, opt_index,
43 0, d, 0);
46 /* Like getopt_long, but '-' as well as '--' can indicate a long option.
47 If an option that starts with '-' (not '--') doesn't match a long option,
48 but does match a short option, it is parsed as a short option
49 instead. */
51 int
52 getopt_long_only (int argc, char *__getopt_argv_const *argv,
53 const char *options,
54 const struct option *long_options, int *opt_index)
56 return _getopt_internal (argc, (char **) argv, options, long_options,
57 opt_index, 1, 0);
60 int
61 _getopt_long_only_r (int argc, char **argv, const char *options,
62 const struct option *long_options, int *opt_index,
63 struct _getopt_data *d)
65 return _getopt_internal_r (argc, argv, options, long_options, opt_index,
66 1, d, 0);
70 #ifdef TEST
72 #include <stdio.h>
73 #include <stdlib.h>
75 int
76 main (int argc, char **argv)
78 int c;
79 int digit_optind = 0;
81 while (1)
83 int this_option_optind = optind ? optind : 1;
84 int option_index = 0;
85 static const struct option long_options[] =
87 {"add", 1, 0, 0},
88 {"append", 0, 0, 0},
89 {"delete", 1, 0, 0},
90 {"verbose", 0, 0, 0},
91 {"create", 0, 0, 0},
92 {"file", 1, 0, 0},
93 {0, 0, 0, 0}
96 c = getopt_long (argc, argv, "abc:d:0123456789",
97 long_options, &option_index);
98 if (c == -1)
99 break;
101 switch (c)
103 case 0:
104 printf ("option %s", long_options[option_index].name);
105 if (optarg)
106 printf (" with arg %s", optarg);
107 printf ("\n");
108 break;
110 case '0':
111 case '1':
112 case '2':
113 case '3':
114 case '4':
115 case '5':
116 case '6':
117 case '7':
118 case '8':
119 case '9':
120 if (digit_optind != 0 && digit_optind != this_option_optind)
121 printf ("digits occur in two different argv-elements.\n");
122 digit_optind = this_option_optind;
123 printf ("option %c\n", c);
124 break;
126 case 'a':
127 printf ("option a\n");
128 break;
130 case 'b':
131 printf ("option b\n");
132 break;
134 case 'c':
135 printf ("option c with value '%s'\n", optarg);
136 break;
138 case 'd':
139 printf ("option d with value '%s'\n", optarg);
140 break;
142 case '?':
143 break;
145 default:
146 printf ("?? getopt returned character code 0%o ??\n", c);
150 if (optind < argc)
152 printf ("non-option ARGV-elements: ");
153 while (optind < argc)
154 printf ("%s ", argv[optind++]);
155 printf ("\n");
158 exit (0);
161 #endif /* TEST */