

/*************************************************
 *  conv.h                                       *
 *                                               *
 *  Copyright (C) 1995-1999 Microsoft Inc.       *
 *                                               *
 *************************************************/

#ifndef __CONV_H
#define __CONV_H

#include <windows.h>
#include <windowsx.h>
#include <io.h>
#include <stdio.h>
#include <string.h>
#include "propshet.h"

//****** PlatFormID ********
#define WIN95_PRC                 0x00000001
#define WIN95_CJK                 0x00000002

//****** EncodeID **********
#define GBK_IME                   0x00000001
#define UNICODE_IME               0x00000002

//****** FileFlag **********
#define FFLG_SINGLEELEMENT                0x00000000
#define FFLG_MULTIELEMENT                 0x00000002
#define FFLG_RULE                         0x00000001
#define FFLG_NORULE                       0x00000000

//****** Number of tables ******
#define NUMTABLES                 0x00000007

//****** Version ***********
#define MBVERSION                 "1.00"

//****** Index tag *********
#define TAG_DESCRIPTION           0x00000001
#define TAG_RULE                  0x00000002
#define TAG_ENCODE                0x00000003
#define TAG_CRTWORDCODE           0x00000004
#define TAG_RECONVINDEX           0x00000005
#define TAG_BASEDICINDEX          0x00000006
#define TAG_BASEDIC               0x00000007

//****** Get code direction mode ****
#define GETCODEFORWARD            0x00000001
#define GETCODEBACKWARD                   0xffffffff

//****** define error number  *******
#define ERR_MBNAME                1001
#define ERR_FILENOTEXIST                  1002
#define ERR_FILENOTOPEN                   1003
#define ERR_OUTOFMEMORY                   1004
#define ERR_GLOBALLOCK            1005
#define ERR_IMEUSE                                1006

#define ERR_MAXCODES              1101 //error:MaxCodes over 12!
#define ERR_ELEMENT                               1102 //error:MaxElement above MaxCodes!
#define ERR_USEDCODE              1103 //error:not in {'0'~'9','a'~'z',...}
#define ERR_WILDCHAR              1104 //error:WildChar in {UsedCode} !
#define ERR_DESCRIPTSEG                   1105
#define ERR_OVERWRITE             1106
#define ERR_IMENAMEENTRY          1107
#define ERR_MAXCODESENTRY         1108
#define ERR_ELEMENTENTRY          1109
#define ERR_USEDCODEENTRY         1110
#define ERR_NUMRULEENTRY          1111

#define ERR_RULEHEADER            1201                       
#define ERR_RULELOGICOPRA         1202                       
#define ERR_RULEWORDLEN           1203                       
#define ERR_RULEEQUAL                     1204//error:not exist '='
#define ERR_RULEDBCSPOS           1205//error:DBCS position not in {'1'~'9','a'~'f'}
#define ERR_RULECODEPOS           1206
#define ERR_RULEDIRECTMODE        1207
#define ERR_NORULE                1210 
#define ERR_NOTDEFRULE                    1211//error:not defined this length word's ruler
#define ERR_RULENUM               1212
#define ERR_RULESEG               1213
#define ERR_DUPRULE               1214        //DUPLICATE RULE 

#define ERR_DBCSCODE              1301
#define ERR_CODEUNITNOTEXIST      1302
#define ERR_CREATECODE            1303
#define ERR_CREATENOTEXIST                1304//multi-elements
#define ERR_CODEEMPTY             1305//when ruler doesnot exist
#define ERR_SINGLECODEWORDDOUBLE  1306
#define ERR_SBCS_IN_DBCS          1307
#define ERR_GB2312NOTENTIRE       1308
#define ERR_USERWORDLEN           1309        
#define ERR_WORDNOTEXIST          1310
#define ERR_TEXTSEG                               1311
#define ERR_TOOMANYUSERWORD               1312

#define ERR_WRITEID               1401
#define ERR_WRITEMAININDEX        1402
#define ERR_WRITEDESCRIPT         1403
#define ERR_WRITERULE             1404
#define ERR_READID                1411
#define ERR_READMAININDEX         1412
#define ERR_READDESCRIPT          1413
#define ERR_READRULE              1414
 
#define ERR_CONVEND                               1501
#define ERR_RECONVEND                     1502
#define ERR_SORTEND                               1503

#define ERR_VERSION               1601
#define ERR_GROUP                 1602

#define ERR                                               1
#define INFO                                      2
#define WARNING                                   3
#define GB2312WORDNUM             6763
#define NUM_OF_XGB_ENCODE         23940
#define NUM_OF_CJK_ENCODE         28528

