#include "StdAfx.h" #include "VSPDef.h" LPCTSTR CVSPDefinition::SPID = _T("SPID"); LPCTSTR CVSPDefinition::LANGUAGE = _T("LANGUAGE"); LPCTSTR CVSPDefinition::GAMENAME = _T("GAMENAME"); LPCTSTR CVSPDefinition::BINDCOINNAME = _T("BINDCOINNAME"); LPCTSTR CVSPDefinition::COINNAME = _T("COINNAME"); LPCTSTR CVSPDefinition::BINDYBNAME = _T("BINDYBNAME"); LPCTSTR CVSPDefinition::YBNAME = _T("YBNAME"); CVSPDefinition::CVSPDefinition() { } CVSPDefinition::~CVSPDefinition() { ClearDefinitions(); } LPCTSTR CVSPDefinition::GetDefinition(LPCTSTR sDefName) const { INT_PTR i, nCount = m_Defines.count(); for (i=0; iIsCommonServer()) preProcessor.addMacro("_COMMON_SERVER_"); } #define LN '\n' bool CVSPDefinition::LoadDefinitions(LPCTSTR sFilePath) { wylib::stream::CMemoryStream ms; //加载定义文件 if ( ms.loadFromFile(sFilePath) <= 0 ) { OutputError(GetLastError(), "unable to load Definitions from %s ", sFilePath); return false; } //清空当前所有定义 ClearDefinitions(); //读取定义文件 LPTSTR sText = (LPTSTR)ms.getMemory(); LPTSTR sLineEnd, sNewLine, sTag, sPtr; //跳过UTF-8 BOM if ( (*(PINT)sText & 0x00FFFFFF) == 0xBFBBEF ) sText += 3; while (true) { //跳过当前行中行首的空白字符 while (*sText && (unsigned char)*sText <= 0x20 && *sText != LN) { sText++; } //字符串是否已经遍历结束 if (!*sText) break; //该行如果是空行则换入下一行并继续 if (*sText == LN) { sText++; continue; } //确定当前行结束的位置 sLineEnd = _tcschr(sText, LN); if ( !sLineEnd ) sLineEnd = sText + _tcslen(sText) - 1; //跳过当前行中行尾的空白字符并在行尾写入终止符 sNewLine = sLineEnd + 1; while (sText < sLineEnd && (unsigned char)*sLineEnd <= 0x20) { sLineEnd--; } if (sLineEnd > sText) { //在行尾写入终止符 sLineEnd++; sLineEnd[0] = 0; //如果该行不是一个注释行,则按定义行分析 if ( sText[0] != '-' && sText[1] != '-' ) { sTag = _tcschr(sText, '='); if ( sTag ) { //跳过定义名称后面的空白字符 sPtr = sTag - 1; while (sPtr > sText && (unsigned char)*sPtr <= 0x20) { sPtr--; } sPtr++; //如果定义名称有效则设置名称指针 if ( sPtr > sText ) { sPtr[0] = 0;//在定义名称后面写入终止符 //跳过定义值前面的空白字符 sPtr = sTag + 1; while (sPtr < sLineEnd && (unsigned char)*sPtr <= 0x20) { sPtr++; } //添加此定义 SetDefinition(sText, sPtr); } } } } sText = sNewLine; } return true; } VOID CVSPDefinition::SetDefinition(LPCTSTR sDefName, LPCTSTR sDefValue) { INT_PTR i, nCount = m_Defines.count(); SIZE_T nNameLen, nValueLen; Definition define; for (i=0; i