(getopt_long, _getopt_long_r, getopt_long_only, _getopt_long_only_r):
[gnulib.git] / lib / getopt1.c
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,2004
3      Free Software Foundation, Inc.
4    This file is part of the GNU C Library.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    This program 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
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License along
17    with this program; if not, write to the Free Software Foundation,
18    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
19 \f
20 #ifdef HAVE_CONFIG_H
21 #include <config.h>
22 #endif
23
24 #ifdef _LIBC
25 # include <getopt.h>
26 #else
27 # include "getopt.h"
28 #endif
29 #include "getopt_int.h"
30
31 #include <stdio.h>
32
33 /* This needs to come after some library #include
34    to get __GNU_LIBRARY__ defined.  */
35 #ifdef __GNU_LIBRARY__
36 #include <stdlib.h>
37 #endif
38
39 #ifndef NULL
40 #define NULL 0
41 #endif
42
43 int
44 getopt_long (int argc, char *__getopt_argv_const *argv, const char *options,
45              const struct option *long_options, int *opt_index)
46 {
47   return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
48 }
49
50 int
51 _getopt_long_r (int argc, char *__getopt_argv_const *argv, const char *options,
52                 const struct option *long_options, int *opt_index,
53                 struct _getopt_data *d)
54 {
55   return _getopt_internal_r (argc, argv, options, long_options, opt_index,
56                              0, d);
57 }
58
59 /* Like getopt_long, but '-' as well as '--' can indicate a long option.
60    If an option that starts with '-' (not '--') doesn't match a long option,
61    but does match a short option, it is parsed as a short option
62    instead.  */
63
64 int
65 getopt_long_only (int argc, char *__getopt_argv_const *argv,
66                   const char *options,
67                   const struct option *long_options, int *opt_index)
68 {
69   return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
70 }
71
72 int
73 _getopt_long_only_r (int argc, char *__getopt_argv_const *argv,
74                      const char *options,
75                      const struct option *long_options, int *opt_index,
76                      struct _getopt_data *d)
77 {
78   return _getopt_internal_r (argc, argv, options, long_options, opt_index,
79                              1, d);
80 }
81
82 \f
83 #ifdef TEST
84
85 #include <stdio.h>
86
87 int
88 main (int argc, char **argv)
89 {
90   int c;
91   int digit_optind = 0;
92
93   while (1)
94     {
95       int this_option_optind = optind ? optind : 1;
96       int option_index = 0;
97       static struct option long_options[] =
98       {
99         {"add", 1, 0, 0},
100         {"append", 0, 0, 0},
101         {"delete", 1, 0, 0},
102         {"verbose", 0, 0, 0},
103         {"create", 0, 0, 0},
104         {"file", 1, 0, 0},
105         {0, 0, 0, 0}
106       };
107
108       c = getopt_long (argc, argv, "abc:d:0123456789",
109                        long_options, &option_index);
110       if (c == -1)
111         break;
112
113       switch (c)
114         {
115         case 0:
116           printf ("option %s", long_options[option_index].name);
117           if (optarg)
118             printf (" with arg %s", optarg);
119           printf ("\n");
120           break;
121
122         case '0':
123         case '1':
124         case '2':
125         case '3':
126         case '4':
127         case '5':
128         case '6':
129         case '7':
130         case '8':
131         case '9':
132           if (digit_optind != 0 && digit_optind != this_option_optind)
133             printf ("digits occur in two different argv-elements.\n");
134           digit_optind = this_option_optind;
135           printf ("option %c\n", c);
136           break;
137
138         case 'a':
139           printf ("option a\n");
140           break;
141
142         case 'b':
143           printf ("option b\n");
144           break;
145
146         case 'c':
147           printf ("option c with value `%s'\n", optarg);
148           break;
149
150         case 'd':
151           printf ("option d with value `%s'\n", optarg);
152           break;
153
154         case '?':
155           break;
156
157         default:
158           printf ("?? getopt returned character code 0%o ??\n", c);
159         }
160     }
161
162   if (optind < argc)
163     {
164       printf ("non-option ARGV-elements: ");
165       while (optind < argc)
166         printf ("%s ", argv[optind++]);
167       printf ("\n");
168     }
169
170   exit (0);
171 }
172
173 #endif /* TEST */