Subversion Repositories planix.SVN

Rev

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

Rev Author Line No. Line
2 - 1
#include "rc.h"
2
#include "exec.h"
3
#include "fns.h"
4
 
5
unsigned
6
hash(char *as, int n)
7
{
8
	int i = 1;
9
	unsigned h = 0;
10
	uchar *s;
11
 
12
	s = (uchar *)as;
13
	while (*s)
14
		h += *s++ * i++;
15
	return h % n;
16
}
17
 
18
#define	NKW	30
19
struct kw{
20
	char *name;
21
	int type;
22
	struct kw *next;
23
}*kw[NKW];
24
 
25
void
26
kenter(int type, char *name)
27
{
28
	int h = hash(name, NKW);
29
	struct kw *p = new(struct kw);
30
	p->type = type;
31
	p->name = name;
32
	p->next = kw[h];
33
	kw[h] = p;
34
}
35
 
36
void
37
kinit(void)
38
{
39
	kenter(FOR, "for");
40
	kenter(IN, "in");
41
	kenter(WHILE, "while");
42
	kenter(IF, "if");
43
	kenter(NOT, "not");
44
	kenter(TWIDDLE, "~");
45
	kenter(BANG, "!");
46
	kenter(SUBSHELL, "@");
47
	kenter(SWITCH, "switch");
48
	kenter(FN, "fn");
49
}
50
 
51
tree*
52
klook(char *name)
53
{
54
	struct kw *p;
55
	tree *t = token(name, WORD);
56
	for(p = kw[hash(name, NKW)];p;p = p->next)
57
		if(strcmp(p->name, name)==0){
58
			t->type = p->type;
59
			t->iskw = 1;
60
			break;
61
		}
62
	return t;
63
}
64
 
65
var*
66
gvlook(char *name)
67
{
68
	int h = hash(name, NVAR);
69
	var *v;
70
	for(v = gvar[h];v;v = v->next) if(strcmp(v->name, name)==0) return v;
71
	return gvar[h] = newvar(strdup(name), gvar[h]);
72
}
73
 
74
var*
75
vlook(char *name)
76
{
77
	var *v;
78
	if(runq)
79
		for(v = runq->local;v;v = v->next)
80
			if(strcmp(v->name, name)==0) return v;
81
	return gvlook(name);
82
}
83
 
84
void
85
setvar(char *name, word *val)
86
{
87
	struct var *v = vlook(name);
88
	freewords(v->val);
89
	v->val = val;
90
	v->changed = 1;
91
}