diff options
author | rsc <devnull@localhost> | 2003-11-23 18:04:08 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2003-11-23 18:04:08 +0000 |
commit | f08fdedcee12c06e3ce9ac9bec363915978e8289 (patch) | |
tree | d67a27473be1e8f98d3694028104d9ddf915345b /src/cmd/rc/var.c | |
parent | 5993a8f2756bc455101a8c9ce95347d5050e7883 (diff) | |
download | plan9port-f08fdedcee12c06e3ce9ac9bec363915978e8289.tar.gz plan9port-f08fdedcee12c06e3ce9ac9bec363915978e8289.tar.bz2 plan9port-f08fdedcee12c06e3ce9ac9bec363915978e8289.zip |
Plan 9's rc.
not a clear win over byron's,
but at least it has the right syntax.
Diffstat (limited to 'src/cmd/rc/var.c')
-rw-r--r-- | src/cmd/rc/var.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/cmd/rc/var.c b/src/cmd/rc/var.c new file mode 100644 index 00000000..73e4e9ae --- /dev/null +++ b/src/cmd/rc/var.c @@ -0,0 +1,71 @@ +#include "rc.h" +#include "exec.h" +#include "fns.h" +int hash(char *s, int n) +{ + register 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) +{ + register int h=hash(name, NKW); + register 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) +{ + register struct var *v=vlook(name); + freewords(v->val); + v->val=val; + v->changed=1; +} |