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