#if !defined(AFX_DICTIONARY_H__80E88BC1_784E_4C96_868B_D7CD66DD6725__INCLUDED_)
#define AFX_DICTIONARY_H__80E88BC1_784E_4C96_868B_D7CD66DD6725__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif
#define CC_NUM 6768
#define WORD_MAXLENGTH 100
#define WT_DELIMITER 0
#define WT_CHINESE 1
#define WT_OTHER 2
#define CC_ID(c1,c2) ((unsigned char)(c1)-176)*94+((unsigned char)(c2)-161)
#define CC_CHAR1(id) (id)/94+176
#define CC_CHAR2(id) (id)%94+161
struct tagWordResult{
char sWord[WORD_MAXLENGTH];
int nHandle;
double dValue;
};
typedef struct tagWordResult WORD_RESULT,*PWORD_RESULT;
struct tagWordItem{
int nWordLen;
char *sWord;
int nHandle;
int nFrequency;
};
typedef struct tagWordItem WORD_ITEM,*PWORD_ITEM;
struct tagIndexTable{
int nCount;
PWORD_ITEM pWordItemHead;
};
typedef struct tagIndexTable INDEX_TABLE;
struct tagWordChain{
WORD_ITEM data;
struct tagWordChain *next;
};
typedef struct tagWordChain WORD_CHAIN,*PWORD_CHAIN;
struct tagModifyTable{
int nCount;
int nDelete;
PWORD_CHAIN pWordItemHead;
};
typedef struct tagModifyTable MODIFY_TABLE,*PMODIFY_TABLE;
class CDictionary
{
public:
bool Output(char *sFilename);
int GetFrequency(char *sWord, int nHandle);
bool GetPOSString(int nPOS,char *sPOSRet);
int GetPOSValue(char *sPOS);
bool GetMaxMatch(char *sWord, char *sWordRet, int *npHandleRet);
bool MergePOS(int nHandle);
bool GetHandle(char *sWord,int *pnCount,int *pnHandle,int *pnFrequency);
bool IsExist(char *sWord,int nHandle);
bool AddItem(char *sWord,int nHandle,int nFrequency=0);
bool DelItem(char *sWord,int nHandle);
bool Save(char *sFilename);
bool Load(char *sFilename,bool bReset=false);
int GetWordType(char *sWord);
bool PreProcessing(char *sWord,int *nId,char *sWordRet,bool bAdd=false);
CDictionary();
virtual ~CDictionary();
INDEX_TABLE m_IndexTable[CC_NUM];
PMODIFY_TABLE m_pModifyTable;
protected:
bool DelModified();
bool FindInOriginalTable(int nInnerCode,char *sWord,int nHandle,int *nPosRet=0);
bool FindInModifyTable(int nInnerCode,char *sWord,int nHandle,PWORD_CHAIN *pFindRet=0);
};
#endif