xref: /trunk/main/soltools/cpp/_nlist.c (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "cpp.h"
5 
6 extern int Cplusplus;
7 Nlist *kwdefined;
8 char wd[128];
9 
10 /*
11     ER: Tabelle extra gross gemacht, da es anscheinend ein Problem mit der
12     der Verkettung gibt, irgendwann irgendwo wird mal ein nlist->next
13     ueberschrieben, was in eineme SIGSEGV resultiert.
14     Den GDB mit watchpoint hab ich aber nach 2 Tagen abgebrochen..
15     so loeppt's jedenfalls erstmal..
16  */
17 #define NLSIZE 15000
18 
19 static Nlist *nlist[NLSIZE];
20 
21 struct kwtab
22 {
23     char *kw;
24     int val;
25     int flag;
26 }   kwtab[] =
27 
28 {
29         {"if", KIF, ISKW},
30         {"ifdef", KIFDEF, ISKW},
31         {"ifndef", KIFNDEF, ISKW},
32         {"elif", KELIF, ISKW},
33         {"else", KELSE, ISKW},
34         {"endif", KENDIF, ISKW},
35         {"include", KINCLUDE, ISKW},
36         {"include_next", KINCLUDENEXT, ISKW},
37         {"import", KIMPORT, ISKW},
38         {"define", KDEFINE, ISKW},
39         {"undef", KUNDEF, ISKW},
40         {"line", KLINE, ISKW},
41         {"error", KERROR, ISKW},
42         {"pragma", KPRAGMA, ISKW},
43         {"ident", KIDENT, ISKW},
44         {"eval", KEVAL, ISKW},
45         {"defined", KDEFINED, ISDEFINED + ISUNCHANGE},
46         {"machine", KMACHINE, ISDEFINED + ISUNCHANGE},
47         {"__LINE__", KLINENO, ISMAC + ISUNCHANGE},
48         {"__FILE__", KFILE, ISMAC + ISUNCHANGE},
49         {"__DATE__", KDATE, ISMAC + ISUNCHANGE},
50         {"__TIME__", KTIME, ISMAC + ISUNCHANGE},
51         {"__STDC__", KSTDC, ISUNCHANGE},
52         {NULL, 0, 0}
53 };
54 
55 unsigned long namebit[077 + 1];
56 
57 void
58     setup_kwtab(void)
59 {
60     struct kwtab *kp;
61     Nlist *np;
62     Token t;
63     static Token deftoken[1] = {{NAME, 0, 0, 7, (uchar *) "defined", 0}};
64     static Tokenrow deftr = {deftoken, deftoken, deftoken + 1, 1};
65 
66     for (kp = kwtab; kp->kw; kp++)
67     {
68         t.t = (uchar *) kp->kw;
69         t.len = strlen(kp->kw);
70         np = lookup(&t, 1);
71         np->flag = (char) kp->flag;
72         np->val = (char) kp->val;
73         if (np->val == KDEFINED)
74         {
75             kwdefined = np;
76             np->val = NAME;
77             np->vp = &deftr;
78             np->ap = 0;
79         }
80     }
81 }
82 
83 Nlist *
84     lookup(Token * tp, int install)
85 {
86     unsigned int h;
87     Nlist *np;
88     uchar *cp, *cpe;
89 
90     h = 0;
91     for (cp = tp->t, cpe = cp + tp->len; cp < cpe;)
92         h += *cp++;
93     h %= NLSIZE;
94     np = nlist[h];
95     while (np)
96     {
97         if (*tp->t == *np->name && tp->len == (unsigned int)np->len
98             && strncmp((char *)tp->t, (char *)np->name, tp->len) == 0)
99             return np;
100         np = np->next;
101     }
102     if (install)
103     {
104         np = new(Nlist);
105         np->vp = NULL;
106         np->ap = NULL;
107         np->flag = 0;
108         np->val = 0;
109         np->len = tp->len;
110         np->name = newstring(tp->t, tp->len, 0);
111         np->next = nlist[h];
112         nlist[h] = np;
113         quickset(tp->t[0], tp->len > 1 ? tp->t[1] : 0);
114         return np;
115     }
116     return NULL;
117 }
118