diff options
Diffstat (limited to 'ash.h')
-rw-r--r-- | ash.h | 1225 |
1 files changed, 1225 insertions, 0 deletions
@@ -0,0 +1,1225 @@ +/*- + * Copyright (c) 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Kenneth Almquist. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 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 + * SUCH DAMAGE. + */ + +/* $NetBSD: alias.h,v 1.4 1995/05/11 21:28:42 christos Exp $ */ + +#define ALIASINUSE 1 +#define ALIASDEAD 2 + +struct alias { + struct alias *next; + char *name; + char *val; + int flag; +}; + +struct alias *lookupalias __P((const char *, int)); +static int aliascmd __P((int, char **)); +static int unaliascmd __P((int, char **)); +static void rmaliases __P((void)); +static int unalias __P((char *)); +static void printalias __P((const struct alias *)); +#define ARITH_NUM 257 +#define ARITH_LPAREN 258 +#define ARITH_RPAREN 259 +#define ARITH_OR 260 +#define ARITH_AND 261 +#define ARITH_BOR 262 +#define ARITH_BXOR 263 +#define ARITH_BAND 264 +#define ARITH_EQ 265 +#define ARITH_NE 266 +#define ARITH_LT 267 +#define ARITH_GT 268 +#define ARITH_GE 269 +#define ARITH_LE 270 +#define ARITH_LSHIFT 271 +#define ARITH_RSHIFT 272 +#define ARITH_ADD 273 +#define ARITH_SUB 274 +#define ARITH_MUL 275 +#define ARITH_DIV 276 +#define ARITH_REM 277 +#define ARITH_UNARYMINUS 278 +#define ARITH_UNARYPLUS 279 +#define ARITH_NOT 280 +#define ARITH_BNOT 281 + +/* + * This file was generated by the mkbuiltins program. + */ + + +#define BUILTIN_SPECIAL 0x1 +#define BUILTIN_REGULAR 0x2 +#define BUILTIN_ASSIGN 0x4 + +struct builtincmd { + const char *name; + int (*const builtinfunc) __P((int, char **)); + unsigned flags; +}; + +extern const struct builtincmd builtincmds[]; + + + +/* $NetBSD: cd.h,v 1.2 1997/07/04 21:01:52 christos Exp $ */ +static int cdcmd __P((int, char **)); +static int pwdcmd __P((int, char **)); +static void setpwd __P((const char *, int)); + + +/* $NetBSD: error.h,v 1.14 2001/02/04 19:52:06 christos Exp $ */ + +/* + * Types of operations (passed to the errmsg routine). + */ + +#define E_OPEN 01 /* opening a file */ +#define E_CREAT 02 /* creating a file */ +#define E_EXEC 04 /* executing a program */ + + +/* + * We enclose jmp_buf in a structure so that we can declare pointers to + * jump locations. The global variable handler contains the location to + * jump to when an exception occurs, and the global variable exception + * contains a code identifying the exeception. To implement nested + * exception handlers, the user should save the value of handler on entry + * to an inner scope, set handler to point to a jmploc structure for the + * inner scope, and restore handler on exit from the scope. + */ + +struct jmploc { + jmp_buf loc; +}; + +extern struct jmploc *handler; +extern int exception; + +/* exceptions */ +#define EXINT 0 /* SIGINT received */ +#define EXERROR 1 /* a generic error */ +#define EXSHELLPROC 2 /* execute a shell procedure */ +#define EXEXEC 3 /* command execution failed */ + + +/* + * These macros allow the user to suspend the handling of interrupt signals + * over a period of time. This is similar to SIGHOLD to or sigblock, but + * much more efficient and portable. (But hacking the kernel is so much + * more fun than worrying about efficiency and portability. :-)) + */ + +extern int suppressint; +extern volatile int intpending; + +#define INTOFF suppressint++ +#ifdef REALLY_SMALL +static void __inton __P((void)); +#define INTON __inton() +#else +#define INTON { if (--suppressint == 0 && intpending) onint(); } +#endif +#define FORCEINTON {suppressint = 0; if (intpending) onint();} +#define CLEAR_PENDING_INT intpending = 0 +#define int_pending() intpending + +static void exraise __P((int)) __attribute__((__noreturn__)); +static void onint __P((void)); +static void error __P((const char *, ...)) __attribute__((__noreturn__)); +static void exerror __P((int, const char *, ...)) __attribute__((__noreturn__)); +static const char *errmsg __P((int, int)); + + +/* + * BSD setjmp saves the signal mask, which violates ANSI C and takes time, + * so we use _setjmp instead. + */ + +#if defined(BSD) && !defined(__SVR4) && !defined(__GLIBC__) +#define setjmp(jmploc) _setjmp(jmploc) +#define longjmp(jmploc, val) _longjmp(jmploc, val) +#endif + + + +/* $NetBSD: shell.h,v 1.13 2000/05/22 10:18:47 elric Exp $ */ + +/* + * The follow should be set to reflect the type of system you have: + * JOBS -> 1 if you have Berkeley job control, 0 otherwise. + * SHORTNAMES -> 1 if your linker cannot handle long names. + * define BSD if you are running 4.2 BSD or later. + * define SYSV if you are running under System V. + * define DEBUG=1 to compile in debugging (set global "debug" to turn on) + * define DEBUG=2 to compile in and turn on debugging. + * + * When debugging is on, debugging info will be written to $HOME/trace and + * a quit signal will generate a core dump. + */ + + +#define JOBS 1 +#ifndef BSD +#define BSD 1 +#endif + +#ifdef __STDC__ +typedef void *pointer; +#ifndef NULL +#define NULL (void *)0 +#endif +#else /* not __STDC__ */ +typedef char *pointer; +#ifndef NULL +#define NULL 0 +#endif +#endif /* not __STDC__ */ + +extern char nullstr[1]; /* null string */ + + +#ifdef DEBUG +#define TRACE(param) trace param +#else +#define TRACE(param) +#endif + + + + +/* + * This file was generated by the mknodes program. + */ + +#define NSEMI 0 +#define NCMD 1 +#define NPIPE 2 +#define NREDIR 3 +#define NBACKGND 4 +#define NSUBSHELL 5 +#define NAND 6 +#define NOR 7 +#define NIF 8 +#define NWHILE 9 +#define NUNTIL 10 +#define NFOR 11 +#define NCASE 12 +#define NCLIST 13 +#define NDEFUN 14 +#define NARG 15 +#define NTO 16 +#define NFROM 17 +#define NFROMTO 18 +#define NAPPEND 19 +#define NTOOV 20 +#define NTOFD 21 +#define NFROMFD 22 +#define NHERE 23 +#define NXHERE 24 +#define NNOT 25 + + + +struct nbinary { + int type; + union node *ch1; + union node *ch2; +}; + + +struct ncmd { + int type; + int backgnd; + union node *assign; + union node *args; + union node *redirect; +}; + + +struct npipe { + int type; + int backgnd; + struct nodelist *cmdlist; +}; + + +struct nredir { + int type; + union node *n; + union node *redirect; +}; + + +struct nif { + int type; + union node *test; + union node *ifpart; + union node *elsepart; +}; + + +struct nfor { + int type; + union node *args; + union node *body; + char *var; +}; + + +struct ncase { + int type; + union node *expr; + union node *cases; +}; + + +struct nclist { + int type; + union node *next; + union node *pattern; + union node *body; +}; + + +struct narg { + int type; + union node *next; + char *text; + struct nodelist *backquote; +}; + + +struct nfile { + int type; + union node *next; + int fd; + union node *fname; + char *expfname; +}; + + +struct ndup { + int type; + union node *next; + int fd; + int dupfd; + union node *vname; +}; + + +struct nhere { + int type; + union node *next; + int fd; + union node *doc; +}; + + +struct nnot { + int type; + union node *com; +}; + + +union node { + int type; + struct nbinary nbinary; + struct ncmd ncmd; + struct npipe npipe; + struct nredir nredir; + struct nif nif; + struct nfor nfor; + struct ncase ncase; + struct nclist nclist; + struct narg narg; + struct nfile nfile; + struct ndup ndup; + struct nhere nhere; + struct nnot nnot; +}; + + +struct nodelist { + struct nodelist *next; + union node *n; +}; + + +#ifdef __STDC__ +union node *copyfunc(union node *); +static void freefunc(union node *); +#else +union node *copyfunc(); +static void freefunc(); +#endif + + + +/* $NetBSD: eval.h,v 1.10 2000/01/27 23:39:40 christos Exp $ */ +extern char *commandname; /* currently executing command */ +extern int exitstatus; /* exit status of last command */ +extern struct strlist *cmdenviron; /* environment for builtin command */ + + +struct backcmd { /* result of evalbackcmd */ + int fd; /* file descriptor to read from */ + char *buf; /* buffer */ + int nleft; /* number of chars in buffer */ + struct job *jp; /* job structure for command */ +}; + +static int evalcmd __P((int, char **)); +static void evalstring __P((char *, int)); +static void evaltree __P((union node *, int)); +static void evalbackcmd __P((union node *, struct backcmd *)); +static int bltincmd __P((int, char **)); +static int breakcmd __P((int, char **)); +static int returncmd __P((int, char **)); +static int execcmd __P((int, char **)); + +/* in_function returns nonzero if we are currently evaluating a function */ +#define in_function() funcnest +extern int funcnest; +extern int evalskip; + +/* reasons for skipping commands (see comment on breakcmd routine) */ +#define SKIPBREAK 1 +#define SKIPCONT 2 +#define SKIPFUNC 3 +#define SKIPFILE 4 + + + + +/* $NetBSD: exec.h,v 1.17 2000/05/22 10:18:47 elric Exp $ */ + +/* values of cmdtype */ +#define CMDUNKNOWN -1 /* no entry in table for command */ +#define CMDNORMAL 0 /* command is an executable program */ +#define CMDBUILTIN 1 /* command is a shell builtin */ +#define CMDFUNCTION 2 /* command is a shell function */ + + +struct cmdentry { + int cmdtype; + union param { + int index; + union node *func; + const struct builtincmd *cmd; + } u; +}; + + +#define DO_ERR 1 /* find_command prints errors */ +#define DO_ABS 2 /* find_command checks absolute paths */ +#define DO_NOFUN 4 /* find_command ignores functions */ +#define DO_BRUTE 8 /* find_command ignores hash table */ + +extern const char *pathopt; /* set by padvance */ +extern int exerrno; /* last exec error */ + +static void shellexec __P((char **, char **, const char *, int)) + __attribute__((noreturn)); +static char *padvance __P((const char **, const char *)); +static int hashcmd __P((int, char **)); +static void find_command __P((char *, struct cmdentry *, int, const char *)); +struct builtincmd *find_builtin __P((char *)); +static void hashcd __P((void)); +static void changepath __P((const char *)); +static void deletefuncs __P((void)); +#ifdef notdef +static void getcmdentry __P((char *, struct cmdentry *)); +#endif +static void addcmdentry __P((char *, struct cmdentry *)); +static void defun __P((char *, union node *)); +static void unsetfunc __P((char *)); +#ifdef ASH_TYPE +static int typecmd __P((int, char **)); +#endif +static int commandcmd __P((int, char **)); + + + +/* $NetBSD: expand.h,v 1.12 1999/07/09 03:05:50 christos Exp $ */ +struct strlist { + struct strlist *next; + char *text; +}; + + +struct arglist { + struct strlist *list; + struct strlist **lastp; +}; + +/* + * expandarg() flags + */ +#define EXP_FULL 0x1 /* perform word splitting & file globbing */ +#define EXP_TILDE 0x2 /* do normal tilde expansion */ +#define EXP_VARTILDE 0x4 /* expand tildes in an assignment */ +#define EXP_REDIR 0x8 /* file glob for a redirection (1 match only) */ +#define EXP_CASE 0x10 /* keeps quotes around for CASE pattern */ +#define EXP_RECORD 0x20 /* need to record arguments for ifs breakup */ + + +static void expandhere __P((union node *, int)); +static void expandarg __P((union node *, struct arglist *, int)); +#ifdef ASH_MATH_SUPPORT +static void expari __P((int)); +#endif +#if !(defined(__GLIBC__) && !defined(FNMATCH_BROKEN) && !defined(GLOB_BROKEN)) +static int patmatch __P((char *, char *, int)); +#endif +#if defined(__GLIBC__) && !defined(FNMATCH_BROKEN) +#define rmescapes(p) _rmescapes((p), 0) +static char *_rmescapes __P((char *, int)); +#else +static void rmescapes __P((char *)); +#endif +static int casematch __P((union node *, char *)); + + +#ifdef ASH_MATH_SUPPORT +/* From arith.y */ +static int arith __P((const char *)); +static int expcmd __P((int , char **)); +static void arith_lex_reset __P((void)); +static int yylex __P((void)); +#endif + + + + +/* $NetBSD: init.h,v 1.8 1995/05/11 21:29:14 christos Exp $ */ +static void init __P((void)); +static void reset __P((void)); +static void initshellproc __P((void)); + + + +/* $NetBSD: input.h,v 1.12 2000/05/22 10:18:47 elric Exp $ */ + +/* PEOF (the end of file marker) is defined in syntax.h */ +/* + * The input line number. Input.c just defines this variable, and saves + * and restores it when files are pushed and popped. The user of this + * package must set its value. + */ +extern int plinno; +extern int parsenleft; /* number of characters left in input buffer */ +extern char *parsenextc; /* next character in input buffer */ + +static char *pfgets __P((char *, int)); +static int pgetc __P((void)); +static int pgetc2 __P((void)); +static int preadbuffer __P((void)); +static void pungetc __P((void)); +static void pushstring __P((char *, int, void *)); +static void popstring __P((void)); +static void setinputfile __P((const char *, int)); +static void setinputfd __P((int, int)); +static void setinputstring __P((char *)); +static void popfile __P((void)); +static void popallfiles __P((void)); +static void closescript __P((void)); + +#define pgetc_macro() (--parsenleft >= 0? *parsenextc++ : preadbuffer()) + + + +/* $NetBSD: jobs.h,v 1.12 2000/05/22 10:18:47 elric Exp $ */ + +/* Mode argument to forkshell. Don't change FORK_FG or FORK_BG. */ +#define FORK_FG 0 +#define FORK_BG 1 +#define FORK_NOJOB 2 + + +/* + * A job structure contains information about a job. A job is either a + * single process or a set of processes contained in a pipeline. In the + * latter case, pidlist will be non-NULL, and will point to a -1 terminated + * array of pids. + */ + +struct procstat { + pid_t pid; /* process id */ + int status; /* status flags (defined above) */ + char *cmd; /* text of command being run */ +}; + + +/* states */ +#define JOBSTOPPED 1 /* all procs are stopped */ +#define JOBDONE 2 /* all procs are completed */ + + +struct job { + struct procstat ps0; /* status of process */ + struct procstat *ps; /* status or processes when more than one */ + short nprocs; /* number of processes */ + short pgrp; /* process group of this job */ + char state; /* true if job is finished */ + char used; /* true if this entry is in used */ + char changed; /* true if status has changed */ +#if JOBS + char jobctl; /* job running under job control */ +#endif +}; + +extern short backgndpid; /* pid of last background process */ +extern int job_warning; /* user was warned about stopped jobs */ + +static void setjobctl __P((int)); +static int killcmd __P((int, char **)); +static int fgcmd __P((int, char **)); +static int bgcmd __P((int, char **)); +static int jobscmd __P((int, char **)); +static void showjobs __P((int)); +static int waitcmd __P((int, char **)); +struct job *makejob __P((union node *, int)); +static int forkshell __P((struct job *, union node *, int)); +static int waitforjob __P((struct job *)); +static int stoppedjobs __P((void)); +static char *commandtext __P((union node *)); + +#if ! JOBS +#define setjobctl(on) /* do nothing */ +#endif + + + +/* $NetBSD: machdep.h,v 1.8 1995/05/11 21:29:21 christos Exp $ */ + +/* + * Most machines require the value returned from malloc to be aligned + * in some way. The following macro will get this right on many machines. + */ + +#ifndef ALIGN +union align { + int i; + char *cp; +}; + +#define ALIGN(nbytes) (((nbytes) + sizeof(union align) - 1) & ~(sizeof(union align) - 1)) +#endif + + + +/* $NetBSD: mail.h,v 1.8 1995/05/11 21:29:23 christos Exp $ */ + +static void chkmail __P((int)); + + + +/* $NetBSD: main.h,v 1.8 1995/05/11 21:29:27 christos Exp $ */ +extern int rootpid; /* pid of main shell */ +extern int rootshell; /* true if we aren't a child of the main shell */ + +static void readcmdfile __P((char *)); +static void cmdloop __P((int)); +static int dotcmd __P((int, char **)); +static int exitcmd __P((int, char **)); + + + +/* $NetBSD: memalloc.h,v 1.11 2000/11/01 19:56:01 christos Exp $ */ +struct stackmark { + struct stack_block *stackp; + char *stacknxt; + int stacknleft; + struct stackmark *marknext; +}; + + +extern char *stacknxt; +extern int stacknleft; +extern int sstrnleft; +extern int herefd; + +static inline pointer ckmalloc (int sz) { return xmalloc(sz); } +static inline pointer ckrealloc(void *p, int sz) { return xrealloc(p, sz); } +static inline char * savestr (const char *s) { return xstrdup(s); } + +pointer stalloc __P((int)); +static void stunalloc __P((pointer)); +static void setstackmark __P((struct stackmark *)); +static void popstackmark __P((struct stackmark *)); +static void growstackblock __P((void)); +static void grabstackblock __P((int)); +static char *growstackstr __P((void)); +static char *makestrspace __P((size_t)); +static void ungrabstackstr __P((char *, char *)); + + + +#define stackblock() stacknxt +#define stackblocksize() stacknleft +#define STARTSTACKSTR(p) p = stackblock(), sstrnleft = stackblocksize() +#define STPUTC(c, p) (--sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(), *p++ = (c))) +#define CHECKSTRSPACE(n, p) { if (sstrnleft < n) p = makestrspace(n); } +#define USTPUTC(c, p) (--sstrnleft, *p++ = (c)) +#define STACKSTRNUL(p) (sstrnleft == 0? (p = growstackstr(), *p = '\0') : (*p = '\0')) +#define STUNPUTC(p) (++sstrnleft, --p) +#define STTOPC(p) p[-1] +#define STADJUST(amount, p) (p += (amount), sstrnleft -= (amount)) +#define grabstackstr(p) stalloc(stackblocksize() - sstrnleft) + +#define ckfree(p) free((pointer)(p)) + + + +/* $NetBSD: miscbltin.h,v 1.1 1997/07/04 21:02:10 christos Exp $ */ +static int readcmd __P((int, char **)); +static int umaskcmd __P((int, char **)); +static int ulimitcmd __P((int, char **)); + + + +/* $NetBSD: mystring.h,v 1.9 1995/05/11 21:29:42 christos Exp $ */ + +extern const char snlfmt[]; +extern const char spcstr[]; + +#if 0 +static void scopyn __P((const char *, char *, int)); +#endif +static int prefix __P((const char *, const char *)); +static int number __P((const char *)); +static int is_number __P((const char *)); +static char *single_quote __P((const char *)); +static char *sstrdup __P((const char *)); +static int pstrcmp __P((const void *, const void *)); +static const char *const *findstring __P((const char *, const char *const *, size_t)); + +#define equal(s1, s2) (strcmp(s1, s2) == 0) +#define scopy(s1, s2) ((void)strcpy(s2, s1)) + + +/* $NetBSD: options.h,v 1.14 2001/02/04 19:52:06 christos Exp $ */ + +struct shparam { + int nparam; /* # of positional parameters (without $0) */ + unsigned char malloc; /* if parameter list dynamically allocated */ + char **p; /* parameter list */ + int optind; /* next parameter to be processed by getopts */ + int optoff; /* used by getopts */ +}; + + + +#define eflag optlist[0].val +#define fflag optlist[1].val +#define Iflag optlist[2].val +#define iflag optlist[3].val +#define mflag optlist[4].val +#define nflag optlist[5].val +#define sflag optlist[6].val +#define xflag optlist[7].val +#define vflag optlist[8].val +#define Vflag optlist[9].val +#define Eflag optlist[10].val +#define Cflag optlist[11].val +#define aflag optlist[12].val +#define bflag optlist[13].val +#define uflag optlist[14].val +#define qflag optlist[15].val + +#define NOPTS 16 + +struct optent { + const char *name; + const char letter; + char val; +}; + +extern struct optent optlist[NOPTS]; + + +extern char *minusc; /* argument to -c option */ +extern char *arg0; /* $0 */ +extern struct shparam shellparam; /* $@ */ +extern char **argptr; /* argument list for builtin commands */ +extern char *optionarg; /* set by nextopt */ +extern char *optptr; /* used by nextopt */ + +static void procargs __P((int, char **)); +static void optschanged __P((void)); +static void setparam __P((char **)); +static void freeparam __P((volatile struct shparam *)); +static int shiftcmd __P((int, char **)); +static int setcmd __P((int, char **)); +#ifdef ASH_GETOPTS +static int getoptscmd __P((int, char **)); +static int setvarsafe __P((const char *, const char *, int)); +#endif +static int nextopt __P((const char *)); +static void getoptsreset __P((const char *)); + + + +/* $NetBSD: output.h,v 1.14 1998/01/31 12:37:55 christos Exp $ */ +struct output { +#ifdef USE_GLIBC_STDIO + FILE *stream; +#endif + char *nextc; + int nleft; + char *buf; + int bufsize; + int fd; + short flags; +}; + +extern struct output output; +extern struct output errout; +extern struct output memout; +extern struct output *out1; +extern struct output *out2; + +static void outstr __P((const char *, struct output *)); +#ifndef USE_GLIBC_STDIO +static void outcslow __P((char, struct output *)); +#endif +static void flushall __P((void)); +static void flushout __P((struct output *)); +static void freestdout __P((void)); +static void outfmt __P((struct output *, const char *, ...)) + __attribute__((__format__(__printf__,2,3))); +static void out1fmt __P((const char *, ...)) + __attribute__((__format__(__printf__,1,2))); +static void fmtstr __P((char *, size_t, const char *, ...)) + __attribute__((__format__(__printf__,3,4))); +#ifndef USE_GLIBC_STDIO +static void doformat __P((struct output *, const char *, va_list)); +#endif +static int xwrite __P((int, const char *, int)); +#ifdef USE_GLIBC_STDIO +static void initstreams __P((void)); +static void openmemout __P((void)); +static int __closememout __P((void)); +#endif + +#define OUTPUT_ERR 01 /* error occurred on output */ + +#ifdef USE_GLIBC_STDIO +#define outc(c, o) putc((c), (o)->stream) +#define doformat(d, f, a) vfprintf((d)->stream, (f), (a)) +#else +#define outc(c, file) (--(file)->nleft < 0? outcslow((c), (file)) : (*(file)->nextc = (c), (file)->nextc++)) +#endif +#define out1c(c) outc((c), out1) +#define out2c(c) outc((c), out2) +#define out1str(s) outstr((s), out1) +#define out2str(s) outstr((s), out2) +#define outerr(f) ((f)->flags & OUTPUT_ERR) + + + +/* $NetBSD: parser.h,v 1.14 2000/07/27 04:09:28 cgd Exp $ */ +/* control characters in argument strings */ +#define CTLESC '\201' +#define CTLVAR '\202' +#define CTLENDVAR '\203' +#define CTLBACKQ '\204' +#define CTLQUOTE 01 /* ored with CTLBACKQ code if in quotes */ +/* CTLBACKQ | CTLQUOTE == '\205' */ +#define CTLARI '\206' +#define CTLENDARI '\207' +#define CTLQUOTEMARK '\210' + +/* variable substitution byte (follows CTLVAR) */ +#define VSTYPE 0x0f /* type of variable substitution */ +#define VSNUL 0x10 /* colon--treat the empty string as unset */ +#define VSQUOTE 0x80 /* inside double quotes--suppress splitting */ + +/* values of VSTYPE field */ +#define VSNORMAL 0x1 /* normal variable: $var or ${var} */ +#define VSMINUS 0x2 /* ${var-text} */ +#define VSPLUS 0x3 /* ${var+text} */ +#define VSQUESTION 0x4 /* ${var?message} */ +#define VSASSIGN 0x5 /* ${var=text} */ +#define VSTRIMLEFT 0x6 /* ${var#pattern} */ +#define VSTRIMLEFTMAX 0x7 /* ${var##pattern} */ +#define VSTRIMRIGHT 0x8 /* ${var%pattern} */ +#define VSTRIMRIGHTMAX 0x9 /* ${var%%pattern} */ +#define VSLENGTH 0xa /* ${#var} */ + + +/* + * NEOF is returned by parsecmd when it encounters an end of file. It + * must be distinct from NULL, so we use the address of a variable that + * happens to be handy. + */ +extern int tokpushback; +#define NEOF ((union node *)&tokpushback) +extern int whichprompt; /* 1 == PS1, 2 == PS2 */ +extern int checkalias; + + +union node *parsecmd(int); +static void fixredir(union node *, const char *, int); +static int goodname(char *); +static const char *getprompt(void *); +static int isassignment __P((const char *)); +static const char *const *findkwd __P((const char *)); + + +/* $NetBSD: redir.h,v 1.12 2000/05/22 10:18:47 elric Exp $ */ +/* flags passed to redirect */ +#define REDIR_PUSH 01 /* save previous values of file descriptors */ +#define REDIR_BACKQ 02 /* save the command output in memory */ + +extern int fileno2; + +static void redirect __P((union node *, int)); +static void popredir __P((void)); +static int fd0_redirected_p __P((void)); +static void clearredir __P((void)); +static int dup_as_newfd __P((int, int)); + + + + +/* $NetBSD: show.h,v 1.4 1999/10/08 21:10:44 pk Exp $ */ +#ifdef DEBUG +static void trace __P((const char *, ...)); +static void trargs __P((char **)); +static void showtree __P((union node *)); +static void trputc __P((int)); +static void trputs __P((const char *)); +static void opentrace __P((void)); +#endif +/* + * This file was generated by the mksyntax program. + */ + +#ifdef CEOF +#undef CEOF +#endif + +/* Syntax classes */ +#define CWORD 0 /* character is nothing special */ +#define CNL 1 /* newline character */ +#define CBACK 2 /* a backslash character */ +#define CSQUOTE 3 /* single quote */ +#define CDQUOTE 4 /* double quote */ +#define CENDQUOTE 5 /* a terminating quote */ +#define CBQUOTE 6 /* backwards single quote */ +#define CVAR 7 /* a dollar sign */ +#define CENDVAR 8 /* a '}' character */ +#define CLP 9 /* a left paren in arithmetic */ +#define CRP 10 /* a right paren in arithmetic */ +#define CEOF 11 /* end of file */ +#define CCTL 12 /* like CWORD, except it must be escaped */ +#define CSPCL 13 /* these terminate a word */ +#define CIGN 14 /* character should be ignored */ + +/* Syntax classes for is_ functions */ +#define ISDIGIT 01 /* a digit */ +#define ISUPPER 02 /* an upper case letter */ +#define ISLOWER 04 /* a lower case letter */ +#define ISUNDER 010 /* an underscore */ +#define ISSPECL 020 /* the name of a special parameter */ + +#define SYNBASE 130 +#define PEOF -130 + +#define PEOA -129 + + +#define BASESYNTAX (basesyntax + SYNBASE) +#define DQSYNTAX (dqsyntax + SYNBASE) +#define SQSYNTAX (sqsyntax + SYNBASE) +#define ARISYNTAX (arisyntax + SYNBASE) + +#define is_digit(c) ((unsigned)((c) - '0') <= 9) +#define is_alpha(c) (((c) < CTLESC || (c) > CTLENDARI) && isalpha((unsigned char) (c))) +#define is_name(c) (((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalpha((unsigned char) (c)))) +#define is_in_name(c) (((c) < CTLESC || (c) > CTLENDARI) && ((c) == '_' || isalnum((unsigned char) (c)))) +#define is_special(c) ((is_type+SYNBASE)[c] & (ISSPECL|ISDIGIT)) +#define digit_val(c) ((c) - '0') + +extern const char basesyntax[]; +extern const char dqsyntax[]; +extern const char sqsyntax[]; +extern const char arisyntax[]; +extern const char is_type[]; +#define TEOF 0 +#define TNL 1 +#define TSEMI 2 +#define TBACKGND 3 +#define TAND 4 +#define TOR 5 +#define TPIPE 6 +#define TLP 7 +#define TRP 8 +#define TENDCASE 9 +#define TENDBQUOTE 10 +#define TREDIR 11 +#define TWORD 12 +#define TASSIGN 13 +#define TNOT 14 +#define TCASE 15 +#define TDO 16 +#define TDONE 17 +#define TELIF 18 +#define TELSE 19 +#define TESAC 20 +#define TFI 21 +#define TFOR 22 +#define TIF 23 +#define TIN 24 +#define TTHEN 25 +#define TUNTIL 26 +#define TWHILE 27 +#define TBEGIN 28 +#define TEND 29 + +/* Array indicating which tokens mark the end of a list */ +static const char tokendlist[] = { + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 1, +}; + +static const char *const tokname[] = { + "end of file", + "newline", + "\";\"", + "\"&\"", + "\"&&\"", + "\"||\"", + "\"|\"", + "\"(\"", + "\")\"", + "\";;\"", + "\"`\"", + "redirection", + "word", + "assignment", + "\"!\"", + "\"case\"", + "\"do\"", + "\"done\"", + "\"elif\"", + "\"else\"", + "\"esac\"", + "\"fi\"", + "\"for\"", + "\"if\"", + "\"in\"", + "\"then\"", + "\"until\"", + "\"while\"", + "\"{\"", + "\"}\"", +}; + +#define KWDOFFSET 14 + +static const char *const parsekwd[] = { + "!", + "case", + "do", + "done", + "elif", + "else", + "esac", + "fi", + "for", + "if", + "in", + "then", + "until", + "while", + "{", + "}" +}; + + + + +/* $NetBSD: trap.h,v 1.14 2000/05/22 10:18:47 elric Exp $ */ +extern int pendingsigs; + +static int trapcmd __P((int, char **)); +static void clear_traps __P((void)); +static void setsignal __P((int)); +static void ignoresig __P((int)); +static void onsig __P((int)); +static void dotrap __P((void)); +static void setinteractive __P((int)); +static void exitshell __P((int)) __attribute__((noreturn)); +static int decode_signal __P((const char *, int)); + + + +/* $NetBSD: var.h,v 1.18 2000/05/22 10:18:47 elric Exp $ */ + +/* + * Shell variables. + */ + +/* flags */ +#define VEXPORT 0x01 /* variable is exported */ +#define VREADONLY 0x02 /* variable cannot be modified */ +#define VSTRFIXED 0x04 /* variable struct is staticly allocated */ +#define VTEXTFIXED 0x08 /* text is staticly allocated */ +#define VSTACK 0x10 /* text is allocated on the stack */ +#define VUNSET 0x20 /* the variable is not set */ +#define VNOFUNC 0x40 /* don't call the callback function */ + + +struct var { + struct var *next; /* next entry in hash list */ + int flags; /* flags are defined above */ + char *text; /* name=value */ + void (*func) __P((const char *)); + /* function to be called when */ + /* the variable gets set/unset */ +}; + + +struct localvar { + struct localvar *next; /* next local variable in list */ + struct var *vp; /* the variable that was made local */ + int flags; /* saved flags */ + char *text; /* saved text */ +}; + + +extern struct localvar *localvars; + +#if ATTY +extern struct var vatty; +#endif +extern struct var vifs; +extern struct var vmail; +extern struct var vmpath; +extern struct var vpath; +extern struct var vps1; +extern struct var vps2; +#ifndef SMALL +extern struct var vterm; +extern struct var vtermcap; +extern struct var vhistsize; +#endif + +#ifdef IFS_BROKEN +extern const char defifsvar[]; +#define defifs (defifsvar + 4) +#else +extern const char defifs[]; +#endif +extern const char defpathvar[]; +#define defpath (defpathvar + 5) + +/* + * The following macros access the values of the above variables. + * They have to skip over the name. They return the null string + * for unset variables. + */ + +#define ifsval() (vifs.text + 4) +#define ifsset() ((vifs.flags & VUNSET) == 0) +#define mailval() (vmail.text + 5) +#define mpathval() (vmpath.text + 9) +#define pathval() (vpath.text + 5) +#define ps1val() (vps1.text + 4) +#define ps2val() (vps2.text + 4) +#define optindval() (voptind.text + 7) +#ifndef SMALL +#define histsizeval() (vhistsize.text + 9) +#define termval() (vterm.text + 5) +#endif + +#if ATTY +#define attyset() ((vatty.flags & VUNSET) == 0) +#endif +#define mpathset() ((vmpath.flags & VUNSET) == 0) + +static void initvar __P((void)); +static void setvar __P((const char *, const char *, int)); +static void setvareq __P((char *, int)); +struct strlist; +static void listsetvar __P((struct strlist *)); +static char *lookupvar __P((const char *)); +static char *bltinlookup __P((const char *)); +static char **environment __P((void)); +static void shprocvar __P((void)); +static int showvarscmd __P((int, char **)); +static int exportcmd __P((int, char **)); +static int localcmd __P((int, char **)); +static void mklocal __P((char *)); +static void poplocalvars __P((void)); +static int setvarcmd __P((int, char **)); +static int unsetcmd __P((int, char **)); +static int unsetvar __P((const char *)); +static int varequal __P((const char *, const char *)); + |