xref: /aoo41x/main/soltools/cpp/_nlist.c (revision cdf0e10c)
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