From c8f538425f4e92e1e438b9bd25cb08e250a93d5b Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 26 Mar 2007 12:02:41 +0000 Subject: sync with plan 9 --- src/cmd/rc/var.c | 98 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 70 insertions(+), 28 deletions(-) (limited to 'src/cmd/rc/var.c') diff --git a/src/cmd/rc/var.c b/src/cmd/rc/var.c index 8a200ffd..2564ba2f 100644 --- a/src/cmd/rc/var.c +++ b/src/cmd/rc/var.c @@ -1,9 +1,11 @@ #include "rc.h" #include "exec.h" #include "fns.h" -int hash(char *s, int n) + +int +hash(char *s, int n) { - register int h=0, i=1; + int h = 0, i = 1; while(*s) h+=*s++*i++; h%=n; return h<0?h+n:h; @@ -14,16 +16,21 @@ struct kw{ int type; struct kw *next; }*kw[NKW]; -void kenter(int type, char *name) + +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; + 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){ + +void +kinit(void) +{ kenter(FOR, "for"); kenter(IN, "in"); kenter(WHILE, "while"); @@ -35,47 +42,59 @@ void kinit(void){ kenter(SWITCH, "switch"); kenter(FN, "fn"); } -tree *klook(char *name) + +tree* +klook(char *name) { struct kw *p; - tree *t=token(name, WORD); - for(p=kw[hash(name, NKW)];p;p=p->next) + 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; + t->type = p->type; + t->iskw = 1; break; } return t; } -var *gvlook(char *name) + +var* +gvlook(char *name) { - int h=hash(name, NVAR); + 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]); + 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* +vlook(char *name) { var *v; if(runq) - for(v=runq->local;v;v=v->next) + 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) + +void +_setvar(char *name, word *val, int callfn) { - register struct var *v=vlook(name); + 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) + +void +setvar(char *name, word *val) { _setvar(name, val, 1); } -void bigpath(var *v) + +void +bigpath(var *v) { /* convert $PATH to $path */ char *p, *q; @@ -107,19 +126,42 @@ void bigpath(var *v) } _setvar("path", w, 0); } -void littlepath(var *v) + +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 = _list2str(v->val, ':'); + 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) + +void +pathinit(void) { var *v; -- cgit v1.2.3