From: j8takagi Date: Sat, 18 Aug 2018 07:57:51 +0000 (+0900) Subject: 命令ハッシュ表の作成方法を変更 X-Git-Tag: v0.5p1^2~1 X-Git-Url: https://j8takagi.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21b0a348f1e1660a3da0ebf0c4e7009a4ac11c71;p=YACASL2.git 命令ハッシュ表の作成方法を変更 --- diff --git a/include/struct.h b/include/struct.h index ed58762..8f69f20 100644 --- a/include/struct.h +++ b/include/struct.h @@ -53,6 +53,14 @@ typedef struct { */ extern SYSTEM *sys; +/** + * 命令ハッシュ表のハッシュの種類 + */ +typedef enum { + HASH_CMDTYPE = 0, + HASH_CODE = 1, +} CMDTAB_HASH; + /** * COMET II 命令 * 命令タイプは、オペランドにより5種類に分類 @@ -145,9 +153,13 @@ void reset(int memsize, int clocks); void shutdown(); /** - * 名前とタイプがキーの命令ハッシュ表を作成する + * @brief 命令ハッシュ表を作成する + * + * @return なし + * + * @param hash ハッシュ値 */ -bool create_cmdtype_code(); +bool create_cmdtable(CMDTAB_HASH hash); /** * 命令の名前とタイプから、命令コードを返す @@ -156,9 +168,9 @@ bool create_cmdtype_code(); WORD getcmdcode(const char *cmd, CMDTYPE type); /** - * 名前とタイプがキーの命令ハッシュ表を解放する + * 命令ハッシュ表を解放する */ -void free_cmdtype_code(); +void free_cmdtable(); /** * コードがキーの命令ハッシュ表を作成する @@ -180,9 +192,4 @@ CMDTYPE getcmdtype(WORD code); */ char *getcmdname(WORD code); -/** - * コードがキーの命令ハッシュ表を解放する - */ -void free_code_cmdtype(); - #endif /* YACASL2_CASL2_INCLUDEDの終端 */ diff --git a/src/casl2.c b/src/casl2.c index 36d5703..68cbb24 100644 --- a/src/casl2.c +++ b/src/casl2.c @@ -145,7 +145,7 @@ int main(int argc, char *argv[]) freecerr(); /* エラーの解放 */ exit(1); } - create_cmdtype_code(); /* 命令の名前とタイプがキーのハッシュ表を作成 */ + create_cmdtable(HASH_CMDTYPE); /* 命令の名前とタイプがキーのハッシュ表を作成 */ reset(memsize, clocks); /* 仮想マシンCOMET IIのリセット */ for(i = 0; i < argc - optind; i++) { /* 引数からファイル名配列を取得 */ af[i] = argv[optind + i]; @@ -165,7 +165,7 @@ int main(int argc, char *argv[]) } casl2fin: shutdown(); /* 仮想マシンCOMET IIのシャットダウン */ - free_cmdtype_code(); + free_cmdtable(HASH_CMDTYPE); stat = (cerr->num == 0) ? 0 : 1; freecerr(); /* エラーの解放 */ return stat; diff --git a/src/comet2monitor.c b/src/comet2monitor.c index b961711..3f9ed7a 100644 --- a/src/comet2monitor.c +++ b/src/comet2monitor.c @@ -52,14 +52,14 @@ int main(int argc, char *argv[]) addcerrlist_load(); addcerrlist_exec(); - create_cmdtype_code(); + create_cmdtable(HASH_CMDTYPE); reset(memsize, clocks); /* COMET II仮想マシンのリセット */ execptr->start = 0; execmode.monitor = true; exec(); /* プログラム実行 */ shutdown(); - free_cmdtype_code(); + free_cmdtable(HASH_CMDTYPE); stat = (cerr->num == 0) ? 0 : 1; freecerr(); /* エラーの解放 */ return stat; diff --git a/src/disassemble.c b/src/disassemble.c index 8f3c9d7..a97a042 100644 --- a/src/disassemble.c +++ b/src/disassemble.c @@ -188,7 +188,7 @@ bool disassemble_file(const char *file) return false; } - create_code_cmdtype(); /* 命令のコードとタイプがキーのハッシュ表を作成 */ + create_cmdtable(HASH_CODE); /* 命令のコードとタイプがキーのハッシュ表を作成 */ fprintf(stdout, "MAIN START\n"); for(word = fgetword(fp); !feof(fp); i++, word = fgetword(fp)) { @@ -218,7 +218,7 @@ bool disassemble_file(const char *file) fprintf(stdout, "\n"); } fprintf(stdout, " END\n"); - free_code_cmdtype(); + free_cmdtable(HASH_CODE); fclose(fp); return stat; } diff --git a/src/exec.c b/src/exec.c index c7c125e..048f223 100644 --- a/src/exec.c +++ b/src/exec.c @@ -768,7 +768,8 @@ void exec() char *s; const char *monmsg = "COMET II machine code monitor. Type ? for help.\n"; - create_code_cmdtype(); /* 命令のコードとタイプがキーのハッシュ表を作成 */ + create_cmdtable(HASH_CODE); /* 命令のコードとタイプがキーのハッシュ表を作成 */ + if(execmode.trace == true) { fprintf(stdout, "\nExecuting machine codes\n"); } @@ -837,7 +838,7 @@ void exec() } execfin: freebps(); - free_code_cmdtype(); /* 命令のコードとタイプがキーのハッシュ表を解放 */ + free_cmdtable(HASH_CODE); /* 命令のコードとタイプがキーのハッシュ表を解放 */ if(cerr->num > 0) { fprintf(stderr, "Execute error - %d: %s\n", cerr->num, cerr->msg); } diff --git a/src/monitor.c b/src/monitor.c index 4278c6a..9fe71f5 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -359,7 +359,7 @@ void monitor() if(cmdtype == MONQUIT) { shutdown(); freebps(); - free_code_cmdtype(); + free_cmdtable(HASH_CODE); freecerr(); exit(0); } diff --git a/src/struct.c b/src/struct.c index 4e38f2e..3fb9a30 100644 --- a/src/struct.c +++ b/src/struct.c @@ -72,6 +72,16 @@ enum { */ static CMDTAB *cmdtype_code[CMDTABSIZE], *code_cmdtype[CMDTABSIZE]; +/** + * 命令の名前とタイプからハッシュ値を生成する + */ +unsigned hash_cmdtype(const char *cmd, CMDTYPE type); + +/** + * 命令コードからハッシュ値を生成する + */ +unsigned hash_code(WORD code); + /** * 命令の名前とタイプからハッシュ値を生成する */ @@ -98,20 +108,26 @@ unsigned hash_cmdtype(const char *cmd, CMDTYPE type) } /** - * 名前とタイプがキーの命令ハッシュ表を作成する + * 命令ハッシュ表を作成する */ -bool create_cmdtype_code() +bool create_cmdtable(CMDTAB_HASH hash) { CMDTAB *p; unsigned hashval; int i; for(i = 0; i < comet2cmdsize; i++) { - hashval = hash_cmdtype(comet2cmd[i].name, comet2cmd[i].type); /* ハッシュ値の生成 */ - p = malloc_chk(sizeof(CMDTAB), "cmdtype_code"); + p = malloc_chk(sizeof(CMDTAB), "create_cmdtable.p"); p->cmd = &comet2cmd[i]; - p->next = cmdtype_code[hashval]; /* ハッシュ表に値を追加 */ - cmdtype_code[hashval] = p; + 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; + } } return true; } @@ -136,16 +152,26 @@ WORD getcmdcode(const char *cmd, CMDTYPE type) } /** - * 名前とタイプがキーの命令ハッシュ表を解放する + * 命令ハッシュ表を解放する */ -void free_cmdtype_code() +void free_cmdtable(CMDTAB_HASH hash) { int i; CMDTAB *p, *q; for(i = 0; i < CMDTABSIZE; i++) { - for(p = cmdtype_code[i]; p != NULL; p = q) { + 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); } } @@ -168,25 +194,6 @@ unsigned hash_code(WORD code) return h; } -/** - * コードがキーの命令ハッシュ表を作成する - */ -bool create_code_cmdtype() -{ - CMDTAB *p; - unsigned hashval; - int i; - - for(i = 0; i < comet2cmdsize; i++) { - hashval = hash_code((&comet2cmd[i])->code); /* ハッシュ値の生成 */ - p = malloc_chk(sizeof(CMDTAB), "code_cmdtype"); - p->cmd = &comet2cmd[i]; - p->next = code_cmdtype[hashval]; /* ハッシュ表に値を追加 */ - code_cmdtype[hashval] = p; - } - return true; -} - /** * 命令コードから命令の関数ポインタを返す */ @@ -250,21 +257,6 @@ char *grstr(WORD word) return str; } -/** - * コードがキーの命令ハッシュ表を解放する - */ -void free_code_cmdtype() -{ - int i; - CMDTAB *p, *q; - for(i = 0; i < CMDTABSIZE; i++) { - for(p = code_cmdtype[i]; p != NULL; p = q) { - q = p->next; - FREE(p); - } - } -} - /** * COMET II仮想マシンのリセット */ diff --git a/test/unit/getcmdcode/cmd.c b/test/unit/getcmdcode/cmd.c index c1d33ff..a479173 100644 --- a/test/unit/getcmdcode/cmd.c +++ b/test/unit/getcmdcode/cmd.c @@ -2,6 +2,7 @@ #include "struct.h" #include "cerr.h" #include "exec.h" +#include "monitor.h" int main(){ int i; @@ -25,7 +26,7 @@ int main(){ { "PUSH", ADR_X }, { "POP", R_ }, { "CALL", ADR_X }, { "SVC", ADR_X }, { "RET", NONE } }; - create_cmdtype_code(); + create_cmdtable(HASH_CMDTYPE); cerr_init(); for(i = 0; i < sizeof(cmdcodelist)/sizeof(cmdcodelist[0]); i++) { code = getcmdcode(cmdcodelist[i].cmd, cmdcodelist[i].type); @@ -35,6 +36,6 @@ int main(){ } } freecerr(); - free_cmdtype_code(); + free_cmdtable(HASH_CMDTYPE); return 0; }