13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * Definitions used in the interpreter 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier extern void Xappend(void), Xasync(void), Xbackq(void), Xbang(void), Xclose(void); 53e12c5d1SDavid du Colombier extern void Xconc(void), Xcount(void), Xdelfn(void), Xdol(void), Xqdol(void), Xdup(void); 63e12c5d1SDavid du Colombier extern void Xexit(void), Xfalse(void), Xfn(void), Xfor(void), Xglob(void); 73e12c5d1SDavid du Colombier extern void Xjump(void), Xmark(void), Xmatch(void), Xpipe(void), Xread(void); 8119a69faSDavid du Colombier extern void Xrdwr(void); 93e12c5d1SDavid du Colombier extern void Xrdfn(void), Xunredir(void), Xstar(void), Xreturn(void), Xsubshell(void); 103e12c5d1SDavid du Colombier extern void Xtrue(void), Xword(void), Xwrite(void), Xpipefd(void), Xcase(void); 113e12c5d1SDavid du Colombier extern void Xlocal(void), Xunlocal(void), Xassign(void), Xsimple(void), Xpopm(void); 123e12c5d1SDavid du Colombier extern void Xrdcmds(void), Xwastrue(void), Xif(void), Xifnot(void), Xpipewait(void); 139a747e4fSDavid du Colombier extern void Xdelhere(void), Xpopredir(void), Xsub(void), Xeflag(void), Xsettrue(void); 147dd7cddfSDavid du Colombier extern void Xerror(char*); 159a747e4fSDavid du Colombier extern void Xerror1(char*); 163e12c5d1SDavid du Colombier /* 173e12c5d1SDavid du Colombier * word lists are in correct order, 183e12c5d1SDavid du Colombier * i.e. word0->word1->word2->word3->0 193e12c5d1SDavid du Colombier */ 203e12c5d1SDavid du Colombier struct word{ 213e12c5d1SDavid du Colombier char *word; 223e12c5d1SDavid du Colombier word *next; 233e12c5d1SDavid du Colombier }; 243e12c5d1SDavid du Colombier struct list{ 253e12c5d1SDavid du Colombier word *words; 263e12c5d1SDavid du Colombier list *next; 273e12c5d1SDavid du Colombier }; 283e12c5d1SDavid du Colombier word *newword(char *, word *), *copywords(word *, word *); 293e12c5d1SDavid du Colombier struct redir{ 303e12c5d1SDavid du Colombier char type; /* what to do */ 313e12c5d1SDavid du Colombier short from, to; /* what to do it to */ 323e12c5d1SDavid du Colombier struct redir *next; /* what else to do (reverse order) */ 333e12c5d1SDavid du Colombier }; 349a747e4fSDavid du Colombier #define NSTATUS ERRMAX /* length of status (from plan 9) */ 353e12c5d1SDavid du Colombier /* 363e12c5d1SDavid du Colombier * redir types 373e12c5d1SDavid du Colombier */ 383e12c5d1SDavid du Colombier #define ROPEN 1 /* dup2(from, to); close(from); */ 393e12c5d1SDavid du Colombier #define RDUP 2 /* dup2(from, to); */ 403e12c5d1SDavid du Colombier #define RCLOSE 3 /* close(from); */ 413e12c5d1SDavid du Colombier struct thread{ 423e12c5d1SDavid du Colombier union code *code; /* code for this thread */ 433e12c5d1SDavid du Colombier int pc; /* code[pc] is the next instruction */ 443e12c5d1SDavid du Colombier struct list *argv; /* argument stack */ 453e12c5d1SDavid du Colombier struct redir *redir; /* redirection stack */ 463e12c5d1SDavid du Colombier struct redir *startredir; /* redir inheritance point */ 473e12c5d1SDavid du Colombier struct var *local; /* list of local variables */ 483e12c5d1SDavid du Colombier char *cmdfile; /* file name in Xrdcmd */ 493e12c5d1SDavid du Colombier struct io *cmdfd; /* file descriptor for Xrdcmd */ 503e12c5d1SDavid du Colombier int iflast; /* static `if not' checking */ 513e12c5d1SDavid du Colombier int eof; /* is cmdfd at eof? */ 523e12c5d1SDavid du Colombier int iflag; /* interactive? */ 533e12c5d1SDavid du Colombier int lineno; /* linenumber */ 543e12c5d1SDavid du Colombier int pid; /* process for Xpipewait to wait for */ 553e12c5d1SDavid du Colombier char status[NSTATUS]; /* status for Xpipewait */ 563e12c5d1SDavid du Colombier tree *treenodes; /* tree nodes created by this process */ 573e12c5d1SDavid du Colombier thread *ret; /* who continues when this finishes */ 583e12c5d1SDavid du Colombier }; 593e12c5d1SDavid du Colombier thread *runq; 603e12c5d1SDavid du Colombier code *codecopy(code*); 613e12c5d1SDavid du Colombier code *codebuf; /* compiler output */ 62*99eb86a7SDavid du Colombier int ntrap; /* number of outstanding traps */ 63*99eb86a7SDavid du Colombier int trap[NSIG]; /* number of outstanding traps per type */ 643e12c5d1SDavid du Colombier struct builtin{ 653e12c5d1SDavid du Colombier char *name; 663e12c5d1SDavid du Colombier void (*fnc)(void); 67d3907fe5SDavid du Colombier }; 68d3907fe5SDavid du Colombier extern struct builtin Builtin[]; 69219b2ee8SDavid du Colombier int eflagok; /* kludge flag so that -e doesn't exit in startup */ 70dc5a79c1SDavid du Colombier int havefork; 71dc5a79c1SDavid du Colombier 723e12c5d1SDavid du Colombier void execcd(void), execwhatis(void), execeval(void), execexec(void); 73dc5a79c1SDavid du Colombier int execforkexec(void); 743e12c5d1SDavid du Colombier void execexit(void), execshift(void); 753e12c5d1SDavid du Colombier void execwait(void), execumask(void), execdot(void), execflag(void); 763e12c5d1SDavid du Colombier void execfunc(var*), execcmds(io *); 77