/* * SYM.C * * (c)Copyright 1993-2014, Matthew Dillon, All Rights Reserved. See the * COPYRIGHT file at the base of the distribution. */ #include "defs.h" #define KDHSIZE 64 #define KDHMASK (KDHSIZE - 1) typedef struct KeyData { const char *kd_Name; int kd_Token; struct KeyData *kd_Next; int kd_Len; } KeyData; static KeyData KeyDataAry[] = { { .kd_Name = "import", .kd_Token = TOK_IMPORT }, { .kd_Name = "class", .kd_Token = TOK_CLASS }, { .kd_Name = "subclass", .kd_Token = TOK_SUBCLASS }, { .kd_Name = "typedef", .kd_Token = TOK_TYPEDEF }, { .kd_Name = "as", .kd_Token = TOK_AS }, { .kd_Name = "using", .kd_Token = TOK_USING }, { .kd_Name = "from", .kd_Token = TOK_FROM }, { .kd_Name = "self", .kd_Token = TOK_SELF }, { .kd_Name = "for", .kd_Token = TOK_FOR }, { .kd_Name = "while", .kd_Token = TOK_WHILE }, { .kd_Name = "do", .kd_Token = TOK_DO }, { .kd_Name = "until", .kd_Token = TOK_UNTIL }, { .kd_Name = "loop", .kd_Token = TOK_LOOP }, { .kd_Name = "break", .kd_Token = TOK_BREAK }, { .kd_Name = "continue", .kd_Token = TOK_CONTINUE }, { .kd_Name = "switch", .kd_Token = TOK_SWITCH }, { .kd_Name = "if", .kd_Token = TOK_IF }, { .kd_Name = "block", .kd_Token = TOK_BLOCK }, { .kd_Name = "else", .kd_Token = TOK_ELSE }, { .kd_Name = "case", .kd_Token = TOK_CASE }, { .kd_Name = "default", .kd_Token = TOK_DEFAULT }, { .kd_Name = "private", .kd_Token = TOK_PRIVATE }, { .kd_Name = "library", .kd_Token = TOK_LIBRARY }, { .kd_Name = "internal", .kd_Token = TOK_INTERNAL }, { .kd_Name = "internal2", .kd_Token = TOK_INTERNAL2 }, { .kd_Name = "project", .kd_Token = TOK_PROJECT }, { .kd_Name = "public", .kd_Token = TOK_PUBLIC }, { .kd_Name = "refine", .kd_Token = TOK_REFINE }, { .kd_Name = "heap", .kd_Token = TOK_HEAP }, { .kd_Name = "pure", .kd_Token = TOK_PURE }, { .kd_Name = "shared", .kd_Token = TOK_SHARED }, { .kd_Name = "unlocked", .kd_Token = TOK_UNLOCKED }, { .kd_Name = "untracked", .kd_Token = TOK_UNTRACKED }, { .kd_Name = "hard", .kd_Token = TOK_HARD }, { .kd_Name = "soft", .kd_Token = TOK_SOFT }, { .kd_Name = "constant", .kd_Token = TOK_CONSTANT }, { .kd_Name = "global", .kd_Token = TOK_GLOBAL }, { .kd_Name = "const", .kd_Token = TOK_CONST }, { .kd_Name = "lvalue", .kd_Token = TOK_LVALUE }, { .kd_Name = "thread", .kd_Token = TOK_THREAD }, { .kd_Name = "thread_schedule", .kd_Token = TOK_THREAD_SCHEDULE }, { .kd_Name = "preempt", .kd_Token = TOK_PREEMPT }, { .kd_Name = "destructor", .kd_Token = TOK_DESTRUCTOR }, { .kd_Name = "constructor", .kd_Token = TOK_CONSTRUCTOR }, { .kd_Name = "__nozero", .kd_Token = TOK_NOZERO }, { .kd_Name = "volatile", .kd_Token = TOK_VOLATILE }, { .kd_Name = "persist", .kd_Token = TOK_PERSIST }, { .kd_Name = "inline", .kd_Token = TOK_INLINE }, { .kd_Name = "noinline", .kd_Token = TOK_NOINLINE }, { .kd_Name = "overload", .kd_Token = TOK_OVERLOAD }, { .kd_Name = "operator", .kd_Token = TOK_OPERATOR }, { .kd_Name = "method", .kd_Token = TOK_METHOD }, { .kd_Name = "return", .kd_Token = TOK_RETURN }, { .kd_Name = "result", .kd_Token = TOK_RESULT }, { .kd_Name = "cast", .kd_Token = TOK_CAST }, { .kd_Name = "sizeof", .kd_Token = TOK_SIZEOF }, { .kd_Name = "arysize", .kd_Token = TOK_ARYSIZE }, { .kd_Name = "typeof", .kd_Token = TOK_TYPEOF }, { .kd_Name = "alias", .kd_Token = TOK_ALIAS }, { .kd_Name = "interface", .kd_Token = TOK_INTERFACE }, { .kd_Name = "subinterface", .kd_Token = TOK_SUBINTERFACE }, /* overrides for naming restrictions, not normally class ids */ { .kd_Name = "void", .kd_Token = TOK_CLASSID }, { .kd_Name = "bool", .kd_Token = TOK_CLASSID }, { .kd_Name = "char", .kd_Token = TOK_CLASSID }, { .kd_Name = "int", .kd_Token = TOK_CLASSID }, { .kd_Name = "uint", .kd_Token = TOK_CLASSID }, { .kd_Name = "long", .kd_Token = TOK_CLASSID }, { .kd_Name = "ulong", .kd_Token = TOK_CLASSID }, { .kd_Name = "float", .kd_Token = TOK_CLASSID }, { .kd_Name = "double", .kd_Token = TOK_CLASSID }, { .kd_Name = "ldouble", .kd_Token = TOK_CLASSID }, /* special API interfacing */ { .kd_Name = "__storage", .kd_Token = TOK_STORAGE }, { .kd_Name = "__clang", .kd_Token = TOK_CLANG }, { .kd_Name = "__align", .kd_Token = TOK_ALIGN } }; static KeyData *KeyHash[KDHSIZE]; static int SymKeywordInited; static void symKeywordInit(void) { size_t i; for (i = 0; i < arysize(KeyDataAry); ++i) { KeyData *kd = &KeyDataAry[i]; int hv = kd->kd_Name[0] & KDHMASK; kd->kd_Next = KeyHash[hv]; kd->kd_Len = strlen(kd->kd_Name); KeyHash[hv] = kd; } SymKeywordInited = 1; } int SymKeywordFind(const char *ptr, int len, int t) { KeyData *kd; if (SymKeywordInited == 0) symKeywordInit(); for (kd = KeyHash[*ptr & KDHMASK]; kd; kd = kd->kd_Next) { if (kd->kd_Len == len && bcmp(ptr, kd->kd_Name, len) == 0) { t = kd->kd_Token; break; } } return(t); }