#define UINT8 unsigned char
#define HASH(keyword, value) \
{ \
int hshval; \
char * p; \
hshval = 0; \
for (p = (keyword); *p != 0; p++) { \
\
hshval = (hshval ^ ((int)(*p))) << 1; \
if (hshval & 0xffffff00) \
hshval = (hshval & ~0xffffff00) ^ 1; \
}; \
value = hshval; \
}
#include <stdio.h>
#include <astp.h>
#include <y_tab.h>
typedef struct {
long next;
long res_word;
char * keyword;
long token;
} keyword_attrib_t;
#define HASH_TABLE_SIZE 256
extern boolean search_attributes_table;
static UINT8 keyword_hash_table [HASH_TABLE_SIZE];
static keyword_attrib_t keywords [] = {
{0, 0, 0, 0},
{0, 1, "boolean", BOOLEAN_KW},
{0, 1, "byte", BYTE_KW},
{0, 1, "case", CASE_KW},
{0, 1, "char", CHAR_KW},
{0, 1, "const", CONST_KW},
{0, 1, "default", DEFAULT_KW},
{0, 1, "double", DOUBLE_KW},
{0, 1, "enum", ENUM_KW},
{0, 1, "FALSE", FALSE_KW},
{0, 1, "float", FLOAT_KW},
{0, 1, "handle_t", HANDLE_T_KW},
{0, 1, "hyper", HYPER_KW},
{0, 1, "import", IMPORT_KW},
{0, 1, "int", INT_KW},
{0, 1, "interface", INTERFACE_KW},
{0, 0, "ref", REF_KW},
{0, 1, "long", LONG_KW},
{0, 1, "NULL", NULL_KW},
{0, 1, "pipe", PIPE_KW},
{0, 1, "short", SHORT_KW},
{0, 1, "small", SMALL_KW},
{0, 1, "struct", STRUCT_KW},
{0, 1, "switch", SWITCH_KW},
{0, 1, "TRUE", TRUE_KW},
{0, 1, "typedef", TYPEDEF_KW},
{0, 1, "union", UNION_KW},
{0, 1, "unsigned", UNSIGNED_KW},
{0, 1, "void", VOID_KW},
{0, 0, "align", ALIGN_KW},
{0, 0, "broadcast", BROADCAST_KW},
{0, 0, "context_handle", CONTEXT_HANDLE_KW},
{0, 0, "endpoint", ENDPOINT_KW},
{0, 0, "exceptions", EXCEPTIONS_KW},
{0, 0, "first_is", FIRST_IS_KW},
{0, 0, "handle", HANDLE_KW},
{0, 0, "idempotent", IDEMPOTENT_KW},
{0, 0, "ignore", IGNORE_KW},
{0, 0, "in", IN_KW},
{0, 0, "last_is", LAST_IS_KW},
{0, 0, "length_is", LENGTH_IS_KW},
{0, 0, "local", LOCAL_KW},
{0, 0, "max_is", MAX_IS_KW},
{0, 0, "maybe", MAYBE_KW},
{0, 0, "min_is", MIN_IS_KW},
{0, 0, "out", OUT_KW},
{0, 0, "pointer_default", POINTER_DEFAULT_KW},
{0, 0, "ptr", PTR_KW},
{0, 0, "reflect_deletions", REFLECT_DELETIONS_KW},
{0, 0, "shape", SHAPE_KW},
{0, 0, "size_is", SIZE_IS_KW},
{0, 0, "string", STRING_KW},
{0, 0, "switch_is", SWITCH_IS_KW},
{0, 0, "switch_type", SWITCH_TYPE_KW},
{0, 0, "transmit_as", TRANSMIT_AS_KW},
{0, 0, "unique", UNIQUE_KW},
{0, 0, "uuid", UUID_KW},
{0, 0, "version", VERSION_KW},
{0, 0, "v1_array", V1_ARRAY_KW},
{0, 0, "v1_enum", V1_ENUM_KW},
{0, 0, "v1_string", V1_STRING_KW},
{0, 0, "v1_struct", V1_STRUCT_KW},
{0, 0, 0, 0}
};
void KEYWORDS_init
(
void
)
{
int hash_value;
int i;
for (i = 0; i<HASH_TABLE_SIZE; i++)
keyword_hash_table [i] = 0;
for (i = 1; keywords [i].keyword != 0; i++) {
HASH( keywords [i].keyword, hash_value);
keywords [i].next = keyword_hash_table [hash_value];
keyword_hash_table [hash_value] = i;
};
}
int KEYWORDS_screen
(
char * identifier,
NAMETABLE_id_t * id
)
{
long hash_value;
long i;
HASH(identifier, hash_value);
if ( keyword_hash_table [hash_value] != 0 ) {
for (i=keyword_hash_table [hash_value]; i; i=keywords [i].next) {
if ((!strcmp (identifier, keywords [i].keyword)) &&
(keywords [i].res_word || search_attributes_table))
return keywords [i].token;
};
};
* id = NAMETABLE_add_id(identifier);
return IDENTIFIER ;
}
char *KEYWORDS_lookup_text
(
long token
)
{
long i;
for (i = 1; keywords [i].keyword != 0; i++)
if (keywords[i].token == token) return keywords[i].keyword;
return "?";
}
#ifdef DUMP_HASH_TABLE
main
(
void
)
{
int i, j;
KEYWORDS_init ();
for (i = 0; i<HASH_TABLE_SIZE; i++) {
if (keyword_hash_table [i]){
printf ("Hash value %d: ",i);
j = keyword_hash_table [i];
for (j; j; j = keywords [j].next)
printf ("%s ", keywords [j].keyword);
printf ("\n");
};
};
}
#endif