69 lines
2 KiB
C
69 lines
2 KiB
C
|
/* $Header$ */
|
||
|
/* IDENTIFIER DESCRIPTOR */
|
||
|
|
||
|
#include "nopp.h"
|
||
|
|
||
|
/* Since the % operation in the calculation of the hash function
|
||
|
turns out to be expensive, it is replaced by the cheaper XOR (^).
|
||
|
Each character of the identifier is xored with an 8-bit mask which
|
||
|
depends on the position of the character; the sum of these results
|
||
|
is the hash value. The random masks are obtained from a
|
||
|
congruence generator in idf.c.
|
||
|
*/
|
||
|
|
||
|
#define HASHSIZE 256 /* must be a power of 2 */
|
||
|
#define HASH_X 0253 /* Knuth's X */
|
||
|
#define HASH_A 77 /* Knuth's a */
|
||
|
#define HASH_C 153 /* Knuth's c */
|
||
|
|
||
|
extern char hmask[]; /* the random masks */
|
||
|
#define HASHMASK (HASHSIZE-1) /* since it is a power of 2 */
|
||
|
#define STARTHASH() (0)
|
||
|
#define ENHASH(hs,ch,ps) (hs + (ch ^ hmask[ps]))
|
||
|
#define STOPHASH(hs) (hs & HASHMASK)
|
||
|
|
||
|
struct idstack_item { /* stack of identifiers */
|
||
|
struct idstack_item *next;
|
||
|
struct idf *is_idf;
|
||
|
};
|
||
|
|
||
|
|
||
|
/* allocation definitions of struct idstack_item */
|
||
|
/* ALLOCDEF "idstack_item" */
|
||
|
extern char *st_alloc();
|
||
|
extern struct idstack_item *h_idstack_item;
|
||
|
#define new_idstack_item() ((struct idstack_item *) \
|
||
|
st_alloc((char **)&h_idstack_item, sizeof(struct idstack_item)))
|
||
|
#define free_idstack_item(p) st_free(p, h_idstack_item, sizeof(struct idstack_item))
|
||
|
|
||
|
|
||
|
struct idf {
|
||
|
struct idf *next;
|
||
|
char *id_text;
|
||
|
#ifndef NOPP
|
||
|
struct macro *id_macro;
|
||
|
int id_resmac; /* if nonzero: keyword of macroproc. */
|
||
|
#endif NOPP
|
||
|
int id_reserved; /* non-zero for reserved words */
|
||
|
struct def *id_def; /* variables, typedefs, enum-constants */
|
||
|
struct sdef *id_sdef; /* selector tags */
|
||
|
struct tag *id_struct; /* struct and union tags */
|
||
|
struct tag *id_enum; /* enum tags */
|
||
|
int id_special; /* special action needed at occurrence */
|
||
|
};
|
||
|
|
||
|
|
||
|
/* allocation definitions of struct idf */
|
||
|
/* ALLOCDEF "idf" */
|
||
|
extern char *st_alloc();
|
||
|
extern struct idf *h_idf;
|
||
|
#define new_idf() ((struct idf *) \
|
||
|
st_alloc((char **)&h_idf, sizeof(struct idf)))
|
||
|
#define free_idf(p) st_free(p, h_idf, sizeof(struct idf))
|
||
|
|
||
|
|
||
|
extern struct idf *str2idf(), *idf_hashed();
|
||
|
|
||
|
extern int level;
|
||
|
extern struct idf *gen_idf();
|