📄 binfilefactory_text.cpp
字号:
if( pAddr == NULL )
return FALSE;
READ_FILE(pAddr, sizeof(char *) * nCount * nLangNum, 1, pFile); //?TT_MAX_NUM
if( bBigEdn )
{
for( i = 0; i < nCount * nLangNum; ++i ) //?TT_MAX_NUM
pAddr[i] = conv.ConvEdn_INT(pAddr[i]);
}
PTEXTINFOEX pTxtInfoEx = NULL;
int nStrSize = 0;
int nNewStrSize = 0;
int nMaxBuf = (MAX_TEXT_LEN + 8)/2;
_TCHAR *pszTemp = new _TCHAR[nMaxBuf];
memset(pszTemp,0,nMaxBuf*sizeof(_TCHAR));
//读第一种语言
for( i = 0; i < nCount; ++i )
{
pTxtInfoEx = new TEXT_INFO_T_EX;
if( NULL == pTxtInfoEx )
return FALSE;
memset(pTxtInfoEx,0,sizeof(TEXT_INFO_T_EX));
READ_FILE( pTxtInfoEx->szLanguage[0], pAddr[i+1] - pAddr[i], 1, pFile );
//@hongliang.xin 2006-12-22
//已存为Big Endian,都需要转换
if((UCHAR)pTxtInfoEx->szLanguage[0][0]>=0x80 /*&& bBigEdn*/) //Unicode
{
LPWORD lpwStrSize=(LPWORD) (pTxtInfoEx->szLanguage[0]+1);
WORD wStrSize = *lpwStrSize;
wStrSize = conv.BigEdnToLitEdn(wStrSize);
nStrSize = wStrSize;
conv.BigEdnToLitEdn((LPWORD)(pTxtInfoEx->szLanguage[0]+1),nStrSize/2+1);
memset(pszTemp,0,nMaxBuf*sizeof(_TCHAR));
memcpy(pszTemp,pTxtInfoEx->szLanguage[0]+3,nStrSize);
if(1 == g_theApp.m_nPrecomposed) //紧缩格式
{
nNewStrSize = FoldString(MAP_PRECOMPOSED,pszTemp,-1,NULL,0);
memset(pTxtInfoEx->szLanguage[0]+3,0,MAX_TEXT_LEN + 8-3);
FoldString(MAP_PRECOMPOSED,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[0]+3),nStrSize);
LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[0]+1);
*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
}
else if(2 == g_theApp.m_nPrecomposed) //非紧缩格式
{
nNewStrSize = FoldString(MAP_COMPOSITE,pszTemp,-1,NULL,0);
memset(pTxtInfoEx->szLanguage[0]+3,0,MAX_TEXT_LEN + 8-3);
FoldString(MAP_COMPOSITE,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[0]+3),nStrSize);
LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[0]+1);
*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
}
}
if( bBuildInfo )
{
CDirFileNode * pRoot = (CDirFileNode *)pInfo->GetRoot();
CDirFileNode * pNode = (CDirFileNode *)pInfo->MallocNode();
if( NULL == pNode )
{
delete pTxtInfoEx;
if(pszTemp != NULL)
delete pszTemp;
return FALSE;
}
_stprintf(pNode->szID, _T("TXT_%03d"), i);
_tcscpy(pNode->szName, pNode->szID);
pInfo->AddChild(pRoot, pNode);
txtExMap.SetAt(pNode->szID, pTxtInfoEx );
arrID.Add( pNode->szID );
}
else
{
txtExMap.SetAt(arrID[i], pTxtInfoEx );
}
}
//读其他语言
int j = 1;
for(j = 1; j < nLangNum ; j++)
{
for( i = nCount*j; i < nCount * (j+1)-1; ++i )
{
VERIFY( txtExMap.Lookup(arrID[i-nCount*j], pTxtInfoEx) );
READ_FILE( pTxtInfoEx->szLanguage[j], pAddr[i+1] - pAddr[i], 1, pFile );
//@hongliang.xin 2006-12-22
//已存为Big Endian,都需要转换
if((UCHAR)pTxtInfoEx->szLanguage[j][0]>=0x80 /*&& bBigEdn*/) //Unicode
{
LPWORD lpwStrSize=(LPWORD) (pTxtInfoEx->szLanguage[j]+1);
WORD wStrSize = *lpwStrSize;
wStrSize = conv.BigEdnToLitEdn(wStrSize);
nStrSize = wStrSize;
conv.BigEdnToLitEdn((LPWORD)(pTxtInfoEx->szLanguage[j]+1),nStrSize/2+1);
memset(pszTemp,0,nMaxBuf*sizeof(_TCHAR));
memcpy(pszTemp,pTxtInfoEx->szLanguage[j]+3,nStrSize);
if(1 == g_theApp.m_nPrecomposed) //紧缩格式
{
nNewStrSize = FoldString(MAP_PRECOMPOSED,pszTemp,-1,NULL,0);
memset(pTxtInfoEx->szLanguage[j]+3,0,MAX_TEXT_LEN + 8-3);
FoldString(MAP_PRECOMPOSED,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[j]+3),nStrSize);
LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[j]+1);
*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
}
else if(2 == g_theApp.m_nPrecomposed) //非紧缩格式
{
nNewStrSize = FoldString(MAP_COMPOSITE,pszTemp,-1,NULL,0);
memset(pTxtInfoEx->szLanguage[j]+3,0,MAX_TEXT_LEN + 8-3);
FoldString(MAP_COMPOSITE,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[j]+3),nStrSize);
LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[j]+1);
*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
}
}
}
// 读最后一个
VERIFY( txtExMap.Lookup(arrID[nCount - 1], pTxtInfoEx) );
READ_FILE( pTxtInfoEx->szLanguage[j], 1, 1, pFile );
if((UCHAR)pTxtInfoEx->szLanguage[j][0] < 0x80)
{
for( int k=1;k<MAX_TEXT_LEN;k++ )
{
READ_FILE( pTxtInfoEx->szLanguage[j]+k, 1, 1, pFile );
if( pTxtInfoEx->szLanguage[j][k] == 0 )
{
break;
}
}
k++;
int k1 = Addr4ByteAlign(k);
if( k1 != k )
{
fseek(pFile, k1 - k, SEEK_CUR);
}
}
else
{
READ_FILE( pTxtInfoEx->szLanguage[j] + 1, sizeof(char)*2, 1, pFile );
LPWORD lpwStrSize=(LPWORD) (pTxtInfoEx->szLanguage[j]+1);
WORD wStrSize = *lpwStrSize;
if(bBigEdn)
{
wStrSize = conv.BigEdnToLitEdn(wStrSize);
}
nStrSize = wStrSize;
READ_FILE( pTxtInfoEx->szLanguage[j] + 3, nStrSize, 1, pFile );
//@hongliang.xin 2006-12-22
//已存为Big Endian,都需要转换
//if(bBigEdn)
conv.BigEdnToLitEdn((LPWORD)(pTxtInfoEx->szLanguage[j]+1),nStrSize/2+1);
memset(pszTemp,0,nMaxBuf*sizeof(_TCHAR));
memcpy(pszTemp,pTxtInfoEx->szLanguage[j]+3,nStrSize);
if(1 == g_theApp.m_nPrecomposed) //紧缩格式
{
nNewStrSize = FoldString(MAP_PRECOMPOSED,pszTemp,-1,NULL,0);
memset(pTxtInfoEx->szLanguage[j]+3,0,MAX_TEXT_LEN + 8-3);
FoldString(MAP_PRECOMPOSED,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[j]+3),nStrSize);
LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[j]+1);
*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
}
else if(2 == g_theApp.m_nPrecomposed) //非紧缩格式
{
nNewStrSize = FoldString(MAP_COMPOSITE,pszTemp,-1,NULL,0);
memset(pTxtInfoEx->szLanguage[j]+3,0,MAX_TEXT_LEN + 8-3);
FoldString(MAP_COMPOSITE,pszTemp,-1,(LPTSTR)(pTxtInfoEx->szLanguage[j]+3),nStrSize);
LPWORD lpwStrSize=(LPWORD)(pTxtInfoEx->szLanguage[j]+1);
*lpwStrSize = (nNewStrSize - 1)*2; //字节数,没有结尾字符
}
int nAlign = Addr4ByteAlign( nStrSize + 3);
// 已经读取3个(类型1byte和长度2bytes),需要-3
fseek(pFile, nAlign - nStrSize - 3, SEEK_CUR);
}
}
if(pszTemp != NULL)
delete pszTemp;
return TRUE;
}
//读Prj版本3
BOOL CBinFileFactory::ReadTextInfo3( FILE * pFile, BOOL bBuildInfo /* = FALSE */ )
{
_ASSERTE( pFile != NULL );
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &TxtData = res.mmi_data_table[MMI_RT_TEXT];
TEXTEX_MAP &txtExMap = mmires.m_mapTextEx;
CDirFileInfo * pInfo = g_theApp.m_pTextInfo;
int &nLangNum = g_theApp.m_nOldUsedLangNum;
const BOOL bBigEdn = res.ToolUsedInfo.bBigEndian;
CConverter conv;
if( bBigEdn )
{
TxtData.uCount = conv.ConvEdn_INT(TxtData.uCount);
TxtData.uSize = conv.ConvEdn_INT(TxtData.uSize);
}
int nCount = TxtData.uCount;
if( nCount == 0 )
return TRUE;
///////////////////////////////////////////////////////////////////////////////
#define READ_FILE(des, st, num, file) \
if( fread(des, st, num, file) != num ) \
{ \
_ASSERTE(0); \
_tcscpy(m_szErrMsg, _T("Read file(text info) error!")); \
return FALSE; \
}
#define SEEK_FILE(pfile, st) \
if( fseek(pfile,st, SEEK_CUR) != 0 ) \
{ _ASSERTE(0); return FALSE; }
///////////////////////////////////////////////////////////////////////////////
CStringArray arrID;
pInfo->CalcAllLeafID( arrID );
int i = 0;
_ASSERTE( 0 == txtExMap.GetCount() );//xe*/
//SEEK_FILE( pFile, sizeof(KSP_TEXT_T) * MAX_LANG_NUM );
SEEK_FILE( pFile, sizeof(KSP_TEXT_T) * nLangNum );
std::auto_ptr<DWORD>Addr(new DWORD[nCount * nLangNum]);
LPDWORD pAddr = (LPDWORD)Addr.get();
if( pAddr == NULL )
return FALSE;
READ_FILE(pAddr, sizeof(char *) * nCount * nLangNum, 1, pFile); //?TT_MAX_NUM
if( bBigEdn )
{
for( i = 0; i < nCount * nLangNum; ++i ) //?TT_MAX_NUM
pAddr[i] = conv.ConvEdn_INT(pAddr[i]);
}
PTEXTINFOEX pTxtInfoEx = NULL;
char szTemp[MAX_TEXT_LEN+8] = {0};
char szDest[MAX_TEXT_LEN+8] = {0};
//读第一种语言
for( i = 0; i < nCount; ++i )
{
pTxtInfoEx = new TEXT_INFO_T_EX;
if( NULL == pTxtInfoEx )
return FALSE;
memset(pTxtInfoEx,0,sizeof(TEXT_INFO_T_EX));
// READ_FILE( pTxtInfoEx->szLanguage[0], pAddr[i+1] - pAddr[i], 1, pFile );//en
memset(szTemp,0, (MAX_TEXT_LEN+8)*sizeof(char));
memset(szDest,0, (MAX_TEXT_LEN+8)*sizeof(char));
READ_FILE(szTemp, pAddr[i+1] - pAddr[i], 1, pFile );
if((UCHAR)szTemp[0]>0)
{
//conv.BigEdnToLitEdn((LPWORD)(szTemp + 1),((UCHAR)szTemp[0]) / 2);
int nStrSize = MultiByteToWideChar(CP_ACP,0,(LPCSTR)(szTemp),-1,NULL,0);
MultiByteToWideChar(CP_ACP,0,(LPCSTR)(szTemp),-1,(LPTSTR)szDest,nStrSize);
if(!HasUcs2Char((LPCTSTR)(szDest),nStrSize*2))//skip len
{
strcpy(pTxtInfoEx->szLanguage[0], szTemp);
}
else
{
pTxtInfoEx->szLanguage[0][0] = (UCHAR)0x80;
LPWORD lpwSize = (LPWORD)(pTxtInfoEx->szLanguage[0]+1);
*lpwSize = (nStrSize-1)*2;
memcpy(pTxtInfoEx->szLanguage[0]+3,szDest,*lpwSize);
}
}
if( bBuildInfo )
{
CDirFileNode * pRoot = (CDirFileNode *)pInfo->GetRoot();
CDirFileNode * pNode = (CDirFileNode *)pInfo->MallocNode();
if( NULL == pNode )
{
delete pTxtInfoEx;
return FALSE;
}
_stprintf(pNode->szID, _T("TXT_%03d"), i);
_tcscpy(pNode->szName, pNode->szID);
pInfo->AddChild(pRoot, pNode);
txtExMap.SetAt(pNode->szID, pTxtInfoEx );
arrID.Add( pNode->szID );
}
else
{
txtExMap.SetAt(arrID[i], pTxtInfoEx );
}
}
int j = 1;
for(j = 1; j < nLangNum ; j++)
{
if(g_theApp.m_nArrLangCBN[j]!=1)
{
for( i = nCount*j; i < nCount * (j+1) - 1; ++i )
{
memset(szTemp,0, (MAX_TEXT_LEN+8)*sizeof(char));
memset(szDest,0, (MAX_TEXT_LEN+8)*sizeof(char));
VERIFY( txtExMap.Lookup(arrID[i-nCount*j], pTxtInfoEx) );
READ_FILE(szTemp, pAddr[i+1] - pAddr[i], 1, pFile );
if((UCHAR)szTemp[0]>0)
{
conv.BigEdnToLitEdn((LPWORD)(szTemp + 1),((UCHAR)szTemp[0]) / 2);
if(!HasUcs2Char((LPCTSTR)(szTemp+1),(UCHAR)szTemp[0]))//skip len
{
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)(szTemp+1),-1,szDest,MAX_TEXT_LEN+8,NULL,NULL);
strcpy(pTxtInfoEx->szLanguage[j], szDest);
}
else
{
pTxtInfoEx->szLanguage[j][0] = (UCHAR)0x80;
LPWORD lpwSize = (LPWORD)(pTxtInfoEx->szLanguage[j]+1);
*lpwSize = (UCHAR)szTemp[0];
memcpy(pTxtInfoEx->szLanguage[j]+3,szTemp+1,*lpwSize);
}
}
}
// 读最后一个
memset(szTemp,0, (MAX_TEXT_LEN+8)*sizeof(char));
memset(szDest,0, (MAX_TEXT_LEN+8)*sizeof(char));
VERIFY( txtExMap.Lookup(arrID[nCount - 1], pTxtInfoEx) );
READ_FILE( szTemp, 1, 1, pFile );//read len
if((UCHAR)szTemp[0]>0)
{
READ_FILE( szTemp+1, (UCHAR)szTemp[0], 1, pFile );
conv.BigEdnToLitEdn((LPWORD)(szTemp + 1),((UCHAR)szTemp[0]) / 2);
if(!HasUcs2Char((LPCTSTR)(szTemp+1),(UCHAR)szTemp[0]))//skip len
{
WideCharToMultiByte(CP_ACP,0,(LPCTSTR)(szTemp+1),-1,szDest,MAX_TEXT_LEN+8,NULL,NULL);
strcpy(pTxtInfoEx->szLanguage[j], szDest);
}
else
{
pTxtInfoEx->szLanguage[j][0] = (UCHAR)0x80;
LPWORD lpwSize = (LPWORD)(pTxtInfoEx->szLanguage[j]+1);
*lpwSize = (UCHAR)szTemp[0];
memcpy(pTxtInfoEx->szLanguage[j]+3,szTemp+1,*lpwSize);
}
}
int nAlign = Addr4ByteAlign( (UCHAR)szTemp[0] + 1 );
// 已经读取一个(长度),需要-1
fseek(pFile, nAlign - (UCHAR)szTemp[0] - 1, SEEK_CUR);
}
else
{
for( i = nCount*j; i < nCount * (j+1) - 1; ++i )
{
VERIFY( txtExMap.Lookup(arrID[i-nCount*j], pTxtInfoEx) );
READ_FILE( pTxtInfoEx->szLanguage[j], pAddr[i+1] - pAddr[i], 1, pFile );
}
// 读最后一个
VERIFY( txtExMap.Lookup(arrID[nCount - 1], pTxtInfoEx) );
READ_FILE( pTxtInfoEx->szLanguage[j], pAddr[i] - pAddr[i-1], 1, pFile );
}
}
return TRUE;
}
BOOL CBinFileFactory::HasUcs2Char(LPCTSTR lpsz,int nSize)
{
_ASSERTE( lpsz != NULL );
//判断是否为ASCII的0扩展的Unicode码
char *p = (LPSTR)lpsz;
int nIndex=0;
for(nIndex= 0;nIndex<nSize;nIndex += 2)
{
if(!((UCHAR)*(p+nIndex) < (UCHAR)0x80 && (UCHAR)*(p+nIndex+1) == (UCHAR)0))
break;
}
if(nIndex>=nSize)//ASCII
{
return FALSE;
}
else //Unicode
{
return TRUE;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -