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

📄 etoc.cpp

📁 支持Windows 3.x、Windows 9x平台上的中文(GB、Big5)、日文(Shift JIS、EUC JIS)、韩文(KS C 5601)、HZ码的显示与输入,智能内码识别
💻 CPP
字号:
//英汉翻译
#include	"stdafx.h"
#include	<windowsx.h>

#include	"etoc.h"

CEtoC	OEtoC ;		//英汉翻译对象

//读入库内容
CEtoC::CEtoC( void )
{
	hpsLib	=NULL ;
}

//装入翻译字库
BOOL CEtoC::LoadDict( void )
{
	//打开文件
	if( !Open( DICT_NAME , CFile::modeRead ) )
	{
		::MessageBox( 0 , "Open file error,in LoadDict!" , 0 , MB_OK ) ;
		return	0 ;
	}

	//得到库长度
	DWORD	dwLibLen=GetLength() ;
	//分配空间
	hpsLib	=(char huge*)GlobalAllocPtr( GMEM_FIXED , 
										dwLibLen ) ;
	if( !hpsLib )
	{
		::MessageBox( 0 , "GlobalAllocPtr error" , 0 , MB_OK ) ;
		return	0 ;
	}
	
	//读出库内容
	ReadHuge( hpsLib , dwLibLen ) ;
	//关闭文件
	Close() ;
	
	lpLibHead	=(LIB_HEAD far*)hpsLib ;	//得到库头
	//判断文件是否正确
	if( dwLibLen != lpLibHead->dwLibLen )	//库有问题
	{
		::MessageBox( 0 , "The etoc.lib is error" , 0 , MB_OK ) ;
		return	0 ;
	}
	
	return	1 ;
}

void CEtoC::UnloadDict( void )
{
	if( hpsLib )
	{
		GlobalFreePtr( hpsLib ) ;
		hpsLib	=NULL ;
	}
}
	
//英汉翻译,返回0,出错,1完全匹配,2非完全匹配
int	CEtoC::EnglishToChinese( LPCSTR lpcsEnglish , 
							int	nLenOfEnglish ,
							LPSTR	lpsChinese , int nLenOfChinese ,
							LPINT	lpnLenOfResult )
{
	char	sBuff[300] ;

	if( (UINT)nLenOfEnglish <= 0 || 
		(UINT)nLenOfEnglish > lpLibHead->uWordClassNum )	//长度不对								
	{
		strcpy( sBuff , "长度错误!" ) ;
		*lpnLenOfResult	=min( nLenOfChinese , strlen( sBuff ) ) ;						 
		_fstrncpy( lpsChinese , sBuff , 
						  *lpnLenOfResult ) ;
		return	0 ;
	}
	
	//检查该类是否有词
	if( lpLibHead->dwStartPos[nLenOfEnglish-1] == 0 ||
		lpLibHead->dwWordNum[nLenOfEnglish-1] == 0 )
	{
		strcpy( sBuff , "不好意思,我不会翻译这个词." ) ; 
		*lpnLenOfResult	=min( nLenOfChinese , strlen( sBuff ) ) ;						 
		_fstrncpy( lpsChinese , sBuff , 
						  *lpnLenOfResult ) ;
		return	0 ;
	}
	
	//检索该英文单词的含义
	DWORD	dwItemLen	=nLenOfEnglish+5 ;			//该词类的项长度
	DWORD	dwFirst	=0 ;	
	DWORD	dwLast	=lpLibHead->dwWordNum[nLenOfEnglish-1] - 1 ;
	DWORD	dwMiddle=0 ;
	DWORD	dwMiddlePoint=0 ;				//中间词的指针
	WORD_CLASS	far	*lpWord ;
	int				n ;

	//以二分法进行检索	
	while( dwFirst <= dwLast )
	{
		dwMiddle	=( ( dwFirst+dwLast )/2 ) ;
		dwMiddlePoint	=dwMiddle*dwItemLen ;
		n	=_fstrnicmp( lpcsEnglish , hpsLib +
								lpLibHead->dwStartPos[nLenOfEnglish-1] +
								dwMiddlePoint , nLenOfEnglish ) ;
		if( !n )	//相等
		{															
			lpWord	=(WORD_CLASS far*)( hpsLib + 
								lpLibHead->dwStartPos[nLenOfEnglish-1] + 
								dwMiddlePoint + nLenOfEnglish ) ;
			_fstrncpy( lpsChinese , lpcsEnglish , nLenOfEnglish ) ;
			lpsChinese[nLenOfEnglish]	=':' ;
			if( nLenOfEnglish+1+nLenOfChinese < lpWord->bLen )	//缓冲区长度太小
			{
				_fstrncpy( lpsChinese+nLenOfEnglish+1 , hpsLib + lpWord->dwStartPos ,
								 nLenOfChinese-nLenOfEnglish-1 ) ;
				*lpnLenOfResult	=nLenOfEnglish+1+nLenOfChinese ;
				lpsChinese[*lpnLenOfResult]	='\0' ;
				return	0 ;
			}
			else
			{
				_fstrncpy( lpsChinese+nLenOfEnglish+1 , hpsLib + lpWord->dwStartPos ,
								 lpWord->bLen ) ;
				*lpnLenOfResult	=nLenOfEnglish+1+lpWord->bLen ;
				lpsChinese[*lpnLenOfResult]	='\0' ;
				return	1 ;
			}
		}
		
		if( n<0 )
		{
			if( !dwMiddle )		//已经为0了
				break ;
			dwLast	=dwMiddle-1 ;
		}
		else
			dwFirst	=dwMiddle+1 ;
	}
												
	//没有匹配者,以中间值代替																										
	//组织输出结果
	char far	*lp ;
	lp	=(char far*)sBuff ;
	//给英文名字
	_fstrncpy( lp , hpsLib +
				lpLibHead->dwStartPos[nLenOfEnglish-1] +
				dwMiddlePoint , nLenOfEnglish ) ;
	lp	+=nLenOfEnglish ;
	*lp++	=':' ;
	//给中文含义
	lpWord	=(WORD_CLASS far*)( hpsLib + 
						lpLibHead->dwStartPos[nLenOfEnglish-1] + 
						dwMiddlePoint + nLenOfEnglish ) ;
	_fstrncpy( lp , hpsLib + lpWord->dwStartPos , 
								 lpWord->bLen ) ;
	lp	+=lpWord->bLen ;
	*lp	='\0' ;
	*lpnLenOfResult	=min( nLenOfChinese , strlen( sBuff ) ) ;
	_fstrncpy( lpsChinese , sBuff ,
					  *lpnLenOfResult ) ;
	lpsChinese[*lpnLenOfResult]	='\0' ;

//	WritePrivateProfileString( "test" , "s" , lpsChinese , "test.ini" ) ;
	return	2 ;
}

