Plan 9's rc.
not a clear win over byron's, but at least it has the right syntax.
This commit is contained in:
parent
5993a8f275
commit
f08fdedcee
24 changed files with 4688 additions and 0 deletions
71
src/cmd/rc/var.c
Normal file
71
src/cmd/rc/var.c
Normal file
|
|
@ -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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue