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

📄 dyz.cpp

📁 中文编码转换
💻 CPP
字号:
// DYZ.cpp : Defines the entry point for the DLL application.
//

 #include "../stdafx.h"
#include <io.h>

//BOOL APIENTRY DllMain( HANDLE hModule, 
//                       DWORD  ul_reason_for_call, 
//                       LPVOID lpReserved
//					 )
//{
//    return TRUE;
//}

//////////////////////////////////////////////////////////////////////////
/*
	homer:

	1	使用前调用init初始化
	2	使用后调用release释放数据空间
*/


//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//struct
typedef struct _tagPinYin 
{
	int		nLen;
	char*	pszPinYin;
	_tagPinYin()
	{
		memset(this, 0, sizeof(*this));
	};
	~_tagPinYin () 
	{
		if (pszPinYin != NULL)
		{
			delete [] pszPinYin;
			pszPinYin = NULL;
		}
	};
}PINYIN,*LPPINYIN;

typedef struct _tagDuoYinZiCiZu 
{
	int		iOff;
	int		nLen;
	char*	pszName;
	PINYIN*	pStPinYin;
	_tagDuoYinZiCiZu()
	{
		memset(this, 0, sizeof(*this));
	};
	~_tagDuoYinZiCiZu()
	{
		if (pszName != NULL)
		{
			delete [] pszName;
			pszName = NULL;
		}
		if (pStPinYin != NULL)
		{
			delete [] pStPinYin;
			pStPinYin = NULL;
		}
	};

	//获得汉字
	char * GetName(){return pszName;};

	//获得指定字的拼音
	int GetPinYin(int nIndex, char* pszPinYin)
	{
		if (nIndex > nLen/2)
			return NULL;
		memcpy(pszPinYin, pStPinYin[nIndex].pszPinYin, pStPinYin[nIndex].nLen);
		pszPinYin[pStPinYin[nIndex].nLen] = '\0';
		pStPinYin[nIndex].pszPinYin[pStPinYin[nIndex].nLen] = '\0';
		return pStPinYin[nIndex].nLen;
	};

	//获得全部简拼编码
	int GetJianPin(char * pszJianPin)
	{
		int nCount = nLen / 2;
		for (int i = 0; i < nCount; i++ )
		{
			pszJianPin[i] = pStPinYin[i].pszPinYin[0];
		}
		pszJianPin[nCount] = '\0';
		return nCount;
	};
}DUOYINZICIZU, *LPDUOYINZICIZU;

//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////

int g_nIndex = 0;//当前位置
int g_nCount = 0;//总记录数
DUOYINZICIZU* g_pDYZ = NULL;	//多音字词组库
int g_Idx[(0xFE - 0x81) * 191 + 0xFE - 0x40 + 1] = {0,};

//////////////////////////////////////////////////////////////////////////


/*
*	function:	Dichotomy
*		find one data(nValue) from one sorted array(pnArr)
*	return value:	index
*/
static long Dichotomy(unsigned long* pnArr, int nNumElement, unsigned long nValue)
{
	if (pnArr == NULL || nNumElement == 0)
		return -1;

	int nStart = 0;
	int nEnd = nNumElement;
	int nMid = 0;
	while( nEnd > nStart )
	{
		nMid = (nStart+nEnd)/2;
		if( pnArr[nMid] == nValue )
			return nMid;
		else if( pnArr[nMid] > nValue )
			nEnd = nMid;
		else
			nStart = nMid;
		if( nEnd-nStart <= 1 )
		{
			if (pnArr[nStart] == nValue)
				return nStart;
			else
				return -1;
		}
	}
	return -1;
}

inline void swap(DUOYINZICIZU &dyz1, DUOYINZICIZU &dyz2)
{
	DUOYINZICIZU dyzTemp;
	dyzTemp = dyz1;
	dyz1 = dyz2;
	dyz2 = dyzTemp;
	memset(&dyzTemp, 0, sizeof(dyzTemp));
}


static void InsertionSortByCodeAndLen(DUOYINZICIZU* pArr, int nCount)
{
	for (int i = 0; i < nCount - 1; i++)
	{
		for (int j = i + 1; j < nCount; j++)
		{
			if (pArr[i].iOff > pArr[j].iOff)
				swap(pArr[i], pArr[j]);
			else if(pArr[i].iOff == pArr[j].iOff && pArr[i].nLen < pArr[j].nLen)
				swap(pArr[i], pArr[j]);
		}
	}

	int iOff = -1;
	for(i = 0; i < nCount; i++)
	{
		if(iOff != pArr[i].iOff)
		{
			ASSERT(iOff < pArr[i].iOff);
			iOff = pArr[i].iOff;
			g_Idx[iOff] = i;
		}
	}
}


extern "C" void __stdcall  dyz_release()	
{
	if (g_pDYZ != NULL)
	{
		delete [] g_pDYZ;
		g_pDYZ = NULL;
	}
	g_nIndex = 0;
	g_nCount = 0;
}


