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 : #include "lex.h"
37 :
38 : static Hashtab *htab;
39 :
40 : struct symhead symbols;
41 :
42 : static int
43 80902 : cmp(void *a, void *b)
44 : {
45 80902 : Symbol *s1 = (Symbol *) a;
46 80902 : Symbol *s2 = (Symbol *) b;
47 :
48 80902 : return strcmp(s1->name, s2->name);
49 : }
50 :
51 : static unsigned
52 81282 : hash(void *a)
53 : {
54 81282 : Symbol *s = (Symbol *) a;
55 :
56 81282 : return hashjpw(s->name);
57 : }
58 :
59 : void
60 304 : initsym(void)
61 : {
62 304 : htab = hashtabnew(101, cmp, hash);
63 304 : }
64 :
65 :
66 : void
67 61921 : output_name(char *s)
68 : {
69 3259 : char *p;
70 :
71 908181 : for (p = s; *p; ++p)
72 846260 : if (*p == '-' || *p == '.')
73 31616 : *p = '_';
74 61921 : }
75 :
76 : Symbol *
77 35416 : addsym(char *name)
78 : {
79 1864 : Symbol key, *s;
80 :
81 35416 : key.name = name;
82 35416 : s = (Symbol *) hashtabsearch(htab, (void *) &key);
83 35416 : if (s == NULL) {
84 15637 : s = (Symbol *) ecalloc(1, sizeof(*s));
85 15637 : s->name = name;
86 15637 : s->gen_name = estrdup(name);
87 15637 : output_name(s->gen_name);
88 15637 : s->stype = SUndefined;
89 15637 : hashtabadd(htab, s);
90 : //HEIM_TAILQ_INSERT_TAIL(&symbols, s, symlist);
91 2687 : do {
92 15637 : if (((s)->symlist.tqe_next = (&symbols)->tqh_first) != NULL)
93 15333 : (&symbols)->tqh_first->symlist.tqe_prev = &(s)->symlist.tqe_next;
94 : else
95 304 : (&symbols)->tqh_last = &(s)->symlist.tqe_next;
96 15637 : (&symbols)->tqh_first = (s);
97 15637 : (s)->symlist.tqe_prev = &(&symbols)->tqh_first;
98 : } while (0);
99 : }
100 35416 : return s;
101 : }
102 :
103 : Symbol *
104 14592 : getsym(char *name)
105 : {
106 768 : Symbol key;
107 :
108 14592 : key.name = name;
109 14592 : return (Symbol *) hashtabsearch(htab, (void *) &key);
110 : }
111 :
112 : static int
113 15637 : checkfunc(void *ptr, void *arg)
114 : {
115 15637 : Symbol *s = ptr;
116 15637 : if (s->stype == SUndefined) {
117 0 : lex_error_message("%s is still undefined\n", s->name);
118 0 : *(int *) arg = 1;
119 : }
120 15637 : return 0;
121 : }
122 :
123 : int
124 304 : checkundefined(void)
125 : {
126 304 : int f = 0;
127 304 : hashtabforeach(htab, checkfunc, &f);
128 304 : return f;
129 : }
130 :
131 : #if 0
132 : static int
133 : generate_1type(void *ptr, void *arg)
134 : {
135 : Symbol *s = ptr;
136 :
137 : if (s->stype == Stype && s->type)
138 : generate_type(s);
139 : return 0;
140 : }
141 : #endif
142 :
143 : void
144 304 : generate_types(void)
145 : {
146 16 : Symbol *s;
147 :
148 304 : if (checkundefined())
149 0 : errx(1, "Some types are undefined");
150 15941 : HEIM_TAILQ_FOREACH_REVERSE(s, &symbols, symhead, symlist) {
151 15637 : if (s->stype == Stype && s->type)
152 7771 : generate_type(s);
153 : }
154 : //hashtabforeach(htab, generate_1type, NULL);
155 304 : }
156 :
157 : void
158 14858 : emitted_declaration(const Symbol *s)
159 : {
160 14858 : ((Symbol *)(uintptr_t)s)->emitted_declaration = 1;
161 14858 : }
162 :
163 : void
164 7771 : emitted_definition(const Symbol *s)
165 : {
166 7771 : ((Symbol *)(uintptr_t)s)->emitted_definition = 1;
167 7771 : }
168 :
169 : void
170 7752 : emitted_tag_enums(const Symbol *s)
171 : {
172 7752 : ((Symbol *)(uintptr_t)s)->emitted_tag_enums = 1;
173 7752 : }
174 :
175 : void
176 7771 : emitted_asn1(const Symbol *s)
177 : {
178 7771 : ((Symbol *)(uintptr_t)s)->emitted_asn1 = 1;
179 7771 : }
|