Annotation of embedaddon/mtr/portability/getopt1.c, revision 1.1.1.1
1.1 misho 1: /* getopt_long and getopt_long_only entry points for GNU getopt.
2: Copyright (C) 1987, 88, 89, 90, 91, 92, 1993, 1994
3: Free Software Foundation, Inc.
4:
5: This program is free software; you can redistribute it and/or modify
6: it under the terms of the GNU General Public License version 2 as
7: published by the Free Software Foundation.
8:
9: This program is distributed in the hope that it will be useful,
10: but WITHOUT ANY WARRANTY; without even the implied warranty of
11: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12: GNU General Public License for more details.
13:
14: You should have received a copy of the GNU General Public License
15: along with this program; if not, write to the Free Software
16: Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
17:
18: #ifdef HAVE_CONFIG_H
19: #include "config.h"
20: #endif
21:
22: #include "getopt.h"
23:
24: #if !defined (__STDC__) || !__STDC__
25: /* This is a separate conditional since some stdc systems
26: reject `defined (const)'. */
27: #ifndef const
28: #define const
29: #endif
30: #endif
31:
32: #include <stdio.h>
33:
34: /* Comment out all this code if we are using the GNU C Library, and are not
35: actually compiling the library itself. This code is part of the GNU C
36: Library, but also included in many other GNU distributions. Compiling
37: and linking in this code is a waste when using the GNU C library
38: (especially if it is a shared library). Rather than having every GNU
39: program understand `configure --with-gnu-libc' and omit the object files,
40: it is simpler to just do this in the source for each such file. */
41:
42: #if defined (_LIBC) || !defined (__GNU_LIBRARY__)
43:
44:
45: /* This needs to come after some library #include
46: to get __GNU_LIBRARY__ defined. */
47: #ifdef __GNU_LIBRARY__
48: #include <stdlib.h>
49: #else
50: char *getenv ();
51: #endif
52:
53: #ifndef NULL
54: #define NULL 0
55: #endif
56:
57: int
58: getopt_long (argc, argv, options, long_options, opt_index)
59: int argc;
60: char *const *argv;
61: const char *options;
62: const struct option *long_options;
63: int *opt_index;
64: {
65: return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
66: }
67:
68: /* Like getopt_long, but '-' as well as '--' can indicate a long option.
69: If an option that starts with '-' (not '--') doesn't match a long option,
70: but does match a short option, it is parsed as a short option
71: instead. */
72:
73: int
74: getopt_long_only (argc, argv, options, long_options, opt_index)
75: int argc;
76: char *const *argv;
77: const char *options;
78: const struct option *long_options;
79: int *opt_index;
80: {
81: return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
82: }
83:
84:
85: #endif /* _LIBC or not __GNU_LIBRARY__. */
86:
87: #ifdef TEST
88:
89: #include <stdio.h>
90:
91: int
92: main (argc, argv)
93: int argc;
94: char **argv;
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);
116: if (c == EOF)
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(EXIT_SUCCESS);
177: }
178:
179: #endif /* TEST */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>