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