xref: /freebsd/contrib/bmake/getopt.c (revision 3955d011f8d241ebed0fa997923e7566f5485c07)
1*3955d011SMarcel Moolenaar /*
2*3955d011SMarcel Moolenaar  * Copyright (c) 1987, 1993, 1994
3*3955d011SMarcel Moolenaar  *	The Regents of the University of California.  All rights reserved.
4*3955d011SMarcel Moolenaar  *
5*3955d011SMarcel Moolenaar  * Redistribution and use in source and binary forms, with or without
6*3955d011SMarcel Moolenaar  * modification, are permitted provided that the following conditions
7*3955d011SMarcel Moolenaar  * are met:
8*3955d011SMarcel Moolenaar  * 1. Redistributions of source code must retain the above copyright
9*3955d011SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer.
10*3955d011SMarcel Moolenaar  * 2. Redistributions in binary form must reproduce the above copyright
11*3955d011SMarcel Moolenaar  *    notice, this list of conditions and the following disclaimer in the
12*3955d011SMarcel Moolenaar  *    documentation and/or other materials provided with the distribution.
13*3955d011SMarcel Moolenaar  * 3. All advertising materials mentioning features or use of this software
14*3955d011SMarcel Moolenaar  *    must display the following acknowledgement:
15*3955d011SMarcel Moolenaar  *	This product includes software developed by the University of
16*3955d011SMarcel Moolenaar  *	California, Berkeley and its contributors.
17*3955d011SMarcel Moolenaar  * 4. Neither the name of the University nor the names of its contributors
18*3955d011SMarcel Moolenaar  *    may be used to endorse or promote products derived from this software
19*3955d011SMarcel Moolenaar  *    without specific prior written permission.
20*3955d011SMarcel Moolenaar  *
21*3955d011SMarcel Moolenaar  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22*3955d011SMarcel Moolenaar  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23*3955d011SMarcel Moolenaar  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24*3955d011SMarcel Moolenaar  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25*3955d011SMarcel Moolenaar  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26*3955d011SMarcel Moolenaar  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27*3955d011SMarcel Moolenaar  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28*3955d011SMarcel Moolenaar  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29*3955d011SMarcel Moolenaar  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30*3955d011SMarcel Moolenaar  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*3955d011SMarcel Moolenaar  * SUCH DAMAGE.
32*3955d011SMarcel Moolenaar  */
33*3955d011SMarcel Moolenaar 
34*3955d011SMarcel Moolenaar #ifdef HAVE_CONFIG_H
35*3955d011SMarcel Moolenaar # include "config.h"
36*3955d011SMarcel Moolenaar #endif
37*3955d011SMarcel Moolenaar #if !defined(HAVE_GETOPT) || defined(WANT_GETOPT_LONG) || defined(BROKEN_GETOPT)
38*3955d011SMarcel Moolenaar 
39*3955d011SMarcel Moolenaar #if defined(LIBC_SCCS) && !defined(lint)
40*3955d011SMarcel Moolenaar /* static char sccsid[] = "from: @(#)getopt.c	8.2 (Berkeley) 4/2/94"; */
41*3955d011SMarcel Moolenaar static char *rcsid = "$Id: getopt.c,v 1.3 1999/01/08 02:14:18 sjg Exp $";
42*3955d011SMarcel Moolenaar #endif /* LIBC_SCCS and not lint */
43*3955d011SMarcel Moolenaar 
44*3955d011SMarcel Moolenaar #include <stdio.h>
45*3955d011SMarcel Moolenaar #include <stdlib.h>
46*3955d011SMarcel Moolenaar #include <string.h>
47*3955d011SMarcel Moolenaar 
48*3955d011SMarcel Moolenaar 
49*3955d011SMarcel Moolenaar #define	BADCH	(int)'?'
50*3955d011SMarcel Moolenaar #define	BADARG	(int)':'
51*3955d011SMarcel Moolenaar #define	EMSG	""
52*3955d011SMarcel Moolenaar 
53*3955d011SMarcel Moolenaar int	opterr = 1,		/* if error message should be printed */
54*3955d011SMarcel Moolenaar 	optind = 1,		/* index into parent argv vector */
55*3955d011SMarcel Moolenaar 	optopt = BADCH,		/* character checked for validity */
56*3955d011SMarcel Moolenaar 	optreset;		/* reset getopt */
57*3955d011SMarcel Moolenaar char	*optarg;		/* argument associated with option */
58*3955d011SMarcel Moolenaar 
59*3955d011SMarcel Moolenaar /*
60*3955d011SMarcel Moolenaar  * getopt --
61*3955d011SMarcel Moolenaar  *	Parse argc/argv argument vector.
62*3955d011SMarcel Moolenaar  */
63*3955d011SMarcel Moolenaar int
64*3955d011SMarcel Moolenaar getopt(nargc, nargv, ostr)
65*3955d011SMarcel Moolenaar 	int nargc;
66*3955d011SMarcel Moolenaar 	char * const *nargv;
67*3955d011SMarcel Moolenaar 	const char *ostr;
68*3955d011SMarcel Moolenaar {
69*3955d011SMarcel Moolenaar 	extern char *__progname;
70*3955d011SMarcel Moolenaar 	static char *place = EMSG;		/* option letter processing */
71*3955d011SMarcel Moolenaar 	char *oli;				/* option letter list index */
72*3955d011SMarcel Moolenaar 
73*3955d011SMarcel Moolenaar #ifndef BSD4_4
74*3955d011SMarcel Moolenaar 	if (!__progname) {
75*3955d011SMarcel Moolenaar 		if (__progname = strrchr(nargv[0], '/'))
76*3955d011SMarcel Moolenaar 			++__progname;
77*3955d011SMarcel Moolenaar 		else
78*3955d011SMarcel Moolenaar 			__progname = nargv[0];
79*3955d011SMarcel Moolenaar 	}
80*3955d011SMarcel Moolenaar #endif
81*3955d011SMarcel Moolenaar 
82*3955d011SMarcel Moolenaar 	if (optreset || !*place) {		/* update scanning pointer */
83*3955d011SMarcel Moolenaar 		optreset = 0;
84*3955d011SMarcel Moolenaar 		if (optind >= nargc || *(place = nargv[optind]) != '-') {
85*3955d011SMarcel Moolenaar 			place = EMSG;
86*3955d011SMarcel Moolenaar 			return (-1);
87*3955d011SMarcel Moolenaar 		}
88*3955d011SMarcel Moolenaar 		if (place[1] && *++place == '-'	/* found "--" */
89*3955d011SMarcel Moolenaar 		    && !place[1]) {		/* and not "--foo" */
90*3955d011SMarcel Moolenaar 			++optind;
91*3955d011SMarcel Moolenaar 			place = EMSG;
92*3955d011SMarcel Moolenaar 			return (-1);
93*3955d011SMarcel Moolenaar 		}
94*3955d011SMarcel Moolenaar 	}					/* option letter okay? */
95*3955d011SMarcel Moolenaar 	if ((optopt = (int)*place++) == (int)':' ||
96*3955d011SMarcel Moolenaar 	    !(oli = strchr(ostr, optopt))) {
97*3955d011SMarcel Moolenaar 		/*
98*3955d011SMarcel Moolenaar 		 * if the user didn't specify '-' as an option,
99*3955d011SMarcel Moolenaar 		 * assume it means -1.
100*3955d011SMarcel Moolenaar 		 */
101*3955d011SMarcel Moolenaar 		if (optopt == (int)'-')
102*3955d011SMarcel Moolenaar 			return (-1);
103*3955d011SMarcel Moolenaar 		if (!*place)
104*3955d011SMarcel Moolenaar 			++optind;
105*3955d011SMarcel Moolenaar 		if (opterr && *ostr != ':')
106*3955d011SMarcel Moolenaar 			(void)fprintf(stderr,
107*3955d011SMarcel Moolenaar 			    "%s: illegal option -- %c\n", __progname, optopt);
108*3955d011SMarcel Moolenaar 		return (BADCH);
109*3955d011SMarcel Moolenaar 	}
110*3955d011SMarcel Moolenaar 	if (*++oli != ':') {			/* don't need argument */
111*3955d011SMarcel Moolenaar 		optarg = NULL;
112*3955d011SMarcel Moolenaar 		if (!*place)
113*3955d011SMarcel Moolenaar 			++optind;
114*3955d011SMarcel Moolenaar 	}
115*3955d011SMarcel Moolenaar 	else {					/* need an argument */
116*3955d011SMarcel Moolenaar 		if (*place)			/* no white space */
117*3955d011SMarcel Moolenaar 			optarg = place;
118*3955d011SMarcel Moolenaar 		else if (nargc <= ++optind) {	/* no arg */
119*3955d011SMarcel Moolenaar 			place = EMSG;
120*3955d011SMarcel Moolenaar 			if (*ostr == ':')
121*3955d011SMarcel Moolenaar 				return (BADARG);
122*3955d011SMarcel Moolenaar 			if (opterr)
123*3955d011SMarcel Moolenaar 				(void)fprintf(stderr,
124*3955d011SMarcel Moolenaar 				    "%s: option requires an argument -- %c\n",
125*3955d011SMarcel Moolenaar 				    __progname, optopt);
126*3955d011SMarcel Moolenaar 			return (BADCH);
127*3955d011SMarcel Moolenaar 		}
128*3955d011SMarcel Moolenaar 	 	else				/* white space */
129*3955d011SMarcel Moolenaar 			optarg = nargv[optind];
130*3955d011SMarcel Moolenaar 		place = EMSG;
131*3955d011SMarcel Moolenaar 		++optind;
132*3955d011SMarcel Moolenaar 	}
133*3955d011SMarcel Moolenaar 	return (optopt);			/* dump back option letter */
134*3955d011SMarcel Moolenaar }
135*3955d011SMarcel Moolenaar #endif
136*3955d011SMarcel Moolenaar #ifdef MAIN
137*3955d011SMarcel Moolenaar #ifndef BSD4_4
138*3955d011SMarcel Moolenaar char *__progname;
139*3955d011SMarcel Moolenaar #endif
140*3955d011SMarcel Moolenaar 
141*3955d011SMarcel Moolenaar int
142*3955d011SMarcel Moolenaar main(argc, argv)
143*3955d011SMarcel Moolenaar 	int argc;
144*3955d011SMarcel Moolenaar 	char *argv[];
145*3955d011SMarcel Moolenaar {
146*3955d011SMarcel Moolenaar 	int c;
147*3955d011SMarcel Moolenaar 	char *opts = argv[1];
148*3955d011SMarcel Moolenaar 
149*3955d011SMarcel Moolenaar 	--argc;
150*3955d011SMarcel Moolenaar 	++argv;
151*3955d011SMarcel Moolenaar 
152*3955d011SMarcel Moolenaar 	while ((c = getopt(argc, argv, opts)) != EOF) {
153*3955d011SMarcel Moolenaar 		switch (c) {
154*3955d011SMarcel Moolenaar 		case '-':
155*3955d011SMarcel Moolenaar 			if (optarg)
156*3955d011SMarcel Moolenaar 				printf("--%s ", optarg);
157*3955d011SMarcel Moolenaar 			break;
158*3955d011SMarcel Moolenaar 		case '?':
159*3955d011SMarcel Moolenaar 			exit(1);
160*3955d011SMarcel Moolenaar 			break;
161*3955d011SMarcel Moolenaar 		default:
162*3955d011SMarcel Moolenaar 			if (optarg)
163*3955d011SMarcel Moolenaar 				printf("-%c %s ", c, optarg);
164*3955d011SMarcel Moolenaar 			else
165*3955d011SMarcel Moolenaar 				printf("-%c ", c);
166*3955d011SMarcel Moolenaar 			break;
167*3955d011SMarcel Moolenaar 		}
168*3955d011SMarcel Moolenaar 	}
169*3955d011SMarcel Moolenaar 
170*3955d011SMarcel Moolenaar 	if (optind < argc) {
171*3955d011SMarcel Moolenaar 		printf("-- ");
172*3955d011SMarcel Moolenaar 		for (; optind < argc; ++optind) {
173*3955d011SMarcel Moolenaar 			printf("%s ", argv[optind]);
174*3955d011SMarcel Moolenaar 		}
175*3955d011SMarcel Moolenaar 	}
176*3955d011SMarcel Moolenaar 	printf("\n");
177*3955d011SMarcel Moolenaar 	exit(0);
178*3955d011SMarcel Moolenaar }
179*3955d011SMarcel Moolenaar #endif
180