look.c revision 80289
1/*
2 * Copyright (c) 1989, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Ozan Yigit at York University.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 *    must display the following acknowledgement:
18 *	This product includes software developed by the University of
19 *	California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 *    may be used to endorse or promote products derived from this software
22 *    without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#ifndef lint
38static char sccsid[] = "@(#)look.c	8.1 (Berkeley) 6/6/93";
39static char rcsid[] =
40  "$FreeBSD: head/usr.bin/m4/look.c 80289 2001-07-24 14:09:47Z obrien $";
41#endif /* not lint */
42
43/*
44 * look.c
45 * Facility: m4 macro processor
46 * by: oz
47 */
48
49#include <sys/types.h>
50#include <err.h>
51#include <stdio.h>
52#include <stdlib.h>
53#include <string.h>
54#include "mdef.h"
55#include "stdd.h"
56#include "extern.h"
57
58int
59hash(name)
60register char *name;
61{
62	register unsigned long h = 0;
63	while (*name)
64		h = (h << 5) + h + *name++;
65	return (h % HASHSIZE);
66}
67
68/*
69 * find name in the hash table
70 */
71ndptr
72lookup(name)
73char *name;
74{
75	register ndptr p;
76
77	for (p = hashtab[hash(name)]; p != nil; p = p->nxtptr)
78		if (STREQ(name, p->name))
79			break;
80	return (p);
81}
82
83/*
84 * hash and create an entry in the hash table.
85 * The new entry is added in front of a hash bucket.
86 */
87ndptr
88addent(name)
89char *name;
90{
91	register int h;
92	ndptr p;
93
94	h = hash(name);
95	if ((p = malloc(sizeof(struct ndblock))) == NULL)
96		err(1, "malloc");
97	p->nxtptr = hashtab[h];
98	hashtab[h] = p;
99	if ((p->name = strdup(name)) == NULL)
100		err(1, "strdup");
101	return p;
102}
103
104static void
105freent(p)
106ndptr p;
107{
108	if (!(p->type & STATIC)) {
109		free((char *) p->name);
110		if (p->defn != null)
111			free((char *) p->defn);
112	}
113	free((char *) p);
114}
115
116/*
117 * remove an entry from the hashtable
118 */
119void
120remhash(name, all)
121char *name;
122int all;
123{
124	register int h;
125	register ndptr xp, tp, mp;
126
127	h = hash(name);
128	mp = hashtab[h];
129	tp = nil;
130	while (mp != nil) {
131		if (STREQ(mp->name, name)) {
132			mp = mp->nxtptr;
133			if (tp == nil) {
134				freent(hashtab[h]);
135				hashtab[h] = mp;
136			}
137			else {
138				xp = tp->nxtptr;
139				tp->nxtptr = mp;
140				freent(xp);
141			}
142			if (!all)
143				break;
144		}
145		else {
146			tp = mp;
147			mp = mp->nxtptr;
148		}
149	}
150}
151