命令ハッシュ表の作成方法を変更
authorj8takagi <j8takagi@nifty.com>
Sat, 18 Aug 2018 07:57:51 +0000 (16:57 +0900)
committerj8takagi <j8takagi@nifty.com>
Sat, 18 Aug 2018 07:57:51 +0000 (16:57 +0900)
include/struct.h
src/casl2.c
src/comet2monitor.c
src/disassemble.c
src/exec.c
src/monitor.c
src/struct.c
test/unit/getcmdcode/cmd.c

index ed58762..8f69f20 100644 (file)
@@ -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);
 
 /**
- * å\90\8då\89\8dã\81¨ã\82¿ã\82¤ã\83\97ã\81\8cã\82­ã\83¼ã\81®å\91½ä»¤ã\83\8fã\83\83ã\82·ã\83¥è¡¨ã\82\92解æ\94¾ã\81\99ã\82\8b
+ * 命令ハッシュ表を解放する
  */
-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の終端 */
index 36d5703..68cbb24 100644 (file)
@@ -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;
index b961711..3f9ed7a 100644 (file)
@@ -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;
index 8f3c9d7..a97a042 100644 (file)
@@ -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;
 }
index c7c125e..048f223 100644 (file)
@@ -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);
     }
index 4278c6a..9fe71f5 100644 (file)
@@ -359,7 +359,7 @@ void monitor()
         if(cmdtype == MONQUIT) {
             shutdown();
             freebps();
-            free_code_cmdtype();
+            free_cmdtable(HASH_CODE);
             freecerr();
             exit(0);
         }
index 4e38f2e..3fb9a30 100644 (file)
@@ -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)
 }
 
 /**
- * å\90\8då\89\8dã\81¨ã\82¿ã\82¤ã\83\97ã\81\8cã\82­ã\83¼ã\81®å\91½ä»¤ã\83\8fã\83\83ã\82·ã\83¥è¡¨ã\82\92ä½\9cæ\88\90ã\81\99ã\82\8b
+ * 命令ハッシュ表を作成する
  */
-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)
 }
 
 /**
- * å\90\8då\89\8dã\81¨ã\82¿ã\82¤ã\83\97ã\81\8cã\82­ã\83¼ã\81®å\91½ä»¤ã\83\8fã\83\83ã\82·ã\83¥è¡¨ã\82\92解æ\94¾ã\81\99ã\82\8b
+ * 命令ハッシュ表を解放する
  */
-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仮想マシンのリセット
  */
index c1d33ff..a479173 100644 (file)
@@ -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;
 }