Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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