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,12 +26,21 @@ if(WIN32) set(Boost_USE_STATIC_RUNTIME OFF) endif() -find_package(Boost 1.55 REQUIRED system filesystem thread program_options iostreams) +include (CheckCXXSourceCompiles) + +check_cxx_source_compiles(" + #include + int main() { std::wregex r(L\".*\"); }" + STD_HAS_WORKING_WREGEX) + +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 -include (CheckCXXSourceCompiles) - set(CMAKE_REQUIRED_INCLUDES ${Boost_INCLUDE_DIR}) set(CMAKE_REQUIRED_LIBRARIES ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_IOSTREAMS_LIBRARY}) set(CMAKE_REQUIRED_FLAGS "-std=c++11") @@ -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() - target_compile_definitions(boost - INTERFACE - -DBOOST_DATE_TIME_NO_LIB - -DBOOST_REGEX_NO_LIB - -DBOOST_CHRONO_NO_LIB -DBOOST_NO_CXX11_SCOPED_ENUMS) endif() + +if (NOT STD_HAS_WORKING_WREGEX) + target_compile_definitions(boost + INTERFACE + -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 + * + * 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 . + */ + +#ifndef TrinityCore_Regex_h__ +#define TrinityCore_Regex_h__ + +#ifndef TC_HAS_BROKEN_WSTRING_REGEX +#include +#define TC_REGEX_NAMESPACE std +#else +#include +#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 +#include "Regex.h" TC_GAME_API extern DB2Storage sAchievementStore; TC_GAME_API extern DB2Storage sAnimKitStore; @@ -259,7 +259,7 @@ public: typedef std::set MountTypeXCapabilitySet; typedef std::unordered_map MountCapabilitiesByTypeContainer; typedef std::unordered_map, 2>> NameGenContainer; - typedef std::array, TOTAL_LOCALES + 1> NameValidationRegexContainer; + typedef std::array, TOTAL_LOCALES + 1> NameValidationRegexContainer; typedef std::unordered_map> PhaseGroupContainer; typedef std::array PowerTypesContainer; typedef std::unordered_map, std::vector>> 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> 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)