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); 83e12c5d1SDavid du Colombier extern void Xrdfn(void), Xunredir(void), Xstar(void), Xreturn(void), Xsubshell(void); 93e12c5d1SDavid du Colombier extern void Xtrue(void), Xword(void), Xwrite(void), Xpipefd(void), Xcase(void); 103e12c5d1SDavid du Colombier extern void Xlocal(void), Xunlocal(void), Xassign(void), Xsimple(void), Xpopm(void); 113e12c5d1SDavid du Colombier extern void Xrdcmds(void), Xwastrue(void), Xif(void), Xifnot(void), Xpipewait(void); 12*219b2ee8SDavid du Colombier extern void Xdelhere(void), Xpopredir(void), Xsub(void), Xeflag(void), Xsettrue(); 13*219b2ee8SDavid du Colombier extern void Xerror(char*), Xperror(char*); 143e12c5d1SDavid du Colombier /* 153e12c5d1SDavid du Colombier * word lists are in correct order, 163e12c5d1SDavid du Colombier * i.e. word0->word1->word2->word3->0 173e12c5d1SDavid du Colombier */ 183e12c5d1SDavid du Colombier struct word{ 193e12c5d1SDavid du Colombier char *word; 203e12c5d1SDavid du Colombier word *next; 213e12c5d1SDavid du Colombier }; 223e12c5d1SDavid du Colombier struct list{ 233e12c5d1SDavid du Colombier word *words; 243e12c5d1SDavid du Colombier list *next; 253e12c5d1SDavid du Colombier }; 263e12c5d1SDavid du Colombier word *newword(char *, word *), *copywords(word *, word *); 273e12c5d1SDavid du Colombier struct redir{ 283e12c5d1SDavid du Colombier char type; /* what to do */ 293e12c5d1SDavid du Colombier short from, to; /* what to do it to */ 303e12c5d1SDavid du Colombier struct redir *next; /* what else to do (reverse order) */ 313e12c5d1SDavid du Colombier }; 323e12c5d1SDavid du Colombier #define NSTATUS 64 /* length of status (from plan 9) */ 333e12c5d1SDavid du Colombier /* 343e12c5d1SDavid du Colombier * redir types 353e12c5d1SDavid du Colombier */ 363e12c5d1SDavid du Colombier #define ROPEN 1 /* dup2(from, to); close(from); */ 373e12c5d1SDavid du Colombier #define RDUP 2 /* dup2(from, to); */ 383e12c5d1SDavid du Colombier #define RCLOSE 3 /* close(from); */ 393e12c5d1SDavid du Colombier struct thread{ 403e12c5d1SDavid du Colombier union code *code; /* code for this thread */ 413e12c5d1SDavid du Colombier int pc; /* code[pc] is the next instruction */ 423e12c5d1SDavid du Colombier struct list *argv; /* argument stack */ 433e12c5d1SDavid du Colombier struct redir *redir; /* redirection stack */ 443e12c5d1SDavid du Colombier struct redir *startredir; /* redir inheritance point */ 453e12c5d1SDavid du Colombier struct var *local; /* list of local variables */ 463e12c5d1SDavid du Colombier char *cmdfile; /* file name in Xrdcmd */ 473e12c5d1SDavid du Colombier struct io *cmdfd; /* file descriptor for Xrdcmd */ 483e12c5d1SDavid du Colombier int iflast; /* static `if not' checking */ 493e12c5d1SDavid du Colombier int eof; /* is cmdfd at eof? */ 503e12c5d1SDavid du Colombier int iflag; /* interactive? */ 513e12c5d1SDavid du Colombier int lineno; /* linenumber */ 523e12c5d1SDavid du Colombier int pid; /* process for Xpipewait to wait for */ 533e12c5d1SDavid du Colombier char status[NSTATUS]; /* status for Xpipewait */ 543e12c5d1SDavid du Colombier tree *treenodes; /* tree nodes created by this process */ 553e12c5d1SDavid du Colombier thread *ret; /* who continues when this finishes */ 563e12c5d1SDavid du Colombier }; 573e12c5d1SDavid du Colombier thread *runq; 583e12c5d1SDavid du Colombier code *codecopy(code*); 593e12c5d1SDavid du Colombier code *codebuf; /* compiler output */ 603e12c5d1SDavid du Colombier int ntrap; /* number of outstanding traps */ 613e12c5d1SDavid du Colombier int trap[NSIG]; /* number of outstanding traps per type */ 623e12c5d1SDavid du Colombier struct builtin{ 633e12c5d1SDavid du Colombier char *name; 643e12c5d1SDavid du Colombier void (*fnc)(void); 653e12c5d1SDavid du Colombier }Builtin[]; 66*219b2ee8SDavid du Colombier int eflagok; /* kludge flag so that -e doesn't exit in startup */ 673e12c5d1SDavid du Colombier void execcd(void), execwhatis(void), execeval(void), execexec(void); 683e12c5d1SDavid du Colombier void execexit(void), execshift(void); 693e12c5d1SDavid du Colombier void execwait(void), execumask(void), execdot(void), execflag(void); 703e12c5d1SDavid du Colombier void execfunc(var*), execcmds(io *); 71