⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sim2lib1.c

📁 自由拼音输入法软件源码 输入法编程必看
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <windows.h>
#include <tchar.h>

#define MAX_PHRASE_LEN 8
#define MAX_PY_NUM 420
#define MAX_EACH_PY_NUM 41
#define MAX_EACH_HZ_NUM 945

typedef struct {
	WORD wKey;
	TCHAR szPY[8];
} PINYIN,FAR *LPPINYIN;

PINYIN      aPYTab[26][MAX_EACH_PY_NUM] = {0};
TCHAR       aHZTab[MAX_PY_NUM][MAX_EACH_HZ_NUM] = {0};

void LoadHZDictionary( LPTSTR lpStr)
{
	TCHAR szPY[20],szHZ[1000];
	static int i=0,j=0,nPre=0;
	WORD wPYHead=1;
	LPPINYIN lpPYTab = (LPPINYIN)aPYTab;
	LPTSTR lpHZTab = (LPTSTR)aHZTab;

	_stscanf(lpStr,"%s %s",szPY,szHZ);

	_tcscpy( (lpHZTab+i*MAX_EACH_HZ_NUM),szHZ);
	
	wPYHead=(WORD)szPY[0] - (WORD)_T('a');
	if(wPYHead != nPre) j=0;
	_tcscpy( (lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->szPY,szPY);
	(lpPYTab+wPYHead*MAX_EACH_PY_NUM+j)->wKey=i+1;

	nPre=wPYHead;
	i++,j++;
	return;
}

WORD GetSegment(LPTSTR buf)
{
	if(*buf == _T('\0')) return 1; //END_SEGMENT
	else if(*buf == _T('#')) return 2; //COMMENT
	else if( _tcsstr(buf,_T("[PUNCTUATION]")) != NULL ) return 3; 
	else if( _tcsstr(buf,_T("[DICTIONARY]")) != NULL) return 4;
	else return 0;
}

void GetStr(FILE *pf,LPTSTR pbuf)
{
	while( !feof(pf) ) {
		*pbuf = _fgettc(pf);
		if(*pbuf == _T('\n')) break;
		pbuf++;
	}
	*pbuf = _T('\0');
}

void LoadTable()
{
	FILE *stream;
	TCHAR szStr[1000];
	TCHAR szTabFileName[200];
	LPTSTR lpTabFileName = szTabFileName;


	lpTabFileName += GetSystemDirectory(szTabFileName,200);
	if (*(lpTabFileName-1) != _T('\\'))
		*lpTabFileName++ = _T('\\');
	_tcscpy(lpTabFileName,_T("freepy.tab"));

	if( (stream = _tfopen( szTabFileName, "r" )) == NULL ){
		_stprintf(szStr,"%s can not found",szTabFileName);
		MessageBox(NULL,szStr,"init",MB_OK);
		exit(1);
	}
	
	while( !feof( stream )) {
		GetStr(stream,szStr);

		switch( GetSegment(szStr)) {
		case 1: //END_SEGMENT
			break;

		case 2: //COMMENT
			break;

		case 3: //PUNCTUATION
			if( feof( stream ) ) goto my_exit;
			GetStr(stream,szStr);
			while(GetSegment(szStr) != 1) {
				if( GetSegment(szStr) != 2){
					//LoadPunct( szStr );
				}
				if( feof( stream ) ) goto my_exit;
				GetStr(stream,szStr);
			}
			break;

		case 4: //DICTIONARY
			if( feof( stream ) ) goto my_exit;
			GetStr(stream,szStr);
			while(GetSegment(szStr) != 1) {
				if( GetSegment(szStr) != 2){
					LoadHZDictionary( szStr );
				}
				if( feof( stream ) ) goto my_exit;
				GetStr(stream,szStr);
			}
			break;

		default:
			break;
		}
	}
my_exit:
	fclose(stream);
	return;
}

int sim2lib(LPTSTR lpInName,LPTSTR lpOutName)
{
	FILE *stream,*out;
	int i,j;
	TCHAR szStr[250],szTempStr[4];
	WORD wLen,wResult;
	LPTSTR lpDest;
	BYTE abKey[MAX_PHRASE_LEN+2],bLen;
	WORD awKey[MAX_PHRASE_LEN];
	WORD wCount;
	WORD wAttrib;

	wAttrib=0;
	
	if( (stream = _tfopen( lpInName, _T("r") )) == NULL ){
		fprintf(stderr,"%s cant open.\n",lpInName);
		exit(1);
	}
	
	if( (out = _tfopen( lpOutName, _T("wb") )) == NULL ){
		fprintf(stderr,"%s cant open.\n",lpOutName);
		exit(1);
	}
	
	szTempStr[2]=_T('\0');
	while( !feof( stream )) {
		if( _fgetts(szStr,1000,stream)!=NULL){
			wLen=_tcslen(szStr)/2;
			
			if(wLen > MAX_PHRASE_LEN) continue;
			
			for(i=0;i<wLen;i++){
				szTempStr[0] = szStr[2*i];
				szTempStr[1] = szStr[2*i+1];
				wCount=0;
				for(j=0;j<MAX_PY_NUM;j++) {
					lpDest = _tcsstr( aHZTab[j],szTempStr);
					wResult = lpDest- aHZTab[j];
					if(lpDest!= NULL && !(wResult%2) ){
						awKey[i]=j+1;
						wCount++;
					}
				}
				if(wCount!=1) break;
			}
			if(wCount!=1){
				*(szStr+_tcslen(szStr)-1)=_T('\0');
				//printf("%s(%s %d)\n",szStr,szTempStr,wCount);
				printf("%s\n",szStr);
				continue;
			}
			for(i=0;i<wLen;i++)
				abKey[i+1] = awKey[i] & 0xff;
			
			abKey[0] = _T('\0');
			for(i=0;i<wLen;i++)
				abKey[0] |= (awKey[i] & 0x0100) >> (8-i);
			
			bLen=(BYTE)wLen;
			
			fwrite(&bLen,1,1,out);
			fwrite(&abKey,1,wLen+1,out);
			fwrite(szStr,1,wLen*2,out);
			fwrite(&wAttrib,2,1,out);
			
		}
	}
	
	fclose(stream);
	fclose(out);
	return (0);
}

void main(int argc,char **argv)
{
	if(argc != 3) {
		fprintf(stderr,"usage: %s <input_name> <output_name>\n",argv[0]);
		return;
	}
	LoadTable();
	sim2lib(argv[1],argv[2]);
	return;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -