Build lexer and parser from libCom/Makefile. Since libCom now includes asLib.c and asLib_lex.c we must build antelope and flex without linking them to Com. This works because they only need epicsTempFile anyway. However make doesn't like a subdirectory with the same name as a target object, so the antelope source directory is now called yacc. The two main.c files were also renamed to avoid other build problems. Merge asHost into Com and remove mentions in CONFIG_BASE Lots of noise since SRCS must be renamed to Com_SRCS
127 lines
2.2 KiB
C
127 lines
2.2 KiB
C
/*************************************************************************\
|
|
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
|
|
* National Laboratory.
|
|
* Copyright (c) 2002 The Regents of the University of California, as
|
|
* Operator of Los Alamos National Laboratory.
|
|
* EPICS BASE is distributed subject to a Software License Agreement found
|
|
* in file LICENSE that is included with this distribution.
|
|
\*************************************************************************/
|
|
#include "defs.h"
|
|
|
|
|
|
/* TABLE_SIZE is the number of entries in the symbol table. */
|
|
/* TABLE_SIZE must be a power of two. */
|
|
|
|
#define TABLE_SIZE 1024
|
|
|
|
|
|
bucket **symbol_table;
|
|
bucket *first_symbol;
|
|
bucket *last_symbol;
|
|
|
|
|
|
static int
|
|
hash(char *name)
|
|
{
|
|
char *s;
|
|
int c, k;
|
|
|
|
assert(name && *name);
|
|
s = name;
|
|
k = *s;
|
|
while ((c = *++s))
|
|
k = (31*k + c) & (TABLE_SIZE - 1);
|
|
|
|
return (k);
|
|
}
|
|
|
|
|
|
bucket *
|
|
make_bucket(char *name)
|
|
{
|
|
bucket *bp;
|
|
|
|
assert(name);
|
|
bp = (bucket *) MALLOC(sizeof(bucket));
|
|
if (bp == 0) no_space();
|
|
bp->link = 0;
|
|
bp->next = 0;
|
|
bp->name = MALLOC(strlen(name) + 1);
|
|
if (bp->name == 0) no_space();
|
|
bp->tag = 0;
|
|
bp->value = UNDEFINED;
|
|
bp->index = 0;
|
|
bp->prec = 0;
|
|
bp-> class = UNKNOWN;
|
|
bp->assoc = TOKEN;
|
|
|
|
if (bp->name == 0) no_space();
|
|
strcpy(bp->name, name);
|
|
|
|
return (bp);
|
|
}
|
|
|
|
|
|
bucket *
|
|
lookup(char *name)
|
|
{
|
|
bucket *bp, **bpp;
|
|
|
|
bpp = symbol_table + hash(name);
|
|
bp = *bpp;
|
|
|
|
while (bp)
|
|
{
|
|
if (strcmp(name, bp->name) == 0) return (bp);
|
|
bpp = &bp->link;
|
|
bp = *bpp;
|
|
}
|
|
|
|
*bpp = bp = make_bucket(name);
|
|
last_symbol->next = bp;
|
|
last_symbol = bp;
|
|
|
|
return (bp);
|
|
}
|
|
|
|
void
|
|
create_symbol_table(void)
|
|
{
|
|
int i;
|
|
bucket *bp;
|
|
|
|
symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
|
|
if (symbol_table == 0) no_space();
|
|
for (i = 0; i < TABLE_SIZE; i++)
|
|
symbol_table[i] = 0;
|
|
|
|
bp = make_bucket("error");
|
|
bp->index = 1;
|
|
bp->class = TERM;
|
|
|
|
first_symbol = bp;
|
|
last_symbol = bp;
|
|
symbol_table[hash("error")] = bp;
|
|
}
|
|
|
|
|
|
void
|
|
free_symbol_table(void)
|
|
{
|
|
FREE(symbol_table);
|
|
symbol_table = 0;
|
|
}
|
|
|
|
|
|
void
|
|
free_symbols(void)
|
|
{
|
|
bucket *p, *q;
|
|
|
|
for (p = first_symbol; p; p = q)
|
|
{
|
|
q = p->next;
|
|
FREE(p);
|
|
}
|
|
}
|