#ifdef UNICODE
#define NUM_OF_ENCODE             NUM_OF_CJK_ENCODE
#else
#define NUM_OF_ENCODE             NUM_OF_XGB_ENCODE
#endif

//CJK Unified Ideograph subset
#define NUM_OF_CJK_CHINESE        20992

#ifdef UNICODE
#define NUMENCODEAREA                 8
#else
#define NUMENCODEAREA                 252
#endif

#define MAXNUMCODES               128
#define MAXUSEDCODES              48
#define NAMESIZE                  128
#define MAXCODELEN                12
#define MAXREADBUFFER             0x4000
#define USER_WORD_SIZE            40
#define MAX_WORD_SIZE             256
//#define ID_LENGTH                                 28
#define ID_LENGTH	sizeof(MAINID)
#define CODEMAPOFFSET                     4
#define MAXUSERWORDS                      1000
#define GMEM_PAGESIZE             0x10000

#define MbName                    "IME file"
//#define CaptionName               "ÊäÈë·¨Éú³ÉÆ÷"
#define ImeSubKey                 "System\\CurrentControlSet\\Control\\Keyboard Layouts"


#define szClassName             "IMEGEN"
#define TplName                 "\\ImeGen.tpl"
#define BmpExt                  ".BMP"
#define IconExt         ".ICO"
#define HlpExt          ".HLP"
#define ImeExt          ".IME"
#define MbExt           ".MB"
#define EmbExt          ".EMB"
#define TxtFileExt  ".TXT"
#define Slope           "\\"

#define LayoutTextKey   "layout text"
#define PreImeKey               "keyboard layout\\preload"
#define DescriptSeg             "[Description]"
#define RuleSeg                 "[Rule]"
#define TextSeg                 "[Text]"
#define TempFile                "$$$$$$$$.$$$"
#define DefVer                  "5.0"
#define DefOrgName              "Microsoft"

#define NUMPROPSHEET    5 
#define PROP_CRTIME             0
#define PROP_RECONV             1
#define PROP_SORT               2
#define PROP_CRTWORD    3
#define PROP_ABOUT              4 


typedef unsigned char UCHAR;
typedef LPTSTR  LPCREATEWORD;
typedef LPTSTR  LPRECONVINDEX;
typedef LPDWORD LPDICINDEX;
typedef LPDWORD LPNUMXYWORDS;

typedef struct tagMAINID {
    TCHAR  szVersion[4];
	DWORD dwLanguageID;
	DWORD dwEncodeID;
	DWORD dwFileFlag;
	DWORD dwNumTables;
	DWORD dwNumWords;
}  MAINID, FAR *LPMAINID;

typedef struct tagMAININDEX {
	 DWORD dwTag;
	 DWORD dwOffset;
	 DWORD dwLength;
	 DWORD dwCheckSum;   //Check if dwCheckSum=dwTag+dwOffset+dwLength
}  MAININDEX, FAR *LPMAININDEX;

typedef struct tagDESCRIPTION {
     TCHAR szName[NAMESIZE];
     WORD  wMaxCodes;
	 WORD  wNumCodes;
	 TCHAR szUsedCode[MAXUSEDCODES];
     BYTE  byMaxElement;
	 TCHAR cWildChar;
	 WORD  wNumRules;
} DESCRIPTION,FAR * LPDESCRIPTION;

typedef struct tagCREATEWORDRULE {
     BYTE byLogicOpra;
	 BYTE byLength;
	 WORD wNumCodeUnits;
	 struct CODEUNIT {
	      DWORD dwDirectMode;
		  WORD  wDBCSPosition;
		  WORD  wCodePosition;
     } CodeUnit[12];
} RULE,FAR *LPRULE;

typedef struct  tagENCODEAREA {
	 DWORD PreCount;   
     DWORD StartEncode;
	 DWORD EndEncode;
} ENCODEAREA,FAR *LPENCODEAREA;

typedef struct tagEMBHEAD {
    TCHAR W_Code[MAXCODELEN];               
    TCHAR C_Char[USER_WORD_SIZE];
} EMB_Head,FAR *LPEMB_Head;

typedef struct tagWORDINDEX {
     TCHAR szCode[MAXCODELEN+1];
	 WORD  wDBCSLen;
	 DWORD dwOffset;
}  WORDINDEX,FAR *LPWORDINDEX;


typedef struct tagImeRes{
     TCHAR  Version[NAMESIZE];
	 TCHAR  Depart[NAMESIZE/2];
	 TCHAR  BmpName[MAX_PATH];
	 TCHAR  IcoName[MAX_PATH];
	 TCHAR  HlpFile[MAX_PATH];   
	 WORD  Value;
}IMERES,FAR *LPIMERES;


