|
|
1.1 root 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 Free Software Foundation, Inc.
3:
4: NOTE: The canonical source of this file is maintained with the GNU C Library.
5: Bugs can be reported to [email protected].
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.
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
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
18: along with this program; if not, write to the Free Software
19: Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
20: USA. */
21:
22: #ifdef HAVE_CONFIG_H
23: #include <config.h>
24: #endif
25:
26: #include "getopt.h"
27:
28: #if !defined (__STDC__) || !__STDC__
29: /* This is a separate conditional since some stdc systems
30: reject `defined (const)'. */
31: #ifndef const
32: #define const
33: #endif
34: #endif
35:
36: #include <stdio.h>
37:
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. */
45:
46: #define GETOPT_INTERFACE_VERSION 2
47: #if !defined (_LIBC) && defined (__GLIBC__) && __GLIBC__ >= 2
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
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>
61: #endif
62:
63: #ifndef NULL
64: #define NULL 0
65: #endif
66:
67: int
68: getopt_long (argc, argv, options, long_options, opt_index)
69: int argc;
70: char *const *argv;
71: const char *options;
72: const struct option *long_options;
73: int *opt_index;
74: {
75: return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
76: }
77:
78: /* Like getopt_long, but '-' as well as '--' can indicate a long option.
79: If an option that starts with '-' (not '--') doesn't match a long option,
80: but does match a short option, it is parsed as a short option
81: instead. */
82:
83: int
84: getopt_long_only (argc, argv, options, long_options, opt_index)
85: int argc;
86: char *const *argv;
87: const char *options;
88: const struct option *long_options;
89: int *opt_index;
90: {
91: return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
92: }
93:
94:
95: #endif /* Not ELIDE_CODE. */
96:
97: #ifdef TEST
98:
99: #include <stdio.h>
100:
101: int
102: main (argc, argv)
103: int argc;
104: char **argv;
105: {
106: int c;
107: int digit_optind = 0;
108:
109: while (1)
110: {
111: int this_option_optind = optind ? optind : 1;
112: int option_index = 0;
113: static struct option long_options[] =
114: {
115: {"add", 1, 0, 0},
116: {"append", 0, 0, 0},
117: {"delete", 1, 0, 0},
118: {"verbose", 0, 0, 0},
119: {"create", 0, 0, 0},
120: {"file", 1, 0, 0},
121: {0, 0, 0, 0}
122: };
123:
124: c = getopt_long (argc, argv, "abc:d:0123456789",
125: long_options, &option_index);
126: if (c == -1)
127: break;
128:
129: switch (c)
130: {
131: case 0:
132: printf ("option %s", long_options[option_index].name);
133: if (optarg)
134: printf (" with arg %s", optarg);
135: printf ("\n");
136: break;
137:
138: case '0':
139: case '1':
140: case '2':
141: case '3':
142: case '4':
143: case '5':
144: case '6':
145: case '7':
146: case '8':
147: case '9':
148: if (digit_optind != 0 && digit_optind != this_option_optind)
149: printf ("digits occur in two different argv-elements.\n");
150: digit_optind = this_option_optind;
151: printf ("option %c\n", c);
152: break;
153:
154: case 'a':
155: printf ("option a\n");
156: break;
157:
158: case 'b':
159: printf ("option b\n");
160: break;
161:
162: case 'c':
163: printf ("option c with value `%s'\n", optarg);
164: break;
165:
166: case 'd':
167: printf ("option d with value `%s'\n", optarg);
168: break;
169:
170: case '?':
171: break;
172:
173: default:
174: printf ("?? getopt returned character code 0%o ??\n", c);
175: }
176: }
177:
178: if (optind < argc)
179: {
180: printf ("non-option ARGV-elements: ");
181: while (optind < argc)
182: printf ("%s ", argv[optind++]);
183: printf ("\n");
184: }
185:
186: exit (0);
187: }
188:
189: #endif /* TEST */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.