client/EterLib/Util.cpp

391 lines
7.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "../eterPack/EterPackManager.h"
#include "TextFileLoader.h"
void PrintfTabs(FILE * File, int iTabCount, const char * c_szString, ...)
{
va_list args;
va_start(args, c_szString);
static char szBuf[1024];
_vsnprintf(szBuf, sizeof(szBuf), c_szString, args);
va_end(args);
for (int i = 0; i < iTabCount; ++i)
fprintf(File, " ");
fprintf(File, szBuf);
}
bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap)
{
LPCVOID pMotionData;
CMappedFile File;
if (!CEterPackManager::Instance().Get(File, c_szFileName, &pMotionData))
return false;
CMemoryTextFileLoader textFileLoader;
CTokenVector stTokenVector;
textFileLoader.Bind(File.Size(), pMotionData);
for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
{
if (!textFileLoader.SplitLine(i, &stTokenVector))
continue;
if (2 != stTokenVector.size())
return false;
stl_lowers(stTokenVector[0]);
stl_lowers(stTokenVector[1]);
rstTokenMap[stTokenVector[0]] = stTokenVector[1];
}
return true;
}
bool LoadMultipleTextData(const char * c_szFileName, CTokenVectorMap & rstTokenVectorMap)
{
LPCVOID pModelData;
CMappedFile File;
if (!CEterPackManager::Instance().Get(File, c_szFileName, &pModelData))
return false;
DWORD i;
CMemoryTextFileLoader textFileLoader;
CTokenVector stTokenVector;
textFileLoader.Bind(File.Size(), pModelData);
for (i = 0; i < textFileLoader.GetLineCount(); ++i)
{
if (!textFileLoader.SplitLine(i, &stTokenVector))
continue;
stl_lowers(stTokenVector[0]);
// Start or End
if (0 == stTokenVector[0].compare("start"))
{
CTokenVector stSubTokenVector;
stl_lowers(stTokenVector[1]);
std::string key = stTokenVector[1];
stTokenVector.clear();
for (i=i+1; i < textFileLoader.GetLineCount(); ++i)
{
if (!textFileLoader.SplitLine(i, &stSubTokenVector))
continue;
stl_lowers(stSubTokenVector[0]);
if (0 == stSubTokenVector[0].compare("end"))
{
break;
}
for (DWORD j = 0; j < stSubTokenVector.size(); ++j)
{
stTokenVector.push_back(stSubTokenVector[j]);
}
}
rstTokenVectorMap.insert(CTokenVectorMap::value_type(key, stTokenVector));
}
else
{
std::string key = stTokenVector[0];
stTokenVector.erase(stTokenVector.begin());
rstTokenVectorMap.insert(CTokenVectorMap::value_type(key, stTokenVector));
}
}
return true;
}
D3DXVECTOR3 TokenToVector(CTokenVector & rVector)
{
if (3 != rVector.size())
{
assert(!"Size of token vector which will be converted to vector is not 3");
return D3DXVECTOR3(0.0f, 0.0f, 0.0f);
}
return D3DXVECTOR3(atof(rVector[0].c_str()),
atof(rVector[1].c_str()),
atof(rVector[2].c_str()));
}
D3DXCOLOR TokenToColor(CTokenVector & rVector)
{
if (4 != rVector.size())
{
assert(!"Size of token vector which will be converted to color is not 4");
return D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);
}
return D3DXCOLOR(atof(rVector[0].c_str()),
atof(rVector[1].c_str()),
atof(rVector[2].c_str()),
atof(rVector[3].c_str()));
}
///////////////////////////////////////////////////////////////////////////////////////////////////
static std::string gs_fontFace="";
static DWORD gs_codePage=0;
int CALLBACK EnumFontFamExProc(CONST LOGFONT* plogFont, CONST TEXTMETRIC* /*textMetric*/, DWORD /*dwWord*/, LPARAM lParam)
{
return stricmp((const char*)lParam, plogFont->lfFaceName);
}
int GetCharsetFromCodePage(WORD codePage)
{
switch( codePage )
{
case CP_932:
return SHIFTJIS_CHARSET;
case CP_949:
return HANGUL_CHARSET;
case CP_936:
return GB2312_CHARSET;
case CP_950:
return CHINESEBIG5_CHARSET;
case CP_1253:
return GREEK_CHARSET;
case CP_1254:
return TURKISH_CHARSET;
case CP_1255:
return HEBREW_CHARSET;
case CP_1256:
return ARABIC_CHARSET;
case CP_1257:
return BALTIC_CHARSET;
case CP_1258:
return VIETNAMESE_CHARSET;
case CP_874:
return THAI_CHARSET;
case CP_1250:
return EASTEUROPE_CHARSET;
case CP_1251:
return RUSSIAN_CHARSET;
default:
return DEFAULT_CHARSET;
}
}
const char* GetFontFaceFromCodePageNT(WORD codePage)
{
switch( codePage )
{
case CP_932:
return "MS PGothic";
case CP_949:
return "GulimChe";
case CP_936:
return "SimSun";
case CP_950:
return "MingLiU";
case CP_874:
return "Tahoma";
case CP_1252:
return "Arial";
case CP_1256:
return "Tahoma";
case CP_1258:
return "Tahoma";
case CP_65001:
return "Arial";
default:
return "Arial";
}
}
const char* GetFontFaceFromCodePage9x(WORD codePage)
{
switch( codePage )
{
case CP_932:
return "<EFBFBD>l<EFBFBD>r <20>o<EFBFBD>S<EFBFBD>V<EFBFBD>b<EFBFBD>N";
case CP_949:
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü";
case CP_936:
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
case CP_950:
return "<EFBFBD>ө<EFBFBD><EFBFBD><EFBFBD>";
case CP_874:
return "Tahoma";
case CP_1252:
return "Arial";
case CP_1256:
return "Tahoma";
case CP_1258:
return "Tahoma";
case CP_65001:
return "Arial";
default:
return "Arial";
}
}
DWORD GetDefaultCodePage()
{
return gs_codePage;
}
const char * GetDefaultFontFace()
{
return gs_fontFace.c_str();
}
const char* GetFontFaceFromCodePage(WORD codePage)
{
LOGFONT logFont;
memset(&logFont, 0, sizeof(logFont));
logFont.lfCharSet = GetCharsetFromCodePage(codePage);
const char* fontFace = GetFontFaceFromCodePage9x(codePage);
HDC hDC=GetDC(NULL);
if(EnumFontFamiliesEx(hDC, &logFont, (FONTENUMPROC)EnumFontFamExProc, (LONG)fontFace, 0) == 0)
{
ReleaseDC(NULL, hDC);
return fontFace;
}
fontFace = GetFontFaceFromCodePageNT(codePage);
if(EnumFontFamiliesEx(hDC, &logFont, (FONTENUMPROC)EnumFontFamExProc, (LONG)fontFace, 0) == 0)
{
ReleaseDC(NULL, hDC);
return fontFace;
}
ReleaseDC(NULL, hDC);
return GetDefaultFontFace();
}
void SetDefaultFontFace(const char* fontFace)
{
gs_fontFace=fontFace;
}
bool SetDefaultCodePage(DWORD codePage)
{
gs_codePage=codePage;
std::string fontFace=GetFontFaceFromCodePage(codePage);
if (fontFace.empty())
return false;
SetDefaultFontFace(fontFace.c_str());
return true;
}
int __base64_get( const int c )
{
if( 'A' <= c && c <= 'Z' )
return c-'A';
if( 'a' <= c && c <= 'z' )
return c - 'a' + 26;
if( '0' <= c && c <= '9' )
return c - '0' + 52;
if( c == '+' )
return 62;
if( c == '/' )
return 63;
if( c == '=' ) // end of line
return -1;
return -2; // non value;
}
void __strcat1(char * str,int i)
{
char result[2];
result[0] = i;
result[1] = NULL;
strcat(str,result);
}
void base64_decode(const char * str,char * resultStr)
{
int nCount=0, i=0, r, result;
int length = strlen(str);
char szDest[5]="";
strcpy(resultStr,"");
while(nCount < length)
{
i=0;
strcpy(szDest, "");
while(nCount<length && i<4) // 4<><34><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>´<EFBFBD>.
{
r = str[nCount++];
result = __base64_get(r);
if(result!=-2)
{
if(result!=-1)
szDest[i++] = result;
else szDest[i++] = '@'; // It's end (64<36><34><EFBFBD><EFBFBD> <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD>)
}
}
if(i==4) // 4<><34><EFBFBD><EFBFBD> <20>ҽ<EFBFBD><D2BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>. <20><><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>
{
if( nCount+3 >= length ) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>.
{
if( szDest[1] == '@' )
{
__strcat1(resultStr,(szDest[0]<<2));
break;
}// exit while loop
else
__strcat1(resultStr,(szDest[0]<<2 | szDest[1]>>4)); // 1 Byte
if( szDest[2] == '@' )
{
__strcat1(resultStr,(szDest[1]<<4));
break;
}
else
__strcat1(resultStr,(szDest[1]<<4 | szDest[2]>>2)); // 2 Byte
if( szDest[3] == '@' )
{
__strcat1(resultStr,(szDest[2]<<6));
break;
}
else
__strcat1(resultStr,(szDest[2]<<6 | szDest[3])); // 3 Byte
}
else
{
__strcat1(resultStr,(szDest[0]<<2 | szDest[1]>>4)); // 1 Byte
__strcat1(resultStr,(szDest[1]<<4 | szDest[2]>>2)); // 2 Byte
__strcat1(resultStr,(szDest[2]<<6 | szDest[3])); // 3 Byte
}
}
}// end of while
for (i = 0; i < strlen(resultStr); i++)
{
char c = resultStr[i];
int xor = i + 5;
resultStr[i] = char(c ^ xor);
}
// E
}