diff --git a/.gitignore b/.gitignore index 34e6b1f..7d8b0da 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ bin/ lib/ +CMakeLists.txt.user diff --git a/CMakeLists.txt b/CMakeLists.txt index ed213a2..4f85f53 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ if(WIN32) set(CMAKE_CXX_FLAGS " /D _VARIADIC_MAX=10") else() set(CMAKE_CXX_FLAGS "-std=c++11") - set(CMAKE_CXX_FLAGS_DEBUG "-O0") + set(CMAKE_CXX_FLAGS_DEBUG "-g -O0") set(CMAKE_CXX_FLAGS_RELEASE "-O2") endif() diff --git a/src/ustring.cpp b/src/ustring.cpp index dc96d7d..7cf54d8 100755 --- a/src/ustring.cpp +++ b/src/ustring.cpp @@ -377,11 +377,18 @@ std::size_t ustring::find(char32_t symbol, std::size_t pos /* = 0 */) const */ std::size_t ustring::find(const ustring& str, std::size_t pos /* = 0 */) const { - if(str.length() > _len) + if(str.length() > (_len - pos)) { return npos; } +#ifdef __GNUC__ + char32_t* fpos = reinterpret_cast(memmem(_pData + pos, (_len - pos)*sizeof(char32_t), str._pData, str._len*sizeof(char32_t))); + if(fpos) + { + return (fpos - _pData); + } +#else const char32_t* pStr = str._pData; const std::size_t len = _len - str.length(); for(std::size_t i = pos; i <= len; ++i) @@ -394,6 +401,7 @@ std::size_t ustring::find(const ustring& str, std::size_t pos /* = 0 */) const } } } +#endif return npos; } @@ -407,7 +415,6 @@ std::size_t ustring::find(const ustring& str, std::size_t pos /* = 0 */) const std::size_t ustring::load_from_file( const ustring& fileName, encoding enc ) // TODO: this terrible function needs refactoring { std::ifstream file; - std::size_t symbolTypeSize = 0; #ifdef WIN32 file.open(fileName.utf16_str(), std::ios::binary); @@ -420,24 +427,9 @@ std::size_t ustring::load_from_file( const ustring& fileName, encoding enc ) // std::size_t fileLength = static_cast(file.tellg()); file.seekg(0, std::ios::beg); - switch(enc) - { - case ustring::UTF8: - symbolTypeSize = sizeof(char); - break; - case ustring::UTF16LE: - symbolTypeSize = sizeof(char16_t); - break; - case ustring::UTF32LE: - symbolTypeSize = sizeof(char32_t); - break; - default: - break; - } - - char* fileData = new char[fileLength + symbolTypeSize]; + char* fileData = new char[fileLength + sizeof(char32_t)]; file.read(fileData, fileLength); - std::memset(fileData + fileLength, 0, symbolTypeSize); + std::memset(fileData + fileLength, 0, sizeof(char32_t)); switch(enc) { diff --git a/test/main.cpp b/test/main.cpp index 6ddb15f..7948a91 100755 --- a/test/main.cpp +++ b/test/main.cpp @@ -437,7 +437,7 @@ TEST(Ustring, find_symbol) TEST(Ustring, find_string) { - ustring str = "Hello World! asdf qwerty asdf"; + ustring str = "Hello World! asdf qwerty asdf"; EXPECT_EQ(13, str.find("asdf")); EXPECT_EQ(25, str.find("asdf", 14)); }