From 23f2e7f9274cf5cef9c8d06280460f21d9401f0d Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Sat, 12 Oct 2013 15:48:08 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8E=20find?= =?UTF-8?q?=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20memmem=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20GCC,=20=D1=83=D0=BF=D1=80=D0=BE=D1=81=D1=82=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20load=5Ffrom=5Ffile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + CMakeLists.txt | 2 +- src/ustring.cpp | 30 +++++++++++------------------- test/main.cpp | 2 +- 4 files changed, 14 insertions(+), 21 deletions(-) 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)); }