extern HANDLE   hDlgless;
extern HGLOBAL  hRule;
HGLOBAL         hEncode;
HINSTANCE       hInst;
DWORD           dwLineNo;
WORD            EMB_Count;
HANDLE          HmemEMB_Table;
HANDLE hSRCFile,hMBFile; 
HANDLE hCmbFile;   
BYTE   WriteCrtFlag[(NUM_OF_ENCODE+7)/8];
BOOL InitApplication(HINSTANCE);

BOOL ConvConv           (HANDLE, LPCTSTR, LPCTSTR); 
BOOL ConvReConv         (HANDLE, LPCTSTR, LPCTSTR);
BOOL ConvGetMainID      (HANDLE, LPMAINID);
BOOL ConvWriteMainID    (HANDLE, LPMAINID);
BOOL ConvGetMainIndex   (HANDLE, HANDLE, LPMAININDEX);
BOOL ConvWriteMainIndex (HANDLE, LPMAININDEX);

BOOL ConvReadFile       (HANDLE, LPCTSTR, LPCTSTR);
BOOL WriteSortFile      (HANDLE, HANDLE, HANDLE, LPWORDINDEX, LPCREATEWORD);
BOOL ConvReadDescript   (HANDLE, LPDESCRIPTION, LPMAININDEX);
BOOL ConvWriteDescript  (HANDLE, LPDESCRIPTION, LPMAININDEX);
int  ConvGetDescript    (HANDLE, LPCTSTR, LPDWORD, LPDWORD, LPDESCRIPTION,BOOL);
BOOL ConvSaveDescript   (LPCTSTR, LPDESCRIPTION, DWORD, DWORD);

BOOL ConvReadRule       (HANDLE, int, LPRULE, LPMAININDEX);
BOOL ConvWriteRule      (HANDLE, int, LPRULE, LPMAININDEX);
int  ConvGetRule        (HANDLE, LPCTSTR, LPDWORD, LPDWORD, LPRULE, LPDESCRIPTION);
BOOL ConvSaveRule       (HANDLE, LPCTSTR, DWORD, DWORD, LPRULE, DWORD);

BOOL ConvInitEncode     (HGLOBAL hEncode);
BOOL ConvGetEncode      (HANDLE, LPENCODEAREA, LPDWORD, LPDWORD, LPMAININDEX);
BOOL ConvWriteEncode    (HANDLE, LPENCODEAREA, LPMAININDEX);

BOOL ConvGetCrtData     (HANDLE, LPCREATEWORD, LPMAININDEX);
BOOL ConvWriteCrtData   (HANDLE, LPCREATEWORD, LPMAININDEX);
BOOL ConvGetReConvIndex (HANDLE, LPRECONVINDEX, LPMAININDEX);
BOOL ConvWriteReConvIdx (HANDLE, LPRECONVINDEX, LPMAININDEX);
BOOL ConvGetCodeIndex   (HANDLE, LPDWORD, LPSTR, LPMAININDEX);
BOOL ConvWriteCodeIndex (HANDLE, LPDWORD, LPTSTR, LPMAININDEX);
BOOL ConvGetDicIndex    (HANDLE, LPDWORD, DWORD, LPMAININDEX);
BOOL ConvWriteDicIndex  (HANDLE, LPDWORD, DWORD, LPMAININDEX);
BOOL ConvGetNumXYWords  (HANDLE, LPDWORD, DWORD, LPMAININDEX);
BOOL ConvWriteNumXYWords(HANDLE, LPDWORD, DWORD, LPMAININDEX);

BOOL ConvInsNewWord     (HANDLE, HANDLE, EMB_Head);
BOOL ConvSort           (HANDLE, LPWORDINDEX, int);
BOOL ConvBatCreate      (HANDLE, DESCRIPTION, LPRULE, LPCREATEWORD, LPTSTR, LPTSTR);
LPTSTR ConvCreateWord    (HWND, LPCTSTR, LPTSTR);

void ConvInit           (LPDESCRIPTION,LPMAINID,LPMAININDEX);
BOOL ConvGetBaseWord    (HANDLE, WORDINDEX, LPTSTR);
BOOL ConvWriteBaseWord  (HANDLE, HANDLE, HANDLE, MAINID,DWORD, 
			 LPCREATEWORD, LPRECONVINDEX, DWORD);
