diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/rc/var.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/rc/var.c')
-rwxr-xr-x | sys/src/cmd/rc/var.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/sys/src/cmd/rc/var.c b/sys/src/cmd/rc/var.c new file mode 100755 index 000000000..a96af06d6 --- /dev/null +++ b/sys/src/cmd/rc/var.c @@ -0,0 +1,86 @@ +#include "rc.h" +#include "exec.h" +#include "fns.h" + +int +hash(char *s, int n) +{ + int h = 0, i = 1; + while(*s) h+=*s++*i++; + h%=n; + return h<0?h+n:h; +} +#define NKW 30 +struct kw{ + char *name; + int type; + struct kw *next; +}*kw[NKW]; + +void +kenter(int type, char *name) +{ + int h = hash(name, NKW); + struct kw *p = new(struct kw); + p->type = type; + p->name = name; + p->next = kw[h]; + kw[h] = p; +} + +void +kinit(void) +{ + kenter(FOR, "for"); + kenter(IN, "in"); + kenter(WHILE, "while"); + kenter(IF, "if"); + kenter(NOT, "not"); + kenter(TWIDDLE, "~"); + kenter(BANG, "!"); + kenter(SUBSHELL, "@"); + kenter(SWITCH, "switch"); + kenter(FN, "fn"); +} + +tree* +klook(char *name) +{ + struct kw *p; + tree *t = token(name, WORD); + for(p = kw[hash(name, NKW)];p;p = p->next) + if(strcmp(p->name, name)==0){ + t->type = p->type; + t->iskw = 1; + break; + } + return t; +} + +var* +gvlook(char *name) +{ + int h = hash(name, NVAR); + var *v; + for(v = gvar[h];v;v = v->next) if(strcmp(v->name, name)==0) return v; + return gvar[h] = newvar(strdup(name), gvar[h]); +} + +var* +vlook(char *name) +{ + var *v; + if(runq) + for(v = runq->local;v;v = v->next) + if(strcmp(v->name, name)==0) return v; + return gvlook(name); +} + +void +setvar(char *name, word *val) +{ + struct var *v = vlook(name); + freewords(v->val); + v->val = val; + v->changed = 1; +} |