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