aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/var.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-11-23 18:04:08 +0000
committerrsc <devnull@localhost>2003-11-23 18:04:08 +0000
commitf08fdedcee12c06e3ce9ac9bec363915978e8289 (patch)
treed67a27473be1e8f98d3694028104d9ddf915345b /src/cmd/rc/var.c
parent5993a8f2756bc455101a8c9ce95347d5050e7883 (diff)
downloadplan9port-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.c71
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;
+}