| /* |
| * Definitions used in the interpreter |
| */ |
| extern void Xappend(void), Xasync(void), Xbackq(void), Xbang(void), Xclose(void); |
| extern void Xconc(void), Xcount(void), Xdelfn(void), Xdol(void), Xqdol(void), Xdup(void); |
| extern void Xexit(void), Xfalse(void), Xfn(void), Xfor(void), Xglob(void); |
| extern void Xjump(void), Xmark(void), Xmatch(void), Xpipe(void), Xread(void); |
| extern void Xrdwr(void); |
| extern void Xrdfn(void), Xunredir(void), Xstar(void), Xreturn(void), Xsubshell(void); |
| extern void Xtrue(void), Xword(void), Xwrite(void), Xpipefd(void), Xcase(void); |
| extern void Xlocal(void), Xunlocal(void), Xassign(void), Xsimple(void), Xpopm(void); |
| extern void Xrdcmds(void), Xwastrue(void), Xif(void), Xifnot(void), Xpipewait(void); |
| extern void Xdelhere(void), Xpopredir(void), Xsub(void), Xeflag(void), Xsettrue(void); |
| extern void Xerror(char*); |
| extern void Xerror1(char*); |
| /* |
| * word lists are in correct order, |
| * i.e. word0->word1->word2->word3->0 |
| */ |
| struct word{ |
| char *word; |
| word *next; |
| }; |
| struct list{ |
| word *words; |
| list *next; |
| }; |
| word *newword(char *, word *), *copywords(word *, word *); |
| struct redir{ |
| char type; /* what to do */ |
| short from, to; /* what to do it to */ |
| struct redir *next; /* what else to do (reverse order) */ |
| }; |
| #define NSTATUS ERRMAX /* length of status (from plan 9) */ |
| /* |
| * redir types |
| */ |
| #define ROPEN 1 /* dup2(from, to); close(from); */ |
| #define RDUP 2 /* dup2(from, to); */ |
| #define RCLOSE 3 /* close(from); */ |
| struct thread{ |
| union code *code; /* code for this thread */ |
| int pc; /* code[pc] is the next instruction */ |
| struct list *argv; /* argument stack */ |
| struct redir *redir; /* redirection stack */ |
| struct redir *startredir; /* redir inheritance point */ |
| struct var *local; /* list of local variables */ |
| char *cmdfile; /* file name in Xrdcmd */ |
| struct io *cmdfd; /* file descriptor for Xrdcmd */ |
| int iflast; /* static `if not' checking */ |
| int eof; /* is cmdfd at eof? */ |
| int iflag; /* interactive? */ |
| int lineno; /* linenumber */ |
| int pid; /* process for Xpipewait to wait for */ |
| char status[NSTATUS]; /* status for Xpipewait */ |
| tree *treenodes; /* tree nodes created by this process */ |
| thread *ret; /* who continues when this finishes */ |
| }; |
| thread *runq; |
| code *codecopy(code*); |
| code *codebuf; /* compiler output */ |
| int ntrap; /* number of outstanding traps */ |
| int trap[NSIG]; /* number of outstanding traps per type */ |
| struct builtin{ |
| char *name; |
| void (*fnc)(void); |
| }; |
| extern struct builtin Builtin[]; |
| int eflagok; /* kludge flag so that -e doesn't exit in startup */ |
| int havefork; |
| |
| void execcd(void), execwhatis(void), execeval(void), execexec(void); |
| int execforkexec(void); |
| void execexit(void), execshift(void); |
| void execwait(void), execumask(void), execdot(void), execflag(void); |
| void execfunc(var*), execcmds(io *); |