diff options
Diffstat (limited to 'mdk-stage1/slang/keywhash.c')
-rw-r--r-- | mdk-stage1/slang/keywhash.c | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/mdk-stage1/slang/keywhash.c b/mdk-stage1/slang/keywhash.c new file mode 100644 index 000000000..17d94d5a3 --- /dev/null +++ b/mdk-stage1/slang/keywhash.c @@ -0,0 +1,190 @@ +/* Perfect hash generated by command line: + * ./a.out 1 + */ +#define MIN_HASH_VALUE 2 +#define MAX_HASH_VALUE 118 +#define MIN_KEYWORD_LEN 2 +#define MAX_KEYWORD_LEN 11 + +static unsigned char Keyword_Hash_Table [256] = +{ + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 1, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 9, 7, 1, 8, 2, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 0, 0, 119, 0, 119, 119, 119, 7, 119, 0, 0, 119, 119, 0, + 119, 119, 0, 0, 0, 0, 119, 119, 0, 119, 119, 119, 119, 119, 119, 2, + 119, 41, 1, 1, 9, 0, 55, 8, 0, 0, 119, 0, 27, 0, 0, 0, + 7, 2, 0, 21, 0, 0, 0, 3, 2, 0, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119 +}; + +static unsigned char keyword_hash (char *s, unsigned int len) +{ + unsigned int sum; + + sum = len; + while (len) + { + len--; + sum += (unsigned int) Keyword_Hash_Table [(unsigned char)s[len]]; + } + return sum; +} + +typedef struct +{ + char *name; + unsigned int type; +} +Keyword_Table_Type; + +static Keyword_Table_Type Keyword_Table [/* 117 */] = +{ + {"or", OR_TOKEN}, + {"not", NOT_TOKEN}, + {NULL,0}, + {"xor", BXOR_TOKEN}, + {"return", RETURN_TOKEN}, + {"exch", EXCH_TOKEN}, + {NULL,0}, + {"continue", CONT_TOKEN}, + {NULL,0}, + {"do", DO_TOKEN}, + {"mod", MOD_TOKEN}, + {"ERROR_BLOCK", ERRBLK_TOKEN}, + {"USER_BLOCK2", USRBLK2_TOKEN}, + {"USER_BLOCK4", USRBLK4_TOKEN}, + {"__tmp", TMP_TOKEN}, + {"pop", POP_TOKEN}, + {NULL,0}, + {"EXIT_BLOCK", EXITBLK_TOKEN}, + {"USER_BLOCK1", USRBLK1_TOKEN}, + {"USER_BLOCK3", USRBLK3_TOKEN}, + {"USER_BLOCK0", USRBLK0_TOKEN}, + {NULL,0}, + {"shr", SHR_TOKEN}, + {"chs", CHS_TOKEN}, + {"sqr", SQR_TOKEN}, + {NULL,0}, + {"struct", STRUCT_TOKEN}, + {NULL,0}, + {NULL,0}, + {"switch", SWITCH_TOKEN}, + {"mul2", MUL2_TOKEN}, + {"sign", SIGN_TOKEN}, + {"using", USING_TOKEN}, + {"while", WHILE_TOKEN}, + {NULL,0}, + {NULL,0}, + {"loop", LOOP_TOKEN}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {"public", PUBLIC_TOKEN}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {"break", BREAK_TOKEN}, + {NULL,0}, + {"do_while", DOWHILE_TOKEN}, + {NULL,0}, + {"shl", SHL_TOKEN}, + {"else", ELSE_TOKEN}, + {"and", AND_TOKEN}, + {"orelse", ORELSE_TOKEN}, + {"private", PRIVATE_TOKEN}, + {NULL,0}, + {"if", IF_TOKEN}, + {"for", FOR_TOKEN}, + {"!if", IFNOT_TOKEN}, + {NULL,0}, + {"_for", _FOR_TOKEN}, + {"forever", FOREVER_TOKEN}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {"abs", ABS_TOKEN}, + {"case", CASE_TOKEN}, + {NULL,0}, + {"static", STATIC_TOKEN}, + {"define", DEFINE_TOKEN}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {"typedef", TYPEDEF_TOKEN}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {"foreach", FOREACH_TOKEN}, + {"andelse", ANDELSE_TOKEN}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {NULL,0}, + {"variable", VARIABLE_TOKEN}, +}; + +static Keyword_Table_Type *is_keyword (char *str, unsigned int len) +{ + unsigned int hash; + char *name; + Keyword_Table_Type *kw; + + if ((len < MIN_KEYWORD_LEN) + || (len > MAX_KEYWORD_LEN)) + return NULL; + + hash = keyword_hash (str, len); + if ((hash > MAX_HASH_VALUE) || (hash < MIN_HASH_VALUE)) + return NULL; + + kw = &Keyword_Table[hash - MIN_HASH_VALUE]; + if ((NULL != (name = kw->name)) + && (*str == *name) + && (0 == strcmp (str, name))) + return kw; + return NULL; +} |