/* * 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), execprintenv(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 *);
/*
* 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), execprintenv(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 *);