projects
/
YACASL2.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ソースの修正
[YACASL2.git]
/
src
/
cmd.c
diff --git
a/src/cmd.c
b/src/cmd.c
index
fb9ae6f
..
f393c9a
100644
(file)
--- a/
src/cmd.c
+++ b/
src/cmd.c
@@
-55,7
+55,7
@@
static CMD comet2cmd[] = {
static int comet2cmdsize = ARRAYSIZE(comet2cmd);
/**
static int comet2cmdsize = ARRAYSIZE(comet2cmd);
/**
- *
命令
表のサイズ
+ *
ハッシュ
表のサイズ
*/
static int cmdtabsize;
*/
static int cmdtabsize;
@@
-73,18
+73,18
@@
unsigned hash_cmdtype(const char *cmd, CMDTYPE type)
unsigned hashval;
/* 命令名を設定 */
unsigned hashval;
/* 命令名を設定 */
- keys[0] = malloc_chk(sizeof(HKEY), "hash_cmdtype.keys[0]");
+ keys[0] = malloc_chk(sizeof(HKEY
*
), "hash_cmdtype.keys[0]");
keys[0]->type = CHARS;
keys[0]->val.s = strdup_chk(cmd, "keys[0].val.s");
/* 命令タイプを設定 */
keys[0]->type = CHARS;
keys[0]->val.s = strdup_chk(cmd, "keys[0].val.s");
/* 命令タイプを設定 */
- keys[1] = malloc_chk(sizeof(HKEY), "hash_cmdtype.keys[1]");
+ 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);
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]"
);
+
FREE(keys[0]->val.s
);
+
FREE(keys[0]
);
+
FREE(keys[1]
);
/* ハッシュ値を返す */
return hashval;
}
/* ハッシュ値を返す */
return hashval;
}
@@
-98,12
+98,12
@@
bool create_cmdtype_code()
unsigned hashval;
int i;
unsigned hashval;
int i;
- cmdtabsize = comet2cmdsize;
+ cmdtabsize = comet2cmdsize;
/* ハッシュ表のサイズ */
cmdtype_code = calloc_chk(cmdtabsize, sizeof(CMDTAB *), "cmdtype_code");
for(i = 0; i < comet2cmdsize; i++) {
cmdtype_code = calloc_chk(cmdtabsize, sizeof(CMDTAB *), "cmdtype_code");
for(i = 0; i < comet2cmdsize; i++) {
- p = malloc_chk(sizeof(CMDTAB
), "
cmdtype_code.p");
+ p = malloc_chk(sizeof(CMDTAB
*), "create_
cmdtype_code.p");
hashval = hash_cmdtype(comet2cmd[i].name, comet2cmd[i].type); /* ハッシュ値の生成 */
hashval = hash_cmdtype(comet2cmd[i].name, comet2cmd[i].type); /* ハッシュ値の生成 */
- p->next = cmdtype_code[hashval]; /* ハッシュ表に値を追加 */
+ p->next = cmdtype_code[hashval];
/* ハッシュ表に値を追加 */
p->cmd = &comet2cmd[i];
cmdtype_code[hashval] = p;
}
p->cmd = &comet2cmd[i];
cmdtype_code[hashval] = p;
}
@@
-117,14
+117,16
@@
bool create_cmdtype_code()
WORD getcmdcode(const char *cmd, CMDTYPE type)
{
CMDTAB *p;
WORD getcmdcode(const char *cmd, CMDTYPE type)
{
CMDTAB *p;
+ WORD w = 0xFFFF;
assert(cmd != NULL);
assert(cmd != NULL);
- for(p = cmdtype_code[hash_cmdtype(cmd, type)]; p != NULL; p = p->next){
+ for(p = cmdtype_code[hash_cmdtype(cmd, type)]; p != NULL; p = p->next)
{
if(strcmp(cmd, p->cmd->name) == 0 && type == p->cmd->type) {
if(strcmp(cmd, p->cmd->name) == 0 && type == p->cmd->type) {
- return p->cmd->code;
+ w = p->cmd->code;
+ break;
}
}
}
}
- return
0xFFFF
;
+ return
w
;
}
/**
}
/**
@@
-138,10
+140,9
@@
void free_cmdtype_code()
for(i = 0; i < cmdtabsize; i++) {
for(p = cmdtype_code[i]; p != NULL; p = q) {
q = p->next;
for(i = 0; i < cmdtabsize; i++) {
for(p = cmdtype_code[i]; p != NULL; p = q) {
q = p->next;
-
free_chk(p, "free_cmdtype_code.p"
);
+
FREE(p
);
}
}
}
}
- free_chk(cmdtype_code, "cmdtype_code");
}
/**
}
/**
@@
-150,13
+151,15
@@
void free_cmdtype_code()
unsigned hash_code(WORD code)
{
HKEY *keys[1];
unsigned hash_code(WORD code)
{
HKEY *keys[1];
+ unsigned h;
/* 命令コードを設定 */
/* 命令コードを設定 */
- keys[0] = malloc_chk(sizeof(HKEY), "hash_code.key");
+ keys[0] = malloc_chk(sizeof(HKEY
*
), "hash_code.key");
keys[0]->type = INT;
keys[0]->val.i = (int)(code >> 8);
keys[0]->type = INT;
keys[0]->val.i = (int)(code >> 8);
- /* ハッシュ値を返す */
- return hash(1, keys, cmdtabsize);
+ h = hash(1, keys, cmdtabsize);
+ FREE(keys[0]);
+ return h;
}
/**
}
/**
@@
-168,12
+171,12
@@
bool create_code_type()
unsigned hashval;
int i;
unsigned hashval;
int i;
- cmdtabsize = comet2cmdsize;
- code_type = calloc_chk(c
mdtab
size, sizeof(CMDTAB *), "code_type");
+ cmdtabsize = comet2cmdsize;
/* ハッシュ表のサイズ */
+ code_type = calloc_chk(c
omet2cmd
size, sizeof(CMDTAB *), "code_type");
for(i = 0; i < comet2cmdsize; i++) {
for(i = 0; i < comet2cmdsize; i++) {
- p = malloc_chk(sizeof(CMDTAB), "code_type.p");
+ p = malloc_chk(sizeof(CMDTAB
*
), "code_type.p");
hashval = hash_code((&comet2cmd[i])->code); /* ハッシュ値の生成 */
hashval = hash_code((&comet2cmd[i])->code); /* ハッシュ値の生成 */
- p->next = code_type[hashval]; /* ハッシュ表に値を追加 */
+ p->next = code_type[hashval];
/* ハッシュ表に値を追加 */
p->cmd = &comet2cmd[i];
code_type[hashval] = p;
}
p->cmd = &comet2cmd[i];
code_type[hashval] = p;
}
@@
-187,12
+190,15
@@
bool create_code_type()
CMDTYPE getcmdtype(WORD code)
{
CMDTAB *p;
CMDTYPE getcmdtype(WORD code)
{
CMDTAB *p;
+ CMDTYPE t = NOTCMD;
+
for(p = code_type[hash_code(code)]; p != NULL; p = p->next) {
if(code == p->cmd->code) {
for(p = code_type[hash_code(code)]; p != NULL; p = p->next) {
if(code == p->cmd->code) {
- return p->cmd->type;
+ t = p->cmd->type;
+ break;
}
}
}
}
- return
NOTCMD
;
+ return
t
;
}
/**
}
/**
@@
-203,12
+209,9
@@
void free_code_type()
int i;
CMDTAB *p, *q;
for(i = 0; i < cmdtabsize; i++) {
int i;
CMDTAB *p, *q;
for(i = 0; i < cmdtabsize; i++) {
- p = code_type[i];
- while(p != NULL) {
+ for(p = code_type[i]; p != NULL; p = q) {
q = p->next;
q = p->next;
- free_chk(p, "code_type.p");
- p = q;
+ FREE(p);
}
}
}
}
- free_chk(code_type, "code_type");
}
}