xref: /aoo41x/main/soltools/cpp/_nlist.c (revision 7ce20373)
1*7ce20373SAndrew Rist /**************************************************************
2*7ce20373SAndrew Rist  *
3*7ce20373SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*7ce20373SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*7ce20373SAndrew Rist  * distributed with this work for additional information
6*7ce20373SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*7ce20373SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*7ce20373SAndrew Rist  * "License"); you may not use this file except in compliance
9*7ce20373SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*7ce20373SAndrew Rist  *
11*7ce20373SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*7ce20373SAndrew Rist  *
13*7ce20373SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*7ce20373SAndrew Rist  * software distributed under the License is distributed on an
15*7ce20373SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*7ce20373SAndrew Rist  * KIND, either express or implied.  See the License for the
17*7ce20373SAndrew Rist  * specific language governing permissions and limitations
18*7ce20373SAndrew Rist  * under the License.
19*7ce20373SAndrew Rist  *
20*7ce20373SAndrew Rist  *************************************************************/
21*7ce20373SAndrew Rist 
22cdf0e10cSrcweir #include <stdio.h>
23cdf0e10cSrcweir #include <stdlib.h>
24cdf0e10cSrcweir #include <string.h>
25cdf0e10cSrcweir #include "cpp.h"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir extern int Cplusplus;
28cdf0e10cSrcweir Nlist *kwdefined;
29cdf0e10cSrcweir char wd[128];
30cdf0e10cSrcweir 
31cdf0e10cSrcweir /*
32cdf0e10cSrcweir 	ER: Tabelle extra gross gemacht, da es anscheinend ein Problem mit der
33cdf0e10cSrcweir 	der Verkettung gibt, irgendwann irgendwo wird mal ein nlist->next
34cdf0e10cSrcweir 	ueberschrieben, was in eineme SIGSEGV resultiert.
35cdf0e10cSrcweir 	Den GDB mit watchpoint hab ich aber nach 2 Tagen abgebrochen..
36cdf0e10cSrcweir 	so loeppt's jedenfalls erstmal..
37cdf0e10cSrcweir  */
38cdf0e10cSrcweir #define	NLSIZE 15000
39cdf0e10cSrcweir 
40cdf0e10cSrcweir static Nlist *nlist[NLSIZE];
41cdf0e10cSrcweir 
42cdf0e10cSrcweir struct kwtab
43cdf0e10cSrcweir {
44cdf0e10cSrcweir     char *kw;
45cdf0e10cSrcweir     int val;
46cdf0e10cSrcweir     int flag;
47cdf0e10cSrcweir }   kwtab[] =
48cdf0e10cSrcweir 
49cdf0e10cSrcweir {
50cdf0e10cSrcweir 		{"if", KIF, ISKW},
51cdf0e10cSrcweir 		{"ifdef", KIFDEF, ISKW},
52cdf0e10cSrcweir 		{"ifndef", KIFNDEF, ISKW},
53cdf0e10cSrcweir 		{"elif", KELIF, ISKW},
54cdf0e10cSrcweir 		{"else", KELSE, ISKW},
55cdf0e10cSrcweir 		{"endif", KENDIF, ISKW},
56cdf0e10cSrcweir 		{"include", KINCLUDE, ISKW},
57cdf0e10cSrcweir 		{"include_next", KINCLUDENEXT, ISKW},
58cdf0e10cSrcweir 		{"import", KIMPORT, ISKW},
59cdf0e10cSrcweir 		{"define", KDEFINE, ISKW},
60cdf0e10cSrcweir 		{"undef", KUNDEF, ISKW},
61cdf0e10cSrcweir 		{"line", KLINE, ISKW},
62cdf0e10cSrcweir 		{"error", KERROR, ISKW},
63cdf0e10cSrcweir 		{"pragma", KPRAGMA, ISKW},
64cdf0e10cSrcweir 		{"ident", KIDENT, ISKW},
65cdf0e10cSrcweir 		{"eval", KEVAL, ISKW},
66cdf0e10cSrcweir 		{"defined", KDEFINED, ISDEFINED + ISUNCHANGE},
67cdf0e10cSrcweir 		{"machine", KMACHINE, ISDEFINED + ISUNCHANGE},
68cdf0e10cSrcweir 		{"__LINE__", KLINENO, ISMAC + ISUNCHANGE},
69cdf0e10cSrcweir 		{"__FILE__", KFILE, ISMAC + ISUNCHANGE},
70cdf0e10cSrcweir 		{"__DATE__", KDATE, ISMAC + ISUNCHANGE},
71cdf0e10cSrcweir 		{"__TIME__", KTIME, ISMAC + ISUNCHANGE},
72cdf0e10cSrcweir 		{"__STDC__", KSTDC, ISUNCHANGE},
73cdf0e10cSrcweir 		{NULL, 0, 0}
74cdf0e10cSrcweir };
75cdf0e10cSrcweir 
76cdf0e10cSrcweir unsigned long namebit[077 + 1];
77cdf0e10cSrcweir 
78cdf0e10cSrcweir void
setup_kwtab(void)79cdf0e10cSrcweir     setup_kwtab(void)
80cdf0e10cSrcweir {
81cdf0e10cSrcweir     struct kwtab *kp;
82cdf0e10cSrcweir     Nlist *np;
83cdf0e10cSrcweir     Token t;
84cdf0e10cSrcweir     static Token deftoken[1] = {{NAME, 0, 0, 7, (uchar *) "defined", 0}};
85cdf0e10cSrcweir     static Tokenrow deftr = {deftoken, deftoken, deftoken + 1, 1};
86cdf0e10cSrcweir 
87cdf0e10cSrcweir     for (kp = kwtab; kp->kw; kp++)
88cdf0e10cSrcweir     {
89cdf0e10cSrcweir         t.t = (uchar *) kp->kw;
90cdf0e10cSrcweir         t.len = strlen(kp->kw);
91cdf0e10cSrcweir         np = lookup(&t, 1);
92cdf0e10cSrcweir         np->flag = (char) kp->flag;
93cdf0e10cSrcweir         np->val = (char) kp->val;
94cdf0e10cSrcweir         if (np->val == KDEFINED)
95cdf0e10cSrcweir         {
96cdf0e10cSrcweir             kwdefined = np;
97cdf0e10cSrcweir             np->val = NAME;
98cdf0e10cSrcweir             np->vp = &deftr;
99cdf0e10cSrcweir             np->ap = 0;
100cdf0e10cSrcweir         }
101cdf0e10cSrcweir     }
102cdf0e10cSrcweir }
103cdf0e10cSrcweir 
104cdf0e10cSrcweir Nlist *
lookup(Token * tp,int install)105cdf0e10cSrcweir     lookup(Token * tp, int install)
106cdf0e10cSrcweir {
107cdf0e10cSrcweir     unsigned int h;
108cdf0e10cSrcweir     Nlist *np;
109cdf0e10cSrcweir     uchar *cp, *cpe;
110cdf0e10cSrcweir 
111cdf0e10cSrcweir     h = 0;
112cdf0e10cSrcweir     for (cp = tp->t, cpe = cp + tp->len; cp < cpe;)
113cdf0e10cSrcweir         h += *cp++;
114cdf0e10cSrcweir     h %= NLSIZE;
115cdf0e10cSrcweir     np = nlist[h];
116cdf0e10cSrcweir     while (np)
117cdf0e10cSrcweir     {
118cdf0e10cSrcweir         if (*tp->t == *np->name && tp->len == (unsigned int)np->len
119cdf0e10cSrcweir             && strncmp((char *)tp->t, (char *)np->name, tp->len) == 0)
120cdf0e10cSrcweir             return np;
121cdf0e10cSrcweir         np = np->next;
122cdf0e10cSrcweir     }
123cdf0e10cSrcweir     if (install)
124cdf0e10cSrcweir     {
125cdf0e10cSrcweir         np = new(Nlist);
126cdf0e10cSrcweir         np->vp = NULL;
127cdf0e10cSrcweir         np->ap = NULL;
128cdf0e10cSrcweir         np->flag = 0;
129cdf0e10cSrcweir         np->val = 0;
130cdf0e10cSrcweir         np->len = tp->len;
131cdf0e10cSrcweir         np->name = newstring(tp->t, tp->len, 0);
132cdf0e10cSrcweir         np->next = nlist[h];
133cdf0e10cSrcweir         nlist[h] = np;
134cdf0e10cSrcweir         quickset(tp->t[0], tp->len > 1 ? tp->t[1] : 0);
135cdf0e10cSrcweir         return np;
136cdf0e10cSrcweir     }
137cdf0e10cSrcweir     return NULL;
138cdf0e10cSrcweir }
139