Blame


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