xref: /plan9-contrib/sys/src/cmd/rc/rc.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 /*
2  * Plan9 is defined for plan 9
3  * V9 is defined for 9th edition
4  * Sun is defined for sun-os
5  * Please don't litter the code with ifdefs.  The three below (and one in
6  * getflags) should be enough.
7  */
8 #define	Plan9
9 #ifdef	Plan9
10 #include <u.h>
11 #include <libc.h>
12 #define	NSIG	32
13 #define	SIGINT	2
14 #define	SIGQUIT	3
15 #endif
16 #ifdef	V9
17 #include <signal.h>
18 #include <libc.h>
19 #endif
20 #ifdef Sun
21 #include <signal.h>
22 #endif
23 #define	YYMAXDEPTH	500
24 #ifndef PAREN
25 #include "x.tab.h"
26 #endif
27 typedef struct tree tree;
28 typedef struct word word;
29 typedef struct io io;
30 typedef union code code;
31 typedef struct var var;
32 typedef struct list list;
33 typedef struct redir redir;
34 typedef struct thread thread;
35 typedef struct builtin builtin;
36 
37 struct tree{
38 	int type;
39 	int rtype, fd0, fd1;		/* details of REDIR PIPE DUP tokens */
40 	char *str;
41 	int quoted;
42 	int iskw;
43 	tree *child[3];
44 	tree *next;
45 };
46 tree *newtree(void);
47 tree *token(char*, int), *klook(char*), *tree1(int, tree*);
48 tree *tree2(int, tree*, tree*), *tree3(int, tree*, tree*, tree*);
49 tree *mung1(tree*, tree*), *mung2(tree*, tree*, tree*);
50 tree *mung3(tree*, tree*, tree*, tree*), *epimung(tree*, tree*);
51 tree *simplemung(tree*), *heredoc(tree*);
52 void freetree(tree*);
53 tree *cmdtree;
54 /*
55  * The first word of any code vector is a reference count.
56  * Always create a new reference to a code vector by calling codecopy(.).
57  * Always call codefree(.) when deleting a reference.
58  */
59 union code{
60 	void (*f)(void);
61 	int i;
62 	char *s;
63 };
64 char *promptstr;
65 int doprompt;
66 #define	NTOK	8192
67 char tok[NTOK];
68 #define	APPEND	1
69 #define	WRITE	2
70 #define	READ	3
71 #define	HERE	4
72 #define	DUPFD	5
73 #define	CLOSE	6
74 struct var{
75 	char *name;		/* ascii name */
76 	word *val;	/* value */
77 	int changed;
78 	code *fn;		/* pointer to function's code vector */
79 	int fnchanged;
80 	int pc;			/* pc of start of function */
81 	var *next;	/* next on hash or local list */
82 };
83 var *vlook(char*), *gvlook(char*), *newvar(char*, var*);
84 #define	NVAR	521
85 var *gvar[NVAR];				/* hash for globals */
86 #define	new(type)	((type *)emalloc(sizeof(type)))
87 char *emalloc(long);
88 void *Malloc(ulong);
89 void efree(char*);
90 #define	NOFILE	128		/* should come from <param.h> */
91 struct here{
92 	tree *tag;
93 	char *name;
94 	struct here *next;
95 };
96 int mypid;
97 /*
98  * Glob character escape in strings:
99  *	In a string, GLOB must be followed by *?[ or GLOB.
100  *	GLOB* matches any string
101  *	GLOB? matches any single character
102  *	GLOB[...] matches anything in the brackets
103  *	GLOBGLOB matches GLOB
104  */
105 #define	GLOB	((char)0x01)
106 /*
107  * onebyte(c), twobyte(c), threebyte(c)
108  * Is c the first character of a one- two- or three-byte utf sequence?
109  */
110 #define	onebyte(c)	((c&0x80)==0x00)
111 #define	twobyte(c)	((c&0xe0)==0xc0)
112 #define	threebyte(c)	((c&0xf0)==0xe0)
113 char **argp;
114 char **args;
115 int nerror;		/* number of errors encountered during compilation */
116 int doprompt;		/* is it time for a prompt? */
117 /*
118  * Which fds are the reading/writing end of a pipe?
119  * Unfortunately, this can vary from system to system.
120  * 9th edition Unix doesn't care, the following defines
121  * work on plan 9.
122  */
123 #define	PRD	0
124 #define	PWR	1
125 char Rcmain[], Fdprefix[];
126 #define	register
127 /*
128  * How many dot commands have we executed?
129  * Used to ensure that -v flag doesn't print rcmain.
130  */
131 int ndot;
132 char *getstatus(void);
133 int lastc;
134