BOOL ReadSRCFile        (HANDLE, LPINT, HANDLE, LPCREATEWORD, LPWORDINDEX, 
			 LPINT, LPDESCRIPTION,LPRECONVINDEX);
BOOL ConvCalc           (HANDLE ,HANDLE ,LPWORDINDEX ,LPMAININDEX ,LPDESCRIPTION);
//BOOL WriteMBFile        (HANDLE, HANDLE, HANDLE, LPWORDINDEX, 
//                         LPMAININDEX, LPDESCRIPTION, LPCREATEWORD, LPRECONVINDEX);
BOOL WriteMBFile        (HANDLE, HANDLE, HANDLE, LPWORDINDEX, 
			 LPMAININDEX, LPDESCRIPTION);
int  WordSplit          (HANDLE, LPINT, LPTSTR, LPCREATEWORD, LPWORDINDEX,
			 LPDESCRIPTION,LPRECONVINDEX);
int  SimpleSplit        (HANDLE, LPINT, LPTSTR, LPCREATEWORD, LPWORDINDEX, WORD);
void qSort              (LPWORDINDEX, DWORD,DWORD);
void qSortChar          (LPTSTR , DWORD ,DWORD );
HANDLE IndexReAlloc     (HANDLE, LPINT);
BOOL RuleParse          (HANDLE, LPTSTR, DWORD, LPRULE, WORD);
void RuleToText         (LPRULE, LPTSTR);
void MoveFileBlock      (HANDLE, DWORD, DWORD, DWORD);
DWORD EncodeToNo        (LPTSTR);
DWORD EncodeToGBNo      (UCHAR szDBCS[3]);
void NoToEncode         (DWORD, LPBYTE, DWORD, LPENCODEAREA);
BOOL CheckCrtData       (HANDLE, LPCREATEWORD, LPENCODEAREA, DWORD);
void DispInfo           (HANDLE, WORD);
void lstrncpy0          (LPTSTR ,int ,LPTSTR );
BOOL ReadUserWord       (HWND ,LPTSTR ,LPDWORD,WORD);
INT  ReadDescript       (LPCTSTR , LPDESCRIPTION ,DWORD);
BOOL ReadRule           (HWND, LPCTSTR , int ,LPRULE );
int  CheckUserWord      (HWND ,LPTSTR, WORD);
BOOL CheckUserDBCS      (HWND ,LPTSTR);
BOOL CheckCodeLegal     (HWND ,LPTSTR ,LPTSTR, LPTSTR, LPDESCRIPTION );
BOOL CheckCodeCollection(HWND ,LPTSTR ) ;
BOOL SaveFileAs         (HWND , LPTSTR );
BOOL CreateMbKey        (PHKEY ,LPCTSTR ,LPCTSTR);
BOOL SetRegValue        (HKEY ,LPDWORD );
BOOL GetRegValue        (HWND, HKEY ,LPDWORD );


extern void   DelSpace();
extern void   trim();
extern BOOL   ParseDBCSstr();
extern void   lstrncpy();
extern HANDLE Create_File();
extern BOOL   Copy_File();
extern void   ProcessError();
extern BOOL   QueryKey();
extern BOOL   ErrMessage();
extern VOID   WarnMessage();
extern VOID   FatalMessage();
extern VOID   InfoMessage();
extern void   ErrorOut();
extern HANDLE CreateMapFile ();
extern HANDLE CreateMap     ();
extern LPVOID MapView       ();
extern HANDLE OpenMap       ();
extern BOOL   WriteEMBToFile();
extern BOOL   ReadEMBFromFile();
extern void   DelSelCU();
extern int    AddZCItem();
extern void   fnsplit();
extern int    GetEntryInt(LPTSTR , LPTSTR, int ,LPINT);
extern int    GetEntryString();
extern void   GetEntryName();
extern int    CheckDescription();
extern int    GetDescriptEntry();
extern BOOL  searchPos(LPWORDINDEX , DWORD );  
extern DWORD bSearch(LPWORDINDEX ,  DWORD , DWORD , WORDINDEX ); 
int  ConvReconvIndex(HANDLE ,LPTSTR ,LPCREATEWORD ,WORDINDEX ,LPDESCRIPTION ,LPRECONVINDEX );
void DelIllegalCode(TCHAR *);
LPTSTR _tcschr(LPTSTR, TCHAR);
LPTSTR _tcsrchr(LPTSTR, TCHAR);
LPTSTR _tcsstr(LPTSTR, LPTSTR);
LPTSTR _tcsupr(LPTSTR);
int _taccess(LPTSTR, int);
int _ttoi(LPTSTR);
#endif //__CONV_H
