* Copyright (c) 1991 The Regents of the University of California.
* This code is derived from software contributed to Berkeley by
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
/*static char sccsid[] = "from: @(#)options.c 5.2 (Berkeley) 3/13/91";*/
static char rcsid
[] = "options.c,v 1.4 1993/08/01 18:58:04 mycroft Exp";
#include "nodes.h" /* for other header files */
char *arg0
; /* value of $0 */
struct shparam shellparam
; /* current positional parameters */
char **argptr
; /* argument list for builtin commands */
char *optarg
; /* set by nextopt (like getopt) */
char *optptr
; /* used by nextopt */
char *minusc
; /* argument to -c option */
STATIC
void options(int);
STATIC
void setoption(int, int);
* Process the shell command line arguments.
for (p
= optval
; p
< optval
+ sizeof optval
- 1 ; p
++)
if (*argptr
== NULL
&& minusc
== NULL
)
if (iflag
== 2 && sflag
== 1 && isatty(0) && isatty(1))
for (p
= optval
; p
< optval
+ sizeof optval
- 1 ; p
++)
if (sflag
== 0 && minusc
== NULL
) {
commandname
= arg0
= *argptr
++;
setinputfile(commandname
, 0);
/* assert(shellparam.malloc == 0 && shellparam.nparam == 0); */
* Process shell options. The global variable argptr contains a pointer
* to the argument list; we advance it past the options.
while ((p
= *argptr
) != NULL
) {
if (p
[0] == '\0' || p
[0] == '-' && p
[1] == '\0') {
/* "-" means turn off -x and -v */
/* "--" means reset params */
else if (*argptr
== NULL
)
break; /* "-" or "--" terminates options */
while ((c
= *p
++) != '\0') {
if (c
== 'c' && cmdline
) {
#ifdef NOHACK /* removing this code allows sh -ce 'foo' for compat */
if (q
== NULL
|| minusc
!= NULL
)
if ((p
= strchr(optchar
, flag
)) == NULL
)
error("Illegal option -%c", flag
);
optval
[p
- optchar
] = val
;
for (p
= optval
; p
< optval
+ sizeof optval
; p
++)
* Set the shell parameters.
for (nparam
= 0 ; argv
[nparam
] ; nparam
++);
ap
= newparam
= ckmalloc((nparam
+ 1) * sizeof *ap
);
*ap
++ = savestr(*argv
++);
shellparam
.nparam
= nparam
;
shellparam
.optnext
= NULL
;
* Free the list of positional parameters.
for (ap
= param
->p
; *ap
; ap
++)
* The shift builtin command.
shiftcmd(argc
, argv
) char **argv
; {
if (n
> shellparam
.nparam
)
for (ap1
= shellparam
.p
; --n
>= 0 ; ap1
++) {
while ((*ap2
++ = *ap1
++) != NULL
);
shellparam
.optnext
= NULL
;
* The set command builtin.
setcmd(argc
, argv
) char **argv
; {
return showvarscmd(argc
, argv
);
* The getopts builtin. Shellparam.optnext points to the next argument
* to be processed. Shellparam.optptr points to the next character to
* be processed in the current argument. If shellparam.optnext is NULL,
* then it's the first time getopts has been called.
getoptscmd(argc
, argv
) char **argv
; {
error("Usage: getopts optstring var");
if (shellparam
.optnext
== NULL
) {
shellparam
.optnext
= shellparam
.p
;
shellparam
.optptr
= NULL
;
if ((p
= shellparam
.optptr
) == NULL
|| *p
== '\0') {
if (p
== NULL
|| *p
!= '-' || *++p
== '\0') {
fmtstr(s
, 10, "%d", shellparam
.optnext
- shellparam
.p
+ 1);
shellparam
.optnext
= NULL
;
if (p
[0] == '-' && p
[1] == '\0') /* check for "--" */
for (q
= argv
[1] ; *q
!= c
; ) {
out1fmt("Illegal option -%c\n", c
);
if (*p
== '\0' && (p
= *shellparam
.optnext
) == NULL
) {
out1fmt("No arg for -%c option\n", c
);
* Standard option processing (a la getopt) for builtin routines. The
* only argument that is passed to nextopt is the option string; the
* other arguments are unnecessary. It return the character, or '\0' on
if ((p
= optptr
) == NULL
|| *p
== '\0') {
if (p
== NULL
|| *p
!= '-' || *++p
== '\0')
if (p
[0] == '-' && p
[1] == '\0') /* check for "--" */
for (q
= optstring
; *q
!= c
; ) {
error("Illegal option -%c", c
);
if (*p
== '\0' && (p
= *argptr
++) == NULL
)
error("No arg for -%c option", c
);