MUSASHI C source: mssHash.h


構造体、共用体、列挙体
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