rminnichmerge57758a716 years agoHistory
156 lines · 3.6 KB · C
RawDownload
/* * Plan9 is defined for plan 9 * V9 is defined for 9th edition * Sun is defined for sun-os * Please don't litter the code with ifdefs.  The three below (and one in * getflags) should be enough. */#define	Plan9#ifdef	Plan9#include <u.h>#include <libc.h>#undef NSIG#undef SIGINT#undef SIGQUIT#define	NSIG	32#define	SIGINT	2#define	SIGQUIT	3#endif#ifdef	V9#include <signal.h>#include <libc.h>#endif#ifdef Sun#include <signal.h>#endif#define	YYMAXDEPTH	500#ifndef PAREN#ifndef YYMAJOR#include "x.tab.h"#endif#endif #undef pipe	/* so that /dev/fd works */#define searchpath rcsearchpath	/* avoid new libc function */ typedef struct tree tree;typedef struct word word;typedef struct io io;typedef union code code;typedef struct var var;typedef struct list list;typedef struct redir redir;typedef struct thread thread;typedef struct builtin builtin;typedef struct pipes pipes; #pragma incomplete word#pragma incomplete io struct pipes{	int npipe;	int fd[1][2][2];}; struct tree{	int type;	int rtype, fd0, fd1;		/* details of REDIR PIPE DUP tokens */	char *str;	int quoted;	int iskw;	tree *child[3];	tree *next;};tree *newtree(void);tree *token(char*, int), *klook(char*), *tree1(int, tree*);tree *tree2(int, tree*, tree*), *tree3(int, tree*, tree*, tree*);tree *mung1(tree*, tree*), *mung2(tree*, tree*, tree*);tree *mung3(tree*, tree*, tree*, tree*), *epimung(tree*, tree*);tree *mung3mp(tree *t, tree *c0, tree *c1, tree *c2);tree *simplemung(tree*), *heredoc(tree*);void freetree(tree*);tree *cmdtree;/* * The first word of any code vector is a reference count. * Always create a new reference to a code vector by calling codecopy(.). * Always call codefree(.) when deleting a reference. */union code{	void (*f)(void);	int i;	char *s;};char *promptstr;int doprompt;#define	NTOK	8192char tok[NTOK];#define	APPEND	1#define	WRITE	2#define	READ	3#define	HERE	4#define	DUPFD	5#define	CLOSE	6#define	RDWR	7struct var{	char *name;		/* ascii name */	word *val;	/* value */	int changed;	code *fn;		/* pointer to function's code vector */	int fnchanged;	int pc;			/* pc of start of function */	var *next;	/* next on hash or local list */	void	(*changefn)(var*);};var *vlook(char*), *gvlook(char*), *newvar(char*, var*);#define	NVAR	521var *gvar[NVAR];				/* hash for globals */#define	new(type)	((type *)emalloc(sizeof(type)))void *emalloc(long);void *Malloc(ulong);void efree(void*);#define	NOFILE	128		/* should come from <param.h> */struct here{	tree *tag;	char *name;	struct here *next;};int mypid;/* * Glob character escape in strings: *	In a string, GLOB must be followed by *?[ or GLOB. *	GLOB* matches any string *	GLOB? matches any single character *	GLOB[...] matches anything in the brackets *	GLOBGLOB matches GLOB */#define	GLOB	((char)0x01)/* * onebyte(c), twobyte(c), threebyte(c) * Is c the first character of a one- two- or three-byte utf sequence? */#define	onebyte(c)	((c&0x80)==0x00)#define	twobyte(c)	((c&0xe0)==0xc0)#define	threebyte(c)	((c&0xf0)==0xe0)char **argp;char **args;int nerror;		/* number of errors encountered during compilation */int doprompt;		/* is it time for a prompt? *//* * Which fds are the reading/writing end of a pipe? * Unfortunately, this can vary from system to system. * 9th edition Unix doesn't care, the following defines * work on plan 9. */#define	PRD	0#define	PWR	1char Rcmain[], Fdprefix[];#define	register/* * How many dot commands have we executed? * Used to ensure that -v flag doesn't print rcmain. */int ndot;char *getstatus(void);int lastc;int lastword;int kidpid;