# ifndef CPPHASH_H
# define CPPHASH_H
/*@constant int CPP_HASHSIZE@*/
# define CPP_HASHSIZE 1403
/* different kinds of things that can appear in the value field
of a hash node. Actually, this may be useless now. */
typedef union u_hashvalue {
int ival;
/*@null@*/ /*@owned@*/ char *cpval;
/*@owned@*/ DEFINITION *defn;
} hashValue;
struct s_hashNode {
/* double links for easy deletion */
/*@only@*/ /*@null@*/ hashNode next;
/*@dependent@*/ /*@null@*/ hashNode prev;
/*
** Also, a back pointer to this node's hash
** chain is kept, in case the node is the head
** of the chain and gets deleted.
*/
/*@null@*/ /*@dependent@*/ hashNode *bucket_hdr;
enum node_type type; /* type of special token */
size_t length; /* length of token, for quick comparison */
cstring name; /* the actual name */
hashValue value; /* pointer to expansion, or whatever */
} ;
/* Some definitions for the hash table. The hash function MUST be
computed as shown in hashf () below. That is because the rescan
loop computes the hash value `on the fly' for most tokens,
in order to avoid the overhead of a lot of procedure calls to
the hashf () function. Hashf () only exists for the sake of
politeness, for use when speed isn't so important. */
extern void cppReader_deleteMacro (/*@exposed@*/ hashNode p_hp)
/*@modifies internalState, p_hp@*/;
extern /*@exposed@*/ hashNode cpphash_install (char *, int,
enum node_type, int,
/*@only@*/ /*@null@*/ char *, int);
extern void cppReader_hashCleanup (void);
extern /*@null@*/ /*@exposed@*/ hashNode cpphash_lookup (char *, int, int);
extern /*@null@*/ /*@exposed@*/ hashNode cpphash_lookupExpand (char *, int, int,
bool p_forceExpand);
extern int cpphash_hashCode (const char *p_name, size_t p_len, int p_hashsize) /*@*/ ;
extern void cppReader_saveHashtab (void);
extern void cppReader_restoreHashtab (void);
extern /*@exposed@*/ hashNode
cpphash_installMacro (char *p_name, size_t p_len,
/*@only@*/ struct definition *p_defn, int p_hash);
# else
# error "Multiple include"
# endif
syntax highlighted by Code2HTML, v. 0.9.1