aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/var.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2007-03-26 12:02:41 +0000
committerrsc <devnull@localhost>2007-03-26 12:02:41 +0000
commitc8f538425f4e92e1e438b9bd25cb08e250a93d5b (patch)
treed701abbcd4973d5b6909d104eefe521de70a4e1c /src/cmd/rc/var.c
parent79049567a0fac8707ea3f2927403445bdb2394fa (diff)
downloadplan9port-c8f538425f4e92e1e438b9bd25cb08e250a93d5b.tar.gz
plan9port-c8f538425f4e92e1e438b9bd25cb08e250a93d5b.tar.bz2
plan9port-c8f538425f4e92e1e438b9bd25cb08e250a93d5b.zip
sync with plan 9
Diffstat (limited to 'src/cmd/rc/var.c')
-rw-r--r--src/cmd/rc/var.c98
1 files changed, 70 insertions, 28 deletions
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;