OpenCores
URL https://opencores.org/ocsvn/eco32/eco32/trunk

Subversion Repositories eco32

[/] [eco32/] [trunk/] [lcc/] [cpp/] [nlist.c] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 hellwig
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
#include "cpp.h"
5
 
6
extern  int getopt(int, char *const *, const char *);
7
extern  char    *optarg;
8
extern  int     optind;
9
extern  int     verbose;
10
extern  int     Cplusplus;
11
Nlist   *kwdefined;
12
 
13
#define NLSIZE  128
14
 
15
static Nlist    *nlist[NLSIZE];
16
 
17
struct  kwtab {
18
        char    *kw;
19
        int     val;
20
        int     flag;
21
} kwtab[] = {
22
        "if",           KIF,            ISKW,
23
        "ifdef",        KIFDEF,         ISKW,
24
        "ifndef",       KIFNDEF,        ISKW,
25
        "elif",         KELIF,          ISKW,
26
        "else",         KELSE,          ISKW,
27
        "endif",        KENDIF,         ISKW,
28
        "include",      KINCLUDE,       ISKW,
29
        "define",       KDEFINE,        ISKW,
30
        "undef",        KUNDEF,         ISKW,
31
        "line",         KLINE,          ISKW,
32
        "error",        KERROR,         ISKW,
33
        "pragma",       KPRAGMA,        ISKW,
34
        "eval",         KEVAL,          ISKW,
35
        "defined",      KDEFINED,       ISDEFINED+ISUNCHANGE,
36
        "ident",        KPRAGMA,        ISKW,   /* treat like pragma (ignored) */
37
        "__LINE__",     KLINENO,        ISMAC+ISUNCHANGE,
38
        "__FILE__",     KFILE,          ISMAC+ISUNCHANGE,
39
        "__DATE__",     KDATE,          ISMAC+ISUNCHANGE,
40
        "__TIME__",     KTIME,          ISMAC+ISUNCHANGE,
41
        "__STDC__",     KSTDC,          ISUNCHANGE,
42
        NULL
43
};
44
 
45
unsigned long   namebit[077+1];
46
Nlist   *np;
47
 
48
void
49
setup_kwtab(void)
50
{
51
        struct kwtab *kp;
52
        Nlist *np;
53
        Token t;
54
        static Token deftoken[1] = {{ NAME, 0, 0, 0, 7, (uchar*)"defined" }};
55
        static Tokenrow deftr = { deftoken, deftoken, deftoken+1, 1 };
56
 
57
        for (kp=kwtab; kp->kw; kp++) {
58
                t.t = (uchar*)kp->kw;
59
                t.len = strlen(kp->kw);
60
                np = lookup(&t, 1);
61
                np->flag = kp->flag;
62
                np->val = kp->val;
63
                if (np->val == KDEFINED) {
64
                        kwdefined = np;
65
                        np->val = NAME;
66
                        np->vp = &deftr;
67
                        np->ap = 0;
68
                }
69
        }
70
}
71
 
72
Nlist *
73
lookup(Token *tp, int install)
74
{
75
        unsigned int h;
76
        Nlist *np;
77
        uchar *cp, *cpe;
78
 
79
        h = 0;
80
        for (cp=tp->t, cpe=cp+tp->len; cp<cpe; )
81
                h += *cp++;
82
        h %= NLSIZE;
83
        np = nlist[h];
84
        while (np) {
85
                if (*tp->t==*np->name && tp->len==np->len
86
                 && strncmp((char*)tp->t, (char*)np->name, tp->len)==0)
87
                        return np;
88
                np = np->next;
89
        }
90
        if (install) {
91
                np = new(Nlist);
92
                np->vp = NULL;
93
                np->ap = NULL;
94
                np->flag = 0;
95
                np->val = 0;
96
                np->len = tp->len;
97
                np->name = newstring(tp->t, tp->len, 0);
98
                np->next = nlist[h];
99
                nlist[h] = np;
100
                quickset(tp->t[0], tp->len>1? tp->t[1]:0);
101
                return np;
102
        }
103
        return NULL;
104
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.