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