diff --git a/code/D3MFImporter.cpp b/code/D3MFImporter.cpp index 1ca4bc74c..1a9716828 100644 --- a/code/D3MFImporter.cpp +++ b/code/D3MFImporter.cpp @@ -47,6 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include "irrXMLWrapper.h" #include "StringComparison.h" +#include "StringUtils.h" #include @@ -224,9 +225,9 @@ private: aiVector3D ReadVertex() { aiVector3D vertex; - vertex.x = std::strtof(xmlReader->getAttributeValue(D3MF::XmlTag::x.c_str()), nullptr); - vertex.y = std::strtof(xmlReader->getAttributeValue(D3MF::XmlTag::y.c_str()), nullptr); - vertex.z = std::strtof(xmlReader->getAttributeValue(D3MF::XmlTag::z.c_str()), nullptr); + vertex.x = ai_strtof(xmlReader->getAttributeValue(D3MF::XmlTag::x.c_str()), nullptr); + vertex.y = ai_strtof(xmlReader->getAttributeValue(D3MF::XmlTag::y.c_str()), nullptr); + vertex.z = ai_strtof>(xmlReader->getAttributeValue(D3MF::XmlTag::z.c_str()), nullptr); return vertex; } diff --git a/code/StringUtils.h b/code/StringUtils.h index a2ae7f817..7aa32fea2 100644 --- a/code/StringUtils.h +++ b/code/StringUtils.h @@ -89,5 +89,22 @@ std::string to_string( T value ) { return os.str(); } +inline +float ai_strtof( const char *begin, const char *end ) { + if ( nullptr == begin ) { + return 0.0f; + } + float val( 0.0f ); + if ( nullptr == end ) { + val = static_cast< float >( ::atof( begin ) ); + } else { + std::string::size_type len( end - begin ); + std::string token( begin, len ); + val = static_cast< float >( ::atof( token.c_str() ) ); + } + + return val; +} + #endif // INCLUDED_AI_STRINGUTILS_H diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 33ad8460a..df0139ddc 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -78,6 +78,7 @@ SET( TEST_SRCS unit/utRemoveRedundantMaterials.cpp unit/utScenePreprocessor.cpp unit/utSharedPPData.cpp + unit/utStringUtils.cpp unit/utSortByPType.cpp unit/utSplitLargeMeshes.cpp unit/utTargetAnimation.cpp diff --git a/test/unit/utStringUtils.cpp b/test/unit/utStringUtils.cpp new file mode 100644 index 000000000..e75ff8d4b --- /dev/null +++ b/test/unit/utStringUtils.cpp @@ -0,0 +1,68 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2016, assimp team + +All rights reserved. + +Redistribution and use of this software in source and binary forms, +with or without modification, are permitted provided that the following +conditions are met: + +* Redistributions of source code must retain the above +copyright notice, this list of conditions and the +following disclaimer. + +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other +materials provided with the distribution. + +* Neither the name of the assimp team, nor the names of its +contributors may be used to endorse or promote products +derived from this software without specific prior +written permission of the assimp team. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------------------------- +*/ +#include "UnitTestPCH.h" +#include "StringUtils.h" + +class utStringUtils : public ::testing::Test { +}; + +TEST_F( utStringUtils, to_string_Test ) { + std::string res = to_string( 1 ); + EXPECT_EQ( res, "1" ); + + res = to_string( 1.0f ); + EXPECT_EQ( res, "1" ); +} + +TEST_F( utStringUtils, ai_strtofTest ) { + float res = ai_strtof( nullptr, nullptr ); + EXPECT_FLOAT_EQ( res, 0.0f ); + + std::string testStr1 = "200.0"; + res = ai_strtof( testStr1.c_str(), nullptr ); + EXPECT_FLOAT_EQ( res, 200.0f ); + + std::string testStr2 = "200.0 xxx"; + const char *begin( testStr2.c_str() ); + const char *end( begin + 6 ); + res = ai_strtof( begin, end ); + EXPECT_FLOAT_EQ( res, 200.0f ); +}