xref: /plan9-contrib/sys/src/cmd/rc/rc.h (revision c6df144405f586b73992827d584728dc975dff14)
13e12c5d1SDavid du Colombier /*
2bad30d5dSDavid du Colombier  * Assume plan 9 by default; if Unix is defined, assume unix.
3*c6df1444SDavid du Colombier  * Please don't litter the code with ifdefs.  The three below should be enough.
43e12c5d1SDavid du Colombier  */
5bad30d5dSDavid du Colombier 
63e12c5d1SDavid du Colombier typedef struct tree tree;
73e12c5d1SDavid du Colombier typedef struct word word;
83e12c5d1SDavid du Colombier typedef struct io io;
93e12c5d1SDavid du Colombier typedef union code code;
103e12c5d1SDavid du Colombier typedef struct var var;
113e12c5d1SDavid du Colombier typedef struct list list;
123e12c5d1SDavid du Colombier typedef struct redir redir;
133e12c5d1SDavid du Colombier typedef struct thread thread;
143e12c5d1SDavid du Colombier typedef struct builtin builtin;
153e12c5d1SDavid du Colombier 
16*c6df1444SDavid du Colombier #define isdigit(c) ((c) >= '0' && (c) <= '9')	/* NB: unsafe macro */
17*c6df1444SDavid du Colombier 
18bad30d5dSDavid du Colombier #ifndef Unix
19*c6df1444SDavid du Colombier /* plan 9 */
20*c6df1444SDavid du Colombier #include <u.h>
21*c6df1444SDavid du Colombier #include <libc.h>
22*c6df1444SDavid du Colombier 
2312fd1c83SDavid du Colombier #pragma incomplete word
2412fd1c83SDavid du Colombier #pragma incomplete io
25*c6df1444SDavid du Colombier 
26*c6df1444SDavid du Colombier /* unix compatibility */
27*c6df1444SDavid du Colombier #define unixclsexec(wdirfd)
28*c6df1444SDavid du Colombier 
29*c6df1444SDavid du Colombier #define	NSIG	32
30*c6df1444SDavid du Colombier #define	SIGINT	2
31*c6df1444SDavid du Colombier #define	SIGQUIT	3
32*c6df1444SDavid du Colombier #else
33*c6df1444SDavid du Colombier #include "unix.h"
34*c6df1444SDavid du Colombier #endif
35*c6df1444SDavid du Colombier 
36*c6df1444SDavid du Colombier #define	YYMAXDEPTH	500
37*c6df1444SDavid du Colombier #ifndef YYPREFIX
38*c6df1444SDavid du Colombier #ifndef PAREN
39*c6df1444SDavid du Colombier #include "x.tab.h"
40*c6df1444SDavid du Colombier #endif
411936bb65SDavid du Colombier #endif
4212fd1c83SDavid du Colombier 
433e12c5d1SDavid du Colombier struct tree{
443e12c5d1SDavid du Colombier 	int	type;
453e12c5d1SDavid du Colombier 	int	rtype, fd0, fd1;	/* details of REDIR PIPE DUP tokens */
463e12c5d1SDavid du Colombier 	char	*str;
473e12c5d1SDavid du Colombier 	int	quoted;
483e12c5d1SDavid du Colombier 	int	iskw;
493e12c5d1SDavid du Colombier 	tree	*child[3];
503e12c5d1SDavid du Colombier 	tree	*next;
513e12c5d1SDavid du Colombier };
523e12c5d1SDavid du Colombier tree *newtree(void);
533e12c5d1SDavid du Colombier tree *token(char*, int), *klook(char*), *tree1(int, tree*);
543e12c5d1SDavid du Colombier tree *tree2(int, tree*, tree*), *tree3(int, tree*, tree*, tree*);
553e12c5d1SDavid du Colombier tree *mung1(tree*, tree*), *mung2(tree*, tree*, tree*);
563e12c5d1SDavid du Colombier tree *mung3(tree*, tree*, tree*, tree*), *epimung(tree*, tree*);
573e12c5d1SDavid du Colombier tree *simplemung(tree*), *heredoc(tree*);
583e12c5d1SDavid du Colombier void freetree(tree*);
593e12c5d1SDavid du Colombier tree *cmdtree;
601936bb65SDavid du Colombier 
613e12c5d1SDavid du Colombier /*
623e12c5d1SDavid du Colombier  * The first word of any code vector is a reference count.
633e12c5d1SDavid du Colombier  * Always create a new reference to a code vector by calling codecopy(.).
643e12c5d1SDavid du Colombier  * Always call codefree(.) when deleting a reference.
653e12c5d1SDavid du Colombier  */
663e12c5d1SDavid du Colombier union code{
673e12c5d1SDavid du Colombier 	void	(*f)(void);
683e12c5d1SDavid du Colombier 	int	i;
693e12c5d1SDavid du Colombier 	char	*s;
703e12c5d1SDavid du Colombier };
71276e7d6dSDavid du Colombier 
723e12c5d1SDavid du Colombier char *promptstr;
733e12c5d1SDavid du Colombier int doprompt;
74276e7d6dSDavid du Colombier 
75bad30d5dSDavid du Colombier #define	NTOK	8192		/* maximum bytes in a word (token) */
76276e7d6dSDavid du Colombier 
778cc1c73aSDavid du Colombier char tok[NTOK + UTFmax];
78276e7d6dSDavid du Colombier 
793e12c5d1SDavid du Colombier #define	APPEND	1
803e12c5d1SDavid du Colombier #define	WRITE	2
813e12c5d1SDavid du Colombier #define	READ	3
823e12c5d1SDavid du Colombier #define	HERE	4
833e12c5d1SDavid du Colombier #define	DUPFD	5
843e12c5d1SDavid du Colombier #define	CLOSE	6
85119a69faSDavid du Colombier #define RDWR	7
86276e7d6dSDavid du Colombier 
873e12c5d1SDavid du Colombier struct var{
883e12c5d1SDavid du Colombier 	char	*name;		/* ascii name */
893e12c5d1SDavid du Colombier 	word	*val;		/* value */
903e12c5d1SDavid du Colombier 	int	changed;
913e12c5d1SDavid du Colombier 	code	*fn;		/* pointer to function's code vector */
923e12c5d1SDavid du Colombier 	int	fnchanged;
933e12c5d1SDavid du Colombier 	int	pc;		/* pc of start of function */
943e12c5d1SDavid du Colombier 	var	*next;		/* next on hash or local list */
953e12c5d1SDavid du Colombier };
963e12c5d1SDavid du Colombier var *vlook(char*), *gvlook(char*), *newvar(char*, var*);
97276e7d6dSDavid du Colombier 
983e12c5d1SDavid du Colombier #define	NVAR	521
99276e7d6dSDavid du Colombier 
1003e12c5d1SDavid du Colombier var *gvar[NVAR];		/* hash for globals */
101276e7d6dSDavid du Colombier 
1023e12c5d1SDavid du Colombier #define	new(type)	((type *)emalloc(sizeof(type)))
103276e7d6dSDavid du Colombier 
104276e7d6dSDavid du Colombier void *emalloc(long);
1053e12c5d1SDavid du Colombier void *Malloc(ulong);
106276e7d6dSDavid du Colombier void efree(void *);
107276e7d6dSDavid du Colombier 
1083e12c5d1SDavid du Colombier struct here{
1093e12c5d1SDavid du Colombier 	tree	*tag;
1103e12c5d1SDavid du Colombier 	char	*name;
1113e12c5d1SDavid du Colombier 	struct here *next;
1123e12c5d1SDavid du Colombier };
1133e12c5d1SDavid du Colombier int mypid;
114276e7d6dSDavid du Colombier 
1153e12c5d1SDavid du Colombier /*
1163e12c5d1SDavid du Colombier  * Glob character escape in strings:
1173e12c5d1SDavid du Colombier  *	In a string, GLOB must be followed by *?[ or GLOB.
1183e12c5d1SDavid du Colombier  *	GLOB* matches any string
1193e12c5d1SDavid du Colombier  *	GLOB? matches any single character
1203e12c5d1SDavid du Colombier  *	GLOB[...] matches anything in the brackets
1213e12c5d1SDavid du Colombier  *	GLOBGLOB matches GLOB
1223e12c5d1SDavid du Colombier  */
1234e3613abSDavid du Colombier #define	GLOB	'\001'
12482726826SDavid du Colombier 
1253e12c5d1SDavid du Colombier char **argp;
1263e12c5d1SDavid du Colombier char **args;
1273e12c5d1SDavid du Colombier int nerror;		/* number of errors encountered during compilation */
1283e12c5d1SDavid du Colombier int doprompt;		/* is it time for a prompt? */
1293e12c5d1SDavid du Colombier /*
1303e12c5d1SDavid du Colombier  * Which fds are the reading/writing end of a pipe?
1313e12c5d1SDavid du Colombier  * Unfortunately, this can vary from system to system.
1323e12c5d1SDavid du Colombier  * 9th edition Unix doesn't care, the following defines
1333e12c5d1SDavid du Colombier  * work on plan 9.
1343e12c5d1SDavid du Colombier  */
1353e12c5d1SDavid du Colombier #define	PRD	0
1363e12c5d1SDavid du Colombier #define	PWR	1
137bad30d5dSDavid du Colombier 
138bad30d5dSDavid du Colombier char *Rcmain, *Fdprefix;
1393e12c5d1SDavid du Colombier /*
1403e12c5d1SDavid du Colombier  * How many dot commands have we executed?
1413e12c5d1SDavid du Colombier  * Used to ensure that -v flag doesn't print rcmain.
1423e12c5d1SDavid du Colombier  */
1433e12c5d1SDavid du Colombier int ndot;
1443e12c5d1SDavid du Colombier char *getstatus(void);
145*c6df1444SDavid du Colombier Rune lastc;
1467dd7cddfSDavid du Colombier int lastword;
147*c6df1444SDavid du Colombier 
148*c6df1444SDavid du Colombier #define	NFLAG	128		/* limited to ascii */
149*c6df1444SDavid du Colombier 
150*c6df1444SDavid du Colombier extern char *flag[NFLAG];
151*c6df1444SDavid du Colombier extern char flagset[];
152