aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/var.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/var.c')
-rw-r--r--sys/cmd/rc/var.c176
1 files changed, 0 insertions, 176 deletions
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);
-}