void __assertex__(const char* file, uint line, const char* myFunction, const char* myException, const char* msg) { char strLog[MAX_SHOWMESSAGE_LENGTH] = {0}; #ifdef _WIN32 tsnprintf( strLog, sizeof(strLog), "[%s][%d][%s][%s]\n[%s]", file, line, myFunction, myException ,msg ) ; #endif #ifdef _LINUX64 tsnprintf( strLog, sizeof(strLog), "[%s][%d][%s][%s]\n[%s]\n", file, line, myFunction, myException ,msg ) ; #endif __show__(strLog); }
VOID DBCFile::CreateIndex(INT nColum, const CHAR* szFileName) { if(nColum <0 || nColum >= m_nFieldsNum || m_nIndexColum==nColum) return; m_hashIndex.clear(); for(INT i=0; i<(INT)m_nRecordsNum; i++) { FIELD* p = &(m_vDataBuf[i*m_nFieldsNum]); FIELD_HASHMAP::iterator itFind = m_hashIndex.find(p->iValue); if(itFind != m_hashIndex.end()) { CHAR szTemp[260]; tsnprintf(szTemp, 260, "[%s]Multi index at line %d(SAME:value=%d)", szFileName, i+1, p->iValue); #ifdef GAME_CLIENT throw std::string(szTemp); #else //AssertEx(FALSE,szTemp); #endif return; } m_hashIndex.insert(std::make_pair(p->iValue, p)); } }
virtual ExecuteResultEnum Execute(int paramClass,Value* pParams,int num,Value* pRetValue) { if(pParams && pRetValue) { ReplaceVariableWithValue(pParams,num); pRetValue->SetInt(0); if(1==num && pParams[0].IsString()) { const char* pScript=pParams[0].GetString(); if(pScript) { tsnprintf(g_FileBuffer,g_c_MaxFileBuffer,"%s",pScript); if(m_pSource) { m_pSource->SetBuffer(g_FileBuffer); pRetValue->SetInt(1); } } } else if(2==num && pParams[0].IsInt() && pParams[1].IsString()) { int ix=pParams[0].GetInt(); const char* pScript=pParams[1].GetString(); if(ix>=0 && ix<g_ScriptThreadNum && ix<g_c_MaxScriptThread && pScript) { if(g_pScriptThread[ix]) { int r=g_pScriptThread[ix]->PushLine(pScript); pRetValue->SetInt(r); } } } } return EXECUTE_RESULT_NORMAL; }
VOID ParseTheResult() { qsort(funcname,numFunc,NAMELEN,compare); qsort(regInfo,numReg,sizeof(_RegisterInfo),compareRegInfo); //解析 //numReg注册函数数目 //numFunc实际函数数目 //只会出现一个函数以数个注册名注册` if(numReg != numFunc) { INT inuseDecl[FUNCNUM]; memset(inuseDecl,0,sizeof(INT)*FUNCNUM); INT startindex = 0; INT ret = 0; for(INT i=0;i<FUNCNUM;i++) { for(INT j=startindex;j<FUNCNUM;j++) { ret = strcmp(regInfo[j].funcname,funcname[i]); if( ret > 0) { break; } else if (ret == 0) { startindex = j + 1; inuseDecl[i] = 1; break; } } } CHAR buf[_MAX_PATH]; tsnprintf(buf,sizeof(buf)-1,"Attention : register & func num mismatch : numReg = %d : numFunc = %d\n",numReg,numFunc); g_pLog->FastSaveLog( LOG_FILE_3, buf) ; g_pLog->FastSaveLog( LOG_FILE_3, "\n") ; g_pLog->FastSaveLog( LOG_FILE_3, "No regisgter begin :\n") ; for(INT i=0;i<numFunc;i++) { if(!inuseDecl[i]) g_pLog->FastSaveLog( LOG_FILE_3,"%s\n",funcname[i]) ; } g_pLog->FastSaveLog( LOG_FILE_3, "No register end\n") ; } else { FILE* fp = fopen(SERVER_FUNCTIONFILE,"w"); if(fp) { fclose(fp); } } }
//错误函数 void myflexer::LexerError(const char* msg) { FKLOG("parse error : %s at line:%d near:%s\n", msg, lineno(), yytext); char buff[100]; tsnprintf(buff, sizeof(buff)-1, "%s at line(%d) near(%s)", msg, lineno(), yytext); m_error = buff; }
void PopMessageMT2M(char* pBuf,int space) { if(g_pSharedMessageQueueT2M) { SharedMessageQueue::MessageType msg=g_pSharedMessageQueueT2M->Pop(); tsnprintf(pBuf,space,"%s",msg.m_Content); } }
char *get_default_prompt (void) { static char buf[1000]; int l = 0; if (in_chat_mode) { peer_t *U = user_chat_get (chat_mode_id); assert (U && U->print_name); l += tsnprintf (buf + l, 999 - l, COLOR_RED "%.*s " COLOR_NORMAL, 100, U->print_name); } if (unread_messages || cur_uploading_bytes || cur_downloading_bytes) { l += tsnprintf (buf + l, 999 - l, COLOR_RED "["); int ok = 0; if (unread_messages) { l += tsnprintf (buf + l, 999 - l, "%d unread", unread_messages); ok = 1; } if (cur_uploading_bytes) { if (ok) { *(buf + l) = ' '; l ++; } ok = 1; l += tsnprintf (buf + l, 999 - l, "%lld%%Up", 100 * cur_uploaded_bytes / cur_uploading_bytes); } if (cur_downloading_bytes) { if (ok) { *(buf + l) = ' '; l ++; } ok = 1; l += tsnprintf (buf + l, 999 - l, "%lld%%Down", 100 * cur_downloaded_bytes / cur_downloading_bytes); } l += tsnprintf (buf + l, 999 - l, "]" COLOR_NORMAL); return buf; } l += tsnprintf (buf + l, 999 - l, "%s", default_prompt); return buf; }
void PushMessageMT2M(const char* pMsg) { if(pMsg && g_pSharedMessageQueueT2M) { SharedMessageQueue::MessageType msg; tsnprintf(msg.m_Content,sizeof(msg.m_Content),"%s",pMsg); g_pSharedMessageQueueT2M->Push(msg); } }
static void ResetSessionManagers(void) { const char* pCenterNum = GetConfig("centernum"); int centerNum = 0; if (NULL != pCenterNum) { centerNum = (int)atoi(pCenterNum); for (int ix = 0; ix < centerNum; ++ix) { char temp[256]; tsnprintf(temp, 256, "ip%d", ix); const char* pIp = GetConfig(temp); if (NULL == pIp) pIp = "127.0.0.1"; tsnprintf(temp, 256, "port%d", ix); const char* pPort = GetConfig(temp); int port = 20000; if (NULL != pPort) port = (int)atoi(pPort); tsnprintf(temp, 256, "worldid%d", ix); const char* pWorldId = GetConfig(temp); int worldId = 0; if (NULL != pWorldId) worldId = (int)atoi(pWorldId); tsnprintf(temp, 256, "name%d", ix); const char* pName = GetConfig(temp); if (NULL != pWorldId && NULL != pName) { SessionManager* pMgr = g_SessionManagers.Get(worldId); if (NULL == pMgr) { pMgr = new SessionManager(); pMgr->Init(g_EventBase); pMgr->SetIpPort(worldId, pIp, port); pMgr->UpdateMyName(pName); g_SessionManagers.Add(worldId, pMgr); } else { pMgr->SetIpPort(worldId, pIp, port); pMgr->UpdateMyName(pName); pMgr->SetSession(NULL); } } } } }
void __assertspecial__(const char* file, uint line, const char* myFunction, const char* myException, const char* msg, ...) { char strLog[MAX_SHOWMESSAGE_LENGTH] = {0}; va_list argp; va_start(argp, msg); char buf[MAX_SHOWMESSAGE_LENGTH] = {0}; int nCount = tvsnprintf(buf, MAX_SHOWMESSAGE_LENGTH, msg, argp); va_end(argp); #ifdef _WIN32 tsnprintf(strLog, sizeof(strLog), "[%s][%d][%s][%s]\n[%s]", file, line, myFunction, myException, buf); #endif #ifdef _LINUX64 tsnprintf(strLog, sizeof(strLog), "[%s][%d][%s][%s]\n[%s]\n", file, line, myFunction, myException, buf); #endif __show__(strLog); }
extern "C" int GetConfig(const char* key, char* buf, int len) { int ret = 0; if (NULL != key && NULL != buf) { const char* val = GetConfig(key); if (NULL != val) { tsnprintf(buf, len, "%s", val); ret = 1; } } return ret; }
extern "C" int TargetName(int handle, char* buf, int len) { int ret = 0; if (NULL != g_pSessionManager && NULL != buf) { const char* name = g_pSessionManager->TargetName(handle); if (NULL != name) { tsnprintf(buf, len, "%s", name); ret = 1; } } return ret; }
void SendMessageMT2T(int index, const char* pMsg) { if (pMsg){ if (index >= 0 && index < g_ScriptThreadNum && index < g_c_MaxScriptThread){ if (g_pScriptThread[index]){ SharedMessageQueue::MessageType msg; tsnprintf(msg.m_Content, sizeof(msg.m_Content), "%s", pMsg); g_pScriptThread[index]->GetSharedMessageQueue().Push(msg); } } else { PushMessageMT2M(pMsg); } } }
extern "C" int TargetName(int worldId, int handle, char* buf, int len) { int ret = 0; if (NULL != buf) { SessionManager* pMgr = g_SessionManagers.Get(worldId); if (NULL != pMgr) { const char* name = pMgr->TargetName(handle); if (NULL != name) { tsnprintf(buf, len, "%s", name); ret = 1; } } } return ret; }
const DBCFile::FIELD* DBCFile::Search_Posistion(INT nRecordLine, INT nColumNum) const { INT nPosition = nRecordLine*GetFieldsNum() + nColumNum; if(nPosition <0 || nColumNum >= (INT)m_vDataBuf.size()) { char szTemp[260]; tsnprintf(szTemp, MAX_FILE_PATH, "DBC:Invalid search request[rec=%d, col=%d]", nRecordLine, nColumNum); #ifdef GAME_CLIENT throw std::string(szTemp); #else //AssertEx(FALSE, szTemp); #endif return NULL; } return &(m_vDataBuf[nPosition]); }
extern "C" void ReloadConfigScript(void) { ReloadConfigState(); const char* pIp = GetConfig("ip"); if (NULL == pIp) pIp = "127.0.0.1"; const char* pPort = GetConfig("port"); int port = 20000; if (NULL != pPort) port = (int)atoi(pPort); tsnprintf(g_Ip, sizeof(g_Ip), "%s", pIp); g_Port = port; if (NULL != g_pSessionManager) { g_pSessionManager->UpdateMyName(); } }
const char * profile::dump() { std::vector<sortele> sortelevec; for (const stringhashmap::ele * p = m_shh.first(); p != 0; p = m_shh.next()) { const profilefuncele & ele = *p->t; sortelevec.push_back(std::make_pair(p->k, ele)); } std::sort(sortelevec.begin(), sortelevec.end(), profilefuncelesort()); m_dumpstr.clear(); m_dumpstr += "Call Func:\n"; for (int i = 0; i < (int)sortelevec.size(); i++) { const sortele & se = sortelevec[i]; const profilefuncele & ele = se.second; char buff[1024]; tsnprintf(buff, sizeof(buff)-1, "\tFunc[%s]\tCalls[%d]\tTotalTime(ms)[%u]\tPerCallTime(ms)[%u]\n", se.first.c_str(), ele.callnum, ele.calltime, ele.callnum ? ele.calltime / ele.callnum : 0); m_dumpstr += buff; } m_dumpstr += "Code Num:\n"; for (int i = 0; i < OPCODE_MAX; i++) { m_dumpstr += "\t"; m_dumpstr += OpCodeStr(i); for (int j = 0; j < (int)(20 - strlen(OpCodeStr(i))); j++) { m_dumpstr += " "; } m_dumpstr += fkitoa(m_codetype[i]); m_dumpstr += "\n"; } return m_dumpstr.c_str(); }
void SessionManager::HandleMyName(TcpSession* session, const char* data, int len) { if (NULL == session || NULL == data) return; int src = session->GetFD(); SessionInfo& sessionInfo = m_Sessions.Get(src); const MessageMyName* msg = reinterpret_cast<const MessageMyName*>(data); if (sessionInfo.IsValid()){ MessageMyHandle handleMsg; handleMsg.m_Handle = src; session->Send(reinterpret_cast<const char*>(&handleMsg), sizeof(MessageMyHandle)); SendNameHandleList(src); tsnprintf(sessionInfo.m_Name, sizeof(sessionInfo.m_Name), "%s", msg->m_Name); BroadcastAddNameHandle(msg->m_Name, src); __Internal_Log("session %d receive (MessageMyName:%s)", src, msg->m_Name); } else { __Internal_Log("session %d can't find session info (MessageMyName:%s)", src, msg->m_Name); } }
//导出Lua脚本中待替换注册函数 //ExportLuaFn.h文件由LuaTool读取 VOID ExportRegName() { //文件路径名 CHAR buf[256]; tsnprintf(buf,256,__FILE__); CHAR* pStr = strrchr(buf,'\\'); strcpy(pStr+1,"ExportLuaFn.h"); FILE* fpScriptFile = NULL; for(INT i=0;i<numReg;i++) { BOOL toggle = FALSE; for(INT j=0;j<regInfo[i].regCount;j++) { if(strcmp(regInfo[i].funcname,regInfo[i].regname[j])) { if(!fpScriptFile) fpScriptFile = fopen(buf,"w"); if(toggle == FALSE) { toggle = TRUE; fprintf(fpScriptFile,"\n"); } //格式 //{"AddEventList",}, fprintf(fpScriptFile,"\"%s\"",regInfo[i].regname[j]); } } if(toggle == TRUE) fprintf(fpScriptFile,",%s",regInfo[i].funcname); } if(fpScriptFile) fclose(fpScriptFile); }
FAKE_API const char * fkgetfilecode(fake * fk, const char * filename, int line) { if (!filename || line <= 0) { return 0; } char buff[512]; FILE * file = fopen(filename, "rb"); if (!file) { tsnprintf(buff, sizeof(buff), "open file(%s:%d) fail", filename, line); fk->rn.curcode = buff; return fk->rn.curcode.c_str(); } int i = 0; while (!feof(file)) { if (!fgets(buff, sizeof(buff), file)) { return 0; } i++; if (i >= line) { fclose(file); fk->rn.curcode = buff; return fk->rn.curcode.c_str(); } } fclose(file); return 0; }
extern "C" void Init(const char* serverType, int argc, char* argv[], HandleNameHandleChangedPtr nameHandleCallback, HandleMessagePtr msgCallback, HandleMessageResultPtr msgResultCallback, HandleCommandPtr cmdCallback) { #if defined(__LINUX__) signal(SIGPIPE, SIG_IGN); #endif InitConfigState(serverType, argc, argv); const char* pIp = GetConfig("ip"); if (NULL == pIp) pIp = "127.0.0.1"; const char* pPort = GetConfig("port"); int port = 20000; if (NULL != pPort) port = (int)atoi(pPort); tsnprintf(g_Ip, sizeof(g_Ip), "%s", pIp); g_Port = port; g_HandleNameHandleChangedPtr = nameHandleCallback; g_HandleMessagePtr = msgCallback; g_HandleMessageResultPtr = msgResultCallback; g_HandleCommandPtr = cmdCallback; g_pSessionManager = new SessionManager(); if (NULL != g_pSessionManager) { g_pSessionManager->Init(); g_pSessionManager->UpdateMyName(); } g_pNetIoService = new NetIoService(); g_pNetIoService->Init(); g_EventBase = g_pNetIoService->EventBase(); if (NULL != g_EventBase) { g_Connector = new Connector(g_EventBase); } }
void SlkToken::getBlockString(const char* delimiter) { newToken(); const char* pLeft = mIterator.GetLeft(); const char* pFind = strstr(pLeft, delimiter); if (!pFind) { char* pInfo = mErrorAndStringBuffer->NewErrorInfo(); if (pInfo) tsnprintf(pInfo, MAX_ERROR_INFO_CAPACITY, "[line %d ]:Block can't finish, delimiter: %s!", mLineNumber, delimiter); endToken(); return; } int len = (int)strlen(delimiter); const char* p = pLeft; while (p != pFind){ if (*p == '\n') ++mLineNumber; pushTokenChar(*p++); ++mIterator; } endToken(); mIterator = mIterator + len; return removeFirstAndLastEmptyLine(); }
//需要添加LuaFn注册头的函数 VOID NeedAddLuaFn() { //文件路径名 CHAR buf[256]; tsnprintf(buf,256,__FILE__); CHAR* pStr = strrchr(buf,'\\'); strcpy(pStr+1,"NeedAddLuaFn.h"); FILE* fpScriptFile = NULL; for(INT i=0;i<numReg;i++) { BOOL toggle = FALSE; for(INT j=0;j<regInfo[i].regCount;j++) { if(!strcmp(regInfo[i].funcname,regInfo[i].regname[j])) { toggle = TRUE; break; } } if(!toggle) { if(!fpScriptFile) fpScriptFile = fopen(buf,"w"); //格式 //{"AddEventList",FuncProto(LuaFnAddNumText)}, fprintf(fpScriptFile,"{\"%s\",FuncProto(%s)},\n",regInfo[i].funcname,regInfo[i].funcname); } } if(fpScriptFile) fclose(fpScriptFile); }
void SlkToken::setScriptDelimiter(const char* begin, const char* end) { tsnprintf(mScriptBeginDelimiter, c_MaxDelimiterSize, "%s", begin); tsnprintf(mScriptEndDelimiter, c_MaxDelimiterSize, "%s", end); }
short SlkToken::get(void) { if (NULL == mSource || NULL == mErrorAndStringBuffer) { return END_OF_SLK_INPUT_; } for (;;) { if (*mIterator == '\0') { if (isCanFinish()) { newToken(); endTokenWithEof(); return END_OF_SLK_INPUT_; } else { if (!mIterator.Load()) { newToken(); endTokenWithEof(); return END_OF_SLK_INPUT_; } } } int isSkip = TRUE; //跳过注释与白空格 for (; isSkip && *mIterator != '\0';) { isSkip = FALSE; for (; isWhiteSpace(*mIterator); ++mIterator) { if (*mIterator == '\n') { ++mLineNumber; if (mCommentNum <= 0) { mCommentOnNewLine = TRUE; } } isSkip = TRUE; } //#引导的单行注释 if (*mIterator == '#') { newComment(); for (; *mIterator != '\0' && *mIterator != '\n'; ++mIterator) { if (*mIterator != '\r') pushCommentChar(*mIterator); } endComment(); isSkip = TRUE; } //C++风格的单行注释与多行注释 if (*mIterator == '/' && (*(mIterator + 1) == '/' || *(mIterator + 1) == '*')) { newComment(); pushCommentChar(*mIterator); ++mIterator; if (*mIterator == '/') { pushCommentChar(*mIterator); ++mIterator; for (; *mIterator != '\0' && *mIterator != '\n'; ++mIterator) { if (*mIterator != '\r') pushCommentChar(*mIterator); } isSkip = TRUE; } else if (*mIterator == '*') { pushCommentChar(*mIterator); ++mIterator; for (;;) { if (*mIterator != '\0') { if (*mIterator == '\n') { pushCommentChar(*mIterator); ++mLineNumber; } else if (*mIterator == '*' && *(mIterator + 1) == '/') { pushCommentChar(*mIterator); ++mIterator; pushCommentChar(*mIterator); ++mIterator; break; } else if (*mIterator != '\r') { pushCommentChar(*mIterator); } } else { if (mIterator.Load()) { continue; } else { endComment(); newToken(); endTokenWithEof(); return END_OF_SLK_INPUT_; } } ++mIterator; } isSkip = TRUE; } endComment(); } } if (*mIterator != '\0') break; } newToken(); if (isCanFinish()) setCanFinish(FALSE); if (*mIterator == '{' && *(mIterator + 1) == ':') { ++mIterator; ++mIterator; int line = mLineNumber; //搜索脚本结束 :} for (; *mIterator != '\0';) { while (*mIterator != '\0' && *mIterator != ':') { if (*mIterator == '\n')++mLineNumber; pushTokenChar(*mIterator); ++mIterator; } if (*mIterator == '\0') break; IScriptSource::Iterator next = mIterator + 1; if (*next == '}') { ++mIterator; ++mIterator; break; } else { pushTokenChar(*mIterator); ++mIterator; } } if (*mIterator == '\0') { char* pInfo = mErrorAndStringBuffer->NewErrorInfo(); if (pInfo) tsnprintf(pInfo, MAX_ERROR_INFO_CAPACITY, "[line %d ]:ExternScript can't finish!", line); } endToken(); if (myhavelinefeed(mCurToken)){ removeFirstAndLastEmptyLine(); } return SCRIPT_CONTENT_; } else if (isOperator(*mIterator)) {//操作符 getOperatorToken(); return getOperatorTokenValue(); } else if (*mIterator == '.' && 0 == myisdigit(*(mIterator + 1), FALSE)) { char c = *mIterator; ++mIterator; pushTokenChar(c); endToken(); return DOT_; } else if (*mIterator == '(') { ++mIterator; pushTokenChar('('); endToken(); return LPAREN_; } else if (*mIterator == ')') { ++mIterator; pushTokenChar(')'); endToken(); return RPAREN_; } else if (*mIterator == '[') { ++mIterator; pushTokenChar('['); endToken(); return LBRACK_; } else if (*mIterator == ']') { ++mIterator; pushTokenChar(']'); endToken(); return RBRACK_; } else if (*mIterator == '{') { ++mIterator; pushTokenChar('{'); endToken(); return LBRACE_; } else if (*mIterator == '}') { ++mIterator; pushTokenChar('}'); endToken(); return RBRACE_; } else if (*mIterator == ',') { ++mIterator; pushTokenChar(','); endToken(); return COMMA_; } else if (*mIterator == ';') { ++mIterator; pushTokenChar(';'); endToken(); return SEMI_; } else {//关键字、标识符或常数 if (*mIterator == '"' || *mIterator == '\'') {//引号括起来的名称或关键字 int line = mLineNumber; char c = *mIterator; for (++mIterator; *mIterator != '\0' && *mIterator != c;) { if (*mIterator == '\n')++mLineNumber; if (*mIterator == '\\') { //pushTokenChar(*mIterator); ++mIterator; } pushTokenChar(*mIterator); ++mIterator; if (*mIterator == '\0') { if (mIterator.Load()) { continue; } else { char* pInfo = mErrorAndStringBuffer->NewErrorInfo(); if (pInfo) tsnprintf(pInfo, MAX_ERROR_INFO_CAPACITY, "[line %d ]:String can't finish!", line); endTokenWithEof(); return END_OF_SLK_INPUT_; } } } if (*mIterator != '\0') { ++mIterator; } else { char* pInfo = mErrorAndStringBuffer->NewErrorInfo(); if (pInfo) tsnprintf(pInfo, MAX_ERROR_INFO_CAPACITY, "[line %d ]:String can't finish!", line); } endToken(); if (myhavelinefeed(mCurToken)){ removeFirstAndLastEmptyLine(); } return STRING_; } else { int isNum = TRUE; int isHex = FALSE; if (*mIterator == '0' && *(mIterator + 1) == 'x') { isHex = TRUE; pushTokenChar(*mIterator); ++mIterator; pushTokenChar(*mIterator); ++mIterator; } for (; !isSpecialChar(*mIterator); ++mIterator) { if (*mIterator == '#') break; else if (*mIterator == '/') { IScriptSource::Iterator next = mIterator + 1; if (*next != '\0' && (*next == '/' || *next == '*')) { break; } } else if (*mIterator == '.') { if (!isNum) { break; } else { IScriptSource::Iterator next = mIterator + 1; if (0 == myisdigit(*next, isHex)) { break; } } } else if (0 == myisdigit(*mIterator, isHex)) { isNum = FALSE; } pushTokenChar(*mIterator); } endToken(); if (isNum) { return NUMBER_; } else { int token = handleStringOrScriptDelimiter(); if (token) return token; return IDENTIFIER_; } } } }
VOID Config::LoadConfigInfo_ReLoad( ) {//可以重复读取的数据 __ENTER_FUNCTION Ini ini( FILE_CONFIG_INFO ) ; CHAR szText[32]; ini.ReadText( "Global", "DropParam", szText, sizeof( szText ) -1 ) ; m_ConfigInfo.m_DropParam = (FLOAT)(atof( szText )); ini.ReadText( "Global", "ExpParam", szText, sizeof( szText ) -1 ) ; m_ConfigInfo.m_ExpParam = (FLOAT)(atof( szText )); m_ConfigInfo.m_EquipmentDamagePoint = ini.ReadInt( "Global", "EquipmentDamagePoint" ) ; m_ConfigInfo.m_RecoverTime = ini.ReadInt( "TimeSetting", "RecoverTime" ) ; m_ConfigInfo.m_MaxMonster = ini.ReadInt( "Monster", "MaxCount" ) ; m_ConfigInfo.m_MaxPet = ini.ReadInt( "Pet", "MaxCount" ) ; m_ConfigInfo.m_PetBodyTime = ini.ReadInt( "Pet", "PetBodyTime" ) ; m_ConfigInfo.m_PetHappinessInterval = ini.ReadInt( "Pet", "PetHappinessInterval" ); m_ConfigInfo.m_PetLifeInterval = ini.ReadInt( "Pet", "PetLifeInterval" ); m_ConfigInfo.m_PetCallUpHappiness = ini.ReadInt( "Pet", "PetCallUpHappiness" ); m_ConfigInfo.m_PetPlacardTime = (UINT)(ini.ReadInt( "Pet", "PetPlacardTime" )); m_ConfigInfo.m_PetPlacardNeedLevel = ini.ReadInt( "Pet", "PetPlacardNeedLevel" ); m_ConfigInfo.m_PetPlacardNeedHappiness = ini.ReadInt( "Pet", "PetPlacardNeedHappiness" ); m_ConfigInfo.m_PetPlacardNeedLife = ini.ReadInt( "Pet", "PetPlacardNeedLife" ); m_ConfigInfo.m_DefaultRespawnTime = ini.ReadInt( "Monster", "DefaultRespawnTime" ) ; m_ConfigInfo.m_DropBoxRecycleTime = ini.ReadInt("TimeSetting","DropBoxRecycle"); m_ConfigInfo.m_TimeChangeInterval = ini.ReadInt("TimeSetting","TimeChangeInterval"); m_ConfigInfo.m_PositionRange = ini.ReadInt( "Monster", "DefaultPositionRange" ) ; m_ConfigInfo.m_AIType = ini.ReadInt( "Monster", "DefaultAIType" ) ; m_ConfigInfo.m_DisconnectTime = ini.ReadInt( "TimeSetting", "DisconnectTime" ) ; ini.ReadText( "Temp", "UserPath", m_ConfigInfo.m_UserPath, _MAX_PATH ) ; m_ConfigInfo.m_DefaultBodyTime = ini.ReadInt( "Monster", "DefaultBodyTime" ) ; m_ConfigInfo.m_DefaultRefuseScanTime = ini.ReadInt( "Monster", "DefaultRefuseScanTime"); m_ConfigInfo.m_OutGhostTime = ini.ReadInt( "Human", "OutGhostTime" ) ; m_ConfigInfo.m_CanGetExpRange = (FLOAT)(ini.ReadInt( "Human", "CanGetExpRange" )); m_ConfigInfo.m_DefaultMoveSpeed = ini.ReadInt( "Human", "DefaultMoveSpeed" ) ; m_ConfigInfo.m_DefaultAttackSpeed = ini.ReadInt( "Human", "DefaultAttackSpeed" ) ; m_ConfigInfo.m_HumanVERecoverInterval = ini.ReadInt( "Human", "HumanVERecoverInterval" ) ; m_ConfigInfo.m_WallowAge = ini.ReadInt( "Human", "WallowAge" ) ; m_ConfigInfo.m_WallowStartTime = ini.ReadInt( "Human", "WallowStartTime" ) ; m_ConfigInfo.m_WallowStartTime2 = ini.ReadInt( "Human", "WallowStartTime2" ) ; m_ConfigInfo.m_WallowAwokeTime = ini.ReadInt( "Human", "WallowAwokeTime" ) ; m_ConfigInfo.m_nAvailableFollowDist = ini.ReadInt( "Team", "AvailableFollowDist" ); m_ConfigInfo.m_nTimeForLoseFollow = ini.ReadInt( "Team", "TimeForLoseFollow" ); m_ConfigInfo.m_nFoundDurationHour = ini.ReadInt( "Guild", "FoundDuration" ); m_ConfigInfo.m_nDefaultMaxMemberCount = ini.ReadInt( "Guild", "DefaultMaxMemberCount" ); m_ConfigInfo.m_nResponseUserCount = ini.ReadInt( "Guild", "ResponseUserCount" ); m_ConfigInfo.m_nPasswdPoint = ini.ReadInt( "Relation", "PasswdPoint" ); m_ConfigInfo.m_nPromptPoint = ini.ReadInt( "Relation", "PromptPoint" ); m_ConfigInfo.m_nDeleteDelayTime = ini.ReadInt( "MinorPassword", "DeleteDelayTime" ); m_ConfigInfo.m_nDeleteDelayTime *= 3600; m_ConfigInfo.m_nExpPoint = ini.ReadInt( "Relation", "ExpPoint" ); //m_ConfigInfo.m_DefaultRefreshRate = ini.ReadInt("Obj_Human","DefaultRefreshRate") ; m_ConfigInfo.m_nHashOnlineUserCount = ini.ReadInt( "World", "HashOnlineUserCount" ); m_ConfigInfo.m_nHashMailUserCount = ini.ReadInt( "World", "HashMailUserCount" ); m_ConfigInfo.m_nMaxOfflineUserCount = ini.ReadInt( "World", "MaxOfflineUserCount" ); ini.ReadText( "Global", "RespawnParam", szText, sizeof(szText)-1 ) ; m_ConfigInfo.m_fRespawnParam = (FLOAT)(atof(szText)) ; m_ConfigInfo.m_KickUserTime = ini.ReadInt( "TimeSetting", "KickUserTime" ); m_ConfigInfo.m_nDefaultDamageFluctuation = ini.ReadInt("Combat","DefaultDamageFluctuation"); m_ConfigInfo.m_nMinGoodBadValue = ini.ReadInt( "GoodBad", "MinGoodBadValue" ); m_ConfigInfo.m_nMaxGoodBadValue = ini.ReadInt( "GoodBad", "MaxGoodBadValue" ); m_ConfigInfo.m_nLevelNeeded = ini.ReadInt( "GoodBad", "LevelNeeded" ); m_ConfigInfo.m_nMemberLevel = ini.ReadInt( "GoodBad", "MemberLevel" ); m_ConfigInfo.m_fGoodBadRadius = (FLOAT)ini.ReadInt( "GoodBad", "GoodBadRadius" ); m_ConfigInfo.m_nBonusPerMember = ini.ReadInt( "GoodBad", "BonusPerMember" ); m_ConfigInfo.m_nMaxBonus = ini.ReadInt( "GoodBad", "MaxBonus" ); m_ConfigInfo.m_nPenaltyWhenMemberDie = ini.ReadInt( "GoodBad", "PenaltyWhenMemberDie" ); m_ConfigInfo.m_nWorldChatItemIndex = ini.ReadInt("WorldChat","ItemIndex"); m_ConfigInfo.m_ThisRegion.m_nRegionIndex = ini.ReadInt("ThisRegion","RegionIndex"); ini.ReadText( "ThisRegion", "RegionName", m_ConfigInfo.m_ThisRegion.m_RegionName, _MAX_PATH ) ; m_ConfigInfo.m_nOldRegionCount = ini.ReadInt("OldRegion","RegionCount"); if( m_ConfigInfo.m_nOldRegionCount > 0 ) { m_ConfigInfo.m_OldRegion = new _REGION_INFO[m_ConfigInfo.m_nOldRegionCount]; for( INT i = 0; i < m_ConfigInfo.m_nOldRegionCount; i ++ ) { CHAR szRegionIndex[100]; CHAR szRegionName[100]; tsnprintf( szRegionIndex, 99, "RegionIndex%03d", i+1 ); tsnprintf( szRegionName, 99, "RegionName%03d", i+1 ); m_ConfigInfo.m_OldRegion[i].m_nRegionIndex = ini.ReadInt( "OldRegion", szRegionIndex ) ; ini.ReadText( "OldRegion", szRegionName, m_ConfigInfo.m_OldRegion[i].m_RegionName, _MAX_PATH ) ; } } Log::SaveLog( CONFIG_LOGFILE, "Load ConfigInfo.ini ...ReLoad OK! " ) ; __LEAVE_FUNCTION }
//读Lua函数表文件 VOID ReadLuaFnTblFiles() { CHAR** pScanFile = pLuaFnTblFile; //扫描文件 while(*pScanFile) { CHAR buf[256]; tsnprintf(buf,256,__FILE__); CHAR* pStr = strrchr(buf,'\\'); strcpy(pStr+1,*pScanFile); FILE* fp = fopen(buf,"r"); if( fp != NULL) { CHAR line[_MAX_PATH * 4]; CHAR *pStr1,*pStr2,*pStr3,*pStr4; INT linenum = 0; BOOL commentBegin = FALSE; BOOL beginNamaSpace = FALSE; while( fgets( line, sizeof( line), fp)) { if(strstr(line,"namespace")) beginNamaSpace = TRUE; if(!beginNamaSpace) continue; if(strstr(line,"endnamespace")) break; //找到函数声明 if( (pStr1 = strstr(line,"INT")) && (pStr2 = strstr(line,"Lua_State")) && (pStr2 > pStr1))//简化 { Assert((pStr2 - pStr1) <= NAMELEN); if((pStr2 - pStr1) <= NAMELEN) { const CHAR* temp = GetFuncName(pStr1,pStr2); Q_strncpyz(funcname[numFunc++],temp,NAMELEN); } } //找到已注册函数,没有考虑空格 if((pStr1 = strstr(line,"FuncProto"))) { pStr2 = strstr(line,")"); pStr1 = pStr1 + strlen("FuncProto") + 1; pStr3 = strchr(line,'"'); pStr4 = strchr(pStr3+1,'"'); char szFuncName[NAMELEN]; char szRegName[NAMELEN]; Q_strncpyz(szFuncName,pStr1,pStr2 - pStr1 + 1);//加一 Q_strncpyz(szRegName,pStr3 + 1,pStr4 - pStr3); BOOL toggle = FALSE; INT i; for(i =0;i<numReg;i++) { if(!strcmp(regInfo[i].funcname,szFuncName)) { toggle = TRUE; break; } } if(!toggle) {//第一次注册该函数 Q_strncpyz(regInfo[numReg++].funcname,szFuncName,NAMELEN); Q_strncpyz(regInfo[numReg - 1].regname[regInfo[numReg -1].regCount++],szRegName,NAMELEN); } else { Q_strncpyz(regInfo[i].regname[regInfo[i].regCount++],szRegName,NAMELEN); } } } fclose(fp); } pScanFile++;//扫描下一个文件 } }
void ErrorAndStringBuffer::AddError(const char* error) { char* p = NewErrorInfo(); if (p) tsnprintf(p, MAX_ERROR_INFO_CAPACITY, "%s", error); }
short SlkToken::get(void) { if (NULL == mSource || NULL == mErrorAndStringBuffer) { return END_OF_SLK_INPUT_; } newToken(); for (;;) { if (*mIterator == '\0') { if (isCanFinish()) { endTokenWithEof(); return END_OF_SLK_INPUT_; } else { if (!mIterator.Load()) { endTokenWithEof(); return END_OF_SLK_INPUT_; } } } int isSkip = TRUE; //跳过注释与白空格 for (; isSkip && *mIterator != '\0';) { isSkip = FALSE; for (; isWhiteSpace(*mIterator); ++mIterator) { if (*mIterator == '\n')++mLineNumber; isSkip = TRUE; } //#引导的单行注释 if (*mIterator == '#') { for (; *mIterator != '\0' && *mIterator != '\n'; ++mIterator); isSkip = TRUE; } //C++风格的单行注释与多行注释 if (*mIterator == '/' && (*(mIterator + 1) == '/' || *(mIterator + 1) == '*')) { ++mIterator; if (*mIterator == '/') { ++mIterator; for (; *mIterator != '\0' && *mIterator != '\n'; ++mIterator); isSkip = TRUE; } else if (*mIterator == '*') { ++mIterator; for (;;) { if (*mIterator != '\0') { if (*mIterator == '\n')++mLineNumber; if (*mIterator == '*' && *(mIterator + 1) == '/') { ++mIterator; ++mIterator; break; } } else { if (mIterator.Load()) { continue; } else { endTokenWithEof(); return END_OF_SLK_INPUT_; } } ++mIterator; } isSkip = TRUE; } } } if (*mIterator != '\0') break; } if (isCanFinish()) setCanFinish(FALSE); if (*mIterator == '{' && *(mIterator + 1) == ':') { ++mIterator; ++mIterator; int line = mLineNumber; //搜索脚本结束 :} for (; *mIterator != '\0';) { while (*mIterator != '\0' && *mIterator != ':') { if (*mIterator == '\n')++mLineNumber; pushTokenChar(*mIterator); ++mIterator; } if (*mIterator == '\0') break; IScriptSource::Iterator next = mIterator + 1; if (*next == '}') { ++mIterator; ++mIterator; break; } else { pushTokenChar(*mIterator); ++mIterator; } } if (*mIterator == '\0') { char* pInfo = mErrorAndStringBuffer->NewErrorInfo(); if (pInfo) tsnprintf(pInfo, MAX_ERROR_INFO_CAPACITY, "[line %d ]:ExternScript can't finish!", line); } endToken(); return SCRIPT_CONTENT_; } else if (isOperator(*mIterator))//操作符 { getOperatorToken(); return getOperatorTokenValue(); } else if (*mIterator == '.' && 0 == myisdigit(*(mIterator + 1), FALSE)) { char c = *mIterator; ++mIterator; pushTokenChar(c); endToken(); return DOT_; } else if (isDelimiter(*mIterator))//分隔符 { char c = *mIterator; ++mIterator; pushTokenChar(c); endToken(); switch (c) { case '(': return LPAREN_; case ')': return RPAREN_; case '[': return LBRACK_; case ']': return RBRACK_; case '{': return LBRACE_; case '}': return RBRACE_; case ',': return COMMA_; case ';': return SEMI_; default: return END_OF_SLK_INPUT_; } } else//关键字、标识符或常数 { if (*mIterator == '"' || *mIterator == '\'')//引号括起来的名称或关键字 { int line = mLineNumber; char c = *mIterator; for (++mIterator; *mIterator != '\0' && *mIterator != c;) { if (*mIterator == '\n')++mLineNumber; if (*mIterator == '\\') { //pushTokenChar(*mIterator); ++mIterator; } pushTokenChar(*mIterator); ++mIterator; if (*mIterator == '\0') { if (mIterator.Load()) { continue; } else { char* pInfo = mErrorAndStringBuffer->NewErrorInfo(); if (pInfo) tsnprintf(pInfo, MAX_ERROR_INFO_CAPACITY, "[line %d ]:String can't finish!", line); endTokenWithEof(); return END_OF_SLK_INPUT_; } } } if (*mIterator != '\0') { ++mIterator; } else { char* pInfo = mErrorAndStringBuffer->NewErrorInfo(); if (pInfo) tsnprintf(pInfo, MAX_ERROR_INFO_CAPACITY, "[line %d ]:String can't finish!", line); } endToken(); return STRING_; } else { int isNum = TRUE; int isHex = FALSE; if (*mIterator == '0' && *(mIterator + 1) == 'x') { isHex = TRUE; pushTokenChar(*mIterator); ++mIterator; pushTokenChar(*mIterator); ++mIterator; } for (; *mIterator != '\0' && !isDelimiter(*mIterator) && !isWhiteSpace(*mIterator) && !isOperator(*mIterator); ++mIterator) { if (*mIterator == '#') break; else if (*mIterator == '/') { IScriptSource::Iterator next = mIterator + 1; if (*next != '\0' && (*next == '/' || *next == '*')) { break; } } else if (*mIterator == '.') { if (!isNum) { break; } else { IScriptSource::Iterator next = mIterator + 1; if (0 == myisdigit(*next, isHex)) { break; } } } else if (0 == myisdigit(*mIterator, isHex)) { isNum = FALSE; } pushTokenChar(*mIterator); } endToken(); if (isNum) return NUMBER_; else return IDENTIFIER_; } } }
//写文件 VOID WriteScriptFile() { CHAR buf[256]; tsnprintf(buf,256,__FILE__); CHAR* pStr = strrchr(buf,'\\'); strcpy(pStr+1,"ScriptFuncForDesigner.h"); FILE* fpScriptFile = fopen(buf,"w"); CHAR** pScanFile = pLuaFnTblFile; while(*pScanFile) { CHAR buf[_MAX_PATH]; tsnprintf(buf,256,__FILE__); CHAR* pStr = strrchr(buf,'\\'); strcpy(pStr+1,*pScanFile); FILE* fp = fopen(buf,"r"); if( fp != NULL && fpScriptFile != NULL) { //写文件头 fprintf(fpScriptFile,"%s\t%s\n","脚本系统C导出函数文档",*pScanFile); CHAR line[_MAX_PATH * 4]; CHAR *pStr1,*pStr2;//,*pStr3,*pStr4; INT linenum = 0; BOOL commentBegin = FALSE; BOOL beginNamaSpace = FALSE; BOOL bDelim = FALSE; while( fgets( line, sizeof( line), fp)) { if(strstr(line,"namespace")) beginNamaSpace = TRUE; if(!beginNamaSpace) continue; if(strstr(line,"endnamespace")) break; if(strstr(line,"/**")) { commentBegin = TRUE; } if(strstr(line,"*/")) { fprintf(fpScriptFile,"%s",line); commentBegin = FALSE; } if(commentBegin) { fprintf(fpScriptFile,"%s",line); continue; } if( (pStr1 = strstr(line,"INT")) && (pStr2 = strstr(line,"Lua_State")) && (pStr2 > pStr1))//简化 { Assert((pStr2 - pStr1) <= NAMELEN); const CHAR* temp = GetFuncName(pStr1,pStr2); for(int i=0;i<numReg;i++) { if(!strcmp(regInfo[i].funcname,temp)) { for(int j=0;j<regInfo[i].regCount;j++) fprintf(fpScriptFile,"\t该函数注册为 %s\n",regInfo[i].regname[j]); } } //剔出Lua_State描述 /*char* pDelim = strchr(line,','); if(pDelim){ char szLine[_MAX_PATH]; memset(szLine,0,_MAX_PATH); strncpy(szLine,line,pStr2-line); strcat(szLine,++pDelim); fprintf(fpScriptFile,"%s\n\n",szLine); } else{*/ //fprintf(fpScriptFile,"%s\n\n",line); //} char* pDelim = strchr(line,'{'); if(pDelim == NULL){ bDelim = TRUE; //fprintf(fpScriptFile,"%s",line); } else{ fprintf(fpScriptFile,"%s\n\n",line); } } if(strchr(line,'{') && bDelim == TRUE) { fprintf(fpScriptFile,"\n\n"); bDelim = FALSE; } if(bDelim) { fprintf(fpScriptFile,"%s",line); } } fclose(fp); } pScanFile++;//读下一个文件 } if(fpScriptFile) { //写文件尾 fprintf(fpScriptFile,"文档生成日期:%d年%d月%d日%d时",g_pTimeManager->GetYear(),g_pTimeManager->GetMonth(),g_pTimeManager->GetDay(),g_pTimeManager->GetHour()); fclose(fpScriptFile); } }