projects
/
YACASL2.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
21b0a34
)
命令ハッシュ表を2次元配列に
author
j8takagi
<j8takagi@nifty.com>
Sat, 18 Aug 2018 08:58:51 +0000
(17:58 +0900)
committer
j8takagi
<j8takagi@nifty.com>
Sat, 18 Aug 2018 08:58:51 +0000
(17:58 +0900)
include/struct.h
patch
|
blob
|
history
src/struct.c
patch
|
blob
|
history
diff --git
a/include/struct.h
b/include/struct.h
index
8f69f20
..
ffc448e
100644
(file)
--- a/
include/struct.h
+++ b/
include/struct.h
@@
-57,8
+57,9
@@
extern SYSTEM *sys;
* 命令ハッシュ表のハッシュの種類
*/
typedef enum {
* 命令ハッシュ表のハッシュの種類
*/
typedef enum {
- HASH_CMDTYPE = 0,
- HASH_CODE = 1,
+ HASH_CMDTYPE,
+ HASH_CODE,
+ HASH_MAX,
} CMDTAB_HASH;
/**
} CMDTAB_HASH;
/**
@@
-161,21
+162,16
@@
void shutdown();
*/
bool create_cmdtable(CMDTAB_HASH hash);
*/
bool create_cmdtable(CMDTAB_HASH hash);
-/**
- * 命令の名前とタイプから、命令コードを返す
- * 無効な場合は0xFFFFを返す
- */
-WORD getcmdcode(const char *cmd, CMDTYPE type);
-
/**
* 命令ハッシュ表を解放する
*/
/**
* 命令ハッシュ表を解放する
*/
-void free_cmdtable();
+void free_cmdtable(
CMDTAB_HASH hash
);
/**
/**
- * コードがキーの命令ハッシュ表を作成する
+ * 命令の名前とタイプから、命令コードを返す
+ * 無効な場合は0xFFFFを返す
*/
*/
-
bool create_code_cmdtype(
);
+
WORD getcmdcode(const char *cmd, CMDTYPE type
);
/**
* 命令コードから命令の関数ポインタを返す
/**
* 命令コードから命令の関数ポインタを返す
diff --git
a/src/struct.c
b/src/struct.c
index
3fb9a30
..
f6d4128
100644
(file)
--- a/
src/struct.c
+++ b/
src/struct.c
@@
-70,7
+70,7
@@
enum {
/**
* ハッシュ表
*/
/**
* ハッシュ表
*/
-static CMDTAB *cmdt
ype_code[CMDTABSIZE], *code_cmdtype
[CMDTABSIZE];
+static CMDTAB *cmdt
ab[HASH_MAX]
[CMDTABSIZE];
/**
* 命令の名前とタイプからハッシュ値を生成する
/**
* 命令の名前とタイプからハッシュ値を生成する
@@
-121,17
+121,32
@@
bool create_cmdtable(CMDTAB_HASH hash)
p->cmd = &comet2cmd[i];
if(hash == HASH_CMDTYPE) {
hashval = hash_cmdtype(comet2cmd[i].name, comet2cmd[i].type);
p->cmd = &comet2cmd[i];
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);
} else if(hash == HASH_CODE) {
hashval = hash_code((&comet2cmd[i])->code);
- p->next = code_cmdtype[hashval];
- code_cmdtype[hashval] = p;
}
}
+ p->next = cmdtab[hash][hashval];
+ cmdtab[hash][hashval] = p;
}
return true;
}
}
return true;
}
+/**
+ * 命令ハッシュ表を解放する
+ */
+void free_cmdtable(CMDTAB_HASH hash)
+{
+ int i;
+ CMDTAB *p, *q;
+
+ for(i = 0; i < CMDTABSIZE; i++) {
+ for(p = cmdtab[hash][i]; p != NULL; p = q) {
+ q = p->next;
+ cmdtab[hash][i] = NULL;
+ FREE(p);
+ }
+ }
+}
+
/**
* 命令の名前とタイプから、命令コードを返す\n
* 無効な場合は0xFFFFを返す
/**
* 命令の名前とタイプから、命令コードを返す\n
* 無効な場合は0xFFFFを返す
@@
-142,7
+157,7
@@
WORD getcmdcode(const char *cmd, CMDTYPE type)
WORD w = 0xFFFF;
assert(cmd != NULL);
WORD w = 0xFFFF;
assert(cmd != NULL);
- for(p = cmdt
ype_code
[hash_cmdtype(cmd, type)]; p != NULL; p = p->next) {
+ for(p = cmdt
ab[HASH_CMDTYPE]
[hash_cmdtype(cmd, type)]; p != NULL; p = p->next) {
if(strcmp(cmd, p->cmd->name) == 0 && type == p->cmd->type) {
w = p->cmd->code;
break;
if(strcmp(cmd, p->cmd->name) == 0 && type == p->cmd->type) {
w = p->cmd->code;
break;
@@
-151,32
+166,6
@@
WORD getcmdcode(const char *cmd, CMDTYPE type)
return w;
}
return w;
}
-/**
- * 命令ハッシュ表を解放する
- */
-void free_cmdtable(CMDTAB_HASH hash)
-{
- int i;
- CMDTAB *p, *q;
-
- for(i = 0; i < CMDTABSIZE; i++) {
- 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);
- }
- }
-}
-
/**
* 命令コードからハッシュ値を生成する
*/
/**
* 命令コードからハッシュ値を生成する
*/
@@
-202,7
+191,7
@@
const void (*getcmdptr(WORD code))
CMDTAB *t;
const void *ptr = NULL;
CMDTAB *t;
const void *ptr = NULL;
- for(t = c
ode_cmdtype
[hash_code(code)]; t != NULL; t = t->next) {
+ for(t = c
mdtab[HASH_CODE]
[hash_code(code)]; t != NULL; t = t->next) {
if(code == t->cmd->code) {
ptr = t->cmd->ptr;
break;
if(code == t->cmd->code) {
ptr = t->cmd->ptr;
break;
@@
-219,7
+208,7
@@
CMDTYPE getcmdtype(WORD code)
CMDTAB *t;
CMDTYPE type = NONE;
CMDTAB *t;
CMDTYPE type = NONE;
- for(t = c
ode_cmdtype
[hash_code(code)]; t != NULL; t = t->next) {
+ for(t = c
mdtab[HASH_CODE]
[hash_code(code)]; t != NULL; t = t->next) {
if(code == t->cmd->code) {
type = t->cmd->type;
break;
if(code == t->cmd->code) {
type = t->cmd->type;
break;
@@
-236,7
+225,7
@@
char *getcmdname(WORD code)
CMDTAB *t;
char *cmd = NULL;
CMDTAB *t;
char *cmd = NULL;
- for(t = c
ode_cmdtype
[hash_code(code)]; t != NULL; t = t->next) {
+ for(t = c
mdtab[HASH_CODE]
[hash_code(code)]; t != NULL; t = t->next) {
if(code == t->cmd->code) {
cmd = t->cmd->name;
break;
if(code == t->cmd->code) {
cmd = t->cmd->name;
break;