1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*	$NetBSD: options.c,v 1.37 2004/10/30 19:29:27 christos Exp $	*/
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*-
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 1991, 1993
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This code is derived from software contributed to Berkeley by
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Kenneth Almquist.
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met:
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    documentation and/or other materials provided with the distribution.
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    may be used to endorse or promote products derived from this software
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    without specific prior written permission.
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE.
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/cdefs.h>
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef lint
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char sccsid[] = "@(#)options.c	8.2 (Berkeley) 5/4/95";
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project__RCSID("$NetBSD: options.c,v 1.37 2004/10/30 19:29:27 christos Exp $");
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* not lint */
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <signal.h>
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <unistd.h>
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "shell.h"
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define DEFINE_OPTIONS
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "options.h"
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#undef DEFINE_OPTIONS
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "nodes.h"	/* for other header files */
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "eval.h"
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "jobs.h"
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "input.h"
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "output.h"
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "trap.h"
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "var.h"
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "memalloc.h"
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "error.h"
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "mystring.h"
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef SMALL
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "myhistedit.h"
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "show.h"
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *arg0;			/* value of $0 */
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct shparam shellparam;	/* current positional parameters */
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar **argptr;			/* argument list for builtin commands */
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *optionarg;		/* set by nextopt (like getopt) */
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *optptr;			/* used by nextopt */
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *minusc;			/* argument to -c option */
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void options(int);
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void minus_o(char *, int);
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void setoption(int, int);
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC int getopts(char *, char *, char **, char ***, char **);
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Process the shell command line arguments.
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectprocargs(int argc, char **argv)
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int i;
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	argptr = argv;
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (argc > 0)
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		argptr++;
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (i = 0; i < NOPTS; i++)
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		optlist[i].val = 2;
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	options(1);
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (*argptr == NULL && minusc == NULL)
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		sflag = 1;
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (iflag == 2 && sflag == 1 && isatty(0) && isatty(1))
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		iflag = 1;
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (mflag == 2)
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		mflag = iflag;
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (i = 0; i < NOPTS; i++)
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (optlist[i].val == 2)
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			optlist[i].val = 0;
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if DEBUG == 2
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	debug = 1;
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	arg0 = argv[0];
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (sflag == 0 && minusc == NULL) {
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		commandname = argv[0];
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		arg0 = *argptr++;
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		setinputfile(arg0, 0);
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		commandname = arg0;
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	/* POSIX 1003.2: first arg after -c cmd is $0, remainder $1... */
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (minusc != NULL) {
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (argptr == NULL || *argptr == NULL)
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			error("Bad -c option");
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		minusc = *argptr++;
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*argptr != 0)
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			arg0 = *argptr++;
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	shellparam.p = argptr;
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	shellparam.reset = 1;
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	/* assert(shellparam.malloc == 0 && shellparam.nparam == 0); */
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while (*argptr) {
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		shellparam.nparam++;
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		argptr++;
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	optschanged();
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectoptschanged(void)
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	setinteractive(iflag);
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef WITH_HISTORY
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	histedit();
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	setjobctl(mflag);
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Process shell options.  The global variable argptr contains a pointer
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * to the argument list; we advance it past the options.
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectoptions(int cmdline)
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	static char empty[] = "";
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char *p;
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int val;
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int c;
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (cmdline)
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		minusc = NULL;
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while ((p = *argptr) != NULL) {
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		argptr++;
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if ((c = *p++) == '-') {
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			val = 1;
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                        if (p[0] == '\0' || (p[0] == '-' && p[1] == '\0')) {
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                if (!cmdline) {
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                        /* "-" means turn off -x and -v */
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                        if (p[0] == '\0')
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                                xflag = vflag = 0;
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                        /* "--" means reset params */
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                        else if (*argptr == NULL)
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project						setparam(argptr);
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                                }
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				break;	  /* "-" or  "--" terminates options */
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		} else if (c == '+') {
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			val = 0;
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		} else {
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			argptr--;
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			break;
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		while ((c = *p++) != '\0') {
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (c == 'c' && cmdline) {
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				/* command is after shell args*/
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				minusc = empty;
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			} else if (c == 'o') {
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				minus_o(*argptr, val);
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				if (*argptr)
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project					argptr++;
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			} else {
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				setoption(c, val);
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic void
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectset_opt_val(int i, int val)
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int j;
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int flag;
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (val && (flag = optlist[i].opt_set)) {
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		/* some options (eg vi/emacs) are mutually exclusive */
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		for (j = 0; j < NOPTS; j++)
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		    if (optlist[j].opt_set == flag)
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			optlist[j].val = 0;
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	optlist[i].val = val;
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef DEBUG
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (&optlist[i].val == &debug)
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		opentrace();
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectminus_o(char *name, int val)
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int i;
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (name == NULL) {
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		out1str("Current option settings\n");
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		for (i = 0; i < NOPTS; i++)
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			out1fmt("%-16s%s\n", optlist[i].name,
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				optlist[i].val ? "on" : "off");
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	} else {
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		for (i = 0; i < NOPTS; i++)
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (equal(name, optlist[i].name)) {
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				set_opt_val(i, val);
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				return;
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		error("Illegal option -o %s", name);
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsetoption(int flag, int val)
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int i;
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (i = 0; i < NOPTS; i++)
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (optlist[i].letter == flag) {
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			set_opt_val( i, val );
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return;
246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	error("Illegal option -%c", flag);
248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	/* NOTREACHED */
249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef mkinit
254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectINCLUDE "options.h"
255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSHELLPROC {
257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int i;
258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (i = 0; optlist[i].name; i++)
260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		optlist[i].val = 0;
261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	optschanged();
262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Set the shell parameters.
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsetparam(char **argv)
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
274dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char **newparam;
275dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char **ap;
276dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int nparam;
277dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
278dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (nparam = 0 ; argv[nparam] ; nparam++);
279dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap = newparam = ckmalloc((nparam + 1) * sizeof *ap);
280dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while (*argv) {
281dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		*ap++ = savestr(*argv++);
282dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
283dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	*ap = NULL;
284dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	freeparam(&shellparam);
285dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	shellparam.malloc = 1;
286dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	shellparam.nparam = nparam;
287dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	shellparam.p = newparam;
288dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	shellparam.optnext = NULL;
289dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
290dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
291dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
292dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
293dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Free the list of positional parameters.
294dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
295dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
296dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
297dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectfreeparam(volatile struct shparam *param)
298dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
299dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char **ap;
300dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
301dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (param->malloc) {
302dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		for (ap = param->p ; *ap ; ap++)
303dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ckfree(*ap);
304dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		ckfree(param->p);
305dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
306dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
307dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
308dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
309dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
310dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
311dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The shift builtin command.
312dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
313dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
314dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint
315dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectshiftcmd(int argc, char **argv)
316dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
317dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int n;
318dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char **ap1, **ap2;
319dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
320dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	n = 1;
321dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (argc > 1)
322dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		n = number(argv[1]);
323dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (n > shellparam.nparam)
324dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		error("can't shift that many");
325dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTOFF;
326dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	shellparam.nparam -= n;
327dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (ap1 = shellparam.p ; --n >= 0 ; ap1++) {
328dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (shellparam.malloc)
329dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ckfree(*ap1);
330dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
331dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap2 = shellparam.p;
332dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while ((*ap2++ = *ap1++) != NULL);
333dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	shellparam.optnext = NULL;
334dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTON;
335dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return 0;
336dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
337dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
338dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
339dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
340dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
341dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The set command builtin.
342dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
343dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
344dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint
345dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsetcmd(int argc, char **argv)
346dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
347dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (argc == 1)
348dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		return showvars(0, 0, 1);
349dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTOFF;
350dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	options(0);
351dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	optschanged();
352dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (*argptr != NULL) {
353dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		setparam(argptr);
354dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
355dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTON;
356dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return 0;
357dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
358dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
359dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
360dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
361dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectgetoptsreset(value)
362dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	const char *value;
363dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
364dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (number(value) == 1) {
365dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		shellparam.optnext = NULL;
366dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		shellparam.reset = 1;
367dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
368dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
369dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
370dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
371dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * The getopts builtin.  Shellparam.optnext points to the next argument
372dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * to be processed.  Shellparam.optptr points to the next character to
373dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * be processed in the current argument.  If shellparam.optnext is NULL,
374dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * then it's the first time getopts has been called.
375dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
376dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
377dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint
378dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectgetoptscmd(int argc, char **argv)
379dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
380dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char **optbase;
381dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
382dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (argc < 3)
383dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		error("usage: getopts optstring var [arg]");
384dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	else if (argc == 3)
385dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		optbase = shellparam.p;
386dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	else
387dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		optbase = &argv[3];
388dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
389dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (shellparam.reset == 1) {
390dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		shellparam.optnext = optbase;
391dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		shellparam.optptr = NULL;
392dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		shellparam.reset = 0;
393dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
394dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
395dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return getopts(argv[1], argv[2], optbase, &shellparam.optnext,
396dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		       &shellparam.optptr);
397dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
398dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
399dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC int
400dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectgetopts(char *optstr, char *optvar, char **optfirst, char ***optnext, char **optpptr)
401dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
402dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char *p, *q;
403dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char c = '?';
404dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int done = 0;
405dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int ind = 0;
406dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int err = 0;
407dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char s[12];
408dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
409dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if ((p = *optpptr) == NULL || *p == '\0') {
410dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		/* Current word is done, advance */
411dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*optnext == NULL)
412dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return 1;
413dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		p = **optnext;
414dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (p == NULL || *p != '-' || *++p == '\0') {
415dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectatend:
416dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ind = *optnext - optfirst + 1;
417dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			*optnext = NULL;
418dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			p = NULL;
419dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			done = 1;
420dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			goto out;
421dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
422dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		(*optnext)++;
423dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (p[0] == '-' && p[1] == '\0')	/* check for "--" */
424dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			goto atend;
425dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
426dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
427dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c = *p++;
428dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (q = optstr; *q != c; ) {
429dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*q == '\0') {
430dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (optstr[0] == ':') {
431dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				s[0] = c;
432dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				s[1] = '\0';
433dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				err |= setvarsafe("OPTARG", s, 0);
434dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			} else {
435dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				outfmt(&errout, "Illegal option -%c\n", c);
436dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				(void) unsetvar("OPTARG", 0);
437dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
438dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			c = '?';
439dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			goto bad;
440dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
441dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*++q == ':')
442dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			q++;
443dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
444dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
445dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (*++q == ':') {
446dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*p == '\0' && (p = **optnext) == NULL) {
447dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (optstr[0] == ':') {
448dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				s[0] = c;
449dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				s[1] = '\0';
450dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				err |= setvarsafe("OPTARG", s, 0);
451dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				c = ':';
452dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			} else {
453dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				outfmt(&errout, "No arg for -%c option\n", c);
454dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				(void) unsetvar("OPTARG", 0);
455dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				c = '?';
456dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
457dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			goto bad;
458dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
459dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
460dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (p == **optnext)
461dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			(*optnext)++;
462dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		err |= setvarsafe("OPTARG", p, 0);
463dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		p = NULL;
464dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	} else
465dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		err |= setvarsafe("OPTARG", "", 0);
466dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ind = *optnext - optfirst + 1;
467dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	goto out;
468dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
469dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectbad:
470dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ind = 1;
471dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	*optnext = NULL;
472dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	p = NULL;
473dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectout:
474dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	*optpptr = p;
475dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	fmtstr(s, sizeof(s), "%d", ind);
476dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	err |= setvarsafe("OPTIND", s, VNOFUNC);
477dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	s[0] = c;
478dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	s[1] = '\0';
479dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	err |= setvarsafe(optvar, s, 0);
480dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (err) {
481dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		*optnext = NULL;
482dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		*optpptr = NULL;
483dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		flushall();
484dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		exraise(EXERROR);
485dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
486dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return done;
487dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
488dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
489dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
490dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * XXX - should get rid of.  have all builtins use getopt(3).  the
491dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * library getopt must have the BSD extension static variable "optreset"
492dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * otherwise it can't be used within the shell safely.
493dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
494dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Standard option processing (a la getopt) for builtin routines.  The
495dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * only argument that is passed to nextopt is the option string; the
496dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * other arguments are unnecessary.  It return the character, or '\0' on
497dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * end of input.
498dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
499dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
500dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint
501dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnextopt(const char *optstring)
502dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
503dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char *p;
504dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	const char *q;
505dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char c;
506dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
507dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if ((p = optptr) == NULL || *p == '\0') {
508dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		p = *argptr;
509dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (p == NULL || *p != '-' || *++p == '\0')
510dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return '\0';
511dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		argptr++;
512dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (p[0] == '-' && p[1] == '\0')	/* check for "--" */
513dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return '\0';
514dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
515dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	c = *p++;
516dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (q = optstring ; *q != c ; ) {
517dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*q == '\0')
518dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			error("Illegal option -%c", c);
519dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*++q == ':')
520dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			q++;
521dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
522dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (*++q == ':') {
523dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (*p == '\0' && (p = *argptr++) == NULL)
524dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			error("No arg for -%c option", c);
525dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		optionarg = p;
526dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		p = NULL;
527dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
528dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	optptr = p;
529dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return c;
530dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
531