メモリ管理の改善
[YACASL2.git] / src / cmd.c
index 04d32aa..add169a 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -48,17 +48,23 @@ CMDTAB **cmdtype_code, **code_type;
 /* 命令と命令タイプからハッシュ値を生成する */
 unsigned hash_cmdtype(const char *cmd, CMDTYPE type) {
     HKEY *keys[2];
+    unsigned hashval;
 
     /* 命令をセット */
-    keys[0] = malloc_chk(sizeof(HKEY), "hash_cmdtype.key");
+    keys[0] = malloc_chk(sizeof(HKEY), "hash_cmdtype.keys[0]");
     keys[0]->type = CHARS;
-    keys[0]->val.s = strdup_chk(cmd, "keys[0].val");
+    keys[0]->val.s = strdup_chk(cmd, "keys[0].val.s");
     /* 命令タイプをセット */
-    keys[1] = malloc_chk(sizeof(HKEY), "hash_cmdtype.key");
+    keys[1] = malloc_chk(sizeof(HKEY), "hash_cmdtype.keys[1]");
     keys[1]->type = INT;
     keys[1]->val.i = (int)(type & 070);
+    /* ハッシュ値の計算 */
+    hashval = hash(2, keys, cmdtabsize);
+    free_chk(keys[0]->val.s, "keys[0].val.s");
+    free_chk(keys[0], "keys[0]");
+    free_chk(keys[1], "keys[1]");
     /* ハッシュ値を返す */
-    return hash(2, keys, cmdtabsize);
+    return hashval;
 }
 
 /* 命令と命令タイプがキーのハッシュ表を作成する */
@@ -69,7 +75,7 @@ bool create_cmdtype_code()
     int i;
 
     cmdtabsize = comet2cmdsize;
-    cmdtype_code = malloc_chk(cmdtabsize * sizeof(CMDTAB *), "cmdtype_code");
+    cmdtype_code = calloc_chk(cmdtabsize, sizeof(CMDTAB *), "cmdtype_code");
     for(i = 0; i < cmdtabsize; i++) {
         *(cmdtype_code + i) = NULL;
     }
@@ -112,11 +118,11 @@ void free_cmdtype_code()
         np = cmdtype_code[i];
         while(np != NULL) {
             nq = np->next;
-            free(np);
+            free_chk(np, "free_cmdtype_code.np");
             np = nq;
         }
     }
-    free(cmdtype_code);
+    free_chk(cmdtype_code, "cmdtype_code");
 }
 
 /* 命令コードからハッシュ値を生成する */
@@ -140,7 +146,7 @@ bool create_code_type()
     int i;
 
     cmdtabsize = comet2cmdsize;
-    code_type = malloc_chk(cmdtabsize * sizeof(CMDTAB *), "code_type");
+    code_type = calloc_chk(cmdtabsize, sizeof(CMDTAB *), "code_type");
     for(i = 0; i < cmdtabsize; i++) {
         *(code_type + i) = NULL;
     }