xref: /plan9/sys/src/cmd/rc/rc.h (revision 4e3613ab15c331a9ada113286cc0f2a35bc0373d)
13e12c5d1SDavid du Colombier /*
2bad30d5dSDavid du Colombier  * Assume plan 9 by default; if Unix is defined, assume unix.
30591a7c1SDavid du Colombier  * Please don't litter the code with ifdefs.  The five below should be enough.
43e12c5d1SDavid du Colombier  */
5bad30d5dSDavid du Colombier 
6bad30d5dSDavid du Colombier #ifndef Unix
7bad30d5dSDavid du Colombier /* plan 9 */
83e12c5d1SDavid du Colombier #include <u.h>
93e12c5d1SDavid du Colombier #include <libc.h>
10bad30d5dSDavid du Colombier 
113e12c5d1SDavid du Colombier #define	NSIG	32
123e12c5d1SDavid du Colombier #define	SIGINT	2
133e12c5d1SDavid du Colombier #define	SIGQUIT	3
141936bb65SDavid du Colombier 
15bad30d5dSDavid du Colombier #define fcntl(fd, op, arg)	/* unix compatibility */
16bad30d5dSDavid du Colombier #define F_SETFD
17bad30d5dSDavid du Colombier #define FD_CLOEXEC
18bad30d5dSDavid du Colombier #else
19bad30d5dSDavid du Colombier #include "unix.h"
203e12c5d1SDavid du Colombier #endif
211936bb65SDavid du Colombier 
221936bb65SDavid du Colombier #ifndef ERRMAX
231936bb65SDavid du Colombier #define ERRMAX 128
241936bb65SDavid du Colombier #endif
251936bb65SDavid du Colombier 
263e12c5d1SDavid du Colombier #define	YYMAXDEPTH	500
27bad30d5dSDavid du Colombier #ifndef YYPREFIX
283e12c5d1SDavid du Colombier #ifndef PAREN
293e12c5d1SDavid du Colombier #include "x.tab.h"
303e12c5d1SDavid du Colombier #endif
31bad30d5dSDavid du Colombier #endif
32bad30d5dSDavid du Colombier 
333e12c5d1SDavid du Colombier typedef struct tree tree;
343e12c5d1SDavid du Colombier typedef struct word word;
353e12c5d1SDavid du Colombier typedef struct io io;
363e12c5d1SDavid du Colombier typedef union code code;
373e12c5d1SDavid du Colombier typedef struct var var;
383e12c5d1SDavid du Colombier typedef struct list list;
393e12c5d1SDavid du Colombier typedef struct redir redir;
403e12c5d1SDavid du Colombier typedef struct thread thread;
413e12c5d1SDavid du Colombier typedef struct builtin builtin;
423e12c5d1SDavid du Colombier 
43bad30d5dSDavid du Colombier #ifndef Unix
4412fd1c83SDavid du Colombier #pragma incomplete word
4512fd1c83SDavid du Colombier #pragma incomplete io
461936bb65SDavid du Colombier #endif
4712fd1c83SDavid du Colombier 
483e12c5d1SDavid du Colombier struct tree{
493e12c5d1SDavid du Colombier 	int	type;
503e12c5d1SDavid du Colombier 	int	rtype, fd0, fd1;	/* details of REDIR PIPE DUP tokens */
513e12c5d1SDavid du Colombier 	char	*str;
523e12c5d1SDavid du Colombier 	int	quoted;
533e12c5d1SDavid du Colombier 	int	iskw;
543e12c5d1SDavid du Colombier 	tree	*child[3];
553e12c5d1SDavid du Colombier 	tree	*next;
563e12c5d1SDavid du Colombier };
573e12c5d1SDavid du Colombier tree *newtree(void);
583e12c5d1SDavid du Colombier tree *token(char*, int), *klook(char*), *tree1(int, tree*);
593e12c5d1SDavid du Colombier tree *tree2(int, tree*, tree*), *tree3(int, tree*, tree*, tree*);
603e12c5d1SDavid du Colombier tree *mung1(tree*, tree*), *mung2(tree*, tree*, tree*);
613e12c5d1SDavid du Colombier tree *mung3(tree*, tree*, tree*, tree*), *epimung(tree*, tree*);
623e12c5d1SDavid du Colombier tree *simplemung(tree*), *heredoc(tree*);
633e12c5d1SDavid du Colombier void freetree(tree*);
643e12c5d1SDavid du Colombier tree *cmdtree;
651936bb65SDavid du Colombier 
663e12c5d1SDavid du Colombier /*
673e12c5d1SDavid du Colombier  * The first word of any code vector is a reference count.
683e12c5d1SDavid du Colombier  * Always create a new reference to a code vector by calling codecopy(.).
693e12c5d1SDavid du Colombier  * Always call codefree(.) when deleting a reference.
703e12c5d1SDavid du Colombier  */
713e12c5d1SDavid du Colombier union code{
723e12c5d1SDavid du Colombier 	void	(*f)(void);
733e12c5d1SDavid du Colombier 	int	i;
743e12c5d1SDavid du Colombier 	char	*s;
753e12c5d1SDavid du Colombier };
76276e7d6dSDavid du Colombier 
773e12c5d1SDavid du Colombier char *promptstr;
783e12c5d1SDavid du Colombier int doprompt;
79276e7d6dSDavid du Colombier 
80bad30d5dSDavid du Colombier #define	NTOK	8192		/* maximum bytes in a word (token) */
81276e7d6dSDavid du Colombier 
828cc1c73aSDavid du Colombier char tok[NTOK + UTFmax];
83276e7d6dSDavid du Colombier 
843e12c5d1SDavid du Colombier #define	APPEND	1
853e12c5d1SDavid du Colombier #define	WRITE	2
863e12c5d1SDavid du Colombier #define	READ	3
873e12c5d1SDavid du Colombier #define	HERE	4
883e12c5d1SDavid du Colombier #define	DUPFD	5
893e12c5d1SDavid du Colombier #define	CLOSE	6
90119a69faSDavid du Colombier #define RDWR	7
91276e7d6dSDavid du Colombier 
923e12c5d1SDavid du Colombier struct var{
933e12c5d1SDavid du Colombier 	char	*name;		/* ascii name */
943e12c5d1SDavid du Colombier 	word	*val;		/* value */
953e12c5d1SDavid du Colombier 	int	changed;
963e12c5d1SDavid du Colombier 	code	*fn;		/* pointer to function's code vector */
973e12c5d1SDavid du Colombier 	int	fnchanged;
983e12c5d1SDavid du Colombier 	int	pc;		/* pc of start of function */
993e12c5d1SDavid du Colombier 	var	*next;		/* next on hash or local list */
1003e12c5d1SDavid du Colombier };
1013e12c5d1SDavid du Colombier var *vlook(char*), *gvlook(char*), *newvar(char*, var*);
102276e7d6dSDavid du Colombier 
1033e12c5d1SDavid du Colombier #define	NVAR	521
104276e7d6dSDavid du Colombier 
1053e12c5d1SDavid du Colombier var *gvar[NVAR];		/* hash for globals */
106276e7d6dSDavid du Colombier 
1073e12c5d1SDavid du Colombier #define	new(type)	((type *)emalloc(sizeof(type)))
108276e7d6dSDavid du Colombier 
109276e7d6dSDavid du Colombier void *emalloc(long);
1103e12c5d1SDavid du Colombier void *Malloc(ulong);
111276e7d6dSDavid du Colombier void efree(void *);
112276e7d6dSDavid du Colombier 
1133e12c5d1SDavid du Colombier struct here{
1143e12c5d1SDavid du Colombier 	tree	*tag;
1153e12c5d1SDavid du Colombier 	char	*name;
1163e12c5d1SDavid du Colombier 	struct here *next;
1173e12c5d1SDavid du Colombier };
1183e12c5d1SDavid du Colombier int mypid;
119276e7d6dSDavid du Colombier 
1203e12c5d1SDavid du Colombier /*
1213e12c5d1SDavid du Colombier  * Glob character escape in strings:
1223e12c5d1SDavid du Colombier  *	In a string, GLOB must be followed by *?[ or GLOB.
1233e12c5d1SDavid du Colombier  *	GLOB* matches any string
1243e12c5d1SDavid du Colombier  *	GLOB? matches any single character
1253e12c5d1SDavid du Colombier  *	GLOB[...] matches anything in the brackets
1263e12c5d1SDavid du Colombier  *	GLOBGLOB matches GLOB
1273e12c5d1SDavid du Colombier  */
128*4e3613abSDavid du Colombier #define	GLOB	'\001'
12982726826SDavid du Colombier 
1303e12c5d1SDavid du Colombier char **argp;
1313e12c5d1SDavid du Colombier char **args;
1323e12c5d1SDavid du Colombier int nerror;		/* number of errors encountered during compilation */
1333e12c5d1SDavid du Colombier int doprompt;		/* is it time for a prompt? */
1343e12c5d1SDavid du Colombier /*
1353e12c5d1SDavid du Colombier  * Which fds are the reading/writing end of a pipe?
1363e12c5d1SDavid du Colombier  * Unfortunately, this can vary from system to system.
1373e12c5d1SDavid du Colombier  * 9th edition Unix doesn't care, the following defines
1383e12c5d1SDavid du Colombier  * work on plan 9.
1393e12c5d1SDavid du Colombier  */
1403e12c5d1SDavid du Colombier #define	PRD	0
1413e12c5d1SDavid du Colombier #define	PWR	1
142bad30d5dSDavid du Colombier 
143bad30d5dSDavid du Colombier char *Rcmain, *Fdprefix;
1443e12c5d1SDavid du Colombier /*
1453e12c5d1SDavid du Colombier  * How many dot commands have we executed?
1463e12c5d1SDavid du Colombier  * Used to ensure that -v flag doesn't print rcmain.
1473e12c5d1SDavid du Colombier  */
1483e12c5d1SDavid du Colombier int ndot;
1493e12c5d1SDavid du Colombier char *getstatus(void);
1503e12c5d1SDavid du Colombier int lastc;
1517dd7cddfSDavid du Colombier int lastword;
152