diff options
-rwxr-xr-x | src/server/game/Chat/Channels/Channel.cpp | 4 | ||||
-rwxr-xr-x | src/server/game/Entities/Item/Item.cpp | 4 | ||||
-rwxr-xr-x | src/server/game/Entities/Object/Object.cpp | 20 | ||||
-rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 16 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 6 | ||||
-rwxr-xr-x | src/server/game/Instances/InstanceSaveMgr.cpp | 2 | ||||
-rwxr-xr-x | src/server/shared/Database/MySQLConnection.h | 25 | ||||
-rwxr-xr-x | src/server/shared/Utilities/Util.cpp | 36 | ||||
-rwxr-xr-x | src/server/shared/Utilities/Util.h | 8 |
9 files changed, 65 insertions, 56 deletions
diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 169ea0269e1..f031fe6f489 100755 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -65,11 +65,11 @@ Channel::Channel(const std::string& name, uint32 channel_id, uint32 Team) if (db_BannedList) { - Tokens tokens = StrSplit(db_BannedList, " "); + Tokens tokens(db_BannedList, ' '); Tokens::iterator iter; for (iter = tokens.begin(); iter != tokens.end(); ++iter) { - uint64 banned_guid = atol((*iter).c_str()); + uint64 banned_guid = atol(*iter); if (banned_guid) { sLog.outDebug("Channel(%s) loaded banned guid:" UI64FMTD "",name.c_str(), banned_guid); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 55d5c80889c..68be75501ae 100755 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -418,10 +418,10 @@ bool Item::LoadFromDB(uint32 guid, uint64 owner_guid, Field* fields, uint32 entr need_save = true; } - Tokens tokens = StrSplit(fields[4].GetString(), " "); + Tokens tokens(fields[4].GetString(), ' ', MAX_ITEM_PROTO_SPELLS); if (tokens.size() == MAX_ITEM_PROTO_SPELLS) for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i) - SetSpellCharges(i, atoi(tokens[i].c_str())); + SetSpellCharges(i, atoi(tokens[i])); SetUInt32Value(ITEM_FIELD_FLAGS, fields[5].GetUInt32()); // Remove bind flag for items vs NO_BIND set diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 7c5768a80e0..868443031ae 100755 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -764,17 +764,13 @@ bool Object::LoadValues(const char* data) { if (!m_uint32Values) _InitValues(); - Tokens tokens = StrSplit(data, " "); + Tokens tokens(data, ' '); if (tokens.size() != m_valuesCount) return false; - Tokens::iterator iter; - int index; - for (iter = tokens.begin(), index = 0; index < m_valuesCount; ++iter, ++index) - { - m_uint32Values[index] = atol((*iter).c_str()); - } + for (uint16 index = 0; index < m_valuesCount; ++index) + m_uint32Values[index] = atol(tokens[index]); return true; } @@ -784,17 +780,13 @@ void Object::_LoadIntoDataField(const char* data, uint32 startOffset, uint32 cou if (!data) return; - Tokens tokens = StrSplit(data, " "); + Tokens tokens(data, ' ', count); if (tokens.size() != count) return; - Tokens::iterator iter; - uint32 index; - for (iter = tokens.begin(), index = 0; index < count; ++iter, ++index) - { - m_uint32Values[startOffset + index] = atol((*iter).c_str()); - } + for (uint32 index = 0; index < count; ++index) + m_uint32Values[startOffset + index] = atol(tokens[index]); } void Object::_SetUpdateBits(UpdateMask *updateMask, Player* /*target*/) const diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 53c5f0f2aa2..085b18c2feb 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -183,7 +183,7 @@ void PlayerTaxi::InitTaxiNodesForLevel(uint32 race, uint32 chrClass, uint8 level void PlayerTaxi::LoadTaxiMask(const char* data) { - Tokens tokens = StrSplit(data, " "); + Tokens tokens(data, ' '); uint8 index; Tokens::iterator iter; @@ -191,7 +191,7 @@ void PlayerTaxi::LoadTaxiMask(const char* data) (index < TaxiMaskSize) && (iter != tokens.end()); ++iter, ++index) { // load and set bits only for existed taxi nodes - m_taximask[index] = sTaxiNodesMask[index] & uint32(atol((*iter).c_str())); + m_taximask[index] = sTaxiNodesMask[index] & uint32(atol(*iter)); } } @@ -213,11 +213,11 @@ bool PlayerTaxi::LoadTaxiDestinationsFromString(const std::string& values, uint3 { ClearTaxiDestinations(); - Tokens tokens = StrSplit(values," "); + Tokens tokens(values,' '); for (Tokens::iterator iter = tokens.begin(); iter != tokens.end(); ++iter) { - uint32 node = uint32(atol(iter->c_str())); + uint32 node = uint32(atol(*iter)); AddTaxiDestination(node); } @@ -1697,7 +1697,7 @@ bool Player::BuildEnumData(QueryResult result, WorldPacket * p_data) *p_data << uint32(petFamily); } - Tokens data = StrSplit(fields[19].GetString(), " "); + Tokens data(fields[19].GetString(), ' '); for (uint8 slot = 0; slot < EQUIPMENT_SLOT_END; ++slot) { uint32 visualbase = slot * 2; @@ -15997,7 +15997,7 @@ uint32 Player::GetUInt32ValueFromArray(Tokens const& data, uint16 index) if (index >= data.size()) return 0; - return (uint32)atoi(data[index].c_str()); + return (uint32)atoi(data[index]); } float Player::GetFloatValueFromArray(Tokens const& data, uint16 index) @@ -16953,10 +16953,10 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timediff) { Field* fields2 = result2->Fetch(); std::string strGUID = fields2[0].GetString(); - Tokens GUIDlist = StrSplit(strGUID, " "); + Tokens GUIDlist(strGUID, ' '); AllowedLooterSet looters; for (Tokens::iterator itr = GUIDlist.begin(); itr != GUIDlist.end(); ++itr) - looters.insert(atol((*itr).c_str())); + looters.insert(atol(*itr)); item->SetSoulboundTradeable(&looters, this, true); m_itemSoulboundTradeable.push_back(item); } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5b155a2879e..5981c8ea9af 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -13806,7 +13806,7 @@ void CharmInfo::LoadPetActionBar(const std::string& data) { InitPetActionBar(); - Tokens tokens = StrSplit(data, " "); + Tokens tokens(data, ' '); if (tokens.size() != (ACTION_BAR_INDEX_END-ACTION_BAR_INDEX_START)*2) return; // non critical, will reset to default @@ -13816,9 +13816,9 @@ void CharmInfo::LoadPetActionBar(const std::string& data) for (iter = tokens.begin(), index = ACTION_BAR_INDEX_START; index < ACTION_BAR_INDEX_END; ++iter, ++index) { // use unsigned cast to avoid sign negative format use at long-> ActiveStates (int) conversion - ActiveStates type = ActiveStates(atol(iter->c_str())); + ActiveStates type = ActiveStates(atol(*iter)); ++iter; - uint32 action = uint32(atol(iter->c_str())); + uint32 action = uint32(atol(*iter)); PetActionBar[index].SetActionAndType(action, type); diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index 8e290160883..324b76da2ef 100755 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -219,7 +219,7 @@ bool InstanceSave::UnloadIfEmpty() void InstanceSaveManager::_DelHelper(const char *fields, const char *table, const char *queryTail,...) { - Tokens fieldTokens = StrSplit(fields, ", "); + Tokens fieldTokens(fields, ','); ASSERT(fieldTokens.size() != 0); va_list ap; diff --git a/src/server/shared/Database/MySQLConnection.h b/src/server/shared/Database/MySQLConnection.h index ccd0dd515cd..56a670d07c1 100755 --- a/src/server/shared/Database/MySQLConnection.h +++ b/src/server/shared/Database/MySQLConnection.h @@ -32,19 +32,18 @@ struct MySQLConnectionInfo MySQLConnectionInfo() {} MySQLConnectionInfo(const std::string& infoString) { - Tokens tokens = StrSplit(infoString, ";"); - Tokens::iterator iter = tokens.begin(); - - if (iter != tokens.end()) - host = *iter++; - if (iter != tokens.end()) - port_or_socket = *iter++; - if (iter != tokens.end()) - user = *iter++; - if (iter != tokens.end()) - password = *iter++; - if (iter != tokens.end()) - database = *iter++; + Tokens tokens(infoString, ';'); + + if (tokens.size() != 5) + return; + + uint8 i = 0; + + host.assign(tokens[i++]); + port_or_socket.assign(tokens[i++]); + user.assign(tokens[i++]); + password.assign(tokens[i++]); + database.assign(tokens[i++]); } std::string user; diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp index 6afbe92c0b7..371bd2c7e2b 100755 --- a/src/server/shared/Utilities/Util.cpp +++ b/src/server/shared/Utilities/Util.cpp @@ -85,24 +85,38 @@ double rand_chance(void) } #endif -Tokens StrSplit(const std::string &src, const std::string &sep) +Tokens::Tokens(const std::string &src, const char sep, uint32 vectorReserve) { - Tokens r; - std::string s; - for (std::string::const_iterator i = src.begin(); i != src.end(); i++) + m_str = new char[src.length() + 1]; + memcpy(m_str, src.c_str(), src.length() + 1); + + if (vectorReserve) + reserve(vectorReserve); + + char* posold = m_str; + char* posnew = m_str; + + for (;;) { - if (sep.find(*i) != std::string::npos) + if (*posnew == sep) { - if (s.length()) r.push_back(s); - s = ""; + push_back(posold); + posold = posnew + 1; + + *posnew = 0x00; } - else + else if (*posnew == 0x00) { - s += *i; + // Hack like, but the old code accepted these kind of broken strings, + // so changing it would break other things + if (posold != posnew) + push_back(posold); + + break; } + + ++posnew; } - if (s.length()) r.push_back(s); - return r; } void stripLineInvisibleChars(std::string &str) diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h index c55da24fc80..8a49d7d9681 100755 --- a/src/server/shared/Utilities/Util.h +++ b/src/server/shared/Utilities/Util.h @@ -24,9 +24,13 @@ #include <string> #include <vector> -typedef std::vector<std::string> Tokens; +struct Tokens: public std::vector<char*> +{ + Tokens(const std::string &src, const char sep, uint32 vectorReserve = 0); + ~Tokens() { delete m_str; } -Tokens StrSplit(const std::string &src, const std::string &sep); + char* m_str; +}; void stripLineInvisibleChars(std::string &src); |