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