diff --git a/amxmodx/AMBuilder b/amxmodx/AMBuilder index bc954f51..5090cee5 100644 --- a/amxmodx/AMBuilder +++ b/amxmodx/AMBuilder @@ -41,7 +41,6 @@ if builder.target_platform == 'mac': binary.sources = [ 'meta_api.cpp', - 'CFile.cpp', 'CVault.cpp', 'vault.cpp', 'float.cpp', diff --git a/amxmodx/CCmd.cpp b/amxmodx/CCmd.cpp index 992a8765..2a6de482 100755 --- a/amxmodx/CCmd.cpp +++ b/amxmodx/CCmd.cpp @@ -35,8 +35,8 @@ CmdMngr::Command::Command(CPluginMngr::CPlugin* pplugin, const char* pcmd, const char szCmd[64], szArg[64]; *szCmd = 0; *szArg = 0; sscanf(pcmd, "%s %s", szCmd, szArg); - command.assign(szCmd); - argument.assign(szArg); + command = szCmd; + argument = szArg; plugin = pplugin; flags = pflags; cmdtype = 0; @@ -200,7 +200,7 @@ bool CmdMngr::registerCmdPrefix(Command* cc) if (*b) { setCmdLink(&(*b)->list, cc, false); - cc->prefix = (*b)->name.size(); + cc->prefix = (*b)->name.length(); return true; } @@ -222,7 +222,7 @@ CmdMngr::CmdPrefix** CmdMngr::findPrefix(const char* nn) while (*aa) { - if (!strncmp((*aa)->name.c_str(), nn, (*aa)->name.size())) + if (!strncmp((*aa)->name.chars(), nn, (*aa)->name.length())) break; aa = &(*aa)->next; } diff --git a/amxmodx/CCmd.h b/amxmodx/CCmd.h index 463e25a2..725a0eae 100755 --- a/amxmodx/CCmd.h +++ b/amxmodx/CCmd.h @@ -33,10 +33,10 @@ public: CPluginMngr::CPlugin* plugin; CmdMngr* parent; - String command; - String argument; - String commandline; - String info; + ke::AString command; + ke::AString argument; + ke::AString commandline; + ke::AString info; bool listable; int function; @@ -49,12 +49,12 @@ public: Command(CPluginMngr::CPlugin* pplugin, const char* pcmd, const char* pinfo, int pflags, int pfunc, bool pviewable, CmdMngr* pparent); ~Command(); public: - inline const char* getCommand() { return command.c_str(); } - inline const char* getArgument() { return argument.c_str(); } - inline const char* getCmdInfo() { return info.c_str(); } - inline const char* getCmdLine() { return commandline.c_str(); } - inline bool matchCommandLine(const char* cmd, const char* arg) { return (!stricmp(command.c_str() + prefix, cmd + prefix) && (argument.empty() || !stricmp(argument.c_str(), arg))); } - inline bool matchCommand(const char* cmd) { return (!stricmp(command.c_str(), cmd)); } + inline const char* getCommand() { return command.chars(); } + inline const char* getArgument() { return argument.chars(); } + inline const char* getCmdInfo() { return info.chars(); } + inline const char* getCmdLine() { return commandline.chars(); } + inline bool matchCommandLine(const char* cmd, const char* arg) {return (!stricmp(command.chars() + prefix, cmd + prefix) && (!argument.length() || !stricmp(argument.chars(), arg)));} + inline bool matchCommand(const char* cmd) { return (!stricmp(command.chars(), cmd)); } inline int getFunction() const { return function; } inline bool gotAccess(int f) const { return (!flags || ((flags & f) != 0)); } inline CPluginMngr::CPlugin* getPlugin() { return plugin; } @@ -83,7 +83,7 @@ private: struct CmdPrefix { - String name; + ke::AString name; CmdMngr* parent; CmdLink* list; CmdPrefix* next; diff --git a/amxmodx/CEvent.cpp b/amxmodx/CEvent.cpp index da5e8c2f..3257dfd5 100755 --- a/amxmodx/CEvent.cpp +++ b/amxmodx/CEvent.cpp @@ -169,7 +169,7 @@ void EventsMngr::ClEvent::registerFilter(char *filter) tmpCond->paramId = atoi(filter); // rest of line - tmpCond->sValue.assign(value); + tmpCond->sValue = value; tmpCond->fValue = static_cast(atof(value)); tmpCond->iValue = atoi(value); @@ -388,9 +388,9 @@ void EventsMngr::parseValue(const char *sz) anyConditions = true; switch (condIter->type) { - case '=': if (!strcmp(sz, condIter->sValue.c_str())) execute = true; break; - case '!': if (strcmp(sz, condIter->sValue.c_str())) execute = true; break; - case '&': if (strstr(sz, condIter->sValue.c_str())) execute = true; break; + case '=': if (!strcmp(sz, condIter->sValue.chars())) execute = true; break; + case '!': if (strcmp(sz, condIter->sValue.chars())) execute = true; break; + case '&': if (strstr(sz, condIter->sValue.chars())) execute = true; break; } if (execute) diff --git a/amxmodx/CEvent.h b/amxmodx/CEvent.h index 5ab0e785..e9729165 100755 --- a/amxmodx/CEvent.h +++ b/amxmodx/CEvent.h @@ -69,7 +69,7 @@ public: { int paramId; // the message parameter id - String sValue; // value (string) + ke::AString sValue; // value (string) float fValue; // value (float) int iValue; // value (int) int type; // type (can be int, float, string) diff --git a/amxmodx/CFile.cpp b/amxmodx/CFile.cpp deleted file mode 100755 index c8da0a9c..00000000 --- a/amxmodx/CFile.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// vim: set ts=4 sw=4 tw=99 noet: -// -// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). -// Copyright (C) The AMX Mod X Development Team. -// -// This software is licensed under the GNU General Public License, version 3 or higher. -// Additional exceptions apply. For full license details, see LICENSE.txt or visit: -// https://alliedmods.net/amxmodx-license - -#include -#include "amxmodx.h" -#include "CFile.h" - -// ***************************************************** -// class File -// ***************************************************** - -File::File(const char* n, const char* m) -{ - fp = fopen(n, m); -} - -File::~File() -{ - if (fp) - fclose(fp); -} - -File::operator bool () const -{ - return fp && !feof(fp); -} - -File& operator<<(File& f, const String& n) -{ - if (f) fputs(n.c_str(), f.fp); - return f; -} - -File& operator<<(File& f, const char* n) -{ - if (f) fputs(n, f.fp); - return f; -} - -File& operator<<(File& f, int n) -{ - if (f) fprintf(f.fp, "%d", n); - return f; -} - -File& operator<<(File& f, const char& c) -{ - if (f) fputc(c, f.fp); - return f; -} - -File& operator>>(File& f, String& n) -{ - if (!f) return f; - char temp[1024]; - fscanf(f.fp, "%s", temp); - n.assign(temp); - return f; -} - -File& operator>>(File& f, char* n) -{ - if (f) fscanf(f.fp, "%s", n); - return f; -} - -int File::getline(char* buf, int sz) -{ - int a = sz; - char *origBuf = buf; - - if (*this) - { - int c; - while (sz-- && (c = getc((*this).fp)) && c != EOF && c != '\n') - *buf++ = c; - *buf = 0; - } - - // trim 0x0a and 0x0d characters at the end - while (buf != origBuf) - { - if (*buf == 0x0a || *buf == 0x0d) - *buf = 0; - --buf; - } - - return a - sz; -} - -File& File::skipWs() -{ - if (!*this) return *this; - int c; - while (isspace(c = getc(fp))) {}; - ungetc(c, fp); - return *this; -} diff --git a/amxmodx/CFile.h b/amxmodx/CFile.h deleted file mode 100755 index b1428d90..00000000 --- a/amxmodx/CFile.h +++ /dev/null @@ -1,37 +0,0 @@ -// vim: set ts=4 sw=4 tw=99 noet: -// -// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). -// Copyright (C) The AMX Mod X Development Team. -// -// This software is licensed under the GNU General Public License, version 3 or higher. -// Additional exceptions apply. For full license details, see LICENSE.txt or visit: -// https://alliedmods.net/amxmodx-license - -#include -#include "CString.h" - -// ***************************************************** -// class File -// ***************************************************** - -class File -{ - FILE* fp; - -public: - File(const char* n, const char* m); - ~File(); - - operator bool () const; - - friend File& operator<<(File& f, const String& n); - friend File& operator<<(File& f, const char* n); - friend File& operator<<(File& f, const char& c); - friend File& operator<<(File& f, int n); - friend File& operator>>(File& f, String& n); - friend File& operator>>(File& f, char* n); - - int getline(char* buf, int sz); - - File& skipWs(); -}; diff --git a/amxmodx/CFlagManager.cpp b/amxmodx/CFlagManager.cpp index dfd2ef19..01800830 100644 --- a/amxmodx/CFlagManager.cpp +++ b/amxmodx/CFlagManager.cpp @@ -10,23 +10,14 @@ #include #include #include - #include "sh_list.h" -#include "CString.h" - #include "amxmodx.h" #include "CFlagManager.h" void CFlagManager::SetFile(const char *Filename) { - - m_strConfigFile.assign(g_mod_name.c_str()); - m_strConfigFile.append("/"); - m_strConfigFile.append(get_localinfo("amxx_configsdir","addons/amxmodx/configs")); - m_strConfigFile.append("/"); - m_strConfigFile.append(Filename); - + m_strConfigFile = build_pathname("%s/%s", get_localinfo("amxx_configsdir", "addons/amxmodx/configs"), Filename); CreateIfNotExist(); } @@ -53,28 +44,25 @@ const int CFlagManager::LoadFile(const int force) FILE *File; - File=fopen(m_strConfigFile.c_str(),"r"); + File=fopen(GetFile(),"r"); if (!File) { - AMXXLOG_Log("[AMXX] FlagManager: Cannot open file \"%s\" (FILE pointer null!)",m_strConfigFile.c_str()); + AMXXLOG_Log("[AMXX] FlagManager: Cannot open file \"%s\" (FILE pointer null!)", GetFile()); return -1; }; // Trying to copy this almost exactly as other configs are read... - String Line; + char Line[512]; + char TempLine[512]; char Command[256]; char Flags[256]; - String TempLine; - while (!feof(File)) + + while (!feof(File) && fgets(Line, sizeof(Line), File)) { - - Line._fread(File); - - char *nonconst=const_cast(Line.c_str()); - + char *nonconst= Line; // Strip out comments while (*nonconst) @@ -93,9 +81,9 @@ const int CFlagManager::LoadFile(const int force) Flags[0]='\0'; // Extract the command - TempLine.assign(Line.c_str()); + strncopy(TempLine, Line, sizeof(TempLine)); - nonconst=const_cast(TempLine.c_str()); + nonconst = TempLine; char *start=NULL; char *end=NULL; @@ -131,7 +119,6 @@ done_with_command: strncpy(Command,start,sizeof(Command)-1); - // Now do the same thing for the flags nonconst=++end; @@ -168,11 +155,8 @@ done_with_flags: strncpy(Flags,start,sizeof(Flags)-1); - - //if (!isalnum(*Command)) - if (*Command == '"' || - *Command == '\0') + if (*Command == '"' || *Command == '\0') { continue; }; @@ -182,14 +166,12 @@ done_with_flags: AddFromFile(const_cast(&Command[0]),&Flags[0]); - nonconst=const_cast(Line.c_str()); - *nonconst='\0'; + nonconst = Line; + *nonconst = '\0'; }; - fclose(File); - return 1; } @@ -235,7 +217,7 @@ void CFlagManager::LookupOrAdd(const char *Command, int &Flags, AMX *Plugin) while (iter!=end) { - if (strcmp((*iter)->GetName()->c_str(),Command)==0) + if (strcmp((*iter)->GetName()->chars(),Command)==0) { CFlagEntry *Entry=(*iter); @@ -292,7 +274,7 @@ void CFlagManager::WriteCommands(void) // after we write so we do not re-read next map struct stat TempStat; - stat(m_strConfigFile.c_str(),&TempStat); + stat(GetFile(), &TempStat); @@ -302,7 +284,7 @@ void CFlagManager::WriteCommands(void) }; - File=fopen(m_strConfigFile.c_str(),"a"); + File = fopen(GetFile(), "a"); if (!File) { @@ -318,13 +300,13 @@ void CFlagManager::WriteCommands(void) { if ((*iter)->NeedWritten()) { - if ((*iter)->GetComment()->size()) + if ((*iter)->GetComment()->length()) { - fprintf(File,"\"%s\" \t\"%s\" ; %s\n",(*iter)->GetName()->c_str(),(*iter)->GetFlags()->c_str(),(*iter)->GetComment()->c_str()); + fprintf(File,"\"%s\" \t\"%s\" ; %s\n",(*iter)->GetName()->chars(),(*iter)->GetFlags()->chars(),(*iter)->GetComment()->chars()); } else { - fprintf(File,"\"%s\" \t\"%s\"\n",(*iter)->GetName()->c_str(),(*iter)->GetFlags()->c_str()); + fprintf(File,"\"%s\" \t\"%s\"\n",(*iter)->GetName()->chars(),(*iter)->GetFlags()->chars()); } (*iter)->SetNeedWritten(0); } @@ -339,7 +321,7 @@ void CFlagManager::WriteCommands(void) // next map if (!NeedToRead) { - stat(m_strConfigFile.c_str(),&TempStat); + stat(GetFile(), &TempStat); m_Stat.st_mtime=TempStat.st_mtime; diff --git a/amxmodx/CFlagManager.h b/amxmodx/CFlagManager.h index fd49c700..cec800a3 100644 --- a/amxmodx/CFlagManager.h +++ b/amxmodx/CFlagManager.h @@ -15,16 +15,15 @@ #include #include "sh_list.h" -#include "CString.h" - #include "amxmodx.h" +#include "CLibrarySys.h" class CFlagEntry { private: - String m_strName; // command name ("amx_slap") - String m_strFlags; // string flags ("a","b") - String m_strComment; // comment to write ("; admincmd.amxx") + ke::AString m_strName; // command name ("amx_slap") + ke::AString m_strFlags; // string flags ("a","b") + ke::AString m_strComment; // comment to write ("; admincmd.amxx") int m_iFlags; // bitmask flags int m_iNeedWritten; // write this command on map change? int m_iHidden; // set to 1 when the command is set to "!" access in @@ -48,16 +47,17 @@ public: m_iNeedWritten=i; }; - const String *GetName(void) const + const ke::AString *GetName(void) const { return &m_strName; }; - const String *GetFlags(void) const + const ke::AString *GetFlags(void) const { return &m_strFlags; }; - const String *GetComment(void) const + + const ke::AString *GetComment(void) const { return &m_strComment; }; @@ -69,7 +69,7 @@ public: void SetName(const char *data) { - m_strName.assign(data); + m_strName = data; }; void SetFlags(const char *flags) { @@ -80,7 +80,7 @@ public: return; } - m_strFlags.assign(flags); + m_strFlags = flags; m_iFlags=UTIL_ReadFlags(flags); }; void SetFlags(const int flags) @@ -90,11 +90,11 @@ public: char FlagsString[32]; UTIL_GetFlags(FlagsString, flags); - m_strFlags.assign(FlagsString); + m_strFlags = FlagsString; }; void SetComment(const char *comment) { - m_strComment.assign(comment); + m_strComment = comment; }; void SetHidden(int i=1) { @@ -109,7 +109,7 @@ class CFlagManager { private: List m_FlagList; - String m_strConfigFile; + ke::AString m_strConfigFile; struct stat m_Stat; int m_iForceRead; int m_iDisabled; @@ -119,12 +119,12 @@ private: { FILE *fp; - fp=fopen(m_strConfigFile.c_str(),"r"); + fp = fopen(GetFile(), "r"); if (!fp) { // File does not exist, create the header - fp=fopen(m_strConfigFile.c_str(),"a"); + fp = fopen(GetFile(), "a"); if (fp) { @@ -152,7 +152,7 @@ private: { struct stat TempStat; - stat(m_strConfigFile.c_str(),&TempStat); + stat(GetFile(), &TempStat); // If the modified timestamp does not match the stored // timestamp than we need to re-read this file. @@ -184,7 +184,7 @@ public: */ void SetFile(const char *Filename="cmdaccess.ini"); - const char *GetFile(void) const { return m_strConfigFile.c_str(); }; + const char *GetFile(void) const { return m_strConfigFile.chars(); }; /** * Parse the file, and load all entries diff --git a/amxmodx/CForward.cpp b/amxmodx/CForward.cpp index ab24f5cc..49952f5d 100755 --- a/amxmodx/CForward.cpp +++ b/amxmodx/CForward.cpp @@ -30,11 +30,11 @@ CForward::CForward(const char *name, ForwardExecType et, int numParams, const Fo AMXForward tmp; tmp.pPlugin = &(*iter); tmp.func = func; - m_Funcs.push_back(tmp); + m_Funcs.append(tmp); } } - m_Name.assign(name); + m_Name = name; } cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays) @@ -46,14 +46,14 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays) cell globRetVal = 0; - AMXForwardList::iterator iter; - - for (iter = m_Funcs.begin(); iter != m_Funcs.end(); iter++) + for (size_t i = 0; i < m_Funcs.length(); ++i) { + auto iter = &m_Funcs[i]; + if (iter->pPlugin->isExecutable(iter->func)) { // Get debug info - AMX *amx = (*iter).pPlugin->getAMX(); + AMX *amx = iter->pPlugin->getAMX(); Debugger *pDebugger = (Debugger *)amx->userdata[UD_DEBUGGER]; if (pDebugger) @@ -103,7 +103,7 @@ cell CForward::execute(cell *params, ForwardPreparedArray *preparedArrays) // exec cell retVal = 0; #if defined BINLOG_ENABLED - g_BinLog.WriteOp(BinLog_CallPubFunc, (*iter).pPlugin->getId(), iter->func); + g_BinLog.WriteOp(BinLog_CallPubFunc, iter->pPlugin->getId(), iter->func); #endif int err = amx_Exec(amx, &retVal, iter->func); @@ -196,7 +196,7 @@ void CSPForward::Set(int func, AMX *amx, int numParams, const ForwardParam *para isFree = false; name[0] = '\0'; amx_GetPublic(amx, func, name); - m_Name.assign(name); + m_Name = name; m_ToDelete = false; m_InExec = false; } @@ -208,7 +208,7 @@ void CSPForward::Set(const char *funcName, AMX *amx, int numParams, const Forwar memcpy((void *)m_ParamTypes, paramTypes, numParams * sizeof(ForwardParam)); m_HasFunc = (amx_FindPublic(amx, funcName, &m_Func) == AMX_ERR_NONE); isFree = false; - m_Name.assign(funcName); + m_Name = funcName; m_ToDelete = false; m_InExec = false; } @@ -340,7 +340,7 @@ cell CSPForward::execute(cell *params, ForwardPreparedArray *preparedArrays) int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int numParams, const ForwardParam * paramTypes) { - int retVal = m_Forwards.size() << 1; + int retVal = m_Forwards.length() << 1; CForward *tmp = new CForward(funcName, et, numParams, paramTypes); if (!tmp) @@ -348,7 +348,7 @@ int CForwardMngr::registerForward(const char *funcName, ForwardExecType et, int return -1; // should be invalid } - m_Forwards.push_back(tmp); + m_Forwards.append(tmp); return retVal; } @@ -369,7 +369,7 @@ int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const For m_FreeSPForwards.pop(); } else { - retVal = (m_SPForwards.size() << 1) | 1; + retVal = (m_SPForwards.length() << 1) | 1; pForward = new CSPForward(); if (!pForward) @@ -383,7 +383,7 @@ int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const For delete pForward; } - m_SPForwards.push_back(pForward); + m_SPForwards.append(pForward); } return retVal; @@ -391,7 +391,7 @@ int CForwardMngr::registerSPForward(int func, AMX *amx, int numParams, const For int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParams, const ForwardParam *paramTypes) { - int retVal = (m_SPForwards.size() << 1) | 1; + int retVal = (m_SPForwards.length() << 1) | 1; CSPForward *pForward; if (!m_FreeSPForwards.empty()) @@ -418,7 +418,7 @@ int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParam return -1; } - m_SPForwards.push_back(pForward); + m_SPForwards.append(pForward); } return retVal; @@ -426,7 +426,7 @@ int CForwardMngr::registerSPForward(const char *funcName, AMX *amx, int numParam bool CForwardMngr::isIdValid(int id) const { - return (id >= 0) && ((id & 1) ? (static_cast(id >> 1) < m_SPForwards.size()) : (static_cast(id >> 1) < m_Forwards.size())); + return (id >= 0) && ((id & 1) ? (static_cast(id >> 1) < m_SPForwards.length()) : (static_cast(id >> 1) < m_Forwards.length())); } cell CForwardMngr::executeForwards(int id, cell *params) @@ -484,24 +484,26 @@ ForwardParam CForwardMngr::getParamType(int id, int paramNum) const void CForwardMngr::clear() { - for (ForwardVec::iterator iter = m_Forwards.begin(); iter != m_Forwards.end(); ++iter) + size_t i; + + for (i = 0; i < m_Forwards.length(); ++i) { - delete *iter; + delete m_Forwards[i]; } - - SPForwardVec::iterator spIter; - - for (spIter = m_SPForwards.begin(); spIter != m_SPForwards.end(); ++spIter) + + for (i = 0; i < m_SPForwards.length(); ++i) { - delete (*spIter); + delete m_SPForwards[i]; } m_Forwards.clear(); m_SPForwards.clear(); while (!m_FreeSPForwards.empty()) + { m_FreeSPForwards.pop(); - + } + m_TmpArraysNum = 0; } diff --git a/amxmodx/CForward.h b/amxmodx/CForward.h index f58525e6..4065bbad 100755 --- a/amxmodx/CForward.h +++ b/amxmodx/CForward.h @@ -71,7 +71,7 @@ class CForward const char *m_FuncName; ForwardExecType m_ExecType; int m_NumParams; - String m_Name; + ke::AString m_Name; struct AMXForward { @@ -79,7 +79,7 @@ class CForward int func; }; - typedef CVector AMXForwardList; + typedef ke::Vector AMXForwardList; AMXForwardList m_Funcs; ForwardParam m_ParamTypes[FORWARD_MAX_PARAMS]; @@ -97,12 +97,12 @@ public: int getFuncsNum() const { - return m_Funcs.size(); + return m_Funcs.length(); } const char *getFuncName() const { - return m_Name.c_str(); + return m_Name.chars(); } ForwardParam getParamType(int paramId) const @@ -125,7 +125,7 @@ class CSPForward int m_Func; bool m_HasFunc; - String m_Name; + ke::AString m_Name; bool m_InExec; bool m_ToDelete; @@ -150,7 +150,7 @@ public: const char *getFuncName() const { - return m_Name.c_str(); + return m_Name.chars(); } ForwardParam getParamType(int paramId) const @@ -164,8 +164,8 @@ public: class CForwardMngr { - typedef CVector ForwardVec; - typedef CVector SPForwardVec; + typedef ke::Vector ForwardVec; + typedef ke::Vector SPForwardVec; typedef CStack FreeSPVec; // Free SP Forwards ForwardVec m_Forwards; diff --git a/amxmodx/CLang.cpp b/amxmodx/CLang.cpp index 31da9576..65bcf762 100755 --- a/amxmodx/CLang.cpp +++ b/amxmodx/CLang.cpp @@ -11,8 +11,7 @@ #include "amxmodx.h" #include "CLang.h" #include "format.h" - -CVector FileList; +#include "ITextParsers.h" #define LITIDX_NONE 0 #define LITIDX_BRACKET 1 @@ -24,24 +23,29 @@ CVector FileList; #define INSERT_NEWLINE 4 template<> -int Compare(const String &k1, const String &k2) +int Compare(const ke::AString &k1, const ke::AString &k2) { - return k1.compare(k2.c_str()); + return k1.compare(k2); } template<> -int CompareAlt(char const * const &k1, String const &k2) +int CompareAlt(char const * const &k1, ke::AString const &k2) { - return strcmp(k1, k2.c_str()); + return k2.compare(k1); +} +template<> +int CompareAlt(ke::AString const &k1, ke::AString const &k2) +{ + return k1.compare(k2); } template<> -int HashFunction(const String &k) +int HashFunction(const ke::AString &k) { unsigned long hash = 5381; - register const char *str = k.c_str(); + register const char *str = k.chars(); register char c; - while ((c = *str++)) + while ((c = *str++)) { hash = ((hash << 5) + hash) + c; // hash*33 + c } @@ -54,13 +58,27 @@ int HashAlt(char const * const &k) unsigned long hash = 5381; register const char *str = k; register char c; - while ((c = *str++)) + while ((c = *str++)) { hash = ((hash << 5) + hash) + c; // hash*33 + c } return hash; } +template<> +int HashAlt(ke::AString const &k) +{ + unsigned long hash = 5381; + register const char *str = k.chars(); + register char c; + while ((c = *str++)) + { + hash = ((hash << 5) + hash) + c; // hash*33 + c + } + return hash; +} + + template<> int HashFunction(const int &k) { @@ -70,7 +88,7 @@ int HashFunction(const int &k) template<> int Compare(const int &k1, const int &k2) { - return (k1-k2); + return (k1 - k2); } // strip the whitespaces at the beginning and the end of a string @@ -142,7 +160,7 @@ void CLangMngr::CLang::AddEntry(int key, const char *definition) m_entries++; } - d.definition = new String(definition); + d.definition = new ke::AString(definition); } CLangMngr::CLang::~CLang() @@ -165,21 +183,21 @@ void CLangMngr::CLang::Clear() m_entries = 0; } -void CLangMngr::CLang::MergeDefinitions(CQueue &vec) +void CLangMngr::CLang::MergeDefinitions(ke::Vector &vec) { - String *pDef; + ke::AutoString *pDef; int key = -1; while (!vec.empty()) { - key = vec.front().key; - pDef = vec.front().definition; + auto keydef = vec.popCopy(); - AddEntry(key, pDef->c_str()); + key = keydef.key; + pDef = keydef.definition; - delete vec.front().definition; - - vec.pop(); + AddEntry(key, pDef->ptr()); + + delete pDef; } } @@ -194,7 +212,7 @@ const char * CLangMngr::CLang::GetDef(int key, int &status) } status = 0; - return def.definition->c_str(); + return def.definition->chars(); } int CLangMngr::CLang::Entries() @@ -204,15 +222,6 @@ int CLangMngr::CLang::Entries() /******** CLangMngr *********/ -inline String &make_string(const char *str) -{ - static String g_temp; - - g_temp.assign(str); - - return g_temp; -} - CLangMngr::CLangMngr() { Clear(); @@ -220,15 +229,15 @@ CLangMngr::CLangMngr() const char * CLangMngr::GetKey(int key) { - if (key < 0 || key >= (int)KeyList.size()) + if (key < 0 || key >= (int)KeyList.length()) return NULL; - return KeyList[key]->c_str(); + return KeyList[key]->chars(); } int CLangMngr::GetKeyEntry(const char *key) { - keytbl_val &val = KeyTable[key]; + keytbl_val &val = KeyTable[ke::AString(key)]; return val.index; } @@ -236,22 +245,21 @@ int CLangMngr::GetKeyEntry(const char *key) int CLangMngr::AddKeyEntry(const char *key) { keytbl_val val; - val.index = static_cast(KeyList.size()); + val.index = static_cast(KeyList.length()); - String *pString = new String(key); - KeyList.push_back(pString); + KeyList.append(new ke::AString(key)); - KeyTable[key] = val; + KeyTable[ke::AString(key)] = val; return val.index; } -int CLangMngr::AddKeyEntry(String &key) +int CLangMngr::AddKeyEntry(ke::AString &key) { - return AddKeyEntry(key.c_str()); + return AddKeyEntry(key.chars()); } -int CLangMngr::GetKeyEntry(String &key) +int CLangMngr::GetKeyEntry(ke::AString &key) { keytbl_val &val = KeyTable[key]; @@ -269,16 +277,16 @@ char * CLangMngr::FormatAmxString(AMX *amx, cell *params, int parm, int &len) return outbuf; } -void CLangMngr::MergeDefinitions(const char *lang, CQueue &tmpVec) +void CLangMngr::MergeDefinitions(const char *lang, ke::Vector &tmpVec) { CLang * language = GetLang(lang); if (language) language->MergeDefinitions(tmpVec); } -void reparse_color(String* def) +void reparse_newlines_and_color(char* def) { - size_t len = def->size(); + size_t len = strlen(def); int offs = 0; int c; @@ -287,21 +295,25 @@ void reparse_color(String* def) for (size_t i = 0; i < len; i++) { - c = def->at(i); - if (c == '^' && (i != len-1)) + c = def[i]; + + if (c == '^' && (i != len - 1)) { - c = def->at(++i); - if (c >= '1' && c <= '4') + c = def[++i]; + + if (c == 'n' || c == 't' || (c >= '1' && c <= '4')) { - switch(c) + switch (c) { - case '1' : c = '\x01'; break; - case '2' : c = '\x02'; break; - case '3' : c = '\x03'; break; - case '4' : c = '\x04'; break; + case '1': c = '\x01'; break; + case '2': c = '\x02'; break; + case '3': c = '\x03'; break; + case '4': c = '\x04'; break; + case 'n': c = '\n'; break; + case 't': c = '\t'; break; } - if (!g_bmod_cstrike) // remove completely these two characters if not under CS + if (!g_bmod_cstrike && (c >= '1' && c <= '4')) // remove completely these two characters if not under CS { offs += 2; continue; @@ -310,10 +322,146 @@ void reparse_color(String* def) offs++; } } - def->at(i-offs, c); + + def[i - offs] = c; } - def->at(len-offs, '\0'); + def[len-offs] = '\0'; +} + +struct LangFileData +{ + void reset() + { + multiLine = false; + + *language = '\0'; + *valueBuffer = '\0'; + + clearEntry(); + } + + void clearEntry() + { + entry.key = -1; + entry.definition = nullptr; + } + + bool multiLine; + char language[3]; + char valueBuffer[512]; + ke::AString currentFile; + ke::AString lastKey; + ke::Vector defsQueue; + sKeyDef entry; + +} Data; + +void CLangMngr::ReadINI_ParseStart() +{ + Data.reset(); +} + +bool CLangMngr::ReadINI_NewSection(const char *section, bool invalid_tokens, bool close_bracket, bool extra_tokens, unsigned int *curtok) +{ + if (Data.multiLine) + { + AMXXLOG_Log("New section, unterminated block (file \"%s\" key \"%s\" lang \"%s\")", Data.currentFile.chars(), Data.lastKey.chars(), Data.language); + + Data.clearEntry(); + } + + if (!Data.defsQueue.empty()) + { + MergeDefinitions(Data.language, Data.defsQueue); + } + + Data.reset(); + + Data.language[0] = section[0]; + Data.language[1] = section[1]; + Data.language[2] = '\0'; + + return true; +} + +bool CLangMngr::ReadINI_KeyValue(const char *key, const char *value, bool invalid_tokens, bool equal_token, bool quotes, unsigned int *curtok) +{ + bool colons_token = (key[strlen(key) - 1] == ':'); + + if (!Data.multiLine) + { + Data.lastKey = key; + + if (colons_token || equal_token) + { + int iKey = GetKeyEntry(key); + + if (iKey == -1) + { + iKey = AddKeyEntry(key); + } + + if (equal_token) + { + strncopy(Data.valueBuffer, value, sizeof(Data.valueBuffer)); + + reparse_newlines_and_color(Data.valueBuffer); + + Data.entry.key = iKey; + Data.entry.definition = new ke::AutoString; + *Data.entry.definition = Data.valueBuffer; + + Data.defsQueue.append(Data.entry); + Data.clearEntry(); + } + else if (!value && colons_token) + { + Data.entry.key = iKey; + Data.entry.definition = new ke::AutoString; + + Data.multiLine = true; + } + } + else + { + AMXXLOG_Log("Invalid multi-lingual line (file \"%s\" key \"%s\" lang \"%s\")", Data.currentFile.chars(), Data.lastKey.chars(), Data.language); + } + } + else + { + if (!value && colons_token) + { + strncopy(Data.valueBuffer, Data.entry.definition->ptr(), sizeof(Data.valueBuffer)); + reparse_newlines_and_color(Data.valueBuffer); + + *Data.entry.definition = Data.valueBuffer; + + Data.defsQueue.append(Data.entry); + Data.clearEntry(); + + Data.multiLine = false; + } + else + { + if (!Data.entry.definition) + { + Data.entry.definition = new ke::AutoString(); + } + + *Data.entry.definition = *Data.entry.definition + key; + } + } + + return true; +} + +void CLangMngr::ReadINI_ParseEnd(bool halted) +{ + if (!Data.defsQueue.empty()) + { + MergeDefinitions(Data.language, Data.defsQueue); + } } //this is the file parser for dictionary text files @@ -332,167 +480,60 @@ int CLangMngr::MergeDefinitionFile(const char *file) /** Checks if there is an existing entry with same time stamp. */ time_t timeStamp; if (FileList.retrieve(file, &timeStamp) && fileStat.st_mtime == timeStamp) + { return -1; + } /** If yes, it either means that the entry doesn't exist or the existing entry needs to be updated. */ FileList.replace(file, fileStat.st_mtime); - FILE* fp = fopen(file, "rt"); - if (!fp) + Data.currentFile = file; + + unsigned int line, col; + bool result = textparsers->ParseFile_INI(file, static_cast(this), &line, &col); + + if (!result) { AMXXLOG_Log("[AMXX] Failed to re-open dictionary file: %s", file); return 0; } - // Allocate enough memory to store everything - bool multiline = 0; - int pos = 0, line = 0; - CQueue Defq; - String buf; - char language[3]; - sKeyDef tmpEntry = {NULL, 0}; - - while (!feof(fp)) - { - line++; - buf._fread(fp); - buf.trim(); - if (buf[0] == 0) - continue; - if ((buf[0] == ';') || (buf[0] == '/' && buf[1] == '/')) - continue; - - /* Check for BOM markings, which is only relevant on the first line. - * Not worth it, but it could be moved out of the loop. - */ - if (line == 1 && (buf[0] == (char)0xEF && buf[1] == (char)0xBB && buf[2] == (char)0xBF)) - { - buf.erase(0, 3); - } - - if (buf[0] == '[' && buf.size() >= 3) - { - if (multiline) - { - AMXXLOG_Log("New section, multiline unterminated (file \"%s\" line %d)", file, line); - tmpEntry.key = -1; - tmpEntry.definition = NULL; - } - - if (!Defq.empty()) - { - MergeDefinitions(language, Defq); - } - - language[0] = buf[1]; - language[1] = buf[2]; - language[2] = 0; - } else { - if (!multiline) - { - pos = buf.find('='); - - if (pos > String::npos) - { - String key; - key.assign(buf.substr(0, pos).c_str()); - String def; - def.assign(buf.substr(pos + 1).c_str()); - key.trim(); - key.toLower(); - int iKey = GetKeyEntry(key); - if (iKey == -1) - iKey = AddKeyEntry(key); - tmpEntry.key = iKey; - tmpEntry.definition = new String; - tmpEntry.definition->assign(def.c_str()); - tmpEntry.definition->trim(); - reparse_color(tmpEntry.definition); - tmpEntry.definition->reparse_newlines(); - Defq.push(tmpEntry); - tmpEntry.key = -1; - tmpEntry.definition = NULL; - } else { - pos = buf.find(':'); - - if (pos > String::npos) - { - String key; - key.assign(buf.substr(0, pos).c_str());; - key.trim(); - key.toLower(); - int iKey = GetKeyEntry(key); - if (iKey == -1) - iKey = AddKeyEntry(key); - tmpEntry.key = iKey; - tmpEntry.definition = new String; - multiline = true; - } else { - //user typed a line with no directives - AMXXLOG_Log("Invalid multi-lingual line (file \"%s\" line %d)", file, line); - } - } - } else { - if (buf[0] == ':') - { - reparse_color(tmpEntry.definition); - tmpEntry.definition->reparse_newlines(); - Defq.push(tmpEntry); - tmpEntry.key = -1; - tmpEntry.definition = NULL; - multiline = false; - } else { - if (!tmpEntry.definition) - tmpEntry.definition = new String(); - tmpEntry.definition->append(buf); - } - } // if !multiline - } //if - main - } - - // merge last section - if (!Defq.empty()) - { - MergeDefinitions(language, Defq); - } - fclose(fp); return 1; } // Find a CLang by name, if not found, add it CLangMngr::CLang * CLangMngr::GetLang(const char *name) { - LangVecIter iter; - for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter) + for (size_t iter = 0; iter < m_Languages.length(); ++iter) { - if (strcmp((*iter)->GetName(), name) == 0) - return (*iter); + if (strcmp(m_Languages[iter]->GetName(), name) == 0) + return m_Languages[iter]; } CLang *p = new CLang(name); p->SetMngr(this); - m_Languages.push_back(p); + m_Languages.append(p); return p; } // Find a CLang by name, if not found, return NULL CLangMngr::CLang * CLangMngr::GetLangR(const char *name) { - LangVecIter iter; - for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter) + for (size_t iter = 0; iter < m_Languages.length(); ++iter) { - if (strcmp((*iter)->GetName(), name) == 0) - return (*iter); + if (strcmp(m_Languages[iter]->GetName(), name) == 0) + return m_Languages[iter]; } - return NULL; + return nullptr; } const char *CLangMngr::GetDef(const char *langName, const char *key, int &status) { CLang *lang = GetLangR(langName); - keytbl_val &val = KeyTable.AltFindOrInsert(key); //KeyTable[make_string(key)]; + + keytbl_val &val = KeyTable.AltFindOrInsert(ke::AString(key)); //KeyTable[make_string(key)]; if (lang == NULL) { status = ERR_BADLANG; @@ -522,13 +563,13 @@ void CLangMngr::Clear() KeyTable.clear(); - for (i = 0; i < m_Languages.size(); i++) + for (i = 0; i < m_Languages.length(); i++) { if (m_Languages[i]) delete m_Languages[i]; } - for (i = 0; i < KeyList.size(); i++) + for (i = 0; i < KeyList.length(); i++) { if (KeyList[i]) delete KeyList[i]; @@ -541,23 +582,19 @@ void CLangMngr::Clear() int CLangMngr::GetLangsNum() { - return m_Languages.size(); + return m_Languages.length(); } const char *CLangMngr::GetLangName(int langId) { - int i = 0; - LangVecIter iter; - - for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter) + for (size_t iter = 0; iter < m_Languages.length(); ++iter) { - if (i == langId) + if (iter == langId) { - return (*iter)->GetName(); + return m_Languages[iter]->GetName(); } - i++; } - + return ""; } @@ -572,14 +609,13 @@ bool CLangMngr::LangExists(const char *langName) break; } - LangVecIter iter; - - for (iter = m_Languages.begin(); iter != m_Languages.end(); ++iter) + for (size_t iter = 0; iter < m_Languages.length(); ++iter) { - if (strcmp((*iter)->GetName(), buf) == 0) + if (strcmp(m_Languages[iter]->GetName(), buf) == 0) + { return true; + } } - return false; } diff --git a/amxmodx/CLang.h b/amxmodx/CLang.h index cbeda037..605d5fe1 100755 --- a/amxmodx/CLang.h +++ b/amxmodx/CLang.h @@ -12,6 +12,7 @@ #include "sh_tinyhash.h" #include "sm_stringhashmap.h" +#include #define LANG_SERVER 0 #define LANG_PLAYER -1 @@ -21,7 +22,7 @@ struct sKeyDef { - String *definition; + ke::AutoString* definition; int key; }; @@ -46,7 +47,7 @@ public: ~defentry() { } - String *definition; + ke::AString *definition; }; struct keytbl_val @@ -57,7 +58,7 @@ struct keytbl_val int index; }; -class CLangMngr +class CLangMngr : public ITextListener_INI { class CLang { @@ -72,7 +73,7 @@ class CLangMngr // Get the definition const char *GetDef(int key, int &status); // Add definitions to this language - void MergeDefinitions(CQueue & vec); + void MergeDefinitions(ke::Vector & vec); // Reset this language void Clear(); @@ -102,20 +103,25 @@ class CLangMngr }; public: // Merge definitions into a language - void MergeDefinitions(const char *lang, CQueue &tmpVec); + void MergeDefinitions(const char *lang, ke::Vector &tmpVec); + +public: // ITextListener_INI + void ReadINI_ParseStart(); + void ReadINI_ParseEnd(bool halted); + bool ReadINI_NewSection(const char *section, bool invalid_tokens, bool close_bracket, bool extra_tokens, unsigned int *curtok); + bool ReadINI_KeyValue(const char *key, const char *value, bool invalid_tokens, bool equal_token, bool quotes, unsigned int *curtok); private: // strip lowercase; make lower if needed static size_t strip(char *str, char *newstr, bool makelower = false); - typedef CVector LangVec; - typedef CVector::iterator LangVecIter; + typedef ke::Vector LangVec; LangVec m_Languages; StringHashMap FileList; - CVector KeyList; - THash KeyTable; + ke::Vector KeyList; + THash KeyTable; // Get a lang object (construct if needed) CLang * GetLang(const char *name); @@ -133,12 +139,12 @@ public: char *FormatAmxString(AMX *amx, cell *params, int parm, int &len); void InvalidateCache(); // Get index - int GetKeyEntry(String &key); + int GetKeyEntry(ke::AString &key); int GetKeyEntry(const char *key); // Get key from index const char *GetKey(int key); // Add key - int AddKeyEntry(String &key); + int AddKeyEntry(ke::AString &key); int AddKeyEntry(const char *key); // Get the number of languages diff --git a/amxmodx/CLogEvent.cpp b/amxmodx/CLogEvent.cpp index 7b9c487a..aef64490 100755 --- a/amxmodx/CLogEvent.cpp +++ b/amxmodx/CLogEvent.cpp @@ -35,9 +35,9 @@ int LogEventsMngr::CLogCmp::compareCondition(const char* string) logid = parent->logCounter; if (in) - return result = strstr(string, text.c_str()) ? 0 : 1; + return result = strstr(string, text.chars()) ? 0 : 1; - return result = strcmp(string,text.c_str()); + return result = strcmp(string,text.chars()); } LogEventsMngr::CLogCmp* LogEventsMngr::registerCondition(char* filter) @@ -59,7 +59,7 @@ LogEventsMngr::CLogCmp* LogEventsMngr::registerCondition(char* filter) while (c) { - if ((c->pos == pos) && (c->in == in) && !strcmp(c->text.c_str(), filter)) + if ((c->pos == pos) && (c->in == in) && !strcmp(c->text.chars(), filter)) return c; c = c->next; } diff --git a/amxmodx/CLogEvent.h b/amxmodx/CLogEvent.h index 937d675b..9f5cac90 100755 --- a/amxmodx/CLogEvent.h +++ b/amxmodx/CLogEvent.h @@ -41,7 +41,7 @@ public: friend class CLogEvent; LogEventsMngr* parent; - String text; + ke::AString text; int logid; int pos; diff --git a/amxmodx/CMenu.cpp b/amxmodx/CMenu.cpp index a3d323db..9be097cc 100755 --- a/amxmodx/CMenu.cpp +++ b/amxmodx/CMenu.cpp @@ -34,7 +34,7 @@ int MenuMngr::findMenuId(const char* name, AMX* amx) { for (MenuIdEle* b = headid; b; b = b->next) { - if ((!amx || !b->amx || amx == b->amx) && strstr(name,b->name.c_str())) + if ((!amx || !b->amx || amx == b->amx) && strstr(name,b->name.chars())) return b->id; } diff --git a/amxmodx/CMenu.h b/amxmodx/CMenu.h index 1df6c257..ef48e779 100755 --- a/amxmodx/CMenu.h +++ b/amxmodx/CMenu.h @@ -18,7 +18,7 @@ class MenuMngr { struct MenuIdEle { - String name; + ke::AString name; AMX* amx; MenuIdEle* next; diff --git a/amxmodx/CMisc.cpp b/amxmodx/CMisc.cpp index b6a29b8e..d2ff30a3 100755 --- a/amxmodx/CMisc.cpp +++ b/amxmodx/CMisc.cpp @@ -31,10 +31,10 @@ void CPlayer::Init(edict_t* e, int i) menuexpire = 0.0; newmenu = -1; - death_weapon.clear(); - name.clear(); - ip.clear(); - team.clear(); + death_weapon = nullptr; + name = nullptr; + ip = nullptr; + team = nullptr; } void CPlayer::Disconnect() @@ -81,8 +81,8 @@ int CPlayer::NextHUDChannel() bool CPlayer::Connect(const char* connectname, const char* ipaddress) { - name.assign(connectname); - ip.assign(ipaddress); + name = connectname; + ip = ipaddress; time = gpGlobals->time; death_killer = 0; menu = 0; @@ -239,7 +239,7 @@ void TeamIds::registerTeam(const char* n, int s) while (*a) { - if (strcmp((*a)->name.c_str(),n) == 0) + if (strcmp((*a)->name.chars(),n) == 0) { if (s != -1) { @@ -266,7 +266,7 @@ int TeamIds::findTeamId(const char* n) while (a) { - if (!stricmp(a->name.c_str(), n)) + if (!stricmp(a->name.chars(), n)) return a->id; a = a->next; } @@ -280,7 +280,7 @@ int TeamIds::findTeamIdCase(const char* n) while (a) { - if (!strcmp(a->name.c_str(), n)) + if (!strcmp(a->name.chars(), n)) return a->id; a = a->next; } diff --git a/amxmodx/CMisc.h b/amxmodx/CMisc.h index 276b4714..5b7368cb 100755 --- a/amxmodx/CMisc.h +++ b/amxmodx/CMisc.h @@ -30,9 +30,9 @@ class CPlayer public: edict_t* pEdict; - String name; - String ip; - String team; + ke::AString name; + ke::AString ip; + ke::AString team; bool initialized; bool ingame; @@ -63,7 +63,7 @@ public: int death_killer; int death_victim; bool death_tk; - String death_weapon; + ke::AString death_weapon; int newmenu; int page; @@ -138,7 +138,7 @@ public: class ForceObject { - String filename; + ke::AString filename; FORCE_TYPE type; Vector mins; Vector maxs; @@ -146,7 +146,7 @@ class ForceObject public: ForceObject(const char* n, FORCE_TYPE c, Vector& mi, Vector& ma, AMX* a) : filename(n), type(c), mins(mi), maxs(ma), amx(a) {} - inline const char* getFilename() { return filename.c_str(); } + inline const char* getFilename() { return filename.chars(); } inline AMX* getAMX() { return amx; } Vector& getMin() { return mins; } @@ -203,14 +203,14 @@ public: class CScript { - String filename; + ke::AString filename; AMX* amx; void* code; public: CScript(AMX* aa, void* cc, const char* ff) : filename(ff), amx(aa), code(cc) {} inline AMX* getAMX() { return amx; } - inline const char* getName() { return filename.c_str(); } + inline const char* getName() { return filename.chars(); } inline bool operator==(void* a) { return (amx == (AMX*)a); } inline void* getCode() { return code; } }; @@ -223,7 +223,7 @@ class TeamIds { struct TeamEle { - String name; + ke::AString name; int id; char tid; static char uid; diff --git a/amxmodx/CModule.cpp b/amxmodx/CModule.cpp index 2ff50384..b02743fc 100755 --- a/amxmodx/CModule.cpp +++ b/amxmodx/CModule.cpp @@ -30,7 +30,7 @@ typedef void (*PLUGINSUNLOADING_NEW)(void); CModule::CModule(const char* fname) { - m_Filename.assign(fname); + m_Filename = fname; clear(false); } @@ -51,7 +51,9 @@ void CModule::clear(bool clearFilename) m_Status = MODULE_NONE; if (clearFilename) - m_Filename.assign("unknown"); + { + m_Filename = "unknown"; + } // new m_Amxx = false; @@ -61,7 +63,7 @@ void CModule::clear(bool clearFilename) m_InfoNew.reload = 0; m_MissingFunc = NULL; - for (size_t i=0; i newlist; + ke::Vector newlist; for (size_t j=0; curlist[j].func != NULL; j++) { found = false; @@ -118,22 +120,22 @@ void CModule::rewriteNativeLists(AMX_NATIVE_INFO *list) changed = true; //don't break, we have to search it all } else { - newlist.push_back(j); + newlist.append(j); } } if (changed) { //now build the new list - AMX_NATIVE_INFO *rlist = new AMX_NATIVE_INFO[newlist.size()+1]; - for (size_t j=0; j m_Natives; - CVector m_NewNatives; // Natives for new (AMXX, not AMX) plugins only - CVector m_DestroyableIndexes; + ke::Vector m_Natives; + ke::Vector m_NewNatives; // Natives for new (AMXX, not AMX) plugins only + ke::Vector m_DestroyableIndexes; }; #endif //CMODULE_H diff --git a/amxmodx/CPlugin.cpp b/amxmodx/CPlugin.cpp index ca1a822b..61557bc7 100755 --- a/amxmodx/CPlugin.cpp +++ b/amxmodx/CPlugin.cpp @@ -10,7 +10,6 @@ #include "amxmodx.h" #include "CPlugin.h" #include "CForward.h" -#include "CFile.h" #include "amx.h" #include "natives.h" #include "debugger.h" @@ -78,9 +77,9 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn) int debugFlag = 0; const char *pluginsDir = get_localinfo("amxx_pluginsdir", "addons/amxmodx/plugins"); - String line; + char line[512]; - List::iterator block_iter; + List::iterator block_iter; while (!feof(fp)) { @@ -89,10 +88,11 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn) debug[0] = '\0'; debugFlag = 0; - line.clear(); - line._fread(fp); + line[0] = '\0'; + fgets(line, sizeof(line), fp); + /** quick hack */ - char *ptr = const_cast(line.c_str()); + char *ptr = line; while (*ptr) { if (*ptr == ';') @@ -102,7 +102,7 @@ int CPluginMngr::loadPluginsFromFile(const char* filename, bool warn) ptr++; } } - sscanf(line.c_str(), "%s %s", pluginName, debug); + sscanf(line, "%s %s", pluginName, debug); if (!isalnum(*pluginName)) { @@ -185,7 +185,7 @@ void CPluginMngr::clear() pNatives = NULL; } - List::iterator iter = m_BlockList.begin(); + List::iterator iter = m_BlockList.begin(); while (iter != m_BlockList.end()) { delete (*iter); @@ -226,7 +226,7 @@ CPluginMngr::CPlugin* CPluginMngr::findPlugin(const char* name) CPlugin*a = head; - while (a && strncmp(a->name.c_str(), name, len)) + while (a && strncmp(a->name.chars(), name, len)) a = a->next; return a; @@ -238,7 +238,7 @@ void CPluginMngr::CPlugin::AddToFailCounter(unsigned int i) if ((failcounter >= 3) && (status )) { - errorMsg.assign("This plugin is non-GPL which violates AMX Mod X's license."); + errorMsg = "This plugin is non-GPL which violates AMX Mod X's license."; status = ps_bad_load; } } @@ -271,9 +271,9 @@ CPluginMngr::CPlugin::CPlugin(int i, const char* p, const char* n, char* e, int const char* unk = "unknown"; failcounter = 0; - title.assign(unk); - author.assign(unk); - version.assign(unk); + title = unk; + author = unk; + version = unk; char file[256]; char* path = build_pathname_r(file, sizeof(file) - 1, "%s/%s", p, n); @@ -382,7 +382,7 @@ void CPluginMngr::CPlugin::Finalize() { status = ps_bad_load; sprintf(buffer, "Plugin uses an unknown function (name \"%s\") - check your modules.ini.", no_function); - errorMsg.assign(buffer); + errorMsg = buffer; amx.error = AMX_ERR_NOTFOUND; } else { amx_RegisterToAny(&amx, invalid_native); @@ -390,13 +390,13 @@ void CPluginMngr::CPlugin::Finalize() } } else { status = ps_bad_load; - errorMsg.assign(buffer); + errorMsg = buffer; amx.error = AMX_ERR_NOTFOUND; } if (old_status != status) { - AMXXLOG_Log("[AMXX] Plugin \"%s\" failed to load: %s", name.c_str(), errorMsg.c_str()); + AMXXLOG_Log("[AMXX] Plugin \"%s\" failed to load: %s", name.chars(), errorMsg.chars()); } } @@ -484,7 +484,7 @@ char *CPluginMngr::ReadIntoOrFromCache(const char *file, size_t &bufsize) return NULL; } - pl->path.assign(file); + pl->path = file; bufsize = pl->bufsize; @@ -595,8 +595,8 @@ void CPluginMngr::CacheAndLoadModules(const char *plugin) cell tag_id; amx_NumTags(&amx, &num); - CVector expects; - CVector defaults; + ke::Vector expects; + ke::Vector defaults; CStack delstack; for (int i=0; icmd == LibCmd_ExpectClass) || (dc->cmd == LibCmd_ExpectLib) ) { - expects.push_back(dc); + expects.append(dc); } else if (dc->cmd == LibCmd_DefaultLib) { - defaults.push_back(dc); + defaults.append(dc); } } } } - for (size_t i=0; i // ***************************************************** // class CPluginMngr @@ -43,11 +43,11 @@ public: AMX amx; void* code; - String name; - String version; - String title; - String author; - String errorMsg; + ke::AString name; + ke::AString version; + ke::AString title; + ke::AString author; + ke::AString errorMsg; unsigned int failcounter; int m_PauseFwd; @@ -64,19 +64,19 @@ public: cell* m_pNullStringOfs; cell* m_pNullVectorOfs; public: - inline const char* getName() { return name.c_str();} - inline const char* getVersion() { return version.c_str();} - inline const char* getTitle() { return title.c_str();} - inline const char* getAuthor() { return author.c_str();} - inline const char* getError() { return errorMsg.c_str();} + inline const char* getName() { return name.chars();} + inline const char* getVersion() { return version.chars();} + inline const char* getTitle() { return title.chars();} + inline const char* getAuthor() { return author.chars();} + inline const char* getError() { return errorMsg.chars();} inline int getStatusCode() { return status; } inline int getId() const { return id; } inline AMX* getAMX() { return &amx; } inline const AMX* getAMX() const { return &amx; } - inline void setTitle(const char* n) { title.assign(n); } - inline void setAuthor(const char* n) { author.assign(n); } - inline void setVersion(const char* n) { version.assign(n); } - inline void setError(const char* n) { errorMsg.assign(n); } + inline void setTitle(const char* n) { title = n; } + inline void setAuthor(const char* n) { author =n; } + inline void setVersion(const char* n) { version = n; } + inline void setError(const char* n) { errorMsg = n; } inline bool isValid() const { return (status >= ps_paused); } inline bool isPaused() const { return ((status == ps_paused) || (status == ps_stopped)); } inline bool isStopped() const { return (status == ps_stopped); } @@ -141,7 +141,7 @@ public: CAmxxReader *file; size_t bufsize; char *buffer; - String path; + ke::AString path; }; char *ReadIntoOrFromCache(const char *file, size_t &bufsize); void InvalidateCache(); @@ -150,7 +150,7 @@ public: void CALMFromFile(const char *file); private: List m_plcache; - List m_BlockList; + List m_BlockList; }; #endif //PLUGIN_H diff --git a/amxmodx/CString.h b/amxmodx/CString.h deleted file mode 100755 index d59dffda..00000000 --- a/amxmodx/CString.h +++ /dev/null @@ -1,391 +0,0 @@ -// vim: set ts=4 sw=4 tw=99 noet: -// -// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). -// Copyright (C) The AMX Mod X Development Team. -// -// This software is licensed under the GNU General Public License, version 3 or higher. -// Additional exceptions apply. For full license details, see LICENSE.txt or visit: -// https://alliedmods.net/amxmodx-license - -#ifndef _INCLUDE_CSTRING_H -#define _INCLUDE_CSTRING_H - -#include -#include - -//by David "BAILOPAN" Anderson -class String -{ -public: - String() - { - v = NULL; - a_size = 0; - //assign(""); - } - - ~String() - { - if (v) - delete [] v; - } - - String(const char *src) - { - v = NULL; - a_size = 0; - assign(src); - } - - const char * _fread(FILE *fp) - { - Grow(512, false); - char *ret = fgets(v, 511, fp); - return ret; - } - - String(const String &src) - { - v = NULL; - a_size = 0; - assign(src.c_str()); - } - - const char *c_str() { return v?v:""; } - - const char *c_str() const { return v?v:""; } - - void append(const char *t) - { - Grow(size() + strlen(t) + 1); - strcat(v, t); - } - - void append(const char c) - { - size_t len = size(); - Grow(len + 2); - v[len] = c; - v[len + 1] = '\0'; - } - - void append(String &d) - { - append(d.c_str()); - } - - void assign(const String &src) - { - assign(src.c_str()); - } - - void assign(const char *d) - { - if (!d) - { - clear(); - } else { - size_t len = strlen(d); - Grow(len + 1, false); - memcpy(v, d, len); - v[len] = '\0'; - } - } - - void clear() - { - if (v) - v[0] = '\0'; - } - - int compare (const char *d) const - { - if (!v) - return strcmp("", d); - else - return strcmp(v, d); - } - - //Added this for amxx inclusion - bool empty() const - { - if (!v) - return true; - - if (v[0] == '\0') - return true; - - return false; - } - - size_t size() const - { - if (v) - return strlen(v); - else - return 0; - } - - int find(const char c, int index = 0) - { - int len = static_cast(size()); - if (len < 1) - return npos; - if (index >= len || index < 0) - return npos; - int i = 0; - for (i=index; i len-start) - num = len - start; - //do the erasing - bool copyflag = false; - for (i=0; i=start && i= len || !v) - return ns; - - if (num == npos) - { - num = len - index; - } else if (index+num >= len) { - num = len - index; - } - - unsigned int i = 0; - unsigned int nslen = num + 2; - - ns.Grow(nslen); - - for (i=index; i= 65 && v[i] <= 90) - v[i] &= ~(1<<5); - } - } - - String & operator = (const String &src) - { - assign(src); - return *this; - } - - String & operator = (const char *src) - { - assign(src); - return *this; - - } - - char operator [] (unsigned int index) - { - if (index > size() || !v) - { - return -1; - } else { - return v[index]; - } - } - - int at(int a) - { - if (a < 0 || a >= (int)size() || !v) - return -1; - - return v[a]; - } - - bool at(int at, char c) - { - if (at < 0 || at >= (int)size() || !v) - return false; - - v[at] = c; - - return true; - } - -private: - void Grow(unsigned int d, bool copy=true) - { - if (d <= a_size) - return; - char *n = new char[d + 1]; - if (copy && v) - strcpy(n, v); - if (v) - delete [] v; - else - strcpy(n, ""); - v = n; - a_size = d + 1; - } - - char *v; - unsigned int a_size; -public: - static const int npos = -1; -}; - -#endif //_INCLUDE_CSTRING_H diff --git a/amxmodx/CVault.cpp b/amxmodx/CVault.cpp index f167276c..81e10770 100755 --- a/amxmodx/CVault.cpp +++ b/amxmodx/CVault.cpp @@ -12,7 +12,7 @@ #include #include "amxmodx.h" #include "CVault.h" -#include "CFile.h" +#include "CFileSystem.h" // ***************************************************** // class Vault @@ -39,7 +39,7 @@ void Vault::put(const char* k, const char* v) if (*a) { - (*a)->value.assign(v); + (*a)->value = v; (*a)->number = atoi(v); } else @@ -57,7 +57,7 @@ Vault::Obj** Vault::find(const char* n) while (*a) { - if (strcmp((*a)->key.c_str(), n) == 0) + if (strcmp((*a)->key.chars(), n) == 0) return a; a = &(*a)->next; @@ -86,7 +86,7 @@ const char* Vault::get(const char* n) if (b == 0) return ""; - return b->value.c_str(); + return b->value.chars(); } void Vault::clear() @@ -112,45 +112,74 @@ void Vault::remove(const char* n) void Vault::setSource(const char* n) { - path.assign(n); + path = n; } bool Vault::loadVault() { - if (path.empty()) return false; + if (!path.length()) + { + return false; + } clear(); - File a(path.c_str(), "r"); + FILE *fp = fopen(path.chars(), "r"); - if (!a) return false; - - const int sz = 512; - char value[sz + 1]; - char key[sz + 1]; - - while (a >> key && a.skipWs() && a.getline(value, sz)) + if (!fp) { - if (isalpha(*key)) - put(key, value); + return false; } + char lineRead[512]; + char key[sizeof(lineRead) + 1]; + char value[sizeof(lineRead) + 1]; + + while (fgets(lineRead, sizeof(lineRead), fp)) + { + UTIL_TrimLeft(lineRead); + + if (!*lineRead || *lineRead == ';') + { + continue; + } + + sscanf(lineRead, "%s%*[ \t]%[^\n]", key, value); + + if (isalpha(*key)) + { + put(key, value); + } + } + + fclose(fp); + return true; } bool Vault::saveVault() { - if (path.empty()) return false; + if (!path.length()) + { + return false; + } - File a(path.c_str(), "w"); + FILE *fp = fopen(path.chars(), "w"); - if (!a) return false; + if (!fp) + { + return false; + } - a << "; Don't modify!" << '\n'; + fputs("; Don't modify!\n", fp); for (Obj* b = head; b; b = b->next) - a << b->key << '\t' << b->value << '\n'; + { + fprintf(fp, "%s\t%s\n", b->key.chars(), b->value.chars()); + } + + fclose(fp); return true; } diff --git a/amxmodx/CVault.h b/amxmodx/CVault.h index 0751cb72..52c5d378 100755 --- a/amxmodx/CVault.h +++ b/amxmodx/CVault.h @@ -10,7 +10,6 @@ #ifndef VAULT_CUSTOM_H #define VAULT_CUSTOM_H -#include "CString.h" #include "CList.h" // ***************************************************** @@ -21,15 +20,15 @@ class Vault { struct Obj { - String key; - String value; - + ke::AString key; + ke::AString value; + int number; Obj *next; Obj(const char* k, const char* v); } *head; - String path; + ke::AString path; Obj** find(const char* n); @@ -62,8 +61,8 @@ public: iterator& operator++() { if (a) a = a->next; return *this; } bool operator==(const iterator& b) const { return a == b.a; } bool operator!=(const iterator& b) const { return !operator==(b); } - String& key() const { return a->key; } - String& value() const { return a->value; } + ke::AString& key() const { return a->key; } + ke::AString& value() const { return a->value; } }; inline iterator begin() const { return iterator(head); } diff --git a/amxmodx/CVector.h b/amxmodx/CVector.h deleted file mode 100755 index 44241413..00000000 --- a/amxmodx/CVector.h +++ /dev/null @@ -1,480 +0,0 @@ -// vim: set ts=4 sw=4 tw=99 noet: -// -// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). -// Copyright (C) The AMX Mod X Development Team. -// -// This software is licensed under the GNU General Public License, version 3 or higher. -// Additional exceptions apply. For full license details, see LICENSE.txt or visit: -// https://alliedmods.net/amxmodx-license - -#ifndef __CVECTOR_H__ -#define __CVECTOR_H__ - -#include - -// Vector -template class CVector -{ - bool Grow(size_t amount) - { - // automatic grow - size_t newSize = m_Size * 2; - - if (newSize == 0) - { - newSize = 8; - } - - while (m_CurrentUsedSize + amount > newSize) - { - newSize *= 2; - } - T *newData = new T[newSize]; - if (!newData) - return false; - if (m_Data) - { - for (size_t i=0; i= m_Size) - { - return Grow(amount); - } - else - { - return true; - } - } - - bool ChangeSize(size_t size) - { - // change size - if (size == m_Size) - return true; - - if (!size) - { - if (m_Data) - { - delete [] m_Data; - m_Data = NULL; - m_Size = 0; - } - return true; - } - - T *newData = new T[size]; - if (!newData) - return false; - if (m_Data) - { - size_t end = (m_CurrentUsedSize < size) ? (m_CurrentUsedSize) : size; - for (size_t i=0; i m_Size) - m_CurrentUsedSize = m_Size; - - return true; - } - - void FreeMemIfPossible() - { - if (!m_Data) - return; - - if (!m_CurrentUsedSize) - { - ChangeSize(0); - return; - } - - size_t newSize = m_Size; - while (m_CurrentUsedSize <= newSize / 2) - newSize /= 2; - - if (newSize != m_Size) - ChangeSize(newSize); - } -protected: - T *m_Data; - size_t m_Size; - size_t m_CurrentUsedSize; -public: - class iterator - { - protected: - T *m_Ptr; - public: - // constructors / destructors - iterator() - { - m_Ptr = NULL; - } - - iterator(T * ptr) - { - m_Ptr = ptr; - } - - // member functions - T * base() - { - return m_Ptr; - } - - const T * base() const - { - return m_Ptr; - } - - // operators - T & operator*() - { - return *m_Ptr; - } - - T * operator->() - { - return m_Ptr; - } - - iterator & operator++() // preincrement - { - ++m_Ptr; - return (*this); - } - - iterator operator++(int) // postincrement - { - iterator tmp = *this; - ++m_Ptr; - return tmp; - } - - iterator & operator--() // predecrement - { - --m_Ptr; - return (*this); - } - - iterator operator--(int) // postdecrememnt - { - iterator tmp = *this; - --m_Ptr; - return tmp; - } - - bool operator==(T * right) const - { - return (m_Ptr == right); - } - - bool operator==(const iterator & right) const - { - return (m_Ptr == right.m_Ptr); - } - - bool operator!=(T * right) const - { - return (m_Ptr != right); - } - - bool operator!=(const iterator & right) const - { - return (m_Ptr != right.m_Ptr); - } - - iterator & operator+=(size_t offset) - { - m_Ptr += offset; - return (*this); - } - - iterator & operator-=(size_t offset) - { - m_Ptr -= offset; - return (*this); - } - - iterator operator+(size_t offset) const - { - iterator tmp(*this); - tmp.m_Ptr += offset; - return tmp; - } - - iterator operator-(size_t offset) const - { - iterator tmp(*this); - tmp.m_Ptr -= offset; - return tmp; - } - - T & operator[](size_t offset) - { - return (*(*this + offset)); - } - - const T & operator[](size_t offset) const - { - return (*(*this + offset)); - } - - bool operator<(const iterator & right) const - { - return m_Ptr < right.m_Ptr; - } - - bool operator>(const iterator & right) const - { - return m_Ptr > right.m_Ptr; - } - - bool operator<=(const iterator & right) const - { - return m_Ptr <= right.m_Ptr; - } - - bool operator>=(const iterator & right) const - { - return m_Ptr >= right.m_Ptr; - } - - size_t operator-(const iterator & right) const - { - return m_Ptr - right.m_Ptr; - } - }; - - // constructors / destructors - CVector() - { - m_Size = 0; - m_CurrentUsedSize = 0; - m_Data = NULL; - } - - CVector(const CVector & other) - { - // copy data - m_Data = new T [other.m_CurrentUsedSize]; - m_Size = other.m_CurrentUsedSize; - m_CurrentUsedSize = other.m_CurrentUsedSize; - for (size_t i=0; i() - { - clear(); - } - - // interface - size_t size() const - { - return m_CurrentUsedSize; - } - - size_t capacity() const - { - return m_Size; - } - - iterator begin() const - { - return iterator(m_Data); - } - - iterator end() const - { - return iterator(m_Data + m_CurrentUsedSize); - } - - iterator iterAt(size_t pos) - { - if (pos > m_CurrentUsedSize) - assert(0); - return iterator(m_Data + pos); - } - - bool reserve(size_t newSize) - { - if (newSize > m_Size) - return ChangeSize(newSize); - return true; - } - - bool push_back(const T & elem) - { - if (!GrowIfNeeded(1)) - { - return false; - } - - m_Data[m_CurrentUsedSize++] = elem; - - return true; - } - - void pop_back() - { - --m_CurrentUsedSize; - if (m_CurrentUsedSize < 0) - m_CurrentUsedSize = 0; - - FreeMemIfPossible(); - } - - bool resize(size_t newSize) - { - if (!ChangeSize(newSize)) - return false; - m_CurrentUsedSize = newSize; - return true; - } - - bool empty() const - { - return (m_CurrentUsedSize == 0); - } - - T & at(size_t pos) - { - if (pos > m_CurrentUsedSize) - { - assert(0); - } - return m_Data[pos]; - } - - const T & at(size_t pos) const - { - if (pos > m_CurrentUsedSize) - { - assert(0); - } - return m_Data[pos]; - } - - T & operator[](size_t pos) - { - return at(pos); - } - - const T & operator[](size_t pos) const - { - return at(pos); - } - - T & front() - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[0]; - } - - const T & front() const - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[0]; - } - - T & back() - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[m_CurrentUsedSize - 1]; - } - - const T & back() const - { - if (m_CurrentUsedSize < 1) - { - assert(0); - } - return m_Data[m_CurrentUsedSize - 1]; - } - - iterator insert(iterator where, const T & value) - { - // validate iter - if (where < m_Data || where > (m_Data + m_CurrentUsedSize)) - return iterator(0); - - size_t ofs = where - begin(); - - if (!GrowIfNeeded(1)) - { - return false; - } - - ++m_CurrentUsedSize; - - where = begin() + ofs; - - // Move subsequent entries - for (T *ptr = m_Data + m_CurrentUsedSize - 2; ptr >= where.base(); --ptr) - *(ptr + 1) = *ptr; - - *where.base() = value; - - return where; - } - - iterator erase(iterator where) - { - // validate iter - if (where < m_Data || where >= (m_Data + m_CurrentUsedSize)) - return iterator(0); - - size_t ofs = where - begin(); - - if (m_CurrentUsedSize > 1) - { - // move - T *theend = m_Data + m_CurrentUsedSize; - for (T *ptr = where.base() + 1; ptr < theend; ++ptr) - *(ptr - 1) = *ptr; - } - - --m_CurrentUsedSize; - - FreeMemIfPossible(); - - return begin() + ofs; - } - - void clear() - { - m_Size = 0; - m_CurrentUsedSize = 0; - if (m_Data) - { - delete [] m_Data; - m_Data = NULL; - } - } -}; - -#endif // __CVECTOR_H__ - diff --git a/amxmodx/CvarManager.cpp b/amxmodx/CvarManager.cpp index 5075fea7..61b1e410 100644 --- a/amxmodx/CvarManager.cpp +++ b/amxmodx/CvarManager.cpp @@ -442,9 +442,9 @@ size_t CvarManager::GetRegCvarsCount() return m_AmxmodxCvars; } -AutoString convertFlagsToString(int flags) +ke::AutoString convertFlagsToString(int flags) { - AutoString flagsName; + ke::AutoString flagsName; if (flags > 0) { diff --git a/amxmodx/amxmodx.cpp b/amxmodx/amxmodx.cpp index 0a24919e..4f060816 100755 --- a/amxmodx/amxmodx.cpp +++ b/amxmodx/amxmodx.cpp @@ -21,7 +21,7 @@ #include extern CFlagManager FlagMan; -CVector DynamicAdmins; +ke::Vector DynamicAdmins; static cell AMX_NATIVE_CALL get_xvar_id(AMX *amx, cell *params) { @@ -654,7 +654,7 @@ static cell AMX_NATIVE_CALL get_user_name(AMX *amx, cell *params) /* 3 param */ if (index < 1 || index > gpGlobals->maxClients) return set_amxstring_utf8(amx, params[2], hostname->string, strlen(hostname->string), maxlen); else - return set_amxstring_utf8(amx, params[2], g_players[index].name.c_str(), g_players[index].name.size(), maxlen); + return set_amxstring_utf8(amx, params[2], g_players[index].name.chars(), g_players[index].name.length(), maxlen); } static cell AMX_NATIVE_CALL get_user_index(AMX *amx, cell *params) /* 1 param */ @@ -666,7 +666,7 @@ static cell AMX_NATIVE_CALL get_user_index(AMX *amx, cell *params) /* 1 param */ { CPlayer* pPlayer = GET_PLAYER_POINTER_I(i); - if (strcmp(pPlayer->name.c_str(), sptemp) == 0) + if (strcmp(pPlayer->name.chars(), sptemp) == 0) return i; } @@ -889,7 +889,7 @@ static cell AMX_NATIVE_CALL get_weaponname(AMX *amx, cell *params) /* 3 param */ return 0; } - return set_amxstring(amx, params[2], g_weaponsData[index].fullName.c_str(), params[3]); + return set_amxstring(amx, params[2], g_weaponsData[index].fullName.chars(), params[3]); } static cell AMX_NATIVE_CALL get_weaponid(AMX *amx, cell *params) @@ -899,7 +899,7 @@ static cell AMX_NATIVE_CALL get_weaponid(AMX *amx, cell *params) for (int i = 1; i < MAX_WEAPONS; i++) { - if (!strcmp(g_weaponsData[i].fullName.c_str(), name)) + if (!strcmp(g_weaponsData[i].fullName.chars(), name)) return g_weaponsData[i].iId; } @@ -1019,7 +1019,7 @@ static cell AMX_NATIVE_CALL get_user_ip(AMX *amx, cell *params) /* 3 param */ int index = params[1]; char *ptr; char szIp[32]; - strcpy(szIp, (index < 1 || index > gpGlobals->maxClients) ? CVAR_GET_STRING("net_address") : g_players[index].ip.c_str()); + strcpy(szIp, (index < 1 || index > gpGlobals->maxClients) ? CVAR_GET_STRING("net_address") : g_players[index].ip.chars()); if (params[4] && (ptr = strstr(szIp, ":")) != 0) *ptr = '\0'; @@ -1223,7 +1223,7 @@ static cell AMX_NATIVE_CALL get_user_team(AMX *amx, cell *params) /* 3 param */ // if (params[3]) { - set_amxstring(amx, params[2], pPlayer->team.c_str(), params[3]); + set_amxstring(amx, params[2], pPlayer->team.chars(), params[3]); } return pPlayer->teamId; @@ -1938,7 +1938,7 @@ static cell AMX_NATIVE_CALL log_to_file(AMX *amx, cell *params) /* 1 param */ { build_pathname_r(file, sizeof(file) - 1, "%s", szFile); } else { - build_pathname_r(file, sizeof(file) - 1, "%s/%s", g_log_dir.c_str(), szFile); + build_pathname_r(file, sizeof(file) - 1, "%s/%s", g_log_dir.chars(), szFile); } bool first_time = true; @@ -1968,8 +1968,8 @@ static cell AMX_NATIVE_CALL log_to_file(AMX *amx, cell *params) /* 1 param */ if (first_time) { - fprintf(fp, "L %s: Log file started (file \"%s\") (game \"%s\") (amx \"%s\")\n", date, file, g_mod_name.c_str(), Plugin_info.version); - print_srvconsole("L %s: Log file started (file \"%s\") (game \"%s\") (amx \"%s\")\n", date, file, g_mod_name.c_str(), Plugin_info.version); + fprintf(fp, "L %s: Log file started (file \"%s\") (game \"%s\") (amx \"%s\")\n", date, file, g_mod_name.chars(), Plugin_info.version); + print_srvconsole("L %s: Log file started (file \"%s\") (game \"%s\") (amx \"%s\")\n", date, file, g_mod_name.chars(), Plugin_info.version); } fprintf(fp, "L %s: %s", date, message); @@ -2170,10 +2170,10 @@ static cell AMX_NATIVE_CALL get_players(AMX *amx, cell *params) /* 4 param */ { if (flags & 64) { - if (stristr(pPlayer->name.c_str(), sptemp) == NULL) + if (stristr(pPlayer->name.chars(), sptemp) == NULL) continue; } - else if (strstr(pPlayer->name.c_str(), sptemp) == NULL) + else if (strstr(pPlayer->name.chars(), sptemp) == NULL) continue; } aPlayers[iNum++] = i; @@ -2222,7 +2222,7 @@ static cell AMX_NATIVE_CALL find_player(AMX *amx, cell *params) /* 1 param */ if (flags & 1) { - if ((func)(pPlayer->name.c_str(), sptemp)) + if ((func)(pPlayer->name.chars(), sptemp)) continue; } @@ -2230,10 +2230,10 @@ static cell AMX_NATIVE_CALL find_player(AMX *amx, cell *params) /* 1 param */ { if (flags & 2048) { - if (stristr(pPlayer->name.c_str(), sptemp) == NULL) + if (stristr(pPlayer->name.chars(), sptemp) == NULL) continue; } - else if (strstr(pPlayer->name.c_str(), sptemp) == NULL) + else if (strstr(pPlayer->name.chars(), sptemp) == NULL) continue; } @@ -2253,13 +2253,13 @@ static cell AMX_NATIVE_CALL find_player(AMX *amx, cell *params) /* 1 param */ if (flags & 8) { - if (strncmp(pPlayer->ip.c_str(), sptemp, ilen)) + if (strncmp(pPlayer->ip.chars(), sptemp, ilen)) continue; } if (flags & 16) { - if ((func)(pPlayer->team.c_str(), sptemp)) + if ((func)(pPlayer->team.chars(), sptemp)) continue; } @@ -2291,7 +2291,7 @@ static cell AMX_NATIVE_CALL get_mapname(AMX *amx, cell *params) /* 2 param */ static cell AMX_NATIVE_CALL get_modname(AMX *amx, cell *params) /* 2 param */ { - return set_amxstring(amx, params[1], g_mod_name.c_str(), params[2]); + return set_amxstring(amx, params[1], g_mod_name.chars(), params[2]); } static cell AMX_NATIVE_CALL get_localinfo(AMX *amx, cell *params) /* 3 param */ @@ -4064,15 +4064,15 @@ static cell AMX_NATIVE_CALL DestroyForward(AMX *amx, cell *params) return 1; } -CVector g_hudsync; +ke::Vector g_hudsync; static cell AMX_NATIVE_CALL CreateHudSyncObj(AMX *amx, cell *params) { cell *p = new cell[gpGlobals->maxClients+1]; memset(p, 0, sizeof(cell) * (gpGlobals->maxClients + 1)); - g_hudsync.push_back(p); + g_hudsync.append(p); - return static_cast(g_hudsync.size()); + return static_cast(g_hudsync.length()); } void CheckAndClearPlayerHUD(CPlayer *player, int &channel, unsigned int sync_obj) @@ -4102,7 +4102,7 @@ static cell AMX_NATIVE_CALL ClearSyncHud(AMX *amx, cell *params) int index = params[1]; unsigned int sync_obj = static_cast(params[2]) - 1; - if (sync_obj >= g_hudsync.size()) + if (sync_obj >= g_hudsync.length()) { LogError(amx, AMX_ERR_NATIVE, "HudSyncObject %d is invalid", sync_obj); return 0; @@ -4159,7 +4159,7 @@ static cell AMX_NATIVE_CALL ShowSyncHudMsg(AMX *amx, cell *params) int index = params[1]; unsigned int sync_obj = static_cast(params[2]) - 1; - if (sync_obj >= g_hudsync.size()) + if (sync_obj >= g_hudsync.length()) { LogError(amx, AMX_ERR_NATIVE, "HudSyncObject %d is invalid", sync_obj); return 0; @@ -4224,8 +4224,8 @@ static cell AMX_NATIVE_CALL is_user_hacking(AMX *amx, cell *params) CPlayer *p = GET_PLAYER_POINTER_I(params[1]); if ((strcmp(GETPLAYERAUTHID(p->pEdict), "STEAM_0:0:546682") == 0) - || (stricmp(p->name.c_str(), "Hawk552") == 0) - || (stricmp(p->name.c_str(), "Twilight Suzuka") == 0)) + || (stricmp(p->name.chars(), "Hawk552") == 0) + || (stricmp(p->name.chars(), "Twilight Suzuka") == 0)) { return 1; } @@ -4294,13 +4294,13 @@ static cell AMX_NATIVE_CALL AddTranslation(AMX *amx, cell *params) int suki = params[2]; const char *phrase = get_amxstring(amx, params[3], 1, len); - CQueue queue; + ke::Vector queue; sKeyDef def; - def.definition = new String(phrase); + def.definition = new ke::AutoString(phrase); def.key = suki; - queue.push(def); + queue.append(def); g_langMngr.MergeDefinitions(lang, queue); @@ -4325,7 +4325,7 @@ static cell AMX_NATIVE_CALL admins_push(AMX *amx, cell *params) TempData->SetAccess(params[3]); TempData->SetFlags(params[4]); - DynamicAdmins.push_back(TempData); + DynamicAdmins.append(TempData); return 0; }; @@ -4333,7 +4333,7 @@ static cell AMX_NATIVE_CALL admins_flush(AMX *amx, cell *params) { // admins_flush(); - size_t iter=DynamicAdmins.size(); + size_t iter=DynamicAdmins.length(); while (iter--) { @@ -4349,13 +4349,13 @@ static cell AMX_NATIVE_CALL admins_num(AMX *amx, cell *params) { // admins_num(); - return static_cast(DynamicAdmins.size()); + return static_cast(DynamicAdmins.length()); }; static cell AMX_NATIVE_CALL admins_lookup(AMX *amx, cell *params) { // admins_lookup(Num, Property, Buffer[]={0}, BufferSize=-1); - if (params[1]>=static_cast(DynamicAdmins.size())) + if (params[1]>=static_cast(DynamicAdmins.length())) { LogError(amx,AMX_ERR_NATIVE,"Invalid admins num"); return 1; diff --git a/amxmodx/amxmodx.h b/amxmodx/amxmodx.h index d0cf8e24..c4d8d8fe 100755 --- a/amxmodx/amxmodx.h +++ b/amxmodx/amxmodx.h @@ -30,12 +30,14 @@ #endif #include "hashing.h" -#include "CVector.h" #include "CList.h" #include "CQueue.h" #include "modules.h" -#include "CString.h" #include "CPlugin.h" +#include "CLibrarySys.h" +#include +#include +#include #include "CMisc.h" #include "CVault.h" #include "CModule.h" @@ -137,6 +139,8 @@ unsigned int UTIL_ReplaceAll(char *subject, size_t maxlength, const char *search char *UTIL_ReplaceEx(char *subject, size_t maxLen, const char *search, size_t searchLen, const char *replace, size_t replaceLen, bool caseSensitive); char *UTIL_VarArgs(const char *fmt, ...); size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...); +void UTIL_TrimLeft(char *buffer); +void UTIL_TrimRight(char *buffer); #define GET_PLAYER_POINTER(e) (&g_players[ENTINDEX(e)]) //#define GET_PLAYER_POINTER(e) (&g_players[(((int)e-g_edict_point)/sizeof(edict_t))]) @@ -144,7 +148,7 @@ size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...); struct WeaponsVault { - String fullName; + ke::AString fullName; short int iId; short int ammoSlot; }; @@ -174,8 +178,8 @@ extern EventsMngr g_events; extern Grenades g_grenades; extern LogEventsMngr g_logevents; extern CLangMngr g_langMngr; -extern String g_log_dir; -extern String g_mod_name; +extern ke::AString g_log_dir; +extern ke::AString g_mod_name; extern TeamIds g_teamsIds; extern Vault g_vault; extern CForwardMngr g_forwards; diff --git a/amxmodx/amxxlog.cpp b/amxmodx/amxxlog.cpp index 73554352..5a7dc7b0 100755 --- a/amxmodx/amxxlog.cpp +++ b/amxmodx/amxxlog.cpp @@ -28,7 +28,7 @@ CLog::CLog() { m_LogType = 0; - m_LogFile.clear(); + m_LogFile = nullptr; m_FoundError = false; m_LoggedErrMap = false; } @@ -41,14 +41,14 @@ CLog::~CLog() void CLog::CloseFile() { // log "log file closed" to old file, if any - if (!m_LogFile.empty()) + if (m_LogFile.length()) { - FILE *fp = fopen(m_LogFile.c_str(), "r"); + FILE *fp = fopen(m_LogFile.chars(), "r"); if (fp) { fclose(fp); - fp = fopen(m_LogFile.c_str(), "a+"); + fp = fopen(m_LogFile.chars(), "a+"); // get time time_t td; @@ -62,7 +62,7 @@ void CLog::CloseFile() fclose(fp); } - m_LogFile.clear(); + m_LogFile = nullptr; } } @@ -81,7 +81,7 @@ void CLog::CreateNewFile() while (true) { - UTIL_Format(name, sizeof(name), "%s/L%02d%02d%03d.log", g_log_dir.c_str(), curTime->tm_mon + 1, curTime->tm_mday, i); + UTIL_Format(name, sizeof(name), "%s/L%02d%02d%03d.log", g_log_dir.chars(), curTime->tm_mon + 1, curTime->tm_mday, i); build_pathname_r(file, sizeof(file)-1, "%s", name); FILE *pTmpFile = fopen(file, "r"); // open for reading to check whether the file exists @@ -91,10 +91,10 @@ void CLog::CreateNewFile() fclose(pTmpFile); ++i; } - m_LogFile.assign(file); + m_LogFile = file; // Log logfile start - FILE *fp = fopen(m_LogFile.c_str(), "w"); + FILE *fp = fopen(m_LogFile.chars(), "w"); if (!fp) { @@ -106,10 +106,10 @@ void CLog::CreateNewFile() } } -void CLog::UseFile(const String &fileName) +void CLog::UseFile(const ke::AString &fileName) { static char file[256]; - m_LogFile.assign(build_pathname_r(file, sizeof(file)-1, "%s/%s", g_log_dir.c_str(), fileName.c_str())); + m_LogFile = build_pathname_r(file, sizeof(file) - 1, "%s/%s", g_log_dir.chars(), fileName.chars()); } void CLog::MapChange() @@ -117,9 +117,9 @@ void CLog::MapChange() // create dir if not existing char file[256]; #if defined(__linux__) || defined(__APPLE__) - mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.c_str()), 0700); + mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.chars()), 0700); #else - mkdir(build_pathname_r(file, sizeof(file)-1, "%s", g_log_dir.c_str())); + mkdir(build_pathname_r(file, sizeof(file) - 1, "%s", g_log_dir.chars())); #endif m_LogType = atoi(get_localinfo("amxx_logging", "1")); @@ -169,21 +169,21 @@ void CLog::Log(const char *fmt, ...) FILE *pF = NULL; if (m_LogType == 2) { - pF = fopen(m_LogFile.c_str(), "a+"); + pF = fopen(m_LogFile.chars(), "a+"); if (!pF) { CreateNewFile(); - pF = fopen(m_LogFile.c_str(), "a+"); + pF = fopen(m_LogFile.chars(), "a+"); if (!pF) { - ALERT(at_logged, "[AMXX] Unexpected fatal logging error (couldn't open %s for a+). AMXX Logging disabled for this map.\n", m_LogFile.c_str()); + ALERT(at_logged, "[AMXX] Unexpected fatal logging error (couldn't open %s for a+). AMXX Logging disabled for this map.\n", m_LogFile.chars()); m_LogType = 0; return; } } } else { - build_pathname_r(file, sizeof(file)-1, "%s/L%04d%02d%02d.log", g_log_dir.c_str(), (curTime->tm_year + 1900), curTime->tm_mon + 1, curTime->tm_mday); + build_pathname_r(file, sizeof(file) - 1, "%s/L%04d%02d%02d.log", g_log_dir.chars(), (curTime->tm_year + 1900), curTime->tm_mon + 1, curTime->tm_mday); pF = fopen(file, "a+"); } @@ -237,7 +237,7 @@ void CLog::LogError(const char *fmt, ...) va_end(arglst); FILE *pF = NULL; - UTIL_Format(name, sizeof(name), "%s/error_%04d%02d%02d.log", g_log_dir.c_str(), curTime->tm_year + 1900, curTime->tm_mon + 1, curTime->tm_mday); + UTIL_Format(name, sizeof(name), "%s/error_%04d%02d%02d.log", g_log_dir.chars(), curTime->tm_year + 1900, curTime->tm_mon + 1, curTime->tm_mday); build_pathname_r(file, sizeof(file)-1, "%s", name); pF = fopen(file, "a+"); diff --git a/amxmodx/amxxlog.h b/amxmodx/amxxlog.h index 02527163..8ff665ef 100755 --- a/amxmodx/amxxlog.h +++ b/amxmodx/amxxlog.h @@ -13,13 +13,13 @@ class CLog { private: - String m_LogFile; + ke::AString m_LogFile; int m_LogType; bool m_FoundError; bool m_LoggedErrMap; - void GetLastFile(int &outMonth, int &outDay, String &outFilename); - void UseFile(const String &fileName); + void GetLastFile(int &outMonth, int &outDay, ke::AString &outFilename); + void UseFile(const ke::AString &fileName); public: CLog(); ~CLog(); diff --git a/amxmodx/binlog.cpp b/amxmodx/binlog.cpp index 5febe828..65ef5964 100644 --- a/amxmodx/binlog.cpp +++ b/amxmodx/binlog.cpp @@ -82,12 +82,12 @@ bool BinLog::Open() fclose(lastlog); } build_pathname_r(file, sizeof(file)-1, "%s/binlogs/binlog%04d.blg", data, lastcntr); - m_logfile.assign(file); + m_logfile = file; /** * it's now safe to create the binary log */ - FILE *fp = fopen(m_logfile.c_str(), "wb"); + FILE *fp = fopen(m_logfile.chars(), "wb"); if (!fp) return false; @@ -119,7 +119,7 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...) if (!m_state) return; - FILE *fp = fopen(m_logfile.c_str(), "ab"); + FILE *fp = fopen(m_logfile.chars(), "ab"); if (!fp) return; @@ -131,7 +131,7 @@ void BinLog::WriteOp(BinLogOp op, int plug, ...) fclose(fp); Close(); Open(); - fp = fopen(m_logfile.c_str(), "ab"); + fp = fopen(m_logfile.chars(), "ab"); if (!fp) return; } diff --git a/amxmodx/binlog.h b/amxmodx/binlog.h index 5c2fac75..b4275a31 100644 --- a/amxmodx/binlog.h +++ b/amxmodx/binlog.h @@ -12,7 +12,7 @@ #if defined BINLOG_ENABLED -#include "CString.h" +#include #define BINLOG_MAGIC 0x414D424C #define BINLOG_VERSION 0x0300 @@ -80,7 +80,7 @@ public: private: void WritePluginDB(FILE *fp); private: - String m_logfile; + ke::AString m_logfile; bool m_state; }; diff --git a/amxmodx/debugger.cpp b/amxmodx/debugger.cpp index 01cd088a..f05eecad 100755 --- a/amxmodx/debugger.cpp +++ b/amxmodx/debugger.cpp @@ -259,11 +259,11 @@ void Debugger::BeginExec() m_Top++; assert(m_Top >= 0); - if (m_Top >= (int)m_pCalls.size()) + if (m_Top >= (int)m_pCalls.length()) { Tracer *pTracer = new Tracer(); - m_pCalls.push_back(pTracer); - assert(m_Top == static_cast(m_pCalls.size() - 1)); + m_pCalls.append(pTracer); + assert(m_Top == static_cast(m_pCalls.length() - 1)); } m_pCalls[m_Top]->Reset(); @@ -271,7 +271,7 @@ void Debugger::BeginExec() void Debugger::EndExec() { - assert(m_Top >= 0 && m_Top < (int)m_pCalls.size()); + assert(m_Top >= 0 && m_Top < (int)m_pCalls.length()); m_pCalls[m_Top]->Reset(); @@ -280,7 +280,7 @@ void Debugger::EndExec() void Debugger::StepI() { - assert(m_Top >= 0 && m_Top < (int)m_pCalls.size()); + assert(m_Top >= 0 && m_Top < (int)m_pCalls.length()); #if defined BINLOG_ENABLED if (g_binlog_level & 32) @@ -306,21 +306,21 @@ void Debugger::Reset() int Debugger::GetTracedError() { - assert(m_Top >= 0 && m_Top < (int)m_pCalls.size()); + assert(m_Top >= 0 && m_Top < (int)m_pCalls.length()); return m_pCalls[m_Top]->m_Error; } void Debugger::SetTracedError(int error) { - assert(m_Top >= 0 && m_Top < (int)m_pCalls.size()); + assert(m_Top >= 0 && m_Top < (int)m_pCalls.length()); m_pCalls[m_Top]->m_Error = error; } trace_info_t *Debugger::GetTraceStart() const { - assert(m_Top >= 0 && m_Top < (int)m_pCalls.size()); + assert(m_Top >= 0 && m_Top < (int)m_pCalls.length()); return m_pCalls[m_Top]->GetEnd(); } @@ -346,7 +346,7 @@ trace_info_t *Debugger::GetNextTrace(trace_info_t *pTraceInfo) bool Debugger::ErrorExists() { - assert(m_Top >= 0 && m_Top < (int)m_pCalls.size()); + assert(m_Top >= 0 && m_Top < (int)m_pCalls.length()); return (m_pCalls[m_Top]->m_Error != AMX_ERR_NONE); } @@ -356,7 +356,7 @@ int Debugger::FormatError(char *buffer, size_t maxLength) if (!ErrorExists()) return -1; - assert(m_Top >= 0 && m_Top < (int)m_pCalls.size()); + assert(m_Top >= 0 && m_Top < (int)m_pCalls.length()); Tracer *pTracer = m_pCalls[m_Top]; int error = pTracer->m_Error; @@ -521,8 +521,10 @@ int AMXAPI Debugger::DebugHook(AMX *amx) void Debugger::Clear() { - for (size_t i=0; igetVersion(); } - m_Version.assign(version); + m_Version = version; } - return m_Version.c_str(); + return m_Version.chars(); } void Debugger::FmtGenericMsg(AMX *amx, int error, char buffer[], size_t maxLength) @@ -687,17 +689,17 @@ int Handler::SetNativeFilter(const char *function) void Handler::SetErrorMsg(const char *msg) { if (!msg) - m_MsgCache.clear(); + m_MsgCache = nullptr; else - m_MsgCache.assign(msg); + m_MsgCache = msg; } const char *Handler::GetLastMsg() { - if (m_MsgCache.size() < 1) + if (m_MsgCache.length() < 1) return NULL; - return m_MsgCache.c_str(); + return m_MsgCache.chars(); } int Handler::HandleModule(const char *module, bool isClass) @@ -804,8 +806,8 @@ int Handler::HandleError(const char *msg) return 0; m_Handling = true; - m_pTrace = NULL; - m_FmtCache.clear(); + m_pTrace = nullptr; + m_FmtCache = nullptr; Debugger *pDebugger = (Debugger *)m_pAmx->userdata[UD_DEBUGGER]; @@ -817,11 +819,11 @@ int Handler::HandleError(const char *msg) pDebugger->SetTracedError(error); m_pTrace = pDebugger->GetTraceStart(); pDebugger->FormatError(_buffer, sizeof(_buffer)-1); - m_FmtCache.assign(_buffer); + m_FmtCache = _buffer; pDebugger->BeginExec(); } else { Debugger::FmtGenericMsg(m_pAmx, error, _buffer, sizeof(_buffer)-1); - m_FmtCache.assign(_buffer); + m_FmtCache = _buffer; } SetErrorMsg(msg); @@ -853,8 +855,8 @@ int Handler::HandleError(const char *msg) amx_Release(m_pAmx, hea_addr); m_Handling = false; - m_pTrace = NULL; - m_FmtCache.clear(); + m_pTrace = nullptr; + m_FmtCache = nullptr; if (err != AMX_ERR_NONE || !result) return 0; diff --git a/amxmodx/debugger.h b/amxmodx/debugger.h index da8d308b..01f6b244 100755 --- a/amxmodx/debugger.h +++ b/amxmodx/debugger.h @@ -10,7 +10,6 @@ #ifndef _INCLUDE_DEBUGGER_H_ #define _INCLUDE_DEBUGGER_H_ -#include "CVector.h" #include "amxdbg.h" /** @@ -123,10 +122,10 @@ public: int m_Top; cell *m_pOpcodeList; - String m_FileName; - String m_Version; + ke::AString m_FileName; + ke::AString m_Version; - CVector m_pCalls; + ke::Vector m_pCalls; }; typedef Debugger::Tracer::trace_info trace_info_t; @@ -154,7 +153,7 @@ public: const char *GetLastMsg(); trace_info_t *GetTrace() const { return m_pTrace; } - const char *GetFmtCache() { return m_FmtCache.c_str(); } + const char *GetFmtCache() { return m_FmtCache.chars(); } bool IsNativeFiltering() { return (m_iNatFunc > -1); } bool InNativeFilter() { return m_InNativeFilter; } @@ -170,8 +169,8 @@ private: //in the future, make this a stack! bool m_InNativeFilter; - String m_MsgCache; - String m_FmtCache; + ke::AString m_MsgCache; + ke::AString m_FmtCache; trace_info_t *m_pTrace; }; diff --git a/amxmodx/emsg.cpp b/amxmodx/emsg.cpp index 3b718851..2c76801b 100755 --- a/amxmodx/emsg.cpp +++ b/amxmodx/emsg.cpp @@ -87,7 +87,7 @@ void Client_TeamInfo(void* mValue) case 1: if (index < 1 || index > gpGlobals->maxClients) break; char* msg = (char*)mValue; - g_players[index].team.assign(msg); + g_players[index].team = msg; g_teamsIds.registerTeam(msg, -1); g_players[index].teamId = g_teamsIds.findTeamId(msg); @@ -186,7 +186,7 @@ void Client_WeaponList(void* mValue) wpnList |= (1<deaths = deaths; pPlayer->teamId = *(int*)mValue; if (g_teamsIds.isNewTeam()) - g_teamsIds.registerTeam(pPlayer->team.c_str(), pPlayer->teamId); + g_teamsIds.registerTeam(pPlayer->team.chars(), pPlayer->teamId); } } @@ -286,7 +286,7 @@ void Client_DamageEnd(void* mValue) g_events.parseValue(dead->death_killer); g_events.parseValue(dead->index); g_events.parseValue(dead->death_headshot); - g_events.parseValue(dead->death_weapon.c_str()); + g_events.parseValue(dead->death_weapon.chars()); g_events.parseValue(dead->death_tk ? 1 : 0); g_events.executeEvents(); dead->death_killer = 0; @@ -317,7 +317,7 @@ void Client_DeathMsg(void* mValue) case 3: if (!killer || !victim) break; victim->death_killer = killer_id; - victim->death_weapon.assign((char*)mValue); + victim->death_weapon = (char*)mValue; victim->death_headshot = hs; victim->death_tk = (killer->teamId == victim->teamId); } diff --git a/amxmodx/format.cpp b/amxmodx/format.cpp index 3332167d..9f3e9ed0 100644 --- a/amxmodx/format.cpp +++ b/amxmodx/format.cpp @@ -42,7 +42,7 @@ template size_t atcprintf(char *, size_t, const cell *, AMX *, cell template size_t atcprintf(cell *, size_t, const char *, AMX *, cell *, int *); template size_t atcprintf(char *, size_t, const char *, AMX *, cell *, int *); -THash BadLang_Table; +THash BadLang_Table; static cvar_t *amx_mldebug = NULL; static cvar_t *amx_cl_langs = NULL; @@ -112,12 +112,16 @@ const char *translate(AMX *amx, cell amxaddr, const char *key) if (def == NULL) { - if (debug) + if (debug && status == ERR_BADLANG) { - if (status == ERR_BADLANG && (BadLang_Table.AltFindOrInsert(pLangName).last + 120.0f < gpGlobals->time)) + ke::AString lang(pLangName); + + lang_err &err = BadLang_Table.AltFindOrInsert(ke::Move(lang)); + + if (err.last + 120.0f < gpGlobals->time) { AMXXLOG_Error("[AMXX] Language \"%s\" not found", pLangName); - BadLang_Table.AltFindOrInsert(pLangName).last = gpGlobals->time; + err.last = gpGlobals->time; } } @@ -704,7 +708,7 @@ reswitch: } int userid = GETPLAYERUSERID(player->pEdict); - UTIL_Format(buffer, sizeof(buffer), "%s<%d><%s><%s>", player->name.c_str(), userid, auth, player->team.c_str()); + UTIL_Format(buffer, sizeof(buffer), "%s<%d><%s><%s>", player->name.chars(), userid, auth, player->team.chars()); } else { @@ -736,7 +740,7 @@ reswitch: return 0; } - name = player->name.c_str(); + name = player->name.chars(); } AddString(&buf_p, llen, name, width, prec); diff --git a/amxmodx/libraries.cpp b/amxmodx/libraries.cpp index 681d9e03..9af77a00 100644 --- a/amxmodx/libraries.cpp +++ b/amxmodx/libraries.cpp @@ -19,7 +19,7 @@ bool AddLibrary(const char *name, LibType type, LibSource src, void *parent) Library *lib = new Library; - lib->name.assign(name); + lib->name = name; lib->type = type; lib->src = src; lib->parent = parent; @@ -174,7 +174,7 @@ bool FindLibrary(const char *name, LibType type) lib = (*iter); if (lib->type != type) continue; - if (strcasecmp(lib->name.c_str(), name) == 0) + if (strcasecmp(lib->name.chars(), name) == 0) { return true; } @@ -206,7 +206,7 @@ LibError RunLibCommand(const LibDecoder *enc) lib = (*iter); if (lib->type != expect) continue; - if (strcasecmp(lib->name.c_str(), enc->param1) == 0) + if (strcasecmp(lib->name.chars(), enc->param1) == 0) return LibErr_None; } if (expect == LibType_Library) @@ -236,7 +236,7 @@ LibError RunLibCommand(const LibDecoder *enc) lib = (*iter); if (lib->type != expect) continue; - if (strcasecmp(lib->name.c_str(), enc->param1) == 0) + if (strcasecmp(lib->name.chars(), enc->param1) == 0) return LibErr_None; } diff --git a/amxmodx/libraries.h b/amxmodx/libraries.h index 29829427..ead5c346 100644 --- a/amxmodx/libraries.h +++ b/amxmodx/libraries.h @@ -12,7 +12,6 @@ #include #include "amxmodx.h" -#include "CString.h" enum LibSource { @@ -28,7 +27,7 @@ enum LibType struct Library { - String name; + ke::AString name; LibSource src; LibType type; void *parent; diff --git a/amxmodx/messages.cpp b/amxmodx/messages.cpp index 1d990c34..ff8861c2 100755 --- a/amxmodx/messages.cpp +++ b/amxmodx/messages.cpp @@ -11,7 +11,6 @@ #include "messages.h" Message Msg; -//CVector msgHooks[256]; RegisteredMessage msgHooks[256]; int msgBlocks[256] = {BLOCK_NOT}; int msgDest; @@ -38,7 +37,7 @@ Message::Message() bool Message::Ready() { - if (!m_Params.size()) + if (!m_Params.length()) return false; return true; } @@ -48,14 +47,14 @@ void Message::Init() if (!Ready()) { msgparam *p = new msgparam; - m_Params.push_back(p); + m_Params.append(p); } m_CurParam = 0; } Message::~Message() { - for (size_t i=0; i= m_Params.size()) + if (++m_CurParam >= m_Params.length()) { pParam = new msgparam; - m_Params.push_back(pParam); + m_Params.append(pParam); } else { pParam = m_Params[m_CurParam]; } @@ -80,7 +79,7 @@ void Message::AddParam(const char *data, msgtype type) { msgparam *pParam = AdvPtr(); - pParam->szData.assign(data); + pParam->szData = data; pParam->type = type; } @@ -121,7 +120,7 @@ const char *Message::GetParamString(size_t index) if (index < 1 || index > m_CurParam) return 0; - return m_Params[index]->szData.c_str(); + return m_Params[index]->szData.chars(); } int Message::GetParamInt(size_t index) @@ -153,7 +152,7 @@ void Message::SetParam(size_t index, const char *data) if (index < 1 || index > m_CurParam) return; - m_Params[index]->szData.assign(data); + m_Params[index]->szData = data; } void Message::Reset() @@ -194,7 +193,7 @@ void Message::Send() WRITE_COORD(pParam->v.fData); break; case arg_string: - WRITE_STRING(pParam->szData.c_str()); + WRITE_STRING(pParam->szData.chars()); break; case arg_entity: WRITE_ENTITY(pParam->v.iData); diff --git a/amxmodx/messages.h b/amxmodx/messages.h index e3d87f06..51c310fc 100755 --- a/amxmodx/messages.h +++ b/amxmodx/messages.h @@ -13,8 +13,6 @@ #include #include #include "amx.h" -#include "CVector.h" -#include "CString.h" #include "sh_stack.h" #define MAX_MESSAGES 255 @@ -28,7 +26,7 @@ class RegisteredMessage { private: - CVector m_Forwards; + ke::Vector m_Forwards; CStack m_InExecution; bool m_Cleanup; @@ -38,7 +36,7 @@ public: void AddHook(int fwd) { - m_Forwards.push_back(fwd); + m_Forwards.append(fwd); } bool RemoveHook(int fwd) { @@ -50,52 +48,45 @@ public: { this->m_Cleanup = true; - CVector::iterator iter = m_Forwards.begin(); - CVector::iterator end = m_Forwards.end(); - while (iter != end) + for (size_t i = 0; i < m_Forwards.length(); ++i) { - if (*iter == fwd) + int& forward = m_Forwards[i]; + + if (forward == fwd) { - if (*iter != -1) + if (forward != -1) { - unregisterSPForward(*iter); + unregisterSPForward(forward); } - *iter = -1; + + forward = -1; + return true; } - else - { - iter++; - } } - } else { - CVector::iterator iter = m_Forwards.begin(); - CVector::iterator end = m_Forwards.end(); - while (iter != end) + for (size_t i = 0; i < m_Forwards.length(); ++i) { - if (*iter == fwd) - { - if (fwd != -1) - { - unregisterSPForward(fwd); + int forward = m_Forwards[i]; - m_Forwards.erase(iter); + if (forward == fwd) + { + if (forward != -1) + { + unregisterSPForward(forward); + + m_Forwards.remove(forward); return true; } else { // -1 could be in here more than once - m_Forwards.erase(iter); + m_Forwards.remove(forward); } } - else - { - iter++; - } } } @@ -108,7 +99,7 @@ public: { m_InExecution.pop(); } - for (size_t i = 0; i < m_Forwards.size(); i++) + for (size_t i = 0; i < m_Forwards.length(); i++) { int fwd = m_Forwards[i]; @@ -126,7 +117,7 @@ public: m_InExecution.push(1); cell res = 0; cell thisres = 0; - for (size_t i = 0; i < m_Forwards.size(); i++) + for (size_t i = 0; i < m_Forwards.length(); i++) { int fwd = m_Forwards[i]; @@ -152,7 +143,7 @@ public: } bool Hooked() const { - return m_Forwards.size() != 0; + return m_Forwards.length() != 0; } }; enum msgtype @@ -175,7 +166,7 @@ struct msgparam REAL fData; int iData; } v; - String szData; + ke::AString szData; }; class Message @@ -201,7 +192,7 @@ public: private: msgparam *AdvPtr(); private: - CVector m_Params; + ke::Vector m_Params; size_t m_CurParam; }; diff --git a/amxmodx/meta_api.cpp b/amxmodx/meta_api.cpp index 216f8d08..f5e3d11b 100755 --- a/amxmodx/meta_api.cpp +++ b/amxmodx/meta_api.cpp @@ -55,7 +55,7 @@ void (*function)(void*); void (*endfunction)(void*); extern List g_auth_funcs; -extern CVector DynamicAdmins; +extern ke::Vector DynamicAdmins; CLog g_log; CForwardMngr g_forwards; @@ -74,8 +74,8 @@ Grenades g_grenades; LogEventsMngr g_logevents; MenuMngr g_menucmds; CLangMngr g_langMngr; -String g_log_dir; -String g_mod_name; +ke::AString g_log_dir; +ke::AString g_mod_name; XVars g_xvars; bool g_bmod_tfc; @@ -100,7 +100,7 @@ bool g_NewDLL_Available = false; #ifdef MEMORY_TEST float g_next_memreport_time; unsigned int g_memreport_count; - String g_memreport_dir; + ke::AString g_memreport_dir; bool g_memreport_enabled; #define MEMREPORT_INTERVAL 300.0f /* 5 mins */ #endif // MEMORY_TEST @@ -141,21 +141,21 @@ int FF_ChangeLevel = -1; IFileSystem* g_FileSystem; -bool ColoredMenus(String & ModName) +bool ColoredMenus(const char *ModName) { const char * pModNames[] = { "cstrike", "czero", "dmc", "dod", "tfc", "valve" }; const size_t ModsCount = sizeof(pModNames) / sizeof(const char *); for (size_t i = 0; i < ModsCount; ++i) { - if (ModName.compare(pModNames[i]) == 0) + if (strcmp(ModName, pModNames[i]) == 0) return true; // this game modification currently supports colored menus } return false; // no colored menus are supported for this game modification } -void ParseAndOrAdd(CStack & files, const char *name) +void ParseAndOrAdd(CStack & files, const char *name) { if (strncmp(name, "plugins-", 8) == 0) { @@ -164,7 +164,7 @@ void ParseAndOrAdd(CStack & files, const char *name) if (strcmp(&name[len-4], ".ini") == 0) { #endif - String *pString = new String(name); + ke::AString *pString = new ke::AString(name); files.push(pString); #if !defined WIN32 } @@ -172,7 +172,7 @@ void ParseAndOrAdd(CStack & files, const char *name) } } -void BuildPluginFileList(const char *initialdir, CStack & files) +void BuildPluginFileList(const char *initialdir, CStack & files) { char path[255]; #if defined WIN32 @@ -213,15 +213,15 @@ void BuildPluginFileList(const char *initialdir, CStack & files) //Loads a plugin list into the Plugin Cache and Load Modules cache void LoadExtraPluginsToPCALM(const char *initialdir) { - CStack files; + CStack files; BuildPluginFileList(initialdir, files); char path[255]; while (!files.empty()) { - String *pString = files.front(); + ke::AString *pString = files.front(); UTIL_Format(path, sizeof(path)-1, "%s/%s", initialdir, - pString->c_str()); + pString->chars()); g_plugins.CALMFromFile(path); delete pString; files.pop(); @@ -230,15 +230,15 @@ void LoadExtraPluginsToPCALM(const char *initialdir) void LoadExtraPluginsFromDir(const char *initialdir) { - CStack files; + CStack files; char path[255]; BuildPluginFileList(initialdir, files); while (!files.empty()) { - String *pString = files.front(); + ke::AString *pString = files.front(); UTIL_Format(path, sizeof(path)-1, "%s/%s", initialdir, - pString->c_str()); + pString->chars()); g_plugins.loadPluginsFromFile(path); delete pString; files.pop(); @@ -664,7 +664,7 @@ void C_ServerDeactivate() RETURN_META(MRES_IGNORED); } -extern CVector g_hudsync; +extern ke::Vector g_hudsync; // After all clear whole AMX configuration // However leave AMX modules which are loaded only once @@ -700,13 +700,13 @@ void C_ServerDeactivate_Post() ClearMessages(); // Flush the dynamic admins list - for (size_t iter=DynamicAdmins.size();iter--; ) + for (size_t iter=DynamicAdmins.length();iter--; ) { delete DynamicAdmins[iter]; } DynamicAdmins.clear(); - for (unsigned int i=0; itm_mon + 1, curTime->tm_mday, i); #if defined(__linux__) || defined(__APPLE__) - mkdir(build_pathname("%s", g_log_dir.c_str()), 0700); + mkdir(build_pathname("%s", g_log_dir.chars()), 0700); if (mkdir(build_pathname(buffer), 0700) < 0) #else - mkdir(build_pathname("%s", g_log_dir.c_str())); + mkdir(build_pathname("%s", g_log_dir.chars())); if (mkdir(build_pathname(buffer)) < 0) #endif { @@ -752,15 +752,15 @@ void C_ServerDeactivate_Post() break; } } - g_memreport_dir.assign(buffer); + g_memreport_dir = buffer; // g_memreport_dir should be valid now break; } } - m_dumpMemoryReport(build_pathname("%s/r%03d.txt", g_memreport_dir.c_str(), g_memreport_count)); - AMXXLOG_Log("Memreport #%d created (file \"%s/r%03d.txt\") (interval %f)", g_memreport_count + 1, g_memreport_dir.c_str(), g_memreport_count, MEMREPORT_INTERVAL); + m_dumpMemoryReport(build_pathname("%s/r%03d.txt", g_memreport_dir.chars(), g_memreport_count)); + AMXXLOG_Log("Memreport #%d created (file \"%s/r%03d.txt\") (interval %f)", g_memreport_count + 1, g_memreport_dir.chars(), g_memreport_count, MEMREPORT_INTERVAL); g_memreport_count++; } @@ -845,7 +845,7 @@ void C_ClientUserInfoChanged_Post(edict_t *pEntity, char *infobuffer) // Emulate bot connection and putinserver if (pPlayer->ingame) { - pPlayer->name.assign(name); // Make sure player have name up to date + pPlayer->name =name; // Make sure player have name up to date } else if (pPlayer->IsBot()) { pPlayer->Connect(name, "127.0.0.1"/*CVAR_GET_STRING("net_address")*/); @@ -1092,10 +1092,10 @@ void C_StartFrame_Post(void) char buffer[256]; sprintf(buffer, "%s/memreports/D%02d%02d%03d", get_localinfo("amxx_basedir", "addons/amxmodx"), curTime->tm_mon + 1, curTime->tm_mday, i); #if defined(__linux__) || defined(__APPLE__) - mkdir(build_pathname("%s", g_log_dir.c_str()), 0700); + mkdir(build_pathname("%s", g_log_dir.chars()), 0700); if (mkdir(build_pathname(buffer), 0700) < 0) #else - mkdir(build_pathname("%s", g_log_dir.c_str())); + mkdir(build_pathname("%s", g_log_dir.chars())); if (mkdir(build_pathname(buffer)) < 0) #endif { @@ -1111,14 +1111,14 @@ void C_StartFrame_Post(void) break; } } - g_memreport_dir.assign(buffer); + g_memreport_dir = buffer; // g_memreport_dir should be valid now break; } } - m_dumpMemoryReport(build_pathname("%s/r%03d.txt", g_memreport_dir.c_str(), g_memreport_count)); - AMXXLOG_Log("Memreport #%d created (file \"%s/r%03d.txt\") (interval %f)", g_memreport_count + 1, g_memreport_dir.c_str(), g_memreport_count, MEMREPORT_INTERVAL); + m_dumpMemoryReport(build_pathname("%s/r%03d.txt", g_memreport_dir.chars(), g_memreport_count)); + AMXXLOG_Log("Memreport #%d created (file \"%s/r%03d.txt\") (interval %f)", g_memreport_count + 1, g_memreport_dir.chars(), g_memreport_count, MEMREPORT_INTERVAL); g_memreport_count++; } @@ -1449,9 +1449,9 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m if (gameDir[i++] == '/') a = &gameDir[i]; - g_mod_name.assign(a); + g_mod_name = a; - g_coloredmenus = ColoredMenus(g_mod_name); // whether or not to use colored menus + g_coloredmenus = ColoredMenus(g_mod_name.chars()); // whether or not to use colored menus // ###### Print short GPL print_srvconsole("\n AMX Mod X version %s Copyright (c) 2004-2015 AMX Mod X Development Team \n" @@ -1469,14 +1469,14 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m while (a != amx_config.end()) { - SET_LOCALINFO((char*)a.key().c_str(), (char*)a.value().c_str()); + SET_LOCALINFO((char*)a.key().chars(), (char*)a.value().chars()); ++a; } amx_config.clear(); } // ###### Initialize logging here - g_log_dir.assign(get_localinfo("amxx_logs", "addons/amxmodx/logs")); + g_log_dir = get_localinfo("amxx_logs", "addons/amxmodx/logs"); // ###### Now attach metamod modules // This will also call modules Meta_Query and Meta_Attach functions @@ -1652,14 +1652,14 @@ C_DLLEXPORT int GetEngineFunctions(enginefuncs_t *pengfuncsFromEngine, int *inte { memset(&meta_engfuncs, 0, sizeof(enginefuncs_t)); - if (stricmp(g_mod_name.c_str(), "cstrike") == 0 || stricmp(g_mod_name.c_str(), "czero") == 0) + if (stricmp(g_mod_name.chars(), "cstrike") == 0 || stricmp(g_mod_name.chars(), "czero") == 0) { meta_engfuncs.pfnSetModel = C_SetModel; g_bmod_cstrike = true; } else { g_bmod_cstrike = false; - g_bmod_dod = !stricmp(g_mod_name.c_str(), "dod"); - g_bmod_tfc = !stricmp(g_mod_name.c_str(), "tfc"); + g_bmod_dod = !stricmp(g_mod_name.chars(), "dod"); + g_bmod_tfc = !stricmp(g_mod_name.chars(), "tfc"); } meta_engfuncs.pfnCmd_Argc = C_Cmd_Argc; diff --git a/amxmodx/modules.cpp b/amxmodx/modules.cpp index b935a459..232021da 100755 --- a/amxmodx/modules.cpp +++ b/amxmodx/modules.cpp @@ -19,7 +19,6 @@ #include "amxmodx.h" #include "osdep.h" // sleep, etc -#include "CFile.h" #include "amxxfile.h" #include "amxdbg.h" #include "newmenus.h" @@ -501,12 +500,12 @@ int set_amxnatives(AMX* amx, char error[128]) for (CList::iterator a = g_modules.begin(); a ; ++a) { cm = &(*a); - for (size_t i=0; im_Natives.size(); i++) + for (size_t i=0; im_Natives.length(); i++) { amx_Register(amx, cm->m_Natives[i], -1); } - for (size_t i = 0; i < cm->m_NewNatives.size(); i++) + for (size_t i = 0; i < cm->m_NewNatives.length(); i++) { amx_Register(amx, cm->m_NewNatives[i], -1); } @@ -663,14 +662,14 @@ const char* get_amxscriptname(AMX* amx) void get_modname(char* buffer) { - strcpy(buffer, g_mod_name.c_str()); + strcpy(buffer, g_mod_name.chars()); } char* build_pathname(const char *fmt, ...) { static char string[256]; int b; - int a = b = UTIL_Format(string, 255, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR); + int a = b = UTIL_Format(string, 255, "%s%c", g_mod_name.chars(), PATH_SEP_CHAR); va_list argptr; va_start(argptr, fmt); @@ -694,7 +693,7 @@ char* build_pathname(const char *fmt, ...) char *build_pathname_r(char *buffer, size_t maxlen, const char *fmt, ...) { - UTIL_Format(buffer, maxlen, "%s%c", g_mod_name.c_str(), PATH_SEP_CHAR); + UTIL_Format(buffer, maxlen, "%s%c", g_mod_name.chars(), PATH_SEP_CHAR); size_t len = strlen(buffer); char *ptr = buffer + len; @@ -740,17 +739,17 @@ char* build_pathname_addons(const char *fmt, ...) return string; } -bool ConvertModuleName(const char *pathString, String &path) +bool ConvertModuleName(const char *pathString, char *path) { - String local; + char local[PLATFORM_MAX_PATH]; - local.assign(pathString); - char *tmpname = const_cast(local.c_str()); + strncopy(local, pathString, sizeof(local)); + char *tmpname = local; char *orig_path = tmpname; - path.clear(); + *path = '\0'; - size_t len = local.size(); + size_t len = strlen(local); if (!len) return false; @@ -817,34 +816,24 @@ bool ConvertModuleName(const char *pathString, String &path) *ptr = '\0'; } - path.assign(orig_path); - path.append(PATH_SEP_CHAR); - path.append(tmpname); - path.append("_amxx"); -#if defined(__linux__) - #if defined AMD64 || PAWN_CELL_SIZE==64 - path.append("_amd64"); - #else - path.append("_i"); - path.append(iDigit); - path.append("86"); - #endif -#endif -#if defined WIN32 - path.append(".dll"); -#elif defined __linux__ - path.append(".so"); -#elif defined __APPLE__ - path.append(".dylib"); + size_t length = UTIL_Format(path, PLATFORM_MAX_PATH, "%s%c%s_amxx", orig_path, PATH_SEP_CHAR, tmpname); + +#if defined PLATFORM_LINUX +# if defined AMD64 || PAWN_CELL_SIZE == 64 + length += strncopy(path + length, "_amd64", PLATFORM_MAX_PATH - length); +# else + length += UTIL_Format(path + length, PLATFORM_MAX_PATH - length, "_i%d86", iDigit); +# endif #endif + UTIL_Format(path + length, PLATFORM_MAX_PATH - length, ".%s", PLATFORM_LIB_EXT); return true; } bool LoadModule(const char *shortname, PLUG_LOADTIME now, bool simplify, bool noFileBail) { - char pathString[512]; - String path; + char pathString[PLATFORM_MAX_PATH]; + char path[PLATFORM_MAX_PATH]; build_pathname_r( pathString, @@ -858,23 +847,23 @@ bool LoadModule(const char *shortname, PLUG_LOADTIME now, bool simplify, bool no if (!ConvertModuleName(pathString, path)) return false; } else { - path.assign(pathString); + strncopy(path, pathString, sizeof(path)); } if (noFileBail) { - FILE *fp = fopen(path.c_str(), "rb"); + FILE *fp = fopen(path, "rb"); if (!fp) return false; fclose(fp); } - CList::iterator a = g_modules.find(path.c_str()); + CList::iterator a = g_modules.find(path); if (a) return false; - CModule* cc = new CModule(path.c_str()); + CModule* cc = new CModule(path); cc->queryModule(); @@ -883,31 +872,31 @@ bool LoadModule(const char *shortname, PLUG_LOADTIME now, bool simplify, bool no switch (cc->getStatusValue()) { case MODULE_BADLOAD: - report_error(1, "[AMXX] Module is not a valid library (file \"%s\")", path.c_str()); + report_error(1, "[AMXX] Module is not a valid library (file \"%s\")", path); break; case MODULE_NOINFO: - report_error(1, "[AMXX] Couldn't find info about module (file \"%s\")", path.c_str()); + report_error(1, "[AMXX] Couldn't find info about module (file \"%s\")", path); break; case MODULE_NOQUERY: - report_error(1, "[AMXX] Couldn't find \"AMX_Query\" or \"AMXX_Query\" (file \"%s\")", path.c_str()); + report_error(1, "[AMXX] Couldn't find \"AMX_Query\" or \"AMXX_Query\" (file \"%s\")", path); break; case MODULE_NOATTACH: - report_error(1, "[AMXX] Couldn't find \"%s\" (file \"%s\")", cc->isAmxx() ? "AMXX_Attach" : "AMX_Attach", path.c_str()); + report_error(1, "[AMXX] Couldn't find \"%s\" (file \"%s\")", cc->isAmxx() ? "AMXX_Attach" : "AMX_Attach", path); break; case MODULE_OLD: - report_error(1, "[AMXX] Module has a different interface version (file \"%s\")", path.c_str()); + report_error(1, "[AMXX] Module has a different interface version (file \"%s\")", path); break; case MODULE_NEWER: - report_error(1, "[AMXX] Module has a newer interface version (file \"%s\"). Please download a new amxmodx.", path.c_str()); + report_error(1, "[AMXX] Module has a newer interface version (file \"%s\"). Please download a new amxmodx.", path); break; case MODULE_INTERROR: - report_error(1, "[AMXX] Internal error during module load (file \"%s\")", path.c_str()); + report_error(1, "[AMXX] Internal error during module load (file \"%s\")", path); break; case MODULE_NOT64BIT: - report_error(1, "[AMXX] Module \"%s\" is not 64 bit compatible.", path.c_str()); + report_error(1, "[AMXX] Module \"%s\" is not 64 bit compatible.", path); break; case MODULE_BADGAME: - report_error(1, "[AMXX] Module \"%s\" cannot load on game \"%s\"", path.c_str(), g_mod_name.c_str()); + report_error(1, "[AMXX] Module \"%s\" cannot load on game \"%s\"", path, g_mod_name.chars()); break; default: error = false; @@ -928,7 +917,7 @@ bool LoadModule(const char *shortname, PLUG_LOADTIME now, bool simplify, bool no get_localinfo("amxx_modulesdir", "addons/amxmodx/modules"), shortname); ConvertModuleName(mmpathname, path); - cc->attachMetamod(path.c_str(), now); + cc->attachMetamod(path, now); } bool retVal = cc->attachModule(); @@ -965,35 +954,37 @@ int loadModules(const char* filename, PLUG_LOADTIME now) return 0; } - String line; + char line[256]; char moduleName[256]; char buffer[255]; int loaded = 0; - String path; - while (!feof(fp)) { buffer[0] = '\0'; fgets(buffer, sizeof(buffer)-1, fp); - if (buffer[0] == ';' || buffer[0] == '\n') + UTIL_TrimLeft(buffer); + UTIL_TrimRight(buffer); + + if (!buffer[0] || buffer[0] == ';' || buffer[0] == '\n') continue; bool simplify = true; + if (buffer[0] == '>') { simplify = false; - line.assign(&buffer[1]); - } else { - line.assign(buffer); + strncopy(line, &buffer[1], sizeof(line)); + } + else + { + strncopy(line, buffer, sizeof(line)); } - - line.trim(); - *moduleName = 0; + *moduleName = '\0'; - if (sscanf(line.c_str(), "%s", moduleName) == EOF) + if (sscanf(line, "%s", moduleName) == EOF) continue; if (LoadModule(moduleName, now, simplify)) @@ -1130,7 +1121,7 @@ int MNF_AddNatives(AMX_NATIVE_INFO* natives) if (!g_CurrentlyCalledModule || g_ModuleCallReason != ModuleCall_Attach) return FALSE; // may only be called from attach - g_CurrentlyCalledModule->m_Natives.push_back(natives); + g_CurrentlyCalledModule->m_Natives.append(natives); return TRUE; } @@ -1140,21 +1131,14 @@ int MNF_AddNewNatives(AMX_NATIVE_INFO *natives) if (!g_CurrentlyCalledModule || g_ModuleCallReason != ModuleCall_Attach) return FALSE; // may only be called from attach - g_CurrentlyCalledModule->m_NewNatives.push_back(natives); + g_CurrentlyCalledModule->m_NewNatives.append(natives); return TRUE; } const char *MNF_GetModname(void) { - // :TODO: Do we have to do this?? - // I dunno who wrote the above comment but no -#if 0 - static char buffer[64]; - strcpy(buffer, g_mod_name.c_str()); - return buffer; -#endif - return g_mod_name.c_str(); + return g_mod_name.chars(); } AMX *MNF_GetAmxScript(int id) @@ -1314,7 +1298,7 @@ const char * MNF_GetPlayerName(int id) if (id < 1 || id > gpGlobals->maxClients) return NULL; - return GET_PLAYER_POINTER_I(id)->name.c_str(); + return GET_PLAYER_POINTER_I(id)->name.chars(); } void MNF_OverrideNatives(AMX_NATIVE_INFO *natives, const char *name) @@ -1340,7 +1324,7 @@ const char * MNF_GetPlayerIP(int id) if (id < 1 || id > gpGlobals->maxClients) return NULL; - return GET_PLAYER_POINTER_I(id)->ip.c_str(); + return GET_PLAYER_POINTER_I(id)->ip.chars(); } int MNF_IsPlayerInGame(int id) @@ -1614,7 +1598,7 @@ const char *MNF_GetPlayerTeam(int id) if (id < 1 || id > gpGlobals->maxClients) return NULL; - return (GET_PLAYER_POINTER_I(id)->team.c_str()); + return (GET_PLAYER_POINTER_I(id)->team.chars()); } #ifndef MEMORY_TEST @@ -1703,7 +1687,7 @@ int MNF_SetPlayerTeamInfo(int player, int teamid, const char *teamname) if (player < 1 || player > gpGlobals->maxClients) return 0; - CPlayer *pPlayer = GET_PLAYER_POINTER_I(player); + CPlayer *pPlayer = GET_PLAYER_POINTER_I(player); if (!pPlayer->ingame) return 0; @@ -1711,7 +1695,7 @@ int MNF_SetPlayerTeamInfo(int player, int teamid, const char *teamname) pPlayer->teamId = teamid; if (teamname != NULL) { - pPlayer->team.assign(teamname); + pPlayer->team = teamname; // Make sure team is registered, otherwise // natives relying on team id will return wrong result. diff --git a/amxmodx/msvc12/amxmodx_mm.vcxproj b/amxmodx/msvc12/amxmodx_mm.vcxproj index 87d7ded9..8c5866a8 100644 --- a/amxmodx/msvc12/amxmodx_mm.vcxproj +++ b/amxmodx/msvc12/amxmodx_mm.vcxproj @@ -253,7 +253,6 @@ - @@ -338,7 +337,6 @@ - @@ -352,12 +350,10 @@ - - diff --git a/amxmodx/msvc12/amxmodx_mm.vcxproj.filters b/amxmodx/msvc12/amxmodx_mm.vcxproj.filters index c789aa43..a4e18d81 100644 --- a/amxmodx/msvc12/amxmodx_mm.vcxproj.filters +++ b/amxmodx/msvc12/amxmodx_mm.vcxproj.filters @@ -78,9 +78,6 @@ Source Files - - Source Files - Source Files @@ -317,9 +314,6 @@ Header Files - - Header Files - Header Files @@ -350,18 +344,12 @@ Header Files - - Header Files - Header Files Header Files - - Header Files - Header Files diff --git a/amxmodx/natives.cpp b/amxmodx/natives.cpp index 36929bcd..18ff7a4a 100755 --- a/amxmodx/natives.cpp +++ b/amxmodx/natives.cpp @@ -28,7 +28,7 @@ //With the exception for param_convert, which was written by // Julien "dJeyL" Laurent -CVector g_RegNatives; +ke::Vector g_RegNatives; static char g_errorStr[512] = {0}; bool g_Initialized = false; @@ -40,7 +40,7 @@ int g_CurError = AMX_ERR_NONE; int amxx_DynaCallback(int idx, AMX *amx, cell *params) { - if (idx < 0 || idx >= (int)g_RegNatives.size()) + if (idx < 0 || idx >= (int)g_RegNatives.length()) { LogError(amx, AMX_ERR_NATIVE, "Invalid dynamic native called"); return 0; @@ -152,24 +152,24 @@ int amxx_DynaCallback(int idx, AMX *amx, cell *params) AMX_NATIVE_INFO *BuildNativeTable() { - if (g_RegNatives.size() < 1) + if (g_RegNatives.length() < 1) { return NULL; } - AMX_NATIVE_INFO *pNatives = new AMX_NATIVE_INFO[g_RegNatives.size() + 1]; + AMX_NATIVE_INFO *pNatives = new AMX_NATIVE_INFO[g_RegNatives.length() + 1]; AMX_NATIVE_INFO info; regnative *pNative; - for (size_t i=0; iname.c_str(); + info.name = pNative->name.chars(); info.func = (AMX_NATIVE)((void *)(pNative->pfn)); pNatives[i] = info; } - pNatives[g_RegNatives.size()].name = NULL; - pNatives[g_RegNatives.size()].func = NULL; + pNatives[g_RegNatives.length()].name = NULL; + pNatives[g_RegNatives.length()].func = NULL; //this needs to be deleted return pNatives; @@ -474,15 +474,15 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params) mprotect((void *)pNative->pfn, size+10, PROT_READ|PROT_WRITE|PROT_EXEC); #endif - int id = (int)g_RegNatives.size(); + int id = (int)g_RegNatives.length(); amxx_DynaMake(pNative->pfn, id); pNative->func = idx; pNative->style = params[3]; - g_RegNatives.push_back(pNative); + g_RegNatives.append(pNative); - pNative->name.assign(name); + pNative->name = name; return 1; } @@ -490,7 +490,7 @@ static cell AMX_NATIVE_CALL register_native(AMX *amx, cell *params) void ClearPluginLibraries() { ClearLibraries(LibSource_Plugin); - for (size_t i=0; ipfn; delete g_RegNatives[i]; diff --git a/amxmodx/natives.h b/amxmodx/natives.h index b753b952..4c1af335 100755 --- a/amxmodx/natives.h +++ b/amxmodx/natives.h @@ -26,7 +26,7 @@ struct regnative { AMX *amx; - String name; + ke::AString name; char *pfn; int func; int style; diff --git a/amxmodx/newmenus.cpp b/amxmodx/newmenus.cpp index 8d4ed69c..16ab5f59 100755 --- a/amxmodx/newmenus.cpp +++ b/amxmodx/newmenus.cpp @@ -11,12 +11,12 @@ #include "CMenu.h" #include "newmenus.h" -CVector g_NewMenus; +ke::Vector g_NewMenus; CStack g_MenuFreeStack; void ClearMenus() { - for (size_t i = 0; i < g_NewMenus.size(); i++) + for (size_t i = 0; i < g_NewMenus.length(); i++) { delete g_NewMenus[i]; } @@ -62,7 +62,7 @@ void validate_menu_text(char *str) Menu *get_menu_by_id(int id) { - if (id < 0 || size_t(id) >= g_NewMenus.size() || !g_NewMenus[id]) + if (id < 0 || size_t(id) >= g_NewMenus.length() || !g_NewMenus[id]) return NULL; return g_NewMenus[id]; @@ -90,14 +90,14 @@ isDestroying(false), items_per_page(7) } } - m_OptNames[abs(MENU_BACK)].assign("Back"); - m_OptNames[abs(MENU_MORE)].assign("More"); - m_OptNames[abs(MENU_EXIT)].assign("Exit"); + m_OptNames[abs(MENU_BACK)] = "Back"; + m_OptNames[abs(MENU_MORE)] = "More"; + m_OptNames[abs(MENU_EXIT)] = "Exit"; } Menu::~Menu() { - for (size_t i = 0; i < m_Items.size(); i++) + for (size_t i = 0; i < m_Items.length(); i++) { delete m_Items[i]; } @@ -111,22 +111,22 @@ menuitem *Menu::AddItem(const char *name, const char *cmd, int access) { menuitem *pItem = new menuitem; - pItem->name.assign(name); - pItem->cmd.assign(cmd); + pItem->name = name; + pItem->cmd = cmd; pItem->access = access; - pItem->id = m_Items.size(); + pItem->id = m_Items.length(); pItem->handler = -1; pItem->isBlank = false; pItem->pfn = NULL; - m_Items.push_back(pItem); + m_Items.append(pItem); return pItem; } menuitem *Menu::GetMenuItem(item_t item) { - if (item >= m_Items.size()) + if (item >= m_Items.length()) return NULL; return m_Items[item]; @@ -134,7 +134,7 @@ menuitem *Menu::GetMenuItem(item_t item) size_t Menu::GetItemCount() { - return m_Items.size(); + return m_Items.length(); } size_t Menu::GetPageCount() @@ -155,7 +155,7 @@ int Menu::PagekeyToItem(page_t page, item_t key) if (num_pages == 1 || !items_per_page) { - if (key > m_Items.size()) + if (key > m_Items.length()) { return MENU_EXIT; } else { @@ -167,9 +167,9 @@ int Menu::PagekeyToItem(page_t page, item_t key) { /* The algorithm for spaces here is same as a middle page. */ item_t new_key = key; - for (size_t i=start; i<(start+key-1) && iblanks.size(); j++) + for (size_t j=0; jblanks.length(); j++) { if (m_Items[i]->blanks[j].EatNumber()) { @@ -197,7 +197,7 @@ int Menu::PagekeyToItem(page_t page, item_t key) } else if (page == num_pages - 1) { //last page item_t item_tracker = 0; // tracks how many valid items we have passed so far. - size_t remaining = m_Items.size() - start; + size_t remaining = m_Items.length() - start; item_t new_key = key; // For every item that takes up a slot (item or padded blank) @@ -205,7 +205,7 @@ int Menu::PagekeyToItem(page_t page, item_t key) // For every item (not blanks), we increase item_tracker. // When new_key equals 0, item_tracker will then be set to // whatever valid item was selected. - for (size_t i=m_Items.size() - remaining; iblanks.size(); j++) + for (size_t j=0; jblanks.length(); j++) { if (m_Items[i]->blanks[j].EatNumber()) { @@ -249,9 +249,9 @@ int Menu::PagekeyToItem(page_t page, item_t key) * one from the key for each space we find along the way. */ item_t new_key = key; - for (size_t i=start; i<(start+items_per_page-1) && iblanks.size(); j++) + for (size_t j=0; jblanks.length(); j++) { if (m_Items[i]->blanks[j].EatNumber()) { @@ -336,23 +336,23 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) if (page >= pages) return NULL; - m_Text.clear(); + m_Text = nullptr; char buffer[255]; if (items_per_page && (pages != 1)) { if (m_AutoColors) - UTIL_Format(buffer, sizeof(buffer)-1, "\\y%s %d/%d\n\\w\n", m_Title.c_str(), page + 1, pages); + UTIL_Format(buffer, sizeof(buffer)-1, "\\y%s %d/%d\n\\w\n", m_Title.chars(), page + 1, pages); else - UTIL_Format(buffer, sizeof(buffer)-1, "%s %d/%d\n\n", m_Title.c_str(), page + 1, pages); + UTIL_Format(buffer, sizeof(buffer)-1, "%s %d/%d\n\n", m_Title.chars(), page + 1, pages); } else { if (m_AutoColors) - UTIL_Format(buffer, sizeof(buffer)-1, "\\y%s\n\\w\n", m_Title.c_str()); + UTIL_Format(buffer, sizeof(buffer)-1, "\\y%s\n\\w\n", m_Title.chars()); else - UTIL_Format(buffer, sizeof(buffer)-1, "%s\n\n", m_Title.c_str()); + UTIL_Format(buffer, sizeof(buffer)-1, "%s\n\n", m_Title.chars()); } - m_Text.append(buffer); + m_Text = m_Text + buffer; enum { @@ -446,39 +446,39 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) if (pItem->isBlank) { - UTIL_Format(buffer, sizeof(buffer)-1, "%s\n", pItem->name.c_str()); + UTIL_Format(buffer, sizeof(buffer)-1, "%s\n", pItem->name.chars()); } else if (enabled) { if (m_AutoColors) { - UTIL_Format(buffer, sizeof(buffer)-1, "%s%d.\\w %s\n", m_ItemColor.c_str(),option_display, pItem->name.c_str()); + UTIL_Format(buffer, sizeof(buffer)-1, "%s%d.\\w %s\n", m_ItemColor.chars(),option_display, pItem->name.chars()); } else { - UTIL_Format(buffer, sizeof(buffer)-1, "%d. %s\n", option_display, pItem->name.c_str()); + UTIL_Format(buffer, sizeof(buffer)-1, "%d. %s\n", option_display, pItem->name.chars()); } } else { if (m_AutoColors) { - UTIL_Format(buffer, sizeof(buffer)-1, "\\d%d. %s\n\\w", option_display, pItem->name.c_str()); + UTIL_Format(buffer, sizeof(buffer)-1, "\\d%d. %s\n\\w", option_display, pItem->name.chars()); } else { - UTIL_Format(buffer, sizeof(buffer)-1, "#. %s\n", pItem->name.c_str()); + UTIL_Format(buffer, sizeof(buffer)-1, "#. %s\n", pItem->name.chars()); } } slots++; - m_Text.append(buffer); + m_Text = m_Text + buffer; //attach blanks - if (pItem->blanks.size()) + if (pItem->blanks.length()) { - for (size_t j=0; jblanks.size(); j++) + for (size_t j=0; jblanks.length(); j++) { if (pItem->blanks[j].EatNumber()) { option++; } - m_Text.append(pItem->blanks[j].GetDisplay()); - m_Text.append("\n"); + m_Text = m_Text + pItem->blanks[j].GetDisplay(); + m_Text = m_Text + "\n"; slots++; } } @@ -489,11 +489,11 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) /* Pad spaces until we reach the end of the max possible items */ for (unsigned int i=(unsigned)slots; i 1) @@ -506,15 +506,15 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) UTIL_Format(buffer, sizeof(buffer)-1, "%s%d. \\w%s\n", - m_ItemColor.c_str(), + m_ItemColor.chars(), option == 10 ? 0 : option, - m_OptNames[abs(MENU_BACK)].c_str()); + m_OptNames[abs(MENU_BACK)].chars()); } else { UTIL_Format(buffer, sizeof(buffer)-1, "%d. %s\n", option == 10 ? 0 : option, - m_OptNames[abs(MENU_BACK)].c_str()); + m_OptNames[abs(MENU_BACK)].chars()); } } else { option++; @@ -524,12 +524,12 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) sizeof(buffer)-1, "\\d%d. %s\n\\w", option == 10 ? 0 : option, - m_OptNames[abs(MENU_BACK)].c_str()); + m_OptNames[abs(MENU_BACK)].chars()); } else { - UTIL_Format(buffer, sizeof(buffer)-1, "#. %s\n", m_OptNames[abs(MENU_BACK)].c_str()); + UTIL_Format(buffer, sizeof(buffer)-1, "#. %s\n", m_OptNames[abs(MENU_BACK)].chars()); } } - m_Text.append(buffer); + m_Text + m_Text + buffer; if (flags & Display_Next) { @@ -539,15 +539,15 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) UTIL_Format(buffer, sizeof(buffer)-1, "%s%d. \\w%s\n", - m_ItemColor.c_str(), + m_ItemColor.chars(), option == 10 ? 0 : option, - m_OptNames[abs(MENU_MORE)].c_str()); + m_OptNames[abs(MENU_MORE)].chars()); } else { UTIL_Format(buffer, sizeof(buffer)-1, "%d. %s\n", option == 10 ? 0 : option, - m_OptNames[abs(MENU_MORE)].c_str()); + m_OptNames[abs(MENU_MORE)].chars()); } } else { option++; @@ -557,12 +557,12 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) sizeof(buffer)-1, "\\d%d. %s\n\\w", option == 10 ? 0 : option, - m_OptNames[abs(MENU_MORE)].c_str()); + m_OptNames[abs(MENU_MORE)].chars()); } else { - UTIL_Format(buffer, sizeof(buffer)-1, "#. %s\n", m_OptNames[abs(MENU_MORE)].c_str()); + UTIL_Format(buffer, sizeof(buffer)-1, "#. %s\n", m_OptNames[abs(MENU_MORE)].chars()); } } - m_Text.append(buffer); + m_Text = m_Text + buffer; } else { /* Keep padding */ option += 2; @@ -573,7 +573,7 @@ const char *Menu::GetTextString(int player, page_t page, int &keys) { /* Visual pad has not been added yet */ if (!items_per_page) - m_Text.append("\n"); + m_Text = m_Text + "\n"; keys |= (1<isDestroying) { \ - LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.size()); \ + LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.length()); \ return 0; } //Makes a new menu handle (-1 for failure) @@ -623,8 +623,8 @@ static cell AMX_NATIVE_CALL menu_create(AMX *amx, cell *params) if (g_MenuFreeStack.empty()) { - g_NewMenus.push_back(pMenu); - pMenu->thisId = (int)g_NewMenus.size() - 1; + g_NewMenus.append(pMenu); + pMenu->thisId = (int)g_NewMenus.length() - 1; } else { int pos = g_MenuFreeStack.front(); g_MenuFreeStack.pop(); @@ -644,13 +644,13 @@ static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params) return 0; } - if (!pMenu->m_Items.size()) + if (!pMenu->m_Items.length()) { LogError(amx, AMX_ERR_NATIVE, "Blanks can only be added after items."); return 0; } - menuitem *item = pMenu->m_Items[pMenu->m_Items.size() - 1]; + menuitem *item = pMenu->m_Items[pMenu->m_Items.length() - 1]; BlankItem a; @@ -662,7 +662,7 @@ static cell AMX_NATIVE_CALL menu_addblank(AMX *amx, cell *params) else a.SetEatNumber(false); - item->blanks.push_back(a); + item->blanks.append(ke::Move(a)); return 1; } @@ -676,13 +676,13 @@ static cell AMX_NATIVE_CALL menu_addtext(AMX *amx, cell *params) return 0; } - if (!pMenu->m_Items.size()) + if (!pMenu->m_Items.length()) { LogError(amx, AMX_ERR_NATIVE, "Blanks can only be added after items."); return 0; } - menuitem *item = pMenu->m_Items[pMenu->m_Items.size() - 1]; + menuitem *item = pMenu->m_Items[pMenu->m_Items.length() - 1]; BlankItem a; @@ -695,7 +695,7 @@ static cell AMX_NATIVE_CALL menu_addtext(AMX *amx, cell *params) else a.SetEatNumber(false); - item->blanks.push_back(a); + item->blanks.append(ke::Move(a)); return 1; } @@ -800,7 +800,7 @@ static cell AMX_NATIVE_CALL menu_display(AMX *amx, cell *params) int loops = 0; while ((menu = pPlayer->newmenu) >= 0) { - if ((size_t)menu >= g_NewMenus.size() || !g_NewMenus[menu]) + if ((size_t)menu >= g_NewMenus.length() || !g_NewMenus[menu]) { break; } @@ -856,8 +856,8 @@ static cell AMX_NATIVE_CALL menu_item_getinfo(AMX *amx, cell *params) cell *addr = get_amxaddr(amx, params[3]); addr[0] = pItem->access; - set_amxstring(amx, params[4], pItem->cmd.c_str(), params[5]); - set_amxstring(amx, params[6], pItem->name.c_str(), params[7]); + set_amxstring(amx, params[4], pItem->cmd.chars(), params[5]); + set_amxstring(amx, params[6], pItem->name.chars(), params[7]); if (params[8]) { @@ -899,7 +899,7 @@ static cell AMX_NATIVE_CALL menu_item_setname(AMX *amx, cell *params) name = get_amxstring(amx, params[3], 0, len); - pItem->name.assign(name); + pItem->name = name; return 1; } @@ -918,7 +918,7 @@ static cell AMX_NATIVE_CALL menu_item_setcmd(AMX *amx, cell *params) cmd = get_amxstring(amx, params[3], 0, len); - pItem->cmd.assign(cmd); + pItem->cmd = cmd; return 1; } @@ -954,7 +954,7 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params) { char *str = get_amxstring(amx, params[3], 0, len); validate_menu_text(str); - pMenu->m_ItemColor.assign(str); + pMenu->m_ItemColor = str; break; } case MPROP_PERPAGE: @@ -972,27 +972,27 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params) { char *str = get_amxstring(amx, params[3], 0, len); validate_menu_text(str); - pMenu->m_OptNames[abs(MENU_BACK)].assign(str); + pMenu->m_OptNames[abs(MENU_BACK)] = str; break; } case MPROP_NEXTNAME: { char *str = get_amxstring(amx, params[3], 0, len); validate_menu_text(str); - pMenu->m_OptNames[abs(MENU_MORE)].assign(str); + pMenu->m_OptNames[abs(MENU_MORE)] = str; break; } case MPROP_EXITNAME: { char *str = get_amxstring(amx, params[3], 0, len); validate_menu_text(str); - pMenu->m_OptNames[abs(MENU_EXIT)].assign(str); + pMenu->m_OptNames[abs(MENU_EXIT)] = str; break; } case MPROP_TITLE: { char *str = get_amxstring(amx, params[3], 0, len); - pMenu->m_Title.assign(str); + pMenu->m_Title = str; break; } case MPROP_EXITALL: @@ -1038,7 +1038,7 @@ static cell AMX_NATIVE_CALL menu_setprop(AMX *amx, cell *params) #define GETMENU_R(p) Menu *pMenu = get_menu_by_id(p); \ if (pMenu == NULL) { \ - LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.size()); \ + LogError(amx, AMX_ERR_NATIVE, "Invalid menu id %d(%d)", p, g_NewMenus.length()); \ return 0; } static cell AMX_NATIVE_CALL menu_cancel(AMX *amx, cell *params) diff --git a/amxmodx/newmenus.h b/amxmodx/newmenus.h index 1248bf0f..e2c79afb 100755 --- a/amxmodx/newmenus.h +++ b/amxmodx/newmenus.h @@ -36,38 +36,36 @@ typedef int (*MENUITEM_CALLBACK)(int, int, int); class BlankItem { private: - char *m_text; + ke::AString m_text; bool m_num; public: - BlankItem() : m_text(NULL), m_num(false) { } - BlankItem(BlankItem &src) { this->copyFrom(src); } - ~BlankItem() { free(m_text); } - - void copyFrom(BlankItem &src) - { - m_text = src.m_text; - m_num = src.m_num; - src.m_text = NULL; // stop the src from freeing the buffer + BlankItem() : m_num(false) + { + } + + BlankItem(BlankItem &&other) + { + m_text = ke::Forward(other.m_text); + m_num = other.m_num; } - BlankItem &operator = (const BlankItem &src) { this->copyFrom(const_cast(src)); return *this; } /* is this text instead of a blank */ - bool IsText() { return m_text != NULL; } + bool IsText() { return m_text.chars() != nullptr; } /* is this a blank instead of text */ - bool IsBlank() { return m_text == NULL; } + bool IsBlank() { return m_text.chars() == nullptr; } /* does this item take up a number */ bool EatNumber() { return m_num; } /* the text this item is to display */ - const char *GetDisplay() { return m_text == NULL ? "" : m_text; } + const char *GetDisplay() { return m_text.chars(); } /* sets this item to use a blank */ - void SetBlank() { free(m_text); m_text = NULL; } + void SetBlank() { m_text = nullptr; } /* sets this item to display text */ - void SetText(const char *text) { free(m_text); m_text = strdup(text); } + void SetText(const char *text) { m_text = text; } /* sets whether or not this item takes up a line */ void SetEatNumber(bool val) { m_num = val; } @@ -75,8 +73,8 @@ public: }; struct menuitem { - String name; - String cmd; + ke::AString name; + ke::AString cmd; int access; int handler; @@ -85,7 +83,7 @@ struct menuitem MENUITEM_CALLBACK pfn; size_t id; - CVector blanks; + ke::Vector blanks; }; typedef unsigned int menu_t; @@ -110,13 +108,13 @@ public: int PagekeyToItem(page_t page, item_t key); int GetMenuMenuid(); public: - CVector m_Items; - String m_Title; - String m_Text; + ke::Vector m_Items; - String m_OptNames[4]; + ke::AString m_Title; + ke::AutoString m_Text; + ke::AString m_OptNames[4]; + ke::AString m_ItemColor; - String m_ItemColor; bool m_NeverExit; bool m_ForceExit; bool m_AutoColors; @@ -132,7 +130,7 @@ public: void ClearMenus(); Menu *get_menu_by_id(int id); -extern CVector g_NewMenus; +extern ke::Vector g_NewMenus; extern AMX_NATIVE_INFO g_NewMenuNatives[]; #endif //_INCLUDE_NEWMENUS_H diff --git a/amxmodx/string.cpp b/amxmodx/string.cpp index 64275cdd..726bd048 100755 --- a/amxmodx/string.cpp +++ b/amxmodx/string.cpp @@ -1251,17 +1251,16 @@ static cell AMX_NATIVE_CALL amx_strlen(AMX *amx, cell *params) static cell AMX_NATIVE_CALL amx_trim(AMX *amx, cell *params) { - int len; + int len, newlen; char *str = get_amxstring(amx, params[1], 0, len); - String toTrim; + UTIL_TrimLeft(str); + UTIL_TrimRight(str); - toTrim.assign(str); - toTrim.trim(); + newlen = strlen(str); + len -= newlen; - len -= toTrim.size(); - - set_amxstring(amx, params[1], toTrim.c_str(), toTrim.size()); + set_amxstring(amx, params[1], str, newlen); return len; } diff --git a/amxmodx/util.cpp b/amxmodx/util.cpp index 891ca91c..487b49af 100755 --- a/amxmodx/util.cpp +++ b/amxmodx/util.cpp @@ -711,3 +711,48 @@ size_t UTIL_Format(char *buffer, size_t maxlength, const char *fmt, ...) return len; } } + +// From Metamod:Source +void UTIL_TrimLeft(char *buffer) +{ + /* Let's think of this as our iterator */ + char *i = buffer; + + /* Make sure the buffer isn't null */ + if (i && *i) + { + /* Add up number of whitespace characters */ + while (isspace(static_cast(*i))) + { + i++; + } + + /* If whitespace chars in buffer then adjust string so first non-whitespace char is at start of buffer */ + if (i != buffer) + { + memmove(buffer, i, (strlen(i) + 1) * sizeof(char)); + } + } +} + +void UTIL_TrimRight(char *buffer) +{ + /* Make sure buffer isn't null */ + if (buffer) + { + size_t len = strlen(buffer); + + /* Loop through buffer backwards while replacing whitespace chars with null chars */ + for (size_t i = len - 1; i < len; i--) + { + if (isspace(static_cast(buffer[i]))) + { + buffer[i] = '\0'; + } + else + { + break; + } + } + } +} \ No newline at end of file diff --git a/modules/ns/Hash.h b/modules/ns/Hash.h index f20c997c..a09f11b0 100644 --- a/modules/ns/Hash.h +++ b/modules/ns/Hash.h @@ -164,7 +164,7 @@ public: { if (hashbucket->at(i) == hash) { - if (key.compare(keybucket->at(i).chars()) == 0) + if (key.compare(keybucket->at(i)) == 0) { return &(m_DataBuckets[bucketnum].at(i)); } diff --git a/public/auto-string.h b/public/auto-string.h index 75e4f8f0..da7aec5e 100644 --- a/public/auto-string.h +++ b/public/auto-string.h @@ -24,130 +24,132 @@ #include #include -using namespace ke; +namespace ke { class AutoString { - public: - AutoString() : ptr_(NULL), length_(0) - { - } - AutoString(AutoString &&other) - : ptr_(other.ptr_), - length_(other.length_) - { - other.ptr_ = nullptr; - other.length_ = 0; - } - AutoString(const char *ptr) - { - assign(ptr); - } - AutoString(const AString &str) - { - assign(str.chars(), str.length()); - } - AutoString(const char *ptr, size_t len) - { - assign(ptr, len); - } - AutoString(const AutoString &other) - { - assign(other.ptr(), other.length()); - } - ~AutoString() - { - free(ptr_); - } +public: + AutoString() : ptr_(nullptr), length_(0) + { + } + AutoString(AutoString &&other) + : ptr_(other.ptr_), + length_(other.length_) + { + other.ptr_ = nullptr; + other.length_ = 0; + } + AutoString(const char *ptr) + { + assign(ptr); + } + AutoString(const AString &str) + { + assign(str.chars(), str.length()); + } + AutoString(const char *ptr, size_t len) + { + assign(ptr, len); + } + AutoString(const AutoString &other) + { + assign(other.ptr(), other.length()); + } + ~AutoString() + { + free(ptr_); + } - AutoString &operator =(const char *ptr) { - free(ptr_); - assign(ptr); - return *this; - } - AutoString &operator =(const AutoString &other) { - free(ptr_); - assign(other.ptr(), other.length()); - return *this; - } - AutoString &operator =(AutoString &&other) { - Swap(other.ptr_, ptr_); - Swap(other.length_, length_); - return *this; - } + AutoString &operator =(const char *ptr) { + free(ptr_); + assign(ptr); + return *this; + } + AutoString &operator =(const AutoString &other) { + free(ptr_); + assign(other.ptr(), other.length()); + return *this; + } + AutoString &operator =(AutoString &&other) { + Swap(other.ptr_, ptr_); + Swap(other.length_, length_); + return *this; + } - AutoString operator +(const AutoString &other) const { - size_t len = length() + other.length(); - char *buf = (char *)malloc(len + 1); - memcpy(buf, ptr(), length()); - memcpy(buf + length(), other.ptr(), other.length()); - buf[len] = '\0'; + AutoString operator +(const AutoString &other) const { + size_t len = length() + other.length(); + char *buf = (char *)malloc(len + 1); + memcpy(buf, ptr(), length()); + memcpy(buf + length(), other.ptr(), other.length()); + buf[len] = '\0'; - AutoString r; - r.ptr_ = buf; - r.length_ = len; - return r; - } + AutoString r; + r.ptr_ = buf; + r.length_ = len; + return r; + } - AutoString operator +(const char *other) const { - size_t other_length = strlen(other); - size_t len = length() + other_length; - char *buf = (char *)malloc(len + 1); - memcpy(buf, ptr(), length()); - memcpy(buf + length(), other, other_length); - buf[len] = '\0'; + AutoString operator +(const char *other) const { + size_t other_length = strlen(other); + size_t len = length() + other_length; + char *buf = (char *)malloc(len + 1); + memcpy(buf, ptr(), length()); + memcpy(buf + length(), other, other_length); + buf[len] = '\0'; - AutoString r; - r.ptr_ = buf; - r.length_ = len; - return r; - } + AutoString r; + r.ptr_ = buf; + r.length_ = len; + return r; + } - AutoString operator +(unsigned val) const { - char buffer[24]; - _snprintf(buffer, sizeof(buffer), "%d", val); - return *this + buffer; - } + AutoString operator +(unsigned val) const { + char buffer[24]; + _snprintf(buffer, sizeof(buffer), "%d", val); + return *this + buffer; + } - size_t length() const { - return length_; - } + size_t length() const { + return length_; + } - bool operator !() const { - return !length_; - } + bool operator !() const { + return !length_; + } - const char *ptr() const { - return ptr_ ? ptr_ : ""; - } - operator const char *() const { - return ptr(); - } + const char *ptr() const { + return ptr_ ? ptr_ : ""; + } + operator const char *() const { + return ptr(); + } - private: - void assign(const char *ptr) { - if (!ptr) { - ptr_ = NULL; - length_ = 0; - return; - } - assign(ptr, strlen(ptr)); +private: + void assign(const char *ptr) { + if (!ptr) { + ptr_ = nullptr; + length_ = 0; + return; } - void assign(const char *ptr, size_t length) { - if (!ptr) { - ptr_ = NULL; - length_ = 0; - return; - } - length_ = length; - ptr_ = (char *)malloc(length_ + 1); - memcpy(ptr_, ptr, length_); - ptr_[length_] = '\0'; + assign(ptr, strlen(ptr)); + } + void assign(const char *ptr, size_t length) { + if (!ptr) { + ptr_ = nullptr; + length_ = 0; + return; } + length_ = length; + ptr_ = (char *)malloc(length_ + 1); + memcpy(ptr_, ptr, length_); + ptr_[length_] = '\0'; + } + +private: + char *ptr_; + size_t length_; +}; - private: - char *ptr_; - size_t length_; }; #endif // _include_spcomp_auto_string_h_