1 /* $NetBSD: options.h,v 1.16 2003/01/22 20:36:04 dsl Exp $ */ 2 3 /*- 4 * Copyright (c) 1991, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Kenneth Almquist. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the University of 21 * California, Berkeley and its contributors. 22 * 4. Neither the name of the University nor the names of its contributors 23 * may be used to endorse or promote products derived from this software 24 * without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 36 * SUCH DAMAGE. 37 * 38 * @(#)options.h 8.2 (Berkeley) 5/4/95 39 */ 40 41 struct shparam { 42 int nparam; /* # of positional parameters (without $0) */ 43 unsigned char malloc; /* if parameter list dynamically allocated */ 44 unsigned char reset; /* if getopts has been reset */ 45 char **p; /* parameter list */ 46 char **optnext; /* next parameter to be processed by getopts */ 47 char *optptr; /* used by getopts */ 48 }; 49 50 51 struct optent { 52 const char *name; /* for set -o <name> */ 53 const char letter; /* set [+/-]<letter> and $- */ 54 const char opt_set; /* mutually exclusive option set */ 55 char val; /* value of <letter>flag */ 56 }; 57 58 /* Those marked [U] are required by posix, but have no effect! */ 59 60 #ifdef DEFINE_OPTIONS 61 #define DEF_OPTS(name, letter, opt_set) {name, letter, opt_set, 0}, 62 struct optent optlist[] = { 63 #else 64 #define DEF_OPTS(name, letter, opt_set) 65 #endif 66 #define DEF_OPT(name,letter) DEF_OPTS(name, letter, 0) 67 68 DEF_OPT( "errexit", 'e' ) /* exit on error */ 69 #define eflag optlist[0].val 70 DEF_OPT( "noglob", 'f' ) /* no pathname expansion */ 71 #define fflag optlist[1].val 72 DEF_OPT( "ignoreeof", 'I' ) /* do not exit on EOF */ 73 #define Iflag optlist[2].val 74 DEF_OPT( "interactive",'i' ) /* interactive shell */ 75 #define iflag optlist[3].val 76 DEF_OPT( "monitor", 'm' ) /* job control */ 77 #define mflag optlist[4].val 78 DEF_OPT( "noexec", 'n' ) /* [U] do not exec commands */ 79 #define nflag optlist[5].val 80 DEF_OPT( "stdin", 's' ) /* read from stdin */ 81 #define sflag optlist[6].val 82 DEF_OPT( "xtrace", 'x' ) /* trace after expansion */ 83 #define xflag optlist[7].val 84 DEF_OPT( "verbose", 'v' ) /* trace read input */ 85 #define vflag optlist[8].val 86 DEF_OPTS( "vi", 'V', 'V' ) /* vi style editing */ 87 #define Vflag optlist[9].val 88 DEF_OPTS( "emacs", 'E', 'V' ) /* emacs style editing */ 89 #define Eflag optlist[10].val 90 DEF_OPT( "noclobber", 'C' ) /* do not overwrite files with > */ 91 #define Cflag optlist[11].val 92 DEF_OPT( "allexport", 'a' ) /* export all variables */ 93 #define aflag optlist[12].val 94 DEF_OPT( "notify", 'b' ) /* [U] report completion of background jobs */ 95 #define bflag optlist[13].val 96 DEF_OPT( "nounset", 'u' ) /* error expansion of unset variables */ 97 #define uflag optlist[14].val 98 DEF_OPT( "quietprofile", 'q' ) 99 #define qflag optlist[15].val 100 DEF_OPT( "nolog", 0 ) /* [U] no functon defs in command history */ 101 #define nolog optlist[16].val 102 DEF_OPT( "cdprint", 0 ) /* always print result of cd */ 103 #define cdprint optlist[17].val 104 #ifdef DEBUG 105 DEF_OPT( "debug", 0 ) /* enable debug prints */ 106 #define debug optlist[18].val 107 #endif 108 109 #ifdef DEFINE_OPTIONS 110 { 0, 0, 0, 0 }, 111 }; 112 #define NOPTS (sizeof optlist / sizeof optlist[0] - 1) 113 int sizeof_optlist = sizeof optlist; 114 #else 115 extern struct optent optlist[]; 116 extern int sizeof_optlist; 117 #endif 118 119 120 extern char *minusc; /* argument to -c option */ 121 extern char *arg0; /* $0 */ 122 extern struct shparam shellparam; /* $@ */ 123 extern char **argptr; /* argument list for builtin commands */ 124 extern char *optionarg; /* set by nextopt */ 125 extern char *optptr; /* used by nextopt */ 126 127 void procargs(int, char **); 128 void optschanged(void); 129 void setparam(char **); 130 void freeparam(volatile struct shparam *); 131 int shiftcmd(int, char **); 132 int setcmd(int, char **); 133 int getoptscmd(int, char **); 134 int nextopt(const char *); 135 void getoptsreset(const char *); 136