1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
/*
* Plan9 is defined for plan 9
* otherwise its UNIX.
* Please don't litter the code with ifdefs. The three below (and one in
* getflags) should be enough.
*/
#ifdef Plan9
#include <u.h>
#include <libc.h>
#define NSIG 32
#define SIGINT 2
#define SIGQUIT 3
#else
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#ifndef NSIG
#define NSIG 32
#endif
#endif
#define YYMAXDEPTH 500
#ifndef PAREN
#include "y.tab.h"
#endif
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 lexer lexer;
typedef struct redir redir;
typedef struct thread thread;
typedef struct builtin builtin;
#pragma incomplete word
#pragma incomplete io
struct tree{
int type;
int rtype, fd0, fd1; /* details of REDIR PIPE DUP tokens */
int line;
char glob; /* 0=string, 1=glob, 2=pattern see globprop() and noglobs() */
char quoted;
char iskw;
char *str;
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 *simplemung(tree*);
tree *globprop(tree*);
char *fnstr(tree*);
/*
* The first word of any code vector is a reference count
* and the second word is a string for srcfile().
* Code starts at pc 2. The last code word must be a zero
* terminator for codefree().
* 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;
};
#define NTOK 8192
struct lexer{
io *input;
char *file;
int line;
char *prolog;
char *epilog;
int peekc;
int future;
int lastc;
char eof;
char inquote;
char incomm;
char lastword; /* was the last token read a word or compound word terminator? */
char lastdol; /* was the last token read '$' or '$#' or '"'? */
char iflast; /* static `if not' checking */
char qflag;
char tok[NTOK];
};
extern lexer *lex; /* current lexer */
lexer *newlexer(io*, char*);
void freelexer(lexer*);
#define APPEND 1
#define WRITE 2
#define READ 3
#define HERE 4
#define DUPFD 5
#define CLOSE 6
#define RDWR 7
struct var{
var *next; /* next on hash or local list */
word *val; /* value */
code *fn; /* pointer to function's code vector */
int pc; /* pc of start of function */
char fnchanged;
char changed;
char name[];
};
var *vlook(char*), *gvlook(char*), *newvar(char*, var*);
void setvar(char*, word*), freevar(var*);
#define NVAR 521
extern var *gvar[NVAR]; /* hash for globals */
#define new(type) ((type *)emalloc(sizeof(type)))
void *emalloc(long);
void *erealloc(void *, long);
char *estrdup(char*);
/*
* 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)
/*
* Is c the first character of a utf sequence?
*/
#define onebyte(c) (((c)&0x80)==0x00)
#define twobyte(c) (((c)&0xe0)==0xc0)
#define threebyte(c) (((c)&0xf0)==0xe0)
#define fourbyte(c) (((c)&0xf8)==0xf0)
#define xbyte(c) (((c)&0xc0)==0x80)
extern char *argv0;
extern int nerror; /* number of errors encountered during compilation */
extern int doprompt; /* is it time for a prompt? */
extern io *err;
/*
* 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 1
extern char Rcmain[], Fdprefix[];
extern char *Signame[];
|