構造体、共用体、列挙体
struct mssHash
struct mssHashFld
struct mssHashNode
struct mssHashNodeFld
0001: /**
0002: * # CHAPTER #
0003: * ============================================================================
0004: * MUSASHIで用いられるハッシュ関連のヘッダーファイル
0005: * ============================================================================
0006: */
0007:
0008: #include <mssHeader.h>
0009: #include <mssValue.h>
0010:
0011: #ifndef __MSSHASH_H
0012: #define __MSSHASH_H 1
0013:
0014: /**
0015: * # STRUCT #
0016: * 項目ハッシュの値を収める構造体
0017: * 項目-行のchar **pntへのポインタをハッシュテーブルに収める
0018: *
0019: * [0] [1] [2] [3] ...[HashValFld-1]->HashValFldに従ったHashValFld個の
0020: * ハッシュ配列
0021: * hn ->rec : [0]
0022: * hn->next*1 ->rec : [0][1][2][3] ---->ここに各レコードの先頭項目アドレス
0023: * hn->next*2 ->rec : [0]
0024: * :
0025: * hn->next*n ->rec : [0][1]
0026: *
0027: * 各ハッシュのバケットはhn->nextでHashNodeFldのリスト構造をとり、同一のhash値
0028: * を持つキーが連結されている。
0029: * ex) hn : キーがA, hn->next : キーがZ, hn->next->next : キーが001など
0030: * リスト終端はhn->rec==NULLで見分けている。
0031: * ここまでで、同一hash値をもつリスト化された各HashNodeFld構造体は、一つのキーに
0032: * 対応していることになる。
0033: * 次に、同一キー値を持ったレコードが複数存在する可能性がある。
0034: * それをhn->recにreallocで動的に領域を確保し、そこにそのレコードの先頭項目
0035: * のアドレスをセットしている。hn->recCntにはその件数が保存される。
0036: */
0037: struct mssHashNodeFld {
0038: char ***rec;
0039: int recCnt;
0040: struct mssHashNodeFld *next;
0041: int endFlg; /*joinで使う。hashSearchFldされた時にセットされる。
0042: traNullを認めるouterJoinで、このフラグが立っていない
0043: レコードを書き出すことになる。*/
0044: };
0045:
0046: /**
0047: * # STRUCT #
0048: * 項目ハッシュの構造体
0049: */
0050: struct mssHashFld {
0051: int hashVal;
0052: struct mssHashNodeFld **node;
0053: struct mssFields *flds;
0054: int fldCnt;
0055: int keyCnt; /*キーの値が何種類あったか==中味のあるHashNodeFldの数に等しい
0056: hashInsertFldでカウントアップされる。*/
0057: int endCnt; /*hashSearchFldされる度にカウントアップされる変数
0058: join処理で、マスタEndを判定させるために利用
0059: endCnt==keyCntで全てサーチされたこととみなす*/
0060: };
0061:
0062: /**
0063: * # STRUCT #
0064: * 汎用ハッシュの値を収める構造体
0065: */
0066: struct mssHashNode {
0067: char *str;
0068: MssValue val;
0069: struct mssHashNode *next;
0070: };
0071:
0072: /**
0073: * # STRUCT #
0074: * 汎用ハッシュ構造体
0075: */
0076: struct mssHash {
0077: int hashVal;
0078: int cnt; /*挿入された値の数*/
0079: struct mssHashNode **node; /*挿入された値へのポインタ*/
0080: };
0081:
0082: /**
0083: * # PROTOTYPE #
0084: */
0085: struct mssHashFld * mssInitHashFld( int size, struct mssFields *flds);
0086: void mssFreeHashFld(struct mssHashFld *hash);
0087: void mssHashInsertFld(struct mssHashFld *hash, char **str);
0088: struct mssHashNodeFld * mssHashMemberFld(struct mssHashFld *hash,char **str, struct mssFields *flds);
0089: void mssShowHashFld(struct mssHashFld *hash, int fldCnt);
0090: struct mssHash * mssInitHash(int size);
0091: void mssFreeHash(struct mssHash *hash);
0092: int mssHashInsert(struct mssHash *hash, char *str, MssValue val);
0093: struct mssHashNode * mssHashInsertAdd(struct mssHash *hash, char *str, MssValue val);
0094: struct mssHashNode * mssHashInsertAddNull(struct mssHash *hash, char *str, MssValue val);
0095: struct mssHashNode * mssHashMember(struct mssHash *hash, char *str);
0096: char * mssHashMemberAdd(struct mssHash *hash, char *str);
0097: MssValue mssHashMemberVal(struct mssHash *hash, char *str);
0098: void mssShowHash(struct mssHash *hash);
0099:
0100: #endif