HEIMDAL: move code from source4/heimdal* to third_party/heimdal*
[samba.git] / third_party / heimdal / lib / asn1 / symbol.c
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 cmp(void *a, void *b)
44 {
45     Symbol *s1 = (Symbol *) a;
46     Symbol *s2 = (Symbol *) b;
47
48     return strcmp(s1->name, s2->name);
49 }
50
51 static unsigned
52 hash(void *a)
53 {
54     Symbol *s = (Symbol *) a;
55
56     return hashjpw(s->name);
57 }
58
59 void
60 initsym(void)
61 {
62     htab = hashtabnew(101, cmp, hash);
63 }
64
65
66 void
67 output_name(char *s)
68 {
69     char *p;
70
71     for (p = s; *p; ++p)
72         if (*p == '-' || *p == '.')
73             *p = '_';
74 }
75
76 Symbol *
77 addsym(char *name)
78 {
79     Symbol key, *s;
80
81     key.name = name;
82     s = (Symbol *) hashtabsearch(htab, (void *) &key);
83     if (s == NULL) {
84         s = (Symbol *) ecalloc(1, sizeof(*s));
85         s->name = name;
86         s->gen_name = estrdup(name);
87         output_name(s->gen_name);
88         s->stype = SUndefined;
89         hashtabadd(htab, s);
90         //HEIM_TAILQ_INSERT_TAIL(&symbols, s, symlist);
91         do {
92             if (((s)->symlist.tqe_next = (&symbols)->tqh_first) != NULL)
93                 (&symbols)->tqh_first->symlist.tqe_prev = &(s)->symlist.tqe_next;
94             else
95                 (&symbols)->tqh_last = &(s)->symlist.tqe_next;
96             (&symbols)->tqh_first = (s);
97             (s)->symlist.tqe_prev = &(&symbols)->tqh_first;
98         } while (0);
99     }
100     return s;
101 }
102
103 Symbol *
104 getsym(char *name)
105 {
106     Symbol key;
107
108     key.name = name;
109     return (Symbol *) hashtabsearch(htab, (void *) &key);
110 }
111
112 static int
113 checkfunc(void *ptr, void *arg)
114 {
115     Symbol *s = ptr;
116     if (s->stype == SUndefined) {
117         lex_error_message("%s is still undefined\n", s->name);
118         *(int *) arg = 1;
119     }
120     return 0;
121 }
122
123 int
124 checkundefined(void)
125 {
126     int f = 0;
127     hashtabforeach(htab, checkfunc, &f);
128     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 generate_types(void)
145 {
146     Symbol *s;
147
148     if (checkundefined())
149         errx(1, "Some types are undefined");
150     HEIM_TAILQ_FOREACH_REVERSE(s, &symbols, symhead, symlist) {
151         if (s->stype == Stype && s->type)
152             generate_type(s);
153     }
154     //hashtabforeach(htab, generate_1type, NULL);
155 }
156
157 void
158 emitted_declaration(const Symbol *s)
159 {
160     ((Symbol *)(uintptr_t)s)->emitted_declaration = 1;
161 }
162
163 void
164 emitted_definition(const Symbol *s)
165 {
166     ((Symbol *)(uintptr_t)s)->emitted_definition = 1;
167 }
168
169 void
170 emitted_tag_enums(const Symbol *s)
171 {
172     ((Symbol *)(uintptr_t)s)->emitted_tag_enums = 1;
173 }