aboutsummaryrefslogtreecommitdiff
path: root/ash.h
diff options
context:
space:
mode:
Diffstat (limited to 'ash.h')
-rw-r--r--ash.h1225
1 files changed, 1225 insertions, 0 deletions
diff --git a/ash.h b/ash.h
new file mode 100644
index 000000000..ac25ddb1c
--- /dev/null
+++ b/ash.h
@@ -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 *));
+