1511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*
2511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Copyright (c) 1987, 1993, 1994
3511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	The Regents of the University of California.  All rights reserved.
4511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
5511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * Redistribution and use in source and binary forms, with or without
6511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * modification, are permitted provided that the following conditions
7511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * are met:
8511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 1. Redistributions of source code must retain the above copyright
9511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    notice, this list of conditions and the following disclaimer.
10511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 2. Redistributions in binary form must reproduce the above copyright
11511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    notice, this list of conditions and the following disclaimer in the
12511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    documentation and/or other materials provided with the distribution.
13511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 3. All advertising materials mentioning features or use of this software
14511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    must display the following acknowledgement:
15511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	This product includes software developed by the University of
16511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	California, Berkeley and its contributors.
17511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * 4. Neither the name of the University nor the names of its contributors
18511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    may be used to endorse or promote products derived from this software
19511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *    without specific prior written permission.
20511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *
21511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * SUCH DAMAGE.
32511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */
33511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
34511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#if defined(LIBC_SCCS) && !defined(lint)
35511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallstatic char sccsid[] = "@(#)getopt.c	8.3 (Berkeley) 4/27/95";
36511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#endif /* LIBC_SCCS and not lint */
37511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
38511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdio.h>
39511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <stdlib.h>
40511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#include <string.h>
41511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
42965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes#include "getopt.h"
43965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes
44511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallint	opterr = 1,		/* if error message should be printed */
45511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	optind = 1,		/* index into parent argv vector */
46511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	optopt,			/* character checked for validity */
47511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	optreset;		/* reset getopt */
48511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallchar	*optarg;		/* argument associated with option */
49511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
50511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define	BADCH	(int)'?'
51511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define	BADARG	(int)':'
52511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall#define	EMSG	""
53511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
54511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall/*
55511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall * getopt --
56511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall *	Parse argc/argv argument vector.
57511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall */
58511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallint
59511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrallgetopt(nargc, nargv, ostr)
60511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	int nargc;
61511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	char * const *nargv;
62511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	const char *ostr;
63511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall{
64965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	char *cp;
65965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	static char *__progname;
66511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	static char *place = EMSG;		/* option letter processing */
67511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	char *oli;				/* option letter list index */
68511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall
69965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	if (__progname == NULL) {
70965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes		if ((cp = strrchr(nargv[0], '/')) != NULL)
71965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes			__progname = cp + 1;
72965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes		else
73965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes			__progname = nargv[0];
74965a4b5291eead2d8f826d2c87e58a12bb56a214Elliott Hughes	}
75511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (optreset || !*place) {		/* update scanning pointer */
76511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		optreset = 0;
77511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (optind >= nargc || *(place = nargv[optind]) != '-') {
78511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			place = EMSG;
79511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			return (-1);
80511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		}
81511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (place[1] && *++place == '-') {	/* found "--" */
82511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			++optind;
83511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			place = EMSG;
84511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			return (-1);
85511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		}
86511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}					/* option letter okay? */
87511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if ((optopt = (int)*place++) == (int)':' ||
88511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	    !(oli = strchr(ostr, optopt))) {
89511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		/*
90511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * if the user didn't specify '-' as an option,
91511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 * assume it means -1.
92511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		 */
93511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (optopt == (int)'-')
94511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			return (-1);
95511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (!*place)
96511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			++optind;
97511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (opterr && *ostr != ':')
98511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			(void)fprintf(stderr,
99511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			    "%s: illegal option -- %c\n", __progname, optopt);
100511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		return (BADCH);
101511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
102511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	if (*++oli != ':') {			/* don't need argument */
103511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		optarg = NULL;
104511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (!*place)
105511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			++optind;
106511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
107511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	else {					/* need an argument */
108511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		if (*place)			/* no white space */
109511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			optarg = place;
110511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		else if (nargc <= ++optind) {	/* no arg */
111511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			place = EMSG;
112511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			if (*ostr == ':')
113511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall				return (BADARG);
114511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			if (opterr)
115511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall				(void)fprintf(stderr,
116511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall				    "%s: option requires an argument -- %c\n",
117511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall				    __progname, optopt);
118511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			return (BADCH);
119511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		}
120511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	 	else				/* white space */
121511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall			optarg = nargv[optind];
122511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		place = EMSG;
123511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall		++optind;
124511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	}
125511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall	return (optopt);			/* dump back option letter */
126511eca30a483e912c274e1d8ba3a0f8f081e2227JP Abgrall}
127