Branch data Line data Source code
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 : 1133 : cmp(void *a, void *b)
41 : : {
42 : 1133 : Symbol *s1 = (Symbol *) a;
43 : 1133 : Symbol *s2 = (Symbol *) b;
44 : :
45 : 1133 : return strcmp(s1->name, s2->name);
46 : : }
47 : :
48 : : static unsigned
49 : 2124 : hash(void *a)
50 : : {
51 : 2124 : Symbol *s = (Symbol *) a;
52 : :
53 : 2124 : return hashjpw(s->name);
54 : : }
55 : :
56 : : void
57 : 14 : initsym(void)
58 : : {
59 : 14 : htab = hashtabnew(101, cmp, hash);
60 : 14 : }
61 : :
62 : :
63 : : void
64 : 1462 : output_name(char *s)
65 : : {
66 : : char *p;
67 : :
68 [ + + ]: 20854 : for (p = s; *p; ++p)
69 [ + + ][ - + ]: 19392 : if (*p == '-' || *p == '.')
70 : 1090 : *p = '_';
71 : 1462 : }
72 : :
73 : : Symbol *
74 : 1102 : addsym(char *name)
75 : : {
76 : : Symbol key, *s;
77 : :
78 : 1102 : key.name = name;
79 : 1102 : s = (Symbol *) hashtabsearch(htab, (void *) &key);
80 [ + + ]: 1102 : if (s == NULL) {
81 : 511 : s = (Symbol *) emalloc(sizeof(*s));
82 : 511 : s->name = name;
83 : 511 : s->gen_name = estrdup(name);
84 : 511 : output_name(s->gen_name);
85 : 511 : s->stype = SUndefined;
86 : 511 : hashtabadd(htab, s);
87 : : }
88 : 1102 : return s;
89 : : }
90 : :
91 : : static int
92 : 511 : checkfunc(void *ptr, void *arg)
93 : : {
94 : 511 : Symbol *s = ptr;
95 [ - + ]: 511 : if (s->stype == SUndefined) {
96 : 0 : lex_error_message("%s is still undefined\n", s->name);
97 : 0 : *(int *) arg = 1;
98 : : }
99 : 511 : return 0;
100 : : }
101 : :
102 : : int
103 : 14 : checkundefined(void)
104 : : {
105 : 14 : int f = 0;
106 : 14 : hashtabforeach(htab, checkfunc, &f);
107 : 14 : return f;
108 : : }
|