|
|
1.1 root 1: /*
2: * Copyright (c) 1989 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * This code is derived from software contributed to Berkeley by
6: * Ozan Yigit.
7: *
8: * Redistribution and use in source and binary forms are permitted
9: * provided that: (1) source distributions retain this entire copyright
10: * notice and comment, and (2) distributions including binaries display
11: * the following acknowledgement: ``This product includes software
12: * developed by the University of California, Berkeley and its contributors''
13: * in the documentation or other materials provided with the distribution
14: * and in all advertising materials mentioning features or use of this
15: * software. Neither the name of the University nor the names of its
16: * contributors may be used to endorse or promote products derived
17: * from this software without specific prior written permission.
18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21: */
22:
23: #ifndef lint
24: static char sccsid[] = "@(#)look.c 5.2 (Berkeley) 6/1/90";
25: #endif /* not lint */
26:
27: /*
28: * look.c
29: * Facility: m4 macro processor
30: * by: oz
31: */
32:
33: #include "mdef.h"
34: #include "extr.h"
35:
36: extern char *strsave();
37:
38: /*
39: * hash - compute hash value using the proverbial
40: * hashing function. Taken from K&R.
41: */
42: hash (name)
43: register char *name;
44: {
45: register int h = 0;
46: while (*name)
47: h += *name++;
48: return (h % HASHSIZE);
49: }
50:
51: /*
52: * lookup - find name in the hash table
53: *
54: */
55: ndptr lookup(name)
56: char *name;
57: {
58: register ndptr p;
59:
60: for (p = hashtab[hash(name)]; p != nil; p = p->nxtptr)
61: if (strcmp(name, p->name) == 0)
62: break;
63: return (p);
64: }
65:
66: /*
67: * addent - hash and create an entry in the hash
68: * table. The new entry is added in front
69: * of a hash bucket.
70: */
71: ndptr addent(name)
72: char *name;
73: {
74: register int h;
75: ndptr p;
76:
77: h = hash(name);
78: if ((p = (ndptr) malloc(sizeof(struct ndblock))) != NULL) {
79: p->nxtptr = hashtab[h];
80: hashtab[h] = p;
81: p->name = strsave(name);
82: }
83: else
84: error("m4: no more memory.");
85: return p;
86: }
87:
88: /*
89: * remhash - remove an entry from the hashtable
90: *
91: */
92: remhash(name, all)
93: char *name;
94: int all;
95: {
96: register int h;
97: register ndptr xp, tp, mp;
98:
99: h = hash(name);
100: mp = hashtab[h];
101: tp = nil;
102: while (mp != nil) {
103: if (strcmp(mp->name, name) == 0) {
104: mp = mp->nxtptr;
105: if (tp == nil) {
106: freent(hashtab[h]);
107: hashtab[h] = mp;
108: }
109: else {
110: xp = tp->nxtptr;
111: tp->nxtptr = mp;
112: freent(xp);
113: }
114: if (!all)
115: break;
116: }
117: else {
118: tp = mp;
119: mp = mp->nxtptr;
120: }
121: }
122: }
123:
124: /*
125: * freent - free a hashtable information block
126: *
127: */
128: freent(p)
129: ndptr p;
130: {
131: if (!(p->type & STATIC)) {
132: free(p->name);
133: if (p->defn != null)
134: free(p->defn);
135: }
136: free(p);
137: }
138:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.