Version 6.4.0.3, tag libreoffice-6.4.0.3
[LibreOffice.git] / soltools / cpp / _nlist.c
blob557de6c1fc80f8119af7f267f640d8d5d2ff817d
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include "cpp.h"
25 extern int Cplusplus;
26 Nlist *kwdefined;
27 char wd[128];
30 ER: Table was made extra large, because there seems to be a problem with the
31 chaining. An nlist->next is sometimes overwritten somewhere, which
32 results in a SIGSEGV. I canceled the GDB with watchpoint after 2 days, though...
33 It works this way for now...
35 #define NLSIZE 15000
37 static Nlist *nlist[NLSIZE];
39 struct kwtab
41 char * const kw;
42 int const val;
43 int const flag;
46 static const struct kwtab kwtab[] =
48 {"if", KIF, ISKW},
49 {"ifdef", KIFDEF, ISKW},
50 {"ifndef", KIFNDEF, ISKW},
51 {"elif", KELIF, ISKW},
52 {"else", KELSE, ISKW},
53 {"endif", KENDIF, ISKW},
54 {"include", KINCLUDE, ISKW},
55 {"include_next", KINCLUDENEXT, ISKW},
56 {"import", KIMPORT, ISKW},
57 {"define", KDEFINE, ISKW},
58 {"undef", KUNDEF, ISKW},
59 {"line", KLINE, ISKW},
60 {"error", KERROR, ISKW},
61 {"pragma", KPRAGMA, ISKW},
62 {"ident", KIDENT, ISKW},
63 {"eval", KEVAL, ISKW},
64 {"defined", KDEFINED, ISDEFINED + ISUNCHANGE},
65 {"machine", KMACHINE, ISDEFINED + ISUNCHANGE},
66 {"__LINE__", KLINENO, ISMAC + ISUNCHANGE},
67 {"__FILE__", KFILE, ISMAC + ISUNCHANGE},
68 {"__DATE__", KDATE, ISMAC + ISUNCHANGE},
69 {"__TIME__", KTIME, ISMAC + ISUNCHANGE},
70 {"__STDC__", KSTDC, ISUNCHANGE},
71 {NULL, 0, 0}
74 unsigned long namebit[077 + 1];
76 void
77 setup_kwtab(void)
79 struct kwtab const *kp;
80 Nlist *np;
81 Token t;
82 static Token deftoken[1] = {{NAME, 0, 7, (uchar *) "defined", 0}};
83 static Tokenrow deftr = {deftoken, deftoken, deftoken + 1, 1};
85 for (kp = kwtab; kp->kw; kp++)
87 t.t = (uchar *) kp->kw;
88 t.len = strlen(kp->kw);
89 np = lookup(&t, 1);
90 np->flag = (char) kp->flag;
91 np->val = (char) kp->val;
92 if (np->val == KDEFINED)
94 kwdefined = np;
95 np->val = NAME;
96 np->vp = &deftr;
97 np->ap = NULL;
102 Nlist *
103 lookup(Token * tp, int install)
105 unsigned int h;
106 Nlist *np;
107 uchar *cp, *cpe;
109 h = 0;
110 for (cp = tp->t, cpe = cp + tp->len; cp < cpe;)
111 h += *cp++;
112 h %= NLSIZE;
113 np = nlist[h];
114 while (np)
116 if (*tp->t == *np->name && tp->len == (unsigned int)np->len
117 && strncmp((char *)tp->t, (char *)np->name, tp->len) == 0)
118 return np;
119 np = np->next;
121 if (install)
123 np = new(Nlist);
124 np->vp = NULL;
125 np->ap = NULL;
126 np->flag = 0;
127 np->val = 0;
128 np->len = tp->len;
129 np->name = newstring(tp->t, tp->len, 0);
130 np->next = nlist[h];
131 nlist[h] = np;
132 quickset(tp->t[0], tp->len > 1 ? tp->t[1] : 0);
133 return np;
135 return NULL;
138 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */