#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;
}