V8/usr/net/face/path.c

#include "trie.h"
extern char	*permalloc();
Trie *
tlookup(s, t)
	register char *s;
	register Trie *t;
{
	while(t){
		if(t->byte==*s){
			t=t->link;
			if(*s++==0)
				return t;
		}else
			t=t->next;
	}
	return 0;
}
Trie *
tcreate(s, v)
	register char *s;
	register Trie *v;
{
	register Trie *t, *trie;
	trie=t=(Trie *)permalloc(sizeof(Trie));
	t->next=0;
	if((t->byte=*s++)==0)
		t->link=v;
	else{
		do{
			t->link=(Trie *)permalloc(sizeof(Trie));
			t=t->link;
			t->next=0;
			t->byte=*s;
		}while(*s++);
	}
	t->link=v;
	return trie;
}
tinsert(s, v, t)
	register char *s;
	register Trie *v, *t;
{
	for(;;){
		if(t->byte==*s){
			if(*s++==0){		/* replacement */
				t->link=v;
				break;
			}
			t=t->link;
		}else if(t->next==0){	/* insertion */
			t->next=tcreate(s, v);
			break;
		}else
			t=t->next;
	}
}