projects
/
YACASL2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
doxygen用にコメント修正。関数のstatic指定を外す
[YACASL2.git]
/
src
/
cmd.c
diff --git
a/src/cmd.c
b/src/cmd.c
index
67d7c2a
..
fc5da13
100644
(file)
--- a/
src/cmd.c
+++ b/
src/cmd.c
@@
-1,6
+1,14
@@
-#include "casl2.h"
-
-CMD comet2cmd[] = {
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include "hash.h"
+#include "struct.h"
+#include "cmem.h"
+
+/**
+ * 機械語命令のリスト
+ */
+static CMD comet2cmd[] = {
{ "NOP", NONE, 0x0 },
{ "LD", R_ADR_X_, 0x1000 },
{ "ST", R_ADR_X, 0x1100 },
{ "NOP", NONE, 0x0 },
{ "LD", R_ADR_X_, 0x1000 },
{ "ST", R_ADR_X, 0x1100 },
@@
-41,27
+49,49
@@
CMD comet2cmd[] = {
{ "RET", NONE, 0x8100 },
};
{ "RET", NONE, 0x8100 },
};
-int comet2cmdsize = ARRAYSIZE(comet2cmd);
-int cmdtabsize;
-CMDTAB **cmdtype_code, **code_type;
-
-/* 命令と命令タイプからハッシュ値を生成する */
-unsigned hash_cmdtype(const char *cmd, CMDTYPE type) {
+/**
+ * 命令コード配列のサイズ
+ */
+static int comet2cmdsize = ARRAYSIZE(comet2cmd);
+
+/**
+ * 命令表のサイズ
+ */
+static int cmdtabsize;
+
+/**
+ * ハッシュ表
+ */
+static CMDTAB **cmdtype_code, **code_type;
+
+/**
+ * 命令の名前とタイプからハッシュ値を生成する
+ */
+unsigned hash_cmdtype(const char *cmd, CMDTYPE type)
+{
HKEY *keys[2];
HKEY *keys[2];
+ unsigned hashval;
- /* 命令
をセット
*/
- keys[0] = malloc_chk(sizeof(HKEY), "hash_cmdtype.key");
+ /* 命令
名を設定
*/
+ keys[0] = malloc_chk(sizeof(HKEY), "hash_cmdtype.key
s[0]
");
keys[0]->type = CHARS;
keys[0]->type = CHARS;
- keys[0]->val.s = strdup
(cmd
);
- /* 命令タイプを
セット
*/
- keys[1] = malloc_chk(sizeof(HKEY), "hash_cmdtype.key");
+ keys[0]->val.s = strdup
_chk(cmd, "keys[0].val.s"
);
+ /* 命令タイプを
設定
*/
+ keys[1] = malloc_chk(sizeof(HKEY), "hash_cmdtype.key
s[1]
");
keys[1]->type = INT;
keys[1]->val.i = (int)(type & 070);
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 hash
val
;
}
}
-/* 命令と命令タイプがキーのハッシュ表を作成する */
+/**
+ * 名前とタイプがキーの命令ハッシュ表を作成する
+ */
bool create_cmdtype_code()
{
CMDTAB *np;
bool create_cmdtype_code()
{
CMDTAB *np;
@@
-69,7
+99,7
@@
bool create_cmdtype_code()
int i;
cmdtabsize = comet2cmdsize;
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;
}
for(i = 0; i < cmdtabsize; i++) {
*(cmdtype_code + i) = NULL;
}
@@
-87,8
+117,10
@@
bool create_cmdtype_code()
return true;
}
return true;
}
-/* 命令と命令タイプから、命令コードを取得する */
-/* 無効な場合は0xFFFFを返す */
+/**
+ * 命令の名前とタイプから、命令コードを返す
+ * 無効な場合は0xFFFFを返す
+ */
WORD getcmdcode(const char *cmd, CMDTYPE type)
{
CMDTAB *np;
WORD getcmdcode(const char *cmd, CMDTYPE type)
{
CMDTAB *np;
@@
-102,7
+134,9
@@
WORD getcmdcode(const char *cmd, CMDTYPE type)
return 0xFFFF;
}
return 0xFFFF;
}
-/* 命令と命令タイプがキーのハッシュ表を解放する */
+/**
+ * 名前とタイプがキーの命令ハッシュ表を解放する
+ */
void free_cmdtype_code()
{
int i;
void free_cmdtype_code()
{
int i;
@@
-112,19
+146,21
@@
void free_cmdtype_code()
np = cmdtype_code[i];
while(np != NULL) {
nq = np->next;
np = cmdtype_code[i];
while(np != NULL) {
nq = np->next;
- free
(np
);
+ free
_chk(np, "free_cmdtype_code.np"
);
np = nq;
}
}
np = nq;
}
}
- free
(cmdtype_code
);
+ free
_chk(cmdtype_code, "cmdtype_code"
);
}
}
-/* 命令コードからハッシュ値を生成する */
+/**
+ * 命令コードからハッシュ値を生成する
+ */
unsigned hash_code(WORD code)
{
HKEY *keys[1];
unsigned hash_code(WORD code)
{
HKEY *keys[1];
- /* 命令コードを
セット
*/
+ /* 命令コードを
設定
*/
keys[0] = malloc_chk(sizeof(HKEY), "hash_code.key");
keys[0]->type = INT;
keys[0]->val.i = (int)(code >> 8);
keys[0] = malloc_chk(sizeof(HKEY), "hash_code.key");
keys[0]->type = INT;
keys[0]->val.i = (int)(code >> 8);
@@
-132,7
+168,9
@@
unsigned hash_code(WORD code)
return hash(1, keys, cmdtabsize);
}
return hash(1, keys, cmdtabsize);
}
-/* 命令コードがキーのハッシュ表を作成する */
+/**
+ * コードがキーの命令ハッシュ表を作成する
+ */
bool create_code_type()
{
CMDTAB *np;
bool create_code_type()
{
CMDTAB *np;
@@
-140,7
+178,7
@@
bool create_code_type()
int i;
cmdtabsize = comet2cmdsize;
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;
}
for(i = 0; i < cmdtabsize; i++) {
*(code_type + i) = NULL;
}
@@
-158,8
+196,10
@@
bool create_code_type()
return true;
}
return true;
}
-/* 命令コードから命令タイプを取得する */
-/* 無効な場合はNONEを返す */
+/**
+ * 命令コードから命令タイプを返す
+ * 無効な場合はNONEを返す
+ */
CMDTYPE getcmdtype(WORD code)
{
CMDTAB *np;
CMDTYPE getcmdtype(WORD code)
{
CMDTAB *np;
@@
-171,7
+211,9
@@
CMDTYPE getcmdtype(WORD code)
return NONE;
}
return NONE;
}
-/* 命令コードがキーのハッシュ表を解放する */
+/**
+ * コードがキーの命令ハッシュ表を解放する
+ */
void free_code_type()
{
int i;
void free_code_type()
{
int i;
@@
-180,9
+222,9
@@
void free_code_type()
np = code_type[i];
while(np != NULL) {
nq = np->next;
np = code_type[i];
while(np != NULL) {
nq = np->next;
- free
(np
);
+ free
_chk(np, "np"
);
np = nq;
}
}
np = nq;
}
}
- free
(code_type
);
+ free
_chk(code_type, "code_type"
);
}
}