From 566d54fe549286895fdef8aa9f385686405dd290 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Wed, 13 Oct 2021 16:46:20 -0700 Subject: RM(rc): old code. too many assumptions baked in --- sys/cmd/rc/var.c | 176 ------------------------------------------------------- 1 file changed, 176 deletions(-) delete mode 100644 sys/cmd/rc/var.c (limited to 'sys/cmd/rc/var.c') diff --git a/sys/cmd/rc/var.c b/sys/cmd/rc/var.c deleted file mode 100644 index a1c60e0..0000000 --- a/sys/cmd/rc/var.c +++ /dev/null @@ -1,176 +0,0 @@ -#include "rc.h" -#include "exec.h" -#include "fns.h" - -Var *gvar[NVAR] = { 0 }; /* hash for globals */ - -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, int callfn) -{ - struct Var *v = vlook(name); - - freewords(v->val); - v->val=val; - v->changed=1; - if(callfn && v->changefn) - v->changefn(v); -} - -void -setvar(char *name, Word *val) -{ - _setvar(name, val, 1); -} - -void -bigpath(Var *v) -{ - /* convert $PATH to $path */ - char *p, *q; - Word **l, *w; - - if(v->val == nil){ - _setvar("path", nil, 0); - return; - } - p = v->val->word; - w = nil; - l = &w; - /* - * Doesn't handle escaped colon nonsense. - */ - if(p[0] == 0) - p = nil; - while(p){ - q = strchr(p, ':'); - if(q) - *q = 0; - *l = newword(p[0] ? p : ".", nil); - l = &(*l)->next; - if(q){ - *q = ':'; - p = q+1; - }else - p = nil; - } - _setvar("path", w, 0); -} - -char* -list2strcolon(Word *words) -{ - char *value, *s, *t; - int len = 0; - Word *ap; - for(ap = words;ap;ap = ap->next) - len+=1+strlen(ap->word); - value = emalloc(len+1); - s = value; - for(ap = words;ap;ap = ap->next){ - for(t = ap->word;*t;) *s++=*t++; - *s++=':'; - } - if(s==value) - *s='\0'; - else s[-1]='\0'; - return value; -} -void -littlepath(Var *v) -{ - /* convert $path to $PATH */ - char *p; - Word *w; - - p = list2strcolon(v->val); - w = new(Word); - w->word = p; - w->next = nil; - _setvar("PATH", w, 1); /* 1: recompute $path to expose colon problems */ -} - -void -pathinit(void) -{ - Var *v; - - v = gvlook("path"); - v->changefn = littlepath; - v = gvlook("PATH"); - v->changefn = bigpath; - bigpath(v); -} -- cgit v1.2.1