// PDicReader.h: CPDicReader クラスのインターフェイス // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_PDICREADER_H__F5DE7F34_1AE8_476A_8242_191AD454ED29__INCLUDED_) #define AFX_PDICREADER_H__F5DE7F34_1AE8_476A_8242_191AD454ED29__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "../BOCU1/bocu1.h" #define EXCEPTION_CODE 0xE0000001 #define LTWOBYTEUINT(b) ((((unsigned int)*((b)+0))<<0)+ (((unsigned int)*((b)+1))<<8)) #define LFOURBYTEUINT(b) \ ( (((unsigned int)*((b)+0))<<0 ) \ + (((unsigned int)*((b)+1))<<8 ) \ + (((unsigned int)*((b)+2))<<16 ) \ + (((unsigned int)*((b)+3))<<24 )) typedef unsigned char byte; //#define PDIC_MAX_TITLE 248 // 見出し最大長 #define PDIC_MAX_TITLE 1024 // 見出し最大長 #define PDIC_MAX_HONBUN 3000 // 訳語最大長 #define PDIC_MAX_YOREI 20000 // 用例最大長 #define PDIC_MAX_PHONETIC 1000 // 発音記号最大長 #define PDIC_MAX_HEADER_LEN 1024 // 最大ヘッダ長(共通) #define PDIC_MAX_BLKLEN 1024 // 最大ブロック長(Hyper辞書形式の場合) #define PDIC_HEADER_256 256 // ヘッダ長(共通) //#define PDIC_HEADER_LEN 256 // ヘッダ長(共通) //#define PDIC_BLKLEN 256 // ブロック長(Hyper辞書形式の場合) ////////////////////////////////////////////////////////////////////// // PDIC ヘッダ ////////////////////////////////////////////////////////////////////// /* このプログラムでは、NEWDIC3(Hyper辞書形式)だけをサポートする */ // NEWDIC2 #define L_HEADERNAME 100 // ヘッダー部文字列長 #define L_DICTITLE 40 // 辞書タイトル名長 struct NEWDIC2 { char headername[ L_HEADERNAME ]; // 辞書ヘッダータイトル char dictitle[ L_DICTITLE ]; // 辞書名 short version; // 辞書のバージョン short lword; // 見出語の最大長 short ljapa; // 訳語の最大長 short block_size; // 1ブロックのバイト数 // NEWDIC2 の場合は、/16 short index_block; // インデックスブロック数 short header_size; // ヘッダーのバイト数 unsigned short index_size; // インデックスのバイト数 short empty_block; // 空きブロックの先頭物理ブロック番号(ないときは-1) short nindex; // インデックスの要素の数 short nblock; // 使用データブロック数 unsigned long nword; // 登録単語数 byte dicorder; // 辞書の順番 byte dictype; // 辞書の種別 byte attrlen; // 単語属性の長さ //#ifdef NEWDIC2 long olenumber; // OLE 用シリアル番号 byte os; // OS // 以下の言語ID は未決定 unsigned short lid_word; // 見出語言語ID unsigned short lid_japa; // 訳語部言語ID unsigned short lid_exp; // 用例部言語ID unsigned short lid_pron; // 発音記号言語ID unsigned short lid_other; // その他言語ID // char dummy[ 84 ]; // 言語ID を使用しないときのdummy char dummy[ 74 ]; // 言語ID を使用したときのdummy //#else // char dummy[ 89 ]; //#endif }; // NEWDIC3 4.00 struct NEWDIC3_4 { char headername[ L_HEADERNAME ]; // 辞書ヘッダータイトル char dictitle[ L_DICTITLE ]; // 辞書名 short version; // 辞書のバージョン short lword; // 見出語の最大長 short ljapa; // 訳語の最大長 short block_size; // 1ブロックのバイト数(256 固定) short index_block; // インデックスブロック数 short header_size; // ヘッダーのバイト数 unsigned short index_size; // インデックスのバイト数(未使用) short empty_block; // 空きブロックの先頭物理ブロック番号(ないときは-1) short nindex; // インデックスの要素の数(未使用) short nblock; // 使用データブロック数(未使用) unsigned long nword; // 登録単語数 byte dicorder; // 辞書の順番 byte dictype; // 辞書の種別 byte attrlen; // 単語属性の長さ long olenumber; // OLE 用シリアル番号 byte os; // OS unsigned short lid_word; // 見出語言語ID unsigned short lid_japa; // 訳語部言語ID unsigned short lid_exp; // 用例部言語ID unsigned short lid_pron; // 発音記号言語ID unsigned short lid_other; // その他言語ID unsigned long extheader; // 拡張ヘッダーサイズ long empty_block2; // 空きブロック先頭物理ブロック番号 long nindex2; // インデックス要素の数 long nblock2; // 使用データブロック数 byte index_blkbit; // 0:16bit, 1:32bit byte reserved[8+1]; unsigned long update_count; // 辞書更新回数 byte charcode; // 文字コード char dummy[ 43 ]; // パディング }; // NEWDIC3 5.00 struct NEWDIC3_5 { char headername[ L_HEADERNAME ]; // 辞書ヘッダータイトル char dictitle[ L_DICTITLE ]; // 辞書名 short version; // 辞書のバージョン short lword; // 見出語の最大長 short ljapa; // 訳語の最大長 short block_size; // 1ブロックのバイト数(256 固定) short index_block; // インデックスブロック数 short header_size; // ヘッダーのバイト数 unsigned short index_size; // インデックスのバイト数(未使用) short empty_block; // 空きブロックの先頭物理ブロック番号(ないときは-1) short nindex; // インデックスの要素の数(未使用) short nblock; // 使用データブロック数(未使用) unsigned long nword; // 登録単語数 byte dicorder; // 辞書の順番 /* Dicorder byte ------------------ 0 コード順 1 大文字・小文字同一視順 2 辞書順 拡張ヘッダー部にCodeMap 3 降順 */ byte dictype; // 辞書の種別 /* 0x01 AR 方式の圧縮を利用する 0x08 BOCU-1 方式の圧縮を利用(Unicode 使用時のみ) 0x10 Unicode(UTF-16)を使用している 0x20 多国語辞書(いずれ削除) 0x40 辞書をオープンするにはパスワードが必要 (辞書データそのものを暗号化するわけではない) 0x80 ツリービューモード用の辞書 */ byte attrlen; // 単語属性の長さ byte os; // OS /* Unicode は必ず0x00* os byte ------------------ 0x00 DOS,Windows,OS/2(x86 系), 改行はCR,LF 0x01 Mac 0x02 UNIX - SJIS 系 0x03 UNIX - EUC 系 0x04 UNIX - JIS 系 0x20 BOCU encoding */ long olenumber; // OLE 用シリアル番号 unsigned short lid_word; // 見出語言語ID unsigned short lid_japa; // 訳語部言語ID unsigned short lid_exp; // 用例部言語ID unsigned short lid_pron; // 発音記号言語ID unsigned short lid_other; // その他言語ID byte index_blkbit; // インデックス部の物理ブロック番号のビット数(0:16bit,1:32bit) byte dummy0; unsigned long extheader; // 拡張ヘッダーサイズ long empty_block2; // 空きブロック先頭物理ブロック番号 long nindex2; // インデックス要素の数 long nblock2; // 使用データブロック数 byte reserved[8]; unsigned long update_count; // 辞書更新回数 byte dummy00[4]; byte dicident[8]; // 辞書識別子 char dummy[ 32 ]; // パディング }; ////////////////////////////////////////////////////////////////////// // PDIC インデックス部 ////////////////////////////////////////////////////////////////////// typedef struct { unsigned long offs; // インデックス先頭からのオフセット 0.. unsigned long blkno; // データブロック番号 unsigned short titlelen; // 見出し長 } PDIC_INDEX; class CPDicIndex { NEWDIC3_5 *m_header; int m_pdic_ver; // PDIC辞書のバージョン番号 PDIC_INDEX *m_indexTbl; unsigned long m_maxIndex; // m_indexTbl[]の割当個数 public: CPDicIndex( FILE*fp, NEWDIC3_5 *header); virtual ~CPDicIndex(); int LoadIndex(); int BSearchIndex( LPCTSTR keyword ); int ReadRec( unsigned long idxno, unsigned long *datablk, byte*title, int *titlelen ); FILE* m_fp; }; ////////////////////////////////////////////////////////////////////// // PDIC データ部 ////////////////////////////////////////////////////////////////////// typedef struct { unsigned long indexno; // インデックス番号 unsigned long blkno; // データ部の物理ブロック番号(連続ブロックの先頭) unsigned long recOffs; // この項目のブロック先頭からのオフセット unsigned long toffs; // 連続ブロック内の先頭からの見出し語オフセット(ただし圧縮されている) unsigned long hoffs; // 連続ブロック内の先頭からの訳語オフセット unsigned long yoffs; // 連続ブロック内の先頭からの用例部オフセット unsigned long poffs; // 連続ブロック内の先頭からの発音記号オフセット unsigned short titlelen; // 見出しの長さ unsigned short honbunlen; // 訳語の長さ unsigned short yoreilen; // 用例部の長さ unsigned short phoneticlen; // 発音記号の長さ short level; // 単語レベル short fieldSize; // 2 or 4 int blocks; // 使用ブロック数 } PDIC_ITEMINFO; class CPDicData { NEWDIC3_5 *m_header; int m_pdic_ver; // PDIC辞書のバージョン番号 byte m_buffer[PDIC_MAX_BLKLEN]; // 現在のブロックの内容 unsigned long m_curBlk; // 現在のブロック番号 int m_recOffs; // ブロック内の現在位置(m_blkbufの先頭からのオフセット) int m_fieldSize; // 2 or 4 int m_blocks; // 使用ブロック数 int m_maxblocks; // 割り当て中のブロック個数 byte* m_blkbuf; // 連続ブロックを保持するバッファ m_maxblocks*256 #if defined(UNICODE) TCHAR m_lastTitle[PDIC_MAX_TITLE+1]; // 直前の見出し語(見出し語は248文字以内) #else byte m_lastTitle[PDIC_MAX_TITLE+1]; // 直前の見出し語(見出し語は248バイト以内) #endif public: CPDicData(FILE*fp,NEWDIC3_5 *header); virtual ~CPDicData(); int ReadBlks( unsigned long blkno ); int ReadRec( byte* title, // 見出しの読出領域 int *titlelen, // titleの長さ int *hoffs, // 訳語の開始オフセット(連続ブロック内での) int *honbunlen, // 訳語の長さ int *yoffs, // 用例の開始オフセット(連続ブロック内での) int *yoreilen, // 用例の長さ(無いときは0) int *poffs, // 発音の開始オフセット(連続ブロック内での) int *phoneticlen, // 発音の長さ(無いときは0) int *level, // 単語レベル PDIC_ITEMINFO *pInfo = NULL ); byte*GetBuffer(); // 現在の連続ブロックのバッファ unsigned long GetOffs(); // 現在の連続ブロック先頭からのオフセット unsigned long GetBlkNo(); // 現在の連続ブロック先頭番号 FILE* m_fp; private: int ReadBlk( unsigned long blkno ); }; ////////////////////////////////////////////////////////////////////// // PDIC reader クラス ////////////////////////////////////////////////////////////////////// // 検索一致情報 /* 検討中 ランダムアクセスの場合、見出し語を直前文字列との差分で見るのがネック デコードは必ず連続ブロック毎に行うしかない 1連続ブロックから表に展開 */ typedef struct { unsigned long indexno; // インデックス番号(前後のデータブロックを読むために) unsigned long blkno; // データ部の物理ブロック番号(連続ブロックの先頭) unsigned long recOffs; // この項目のブロック先頭からのオフセット unsigned long titleoffs; // 見出し語プールの先頭からのオフセット unsigned long hoffs; // 連続ブロック内の先頭からの訳語オフセット unsigned long yoffs; // 連続ブロック内の先頭からの用例部オフセット unsigned long poffs; // 連続ブロック内の先頭からの発音記号オフセット unsigned short titlelen; // 見出しの長さ unsigned short honbunlen; // 訳語の長さ unsigned short yoreilen; // 用例部の長さ unsigned short phoneticlen; // 発音記号の長さ short level; // 単語レベル // unsigned short num; // ブロック内のデータ番号0.. ReadRandom()で使用 } PDIC_HITENT; #define MAX_PDIC_HITENT 1024 #define MAX_PDIC_POOL (16*1024) // 全文検索で使用するフラグ #define PDIC_S_TITLE 0x01 #define PDIC_S_HONBUN 0x02 #define PDIC_S_YOREI 0x04 class CPDicReader { FILE* m_fp; NEWDIC3_5 m_header; // PDIC辞書のヘッダ情報(Ver5形式) int m_pdic_ver; // PDIC辞書のバージョン番号 unsigned long m_seq_idxno; // インデックス順読込時の現在のインデックス番号 unsigned long m_seq_datablk; // インデックス順読込時の現在のデータブロック // 連続ブロックの先頭 // 検索構造 PDIC_HITENT *m_hitent; // 検索一致結果を格納する配列 unsigned long m_numhit; // 最終の検索のヒット数 unsigned long m_max_hitent; // m_hitent[]の割当サイズ byte*m_title_pool; // 検索に一致した見出し語のプール領域 // 見出し語は圧縮されているので、伸張結果を保存するため unsigned long m_max_title_pool; // m_title_poolの割当サイズ unsigned long m_title_len; // m_title_poolの最終書込位置 CPDicIndex*m_pIndex; CPDicData*m_pData; int m_bOpened; // open済か public: CPDicReader(); virtual ~CPDicReader(); int Open( LPCTSTR pszFilePath ); void Close(); int ReOpen( LPCTSTR pszFilePath ); // ファイルハンドルのみ再open // 順検索 int FindFirst(); // 先頭項目に位置付ける int ReadNext( LPTSTR keyword, int maxtitle, LPTSTR honbun,int maxhonbun, LPTSTR yorei,int maxyorei, LPTSTR phonetic,int maxphonetic,int*level, unsigned short (*phoneticUniMap)[256][2] , PDIC_ITEMINFO *pInfo ); // 次の項目を読む // キーワード検索 int SearchAbs( unsigned long idxno ); // インデックス番号指定 int SearchWord( LPCTSTR keyword, int bExact,int maxHit, int *over); // 検索 int ReadResult( int num, LPTSTR keyword, int maxtitle, LPTSTR honbun,int maxhonbun, LPTSTR yorei,int maxyorei, LPTSTR phonetic,int maxphonetic,int*level, unsigned short (*phoneticUniMap)[256][2] ); // num番目の検索結果を取得 int ReadResultEnt( PDIC_HITENT*pHitent,byte*m_title_pool, LPTSTR keyword, int maxtitle, LPTSTR honbun,int maxhonbun, LPTSTR yorei,int maxyorei, LPTSTR phonetic,int maxphonetic,int*level, unsigned short (*phoneticUniMap)[256][2] ); int GetHitEnt( PDIC_HITENT **hit_list, int *numhit ); int GetHitCount(); // 検索一致個数を返す void ClearHitEnt(); // 検索一致情報をクリア byte* GetTextPool(); int GetMaxText(); // 全文検索 int SearchFullText( LPCTSTR keyword, int maxHit, int *over, short *bAbort, void ( *EchoCallback )(LPVOID pParam,int count, int blks, int nRead ), LPVOID pParam, int flag ); // 検索 // ランダム検索 int SeekIndex( unsigned long idxno ); unsigned long GetIndexNo(); // 現在のインデックス番号 unsigned long GetBlkNo(); // 現在のデータブロック先頭の番号 unsigned long GetOffs(); // 現在のデータブロック先頭からのオフセット NEWDIC3_5 *GetHeader(); // PDIC辞書のヘッダ情報(Ver5形式) int GetPDICVer(); // PDIC辞書のバージョン番号 void PDicDumpInfo( char*pBuf,int maxbuf, int bCRLF); #if defined(UNICODE) int MapPhoneticUni( LPCTSTR src,int slen, LPTSTR dest, int maxdest,unsigned short (*CMap)[256][2] ); int MapPhoneticUni( byte* src,int slen, LPTSTR dest, int maxdest,unsigned short (*CMap)[256][2] ); #endif // int ReadRandom( int blkno, int num, LPTSTR keyword, LPTSTR honbun,int maxhonbun, // LPTSTR yorei,int maxyorei, LPTSTR phonetic,int maxphonetic,int*level ); }; #endif // !defined(AFX_PDICREADER_H__F5DE7F34_1AE8_476A_8242_191AD454ED29__INCLUDED_)