155682Smarkm/*
2233294Sstas * Copyright (c) 1997 - 2005 Kungliga Tekniska H��gskolan
3178825Sdfr * (Royal Institute of Technology, Stockholm, Sweden).
4178825Sdfr * All rights reserved.
555682Smarkm *
6178825Sdfr * Redistribution and use in source and binary forms, with or without
7178825Sdfr * modification, are permitted provided that the following conditions
8178825Sdfr * are met:
955682Smarkm *
10178825Sdfr * 1. Redistributions of source code must retain the above copyright
11178825Sdfr *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
13178825Sdfr * 2. Redistributions in binary form must reproduce the above copyright
14178825Sdfr *    notice, this list of conditions and the following disclaimer in the
15178825Sdfr *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
17178825Sdfr * 3. Neither the name of the Institute nor the names of its contributors
18178825Sdfr *    may be used to endorse or promote products derived from this software
19178825Sdfr *    without specific prior written permission.
2055682Smarkm *
21178825Sdfr * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22178825Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23178825Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24178825Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25178825Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26178825Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27178825Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28178825Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29178825Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30178825Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31178825Sdfr * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
3455682Smarkm#include "gen_locl.h"
35178825Sdfr#include "lex.h"
3655682Smarkm
3755682Smarkmstatic Hashtab *htab;
3855682Smarkm
3955682Smarkmstatic int
40178825Sdfrcmp(void *a, void *b)
4155682Smarkm{
42178825Sdfr    Symbol *s1 = (Symbol *) a;
43178825Sdfr    Symbol *s2 = (Symbol *) b;
4455682Smarkm
45178825Sdfr    return strcmp(s1->name, s2->name);
4655682Smarkm}
4755682Smarkm
4855682Smarkmstatic unsigned
49178825Sdfrhash(void *a)
5055682Smarkm{
51178825Sdfr    Symbol *s = (Symbol *) a;
5255682Smarkm
53178825Sdfr    return hashjpw(s->name);
5455682Smarkm}
5555682Smarkm
5655682Smarkmvoid
57178825Sdfrinitsym(void)
5855682Smarkm{
59178825Sdfr    htab = hashtabnew(101, cmp, hash);
6055682Smarkm}
6155682Smarkm
6255682Smarkm
6355682Smarkmvoid
64178825Sdfroutput_name(char *s)
6555682Smarkm{
66178825Sdfr    char *p;
6755682Smarkm
68178825Sdfr    for (p = s; *p; ++p)
69233294Sstas	if (*p == '-' || *p == '.')
70178825Sdfr	    *p = '_';
7155682Smarkm}
7255682Smarkm
73178825SdfrSymbol *
74178825Sdfraddsym(char *name)
7555682Smarkm{
76178825Sdfr    Symbol key, *s;
7755682Smarkm
78178825Sdfr    key.name = name;
79178825Sdfr    s = (Symbol *) hashtabsearch(htab, (void *) &key);
80178825Sdfr    if (s == NULL) {
81178825Sdfr	s = (Symbol *) emalloc(sizeof(*s));
82178825Sdfr	s->name = name;
83178825Sdfr	s->gen_name = estrdup(name);
84178825Sdfr	output_name(s->gen_name);
85178825Sdfr	s->stype = SUndefined;
86178825Sdfr	hashtabadd(htab, s);
87178825Sdfr    }
88178825Sdfr    return s;
8955682Smarkm}
90178825Sdfr
91178825Sdfrstatic int
92178825Sdfrcheckfunc(void *ptr, void *arg)
93178825Sdfr{
94178825Sdfr    Symbol *s = ptr;
95178825Sdfr    if (s->stype == SUndefined) {
96233294Sstas	lex_error_message("%s is still undefined\n", s->name);
97178825Sdfr	*(int *) arg = 1;
98178825Sdfr    }
99178825Sdfr    return 0;
100178825Sdfr}
101178825Sdfr
102178825Sdfrint
103178825Sdfrcheckundefined(void)
104178825Sdfr{
105178825Sdfr    int f = 0;
106178825Sdfr    hashtabforeach(htab, checkfunc, &f);
107178825Sdfr    return f;
108178825Sdfr}
109