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