#ifdef __cplusplus
extern "C" {
#endif

//装入翻译字库
BOOL __export FAR PASCAL	LoadDict( void )
{
	return	OEtoC.LoadDict() ;
}

//卸掉翻译字库
void __export FAR PASCAL	UnloadDict( void )
{
	OEtoC.UnloadDict() ;
}

//对外输出的函数									
#define	HOU_ZHUI_NUM	6	//后缀数目
#define	BUFF_LEN	100
BOOL __export FAR PASCAL	EnglishToChinese( LPCSTR lpcsEnglish , 
							int	nLenOfEnglish ,
							LPSTR	lpsChinese , int nLenOfChinese ,
							LPINT	lpnLenOfResult )
{
	char	sDelStr[HOU_ZHUI_NUM][10]=		//减去某部分
		{ "s" , "es" , "ing" , "ing" , "ed" , "ied" } ;
	char	sAddStr[HOU_ZHUI_NUM][10]=	//减去后,再加上某个部分
		{ "" , "" , "" , "e" , "" , "y" } ;
	
	int	n	=OEtoC.EnglishToChinese( lpcsEnglish , nLenOfEnglish ,
				lpsChinese , nLenOfChinese , lpnLenOfResult ) ;
	if( n==0 || n==1 )
		return	(BOOL)n ;

	char	sBuff[BUFF_LEN] ;
	int		nLen , nDelStr ;
	for( int i=0 ; i<HOU_ZHUI_NUM ; i++ )
	{
		nDelStr	=strlen( sDelStr[i] ) ;
		if( nLenOfEnglish<=nDelStr )
			continue ;
		//比较是否有减去的部分
		if( _fstrncmp( lpcsEnglish+nLenOfEnglish-nDelStr , sDelStr[i] , nDelStr ) )
			continue ;	//不相等
		nLen	=nLenOfEnglish-nDelStr+strlen(sAddStr[i]) ;
		if( nLen>BUFF_LEN )
			continue ;
		_fstrncpy( sBuff , lpcsEnglish , nLenOfEnglish-nDelStr ) ;
		strncpy( sBuff+nLenOfEnglish-nDelStr , sAddStr[i] , strlen(sAddStr[i]) ) ;
		n	=OEtoC.EnglishToChinese( sBuff , nLen ,
				lpsChinese , nLenOfChinese , lpnLenOfResult ) ;
		if( n==0 || n==1 )
			return	(BOOL)n ;
	}

	return	OEtoC.EnglishToChinese( lpcsEnglish , nLenOfEnglish ,
				lpsChinese , nLenOfChinese , lpnLenOfResult ) ;
}

#ifdef __cplusplus
}
#endif

⌨️ 快捷键说明

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