From: j8takagi Date: Sat, 18 Aug 2018 08:58:51 +0000 (+0900) Subject: 命令ハッシュ表を2次元配列に X-Git-Tag: v0.5p1^2 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=903276ec3fb4522ec83b16ba5068787532b42547;p=YACASL2.git 命令ハッシュ表を2次元配列に --- diff --git a/include/struct.h b/include/struct.h index 8f69f20..ffc448e 100644 --- a/include/struct.h +++ b/include/struct.h @@ -57,8 +57,9 @@ extern SYSTEM *sys; * 命令ハッシュ表のハッシュの種類 */ typedef enum { - HASH_CMDTYPE = 0, - HASH_CODE = 1, + HASH_CMDTYPE, + HASH_CODE, + HASH_MAX, } CMDTAB_HASH; /** @@ -161,21 +162,16 @@ void shutdown(); */ bool create_cmdtable(CMDTAB_HASH hash); -/** - * 命令の名前とタイプから、命令コードを返す - * 無効な場合は0xFFFFを返す - */ -WORD getcmdcode(const char *cmd, CMDTYPE type); - /** * 命令ハッシュ表を解放する */ -void free_cmdtable(); +void free_cmdtable(CMDTAB_HASH hash); /** - * コードがキーの命令ハッシュ表を作成する + * 命令の名前とタイプから、命令コードを返す + * 無効な場合は0xFFFFを返す */ -bool create_code_cmdtype(); +WORD getcmdcode(const char *cmd, CMDTYPE type); /** * 命令コードから命令の関数ポインタを返す diff --git a/src/struct.c b/src/struct.c index 3fb9a30..f6d4128 100644 --- a/src/struct.c +++ b/src/struct.c @@ -70,7 +70,7 @@ enum { /** * ハッシュ表 */ -static CMDTAB *cmdtype_code[CMDTABSIZE], *code_cmdtype[CMDTABSIZE]; +static CMDTAB *cmdtab[HASH_MAX][CMDTABSIZE]; /** * 命令の名前とタイプからハッシュ値を生成する @@ -121,17 +121,32 @@ bool create_cmdtable(CMDTAB_HASH hash) p->cmd = &comet2cmd[i]; if(hash == HASH_CMDTYPE) { hashval = hash_cmdtype(comet2cmd[i].name, comet2cmd[i].type); - p->next = cmdtype_code[hashval]; - cmdtype_code[hashval] = p; } else if(hash == HASH_CODE) { hashval = hash_code((&comet2cmd[i])->code); - p->next = code_cmdtype[hashval]; - code_cmdtype[hashval] = p; } + p->next = cmdtab[hash][hashval]; + cmdtab[hash][hashval] = p; } return true; } +/** + * 命令ハッシュ表を解放する + */ +void free_cmdtable(CMDTAB_HASH hash) +{ + int i; + CMDTAB *p, *q; + + for(i = 0; i < CMDTABSIZE; i++) { + for(p = cmdtab[hash][i]; p != NULL; p = q) { + q = p->next; + cmdtab[hash][i] = NULL; + FREE(p); + } + } +} + /** * 命令の名前とタイプから、命令コードを返す\n * 無効な場合は0xFFFFを返す @@ -142,7 +157,7 @@ WORD getcmdcode(const char *cmd, CMDTYPE type) WORD w = 0xFFFF; assert(cmd != NULL); - for(p = cmdtype_code[hash_cmdtype(cmd, type)]; p != NULL; p = p->next) { + for(p = cmdtab[HASH_CMDTYPE][hash_cmdtype(cmd, type)]; p != NULL; p = p->next) { if(strcmp(cmd, p->cmd->name) == 0 && type == p->cmd->type) { w = p->cmd->code; break; @@ -151,32 +166,6 @@ WORD getcmdcode(const char *cmd, CMDTYPE type) return w; } -/** - * 命令ハッシュ表を解放する - */ -void free_cmdtable(CMDTAB_HASH hash) -{ - int i; - CMDTAB *p, *q; - - for(i = 0; i < CMDTABSIZE; i++) { - if(hash == HASH_CMDTYPE) { - p = cmdtype_code[i]; - } else if(hash == HASH_CODE) { - p = code_cmdtype[i]; - } - for( ; p != NULL; p = q) { - q = p->next; - if(p == cmdtype_code[i]) { - cmdtype_code[i] = NULL; - } else if (p == code_cmdtype[i]) { - code_cmdtype[i] = NULL; - } - FREE(p); - } - } -} - /** * 命令コードからハッシュ値を生成する */ @@ -202,7 +191,7 @@ const void (*getcmdptr(WORD code)) CMDTAB *t; const void *ptr = NULL; - for(t = code_cmdtype[hash_code(code)]; t != NULL; t = t->next) { + for(t = cmdtab[HASH_CODE][hash_code(code)]; t != NULL; t = t->next) { if(code == t->cmd->code) { ptr = t->cmd->ptr; break; @@ -219,7 +208,7 @@ CMDTYPE getcmdtype(WORD code) CMDTAB *t; CMDTYPE type = NONE; - for(t = code_cmdtype[hash_code(code)]; t != NULL; t = t->next) { + for(t = cmdtab[HASH_CODE][hash_code(code)]; t != NULL; t = t->next) { if(code == t->cmd->code) { type = t->cmd->type; break; @@ -236,7 +225,7 @@ char *getcmdname(WORD code) CMDTAB *t; char *cmd = NULL; - for(t = code_cmdtype[hash_code(code)]; t != NULL; t = t->next) { + for(t = cmdtab[HASH_CODE][hash_code(code)]; t != NULL; t = t->next) { if(code == t->cmd->code) { cmd = t->cmd->name; break;