extern "C" int __stdcall dyz_init(char * pszDatabaseName, BOOL bSort = TRUE)
{
	dyz_release();
	if (pszDatabaseName == NULL)
		return 0;
	if (pszDatabaseName[0] == '\0' )
		return 0;
	if (access(pszDatabaseName, 0x04) != 0)
		return 0;

	FILE * pLoadFile = fopen(pszDatabaseName, "rt");
	if (pLoadFile == NULL)
		return 0;
	
	char szLine[MAX_PATH] = _T("");
	while (!feof(pLoadFile))
	{
		int nReturn = fscanf(pLoadFile, "%s", szLine);
		if (nReturn != 1)
			continue;
		if (szLine[0] == ';')	//如果首字为';',不处理
			continue;
		g_nCount++;
	};

	g_pDYZ = new DUOYINZICIZU[g_nCount];
	int i, j;
	for(i = 0; i < ((0xFE - 0x81) * 191 + 0xFE - 0x40 + 1); i++)
		g_Idx[i] = -1;

	int nIndex = 0;
	fseek(pLoadFile, 0, 0);
	while (!feof(pLoadFile))
	{
		int nReturn = fscanf(pLoadFile, "%s", szLine);
		if (nReturn != 1)
			continue;
		if (szLine[0] == ';')	//如果首字为';',视为无效,不进行处理.
			continue;
		
		//处理一条有效记录
		char *pszTemp = NULL;
		char *pszTempNext = NULL;
		pszTemp = strchr(szLine, '=');
		g_pDYZ[nIndex].nLen = (int)pszTemp - (int)&szLine;

		g_pDYZ[nIndex].pszName = new char[g_pDYZ[nIndex].nLen + 1];
		strncpy(g_pDYZ[nIndex].pszName, szLine, g_pDYZ[nIndex].nLen);
		g_pDYZ[nIndex].pszName[g_pDYZ[nIndex].nLen] = '\0';
		
		// 首汉字内码偏移值, added by kripa
		ASSERT(g_pDYZ[nIndex].pszName[0] < 0);
		g_pDYZ[nIndex].iOff = ((BYTE)(g_pDYZ[nIndex].pszName[0]) - 0x81) * 191 + (BYTE)(g_pDYZ[nIndex].pszName[1]) - 0x40; 

		int nHZCount = g_pDYZ[nIndex].nLen / 2;
		g_pDYZ[nIndex].pStPinYin = new PINYIN[nHZCount];
		for (i = 0; i < nHZCount; i++)
		{
			pszTemp++;
			pszTempNext = strchr(pszTemp, ',');
			if (pszTempNext == NULL)
				g_pDYZ[nIndex].pStPinYin[i].nLen = strlen(pszTemp);
			else
				g_pDYZ[nIndex].pStPinYin[i].nLen = pszTempNext - pszTemp;
			g_pDYZ[nIndex].pStPinYin[i].pszPinYin = new char[g_pDYZ[nIndex].pStPinYin[i].nLen + 1];
			strncpy(g_pDYZ[nIndex].pStPinYin[i].pszPinYin, pszTemp, g_pDYZ[nIndex].pStPinYin[i].nLen);
			g_pDYZ[nIndex].pStPinYin[i].pszPinYin[g_pDYZ[nIndex].pStPinYin[i].nLen] = '\0';
			pszTemp = pszTempNext;
			if (pszTemp == NULL && i < nHZCount-1)
			{
				TRACE("one record is error:%s\n", szLine);
				break;
			}
		}

		if (pszTemp != NULL)
			TRACE("one record is error:%s\n", szLine);

		nIndex++;
	}

	if (bSort)
	{
		InsertionSortByCodeAndLen(g_pDYZ, g_nCount);
	}

	
	//关闭文件
	fclose(pLoadFile);

	return 1;
}


extern "C" int __stdcall dyz_GetNext()
{
	if (g_nIndex < g_nCount - 1)
	{
		g_nIndex++;
		return g_nIndex;
	}
	else
	{
		return 0;
	}
}

extern "C" int __stdcall dyz_GetLast()
{
	if (g_nIndex > 0)
	{
		g_nIndex--;
		return g_nIndex;
	}
	else
	{
		return 0;
	}
}

extern "C" int __stdcall dyz_GetFirst()
{
	g_nIndex = 0;
	return 1;
}

extern "C" char* __stdcall dyz_GetName()
{
	return g_pDYZ[g_nIndex].GetName();
}

extern "C" int __stdcall dyz_GetPosByOff(int iOff)
{
	if(g_Idx[iOff] == -1)
		return 0;
	else
	{
		g_nIndex = g_Idx[iOff];
		return 1;
	}	
}

extern "C" int __stdcall dyz_GetOffset()
{
	return g_pDYZ[g_nIndex].iOff;
}

extern "C" int __stdcall dyz_GetJianPin(char * pszJianPin)
{
	return g_pDYZ[g_nIndex].GetJianPin(pszJianPin);
}

extern "C" int __stdcall dyz_GetPinYin(int nIndex, char * pszPinYin)
{
	return g_pDYZ[g_nIndex].GetPinYin(nIndex, pszPinYin);
}

extern "C" int __stdcall dyz_GetCount()
{
	return g_nCount;
}

extern "C" int __stdcall dyz_GetLen()
{
	return g_pDYZ[g_nIndex].nLen;
}



⌨️ 快捷键说明

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