diff options
| -rw-r--r-- | dep/boost/CMakeLists.txt | 36 | ||||
| -rw-r--r-- | src/common/Utilities/Regex.h | 39 | ||||
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 16 | ||||
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 4 | ||||
| -rw-r--r-- | src/server/game/Scripting/ScriptReloadMgr.cpp | 8 |
5 files changed, 77 insertions, 26 deletions
diff --git a/dep/boost/CMakeLists.txt b/dep/boost/CMakeLists.txt index fc20347c2c8..988006b2ecd 100644 --- a/dep/boost/CMakeLists.txt +++ b/dep/boost/CMakeLists.txt @@ -26,11 +26,20 @@ if(WIN32) set(Boost_USE_STATIC_RUNTIME OFF) endif() -find_package(Boost 1.55 REQUIRED system filesystem thread program_options iostreams) +include (CheckCXXSourceCompiles) -# Find if Boost was compiled in C++03 mode because it requires -DBOOST_NO_CXX11_SCOPED_ENUMS +check_cxx_source_compiles(" + #include <regex> + int main() { std::wregex r(L\".*\"); }" + STD_HAS_WORKING_WREGEX) -include (CheckCXXSourceCompiles) +if (STD_HAS_WORKING_WREGEX) + find_package(Boost 1.55 REQUIRED system filesystem thread program_options iostreams) +else() + find_package(Boost 1.55 REQUIRED system filesystem thread program_options iostreams regex) +endif() + +# Find if Boost was compiled in C++03 mode because it requires -DBOOST_NO_CXX11_SCOPED_ENUMS set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIR}) set(CMAKE_REQUIRED_LIBRARIES ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_IOSTREAMS_LIBRARY}) @@ -54,17 +63,20 @@ target_include_directories(boost INTERFACE ${Boost_INCLUDE_DIRS}) -if (boost_filesystem_copy_links_without_NO_SCOPED_ENUM) +target_compile_definitions(boost + INTERFACE + -DBOOST_DATE_TIME_NO_LIB + -DBOOST_REGEX_NO_LIB + -DBOOST_CHRONO_NO_LIB) + +if (NOT boost_filesystem_copy_links_without_NO_SCOPED_ENUM) target_compile_definitions(boost INTERFACE - -DBOOST_DATE_TIME_NO_LIB - -DBOOST_REGEX_NO_LIB - -DBOOST_CHRONO_NO_LIB) -else() + -DBOOST_NO_CXX11_SCOPED_ENUMS) +endif() + +if (NOT STD_HAS_WORKING_WREGEX) target_compile_definitions(boost INTERFACE - -DBOOST_DATE_TIME_NO_LIB - -DBOOST_REGEX_NO_LIB - -DBOOST_CHRONO_NO_LIB - -DBOOST_NO_CXX11_SCOPED_ENUMS) + -DTC_HAS_BROKEN_WSTRING_REGEX) endif() diff --git a/src/common/Utilities/Regex.h b/src/common/Utilities/Regex.h new file mode 100644 index 00000000000..67b76688384 --- /dev/null +++ b/src/common/Utilities/Regex.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TrinityCore_Regex_h__ +#define TrinityCore_Regex_h__ + +#ifndef TC_HAS_BROKEN_WSTRING_REGEX +#include <regex> +#define TC_REGEX_NAMESPACE std +#else +#include <boost/regex.hpp> +#define TC_REGEX_NAMESPACE boost +#endif + +// regex compatibility layer, required for clang building with libstdc++-4.9 +namespace Trinity +{ + using regex = TC_REGEX_NAMESPACE :: regex; + using wregex = TC_REGEX_NAMESPACE :: wregex; + + using :: TC_REGEX_NAMESPACE :: regex_match; + using :: TC_REGEX_NAMESPACE :: regex_search; +} + +#endif // TrinityCore_Regex_h__ diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index d249097273f..70ce1a35d2c 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -741,7 +741,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) std::wstring name; ASSERT(Utf8toWStr(namesProfanity->Name, name)); if (namesProfanity->Language != -1) - _nameValidators[namesProfanity->Language].emplace_back(name, std::regex::icase | std::regex::optimize); + _nameValidators[namesProfanity->Language].emplace_back(name, Trinity::regex::icase | Trinity::regex::optimize); else { for (uint32 i = 0; i < TOTAL_LOCALES; ++i) @@ -749,7 +749,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) if (i == LOCALE_none) continue; - _nameValidators[i].emplace_back(name, std::regex::icase | std::regex::optimize); + _nameValidators[i].emplace_back(name, Trinity::regex::icase | Trinity::regex::optimize); } } } @@ -758,7 +758,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) { std::wstring name; ASSERT(Utf8toWStr(namesReserved->Name, name)); - _nameValidators[TOTAL_LOCALES].emplace_back(name, std::regex::icase | std::regex::optimize); + _nameValidators[TOTAL_LOCALES].emplace_back(name, Trinity::regex::icase | Trinity::regex::optimize); } for (NamesReservedLocaleEntry const* namesReserved : sNamesReservedLocaleStore) @@ -772,7 +772,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) continue; if (namesReserved->LocaleMask & (1 << i)) - _nameValidators[i].emplace_back(name, std::regex::icase | std::regex::optimize); + _nameValidators[i].emplace_back(name, Trinity::regex::icase | Trinity::regex::optimize); } } @@ -1580,13 +1580,13 @@ std::string DB2Manager::GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant ResponseCodes DB2Manager::ValidateName(std::wstring const& name, LocaleConstant locale) const { - for (std::wregex const& regex : _nameValidators[locale]) - if (std::regex_search(name, regex)) + for (Trinity::wregex const& regex : _nameValidators[locale]) + if (Trinity::regex_search(name, regex)) return CHAR_NAME_PROFANE; // regexes at TOTAL_LOCALES are loaded from NamesReserved which is not locale specific - for (std::wregex const& regex : _nameValidators[TOTAL_LOCALES]) - if (std::regex_search(name, regex)) + for (Trinity::wregex const& regex : _nameValidators[TOTAL_LOCALES]) + if (Trinity::regex_search(name, regex)) return CHAR_NAME_RESERVED; return CHAR_NAME_SUCCESS; diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index bdcb1ae5b9c..5b1751095b1 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -21,7 +21,7 @@ #include "DB2Store.h" #include "DB2Structure.h" #include "SharedDefines.h" -#include <regex> +#include "Regex.h" TC_GAME_API extern DB2Storage<AchievementEntry> sAchievementStore; TC_GAME_API extern DB2Storage<AnimKitEntry> sAnimKitStore; @@ -259,7 +259,7 @@ public: typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator> MountTypeXCapabilitySet; typedef std::unordered_map<uint32, MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer; typedef std::unordered_map<uint32, std::array<std::vector<NameGenEntry const*>, 2>> NameGenContainer; - typedef std::array<std::vector<std::wregex>, TOTAL_LOCALES + 1> NameValidationRegexContainer; + typedef std::array<std::vector<Trinity::wregex>, TOTAL_LOCALES + 1> NameValidationRegexContainer; typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer; typedef std::array<PowerTypeEntry const*, MAX_POWERS> PowerTypesContainer; typedef std::unordered_map<uint32, std::pair<std::vector<QuestPackageItemEntry const*>, std::vector<QuestPackageItemEntry const*>>> QuestPackageItemContainer; diff --git a/src/server/game/Scripting/ScriptReloadMgr.cpp b/src/server/game/Scripting/ScriptReloadMgr.cpp index b0c9b6821d2..07cfba8408f 100644 --- a/src/server/game/Scripting/ScriptReloadMgr.cpp +++ b/src/server/game/Scripting/ScriptReloadMgr.cpp @@ -308,12 +308,12 @@ Optional<std::shared_ptr<ScriptModule>> static bool HasValidScriptModuleName(std::string const& name) { // Detects scripts_NAME.dll's / .so's - static std::regex const regex( + static Trinity::regex const regex( Trinity::StringFormat("^%s[sS]cripts_[a-zA-Z0-9_]+\\.%s$", GetSharedLibraryPrefix(), GetSharedLibraryExtension())); - return std::regex_match(name, regex); + return Trinity::regex_match(name, regex); } /// File watcher responsible for watching shared libraries @@ -1529,8 +1529,8 @@ void LibraryUpdateListener::handleFileAction(efsw::WatchID watchid, std::string /// Returns true when the given path has a known C++ file extension static bool HasCXXSourceFileExtension(fs::path const& path) { - static std::regex const regex("^\\.(h|hpp|c|cc|cpp)$"); - return std::regex_match(path.extension().generic_string(), regex); + static Trinity::regex const regex("^\\.(h|hpp|c|cc|cpp)$"); + return Trinity::regex_match(path.extension().generic_string(), regex); } SourceUpdateListener::SourceUpdateListener(fs::path path, std::string script_module_name) |
