📄 dyz.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 + -