1 : /*
2 : * Copyright (c) 1997 - 2005 Kungliga Tekniska Högskolan
3 : * (Royal Institute of Technology, Stockholm, Sweden).
4 : * All rights reserved.
5 : *
6 : * Redistribution and use in source and binary forms, with or without
7 : * modification, are permitted provided that the following conditions
8 : * are met:
9 : *
10 : * 1. Redistributions of source code must retain the above copyright
11 : * notice, this list of conditions and the following disclaimer.
12 : *
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 : *
17 : * 3. Neither the name of the Institute nor the names of its contributors
18 : * may be used to endorse or promote products derived from this software
19 : * without specific prior written permission.
20 : *
21 : * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 : * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 : * SUCH DAMAGE.
32 : */
33 :
34 : #include "gen_locl.h"
35 : #include "lex.h"
36 :
37 : static Hashtab *htab;
38 :
39 : static int
40 : cmp(void *a, void *b)
41 1124 : {
42 1124 : Symbol *s1 = (Symbol *) a;
43 1124 : Symbol *s2 = (Symbol *) b;
44 :
45 1124 : return strcmp(s1->name, s2->name);
46 : }
47 :
48 : static unsigned
49 : hash(void *a)
50 2108 : {
51 2108 : Symbol *s = (Symbol *) a;
52 :
53 2108 : return hashjpw(s->name);
54 : }
55 :
56 : void
57 : initsym(void)
58 14 : {
59 14 : htab = hashtabnew(101, cmp, hash);
60 14 : }
61 :
62 :
63 : void
64 : output_name(char *s)
65 1447 : {
66 : char *p;
67 :
68 20475 : for (p = s; *p; ++p)
69 19028 : if (*p == '-' || *p == '.')
70 1068 : *p = '_';
71 1447 : }
72 :
73 : Symbol *
74 : addsym(char *name)
75 1094 : {
76 : Symbol key, *s;
77 :
78 1094 : key.name = name;
79 1094 : s = (Symbol *) hashtabsearch(htab, (void *) &key);
80 1094 : if (s == NULL) {
81 507 : s = (Symbol *) emalloc(sizeof(*s));
82 507 : s->name = name;
83 507 : s->gen_name = estrdup(name);
84 507 : output_name(s->gen_name);
85 507 : s->stype = SUndefined;
86 507 : hashtabadd(htab, s);
87 : }
88 1094 : return s;
89 : }
90 :
91 : static int
92 : checkfunc(void *ptr, void *arg)
93 507 : {
94 507 : Symbol *s = ptr;
95 507 : if (s->stype == SUndefined) {
96 0 : error_message("%s is still undefined\n", s->name);
97 0 : *(int *) arg = 1;
98 : }
99 507 : return 0;
100 : }
101 :
102 : int
103 : checkundefined(void)
104 14 : {
105 14 : int f = 0;
106 14 : hashtabforeach(htab, checkfunc, &f);
107 14 : return f;
108 : }
|