1 #ifndef lint 2 static char sccsid[] = "@(#)rlook.c 1.2 (Berkeley) 08/11/83"; 3 #endif 4 5 #define NULL 0 6 #define EOS 0 7 #define HSHSIZ 101 8 struct nlist { 9 char *name; 10 char *def; 11 int ydef; 12 struct nlist *next; 13 }; 14 15 struct nlist *hshtab[HSHSIZ]; 16 struct nlist *lookup(); 17 char *install(); 18 char *malloc(); 19 char *copy(); 20 int hshval; 21 22 struct nlist *lookup(str) 23 char *str; 24 { 25 register char *s1, *s2; 26 register struct nlist *np; 27 static struct nlist nodef; 28 29 s1 = str; 30 for (hshval = 0; *s1; ) 31 hshval += *s1++; 32 hshval %= HSHSIZ; 33 for (np = hshtab[hshval]; np!=NULL; np = np->next) { 34 s1 = str; 35 s2 = np->name; 36 while (*s1++ == *s2) 37 if (*s2++ == EOS) 38 return(np); 39 } 40 return(&nodef); 41 } 42 43 char *install(nam, val, tran) 44 char *nam, *val; 45 int tran; 46 { 47 register struct nlist *np; 48 49 if ((np = lookup(nam))->name == NULL) { 50 np = (struct nlist *)malloc(sizeof(*np)); 51 np->name = copy(nam); 52 np->def = copy(val); 53 np->ydef = tran; 54 np->next = hshtab[hshval]; 55 hshtab[hshval] = np; 56 return(np->def); 57 } 58 free(np->def); 59 np->def = copy(val); 60 return(np->def); 61 } 62 63 char *copy(s) 64 register char *s; 65 { 66 register char *p, *s1; 67 68 p = s1 = (char *) malloc((unsigned)strlen(s)+1); 69 while (*s1++ = *s++); 70 return(p); 71 } 72