From 6230e70d02b8023f19d84d8e82ae0cc42e23085b Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 25 Jan 2024 14:25:00 +0100 Subject: [PATCH] Fix unittest of AC-Loader. --- code/AssetLib/AC/ACLoader.cpp | 4 ++- code/AssetLib/MD5/MD5Parser.cpp | 63 +++++++++++++++++++++------------ code/CMakeLists.txt | 4 +++ 3 files changed, 47 insertions(+), 24 deletions(-) diff --git a/code/AssetLib/AC/ACLoader.cpp b/code/AssetLib/AC/ACLoader.cpp index b5aa1d547..205e9c000 100644 --- a/code/AssetLib/AC/ACLoader.cpp +++ b/code/AssetLib/AC/ACLoader.cpp @@ -92,7 +92,7 @@ inline const char *AcGetString(const char *buffer, const char *end, std::string } ++buffer; const char *sz = buffer; - while ('\"' != *buffer || buffer != end) { + while ('\"' != *buffer && buffer != end) { if (IsLineEnd(*buffer)) { ASSIMP_LOG_ERROR("AC3D: Unexpected EOF/EOL in string"); out = "ERROR"; @@ -801,6 +801,8 @@ void AC3DImporter::InternReadFile(const std::string &pFile, mBuffer.data = TAcCheckedLoadFloatArray(mBuffer.data, mBuffer.end, "spec", 4, 3, &mat.spec); mBuffer.data = TAcCheckedLoadFloatArray(mBuffer.data, mBuffer.end, "shi", 3, 1, &mat.shin); mBuffer.data = TAcCheckedLoadFloatArray(mBuffer.data, mBuffer.end, "trans", 5, 1, &mat.trans); + } else { + LoadObjectSection(rootObjects); } } diff --git a/code/AssetLib/MD5/MD5Parser.cpp b/code/AssetLib/MD5/MD5Parser.cpp index a5656e718..c4972c6e5 100644 --- a/code/AssetLib/MD5/MD5Parser.cpp +++ b/code/AssetLib/MD5/MD5Parser.cpp @@ -138,14 +138,16 @@ bool MD5Parser::ParseSection(Section &out) { char *sz = buffer; while (!IsSpaceOrNewLine(*buffer)) { ++buffer; - if (buffer == bufferEnd) + if (buffer == bufferEnd) { return false; + } } out.mName = std::string(sz, (uintptr_t)(buffer - sz)); while (IsSpace(*buffer)) { ++buffer; - if (buffer == bufferEnd) + if (buffer == bufferEnd) { return false; + } } bool running = true; @@ -153,14 +155,16 @@ bool MD5Parser::ParseSection(Section &out) { if ('{' == *buffer) { // it is a normal section so read all lines ++buffer; - if (buffer == bufferEnd) + if (buffer == bufferEnd) { return false; + } bool run = true; while (run) { while (IsSpaceOrNewLine(*buffer)) { ++buffer; - if (buffer == bufferEnd) + if (buffer == bufferEnd) { return false; + } } if ('\0' == *buffer) { return false; // seems this was the last section @@ -180,14 +184,16 @@ bool MD5Parser::ParseSection(Section &out) { // terminate the line with zero while (!IsLineEnd(*buffer)) { ++buffer; - if (buffer == bufferEnd) + if (buffer == bufferEnd) { return false; + } } if (*buffer) { ++lineNumber; *buffer++ = '\0'; - if (buffer == bufferEnd) + if (buffer == bufferEnd) { return false; + } } } break; @@ -195,8 +201,9 @@ bool MD5Parser::ParseSection(Section &out) { // it is an element at global scope. Parse its value and go on sz = buffer; while (!IsSpaceOrNewLine(*buffer++)) { - if (buffer == bufferEnd) + if (buffer == bufferEnd) { return false; + } } out.mGlobalValue = std::string(sz, (uintptr_t)(buffer - sz)); continue; @@ -206,8 +213,9 @@ bool MD5Parser::ParseSection(Section &out) { if (buffer == bufferEnd) return false; while (IsSpaceOrNewLine(*buffer)) { - if (buffer == bufferEnd) + if (buffer == bufferEnd) { break; + } ++buffer; } return '\0' != *buffer; @@ -226,8 +234,11 @@ inline void AI_MD5_SKIP_SPACES(const char **sz, const char *bufferEnd, int linen // read a triple float in brackets: (1.0 1.0 1.0) inline void AI_MD5_READ_TRIPLE(aiVector3D &vec, const char **sz, const char *bufferEnd, int linenumber) { AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber); - if ('(' != **sz++) + if ('(' != **sz) { MD5Parser::ReportWarning("Unexpected token: ( was expected", linenumber); + ++*sz; + } + ++*sz; AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber); *sz = fast_atoreal_move(*sz, (float &)vec.x); AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber); @@ -235,17 +246,20 @@ inline void AI_MD5_READ_TRIPLE(aiVector3D &vec, const char **sz, const char *buf AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber); *sz = fast_atoreal_move(*sz, (float &)vec.z); AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber); - if (')' != **sz++) { + if (')' != **sz) { MD5Parser::ReportWarning("Unexpected token: ) was expected", linenumber); } + ++*sz; } // parse a string, enclosed in quotation marks or not -inline bool AI_MD5_PARSE_STRING(const char **sz, aiString &out, int linenumber) { +inline bool AI_MD5_PARSE_STRING(const char **sz, const char *bufferEnd, aiString &out, int linenumber) { bool bQuota = (**sz == '\"'); const char *szStart = *sz; - while (!IsSpaceOrNewLine(*sz)) - ++sz; + while (!IsSpaceOrNewLine(*sz)) { + ++*sz; + if (*sz == bufferEnd) break; + } const char *szEnd = *sz; if (bQuota) { szStart++; @@ -260,15 +274,18 @@ inline bool AI_MD5_PARSE_STRING(const char **sz, aiString &out, int linenumber) } // parse a string, enclosed in quotation marks -inline void AI_MD5_PARSE_STRING_IN_QUOTATION(const char **sz, aiString &out) { +inline void AI_MD5_PARSE_STRING_IN_QUOTATION(const char **sz, const char *bufferEnd, aiString &out) { out.length = 0u; - while ('\"' != **sz && '\0' != *sz) - ++sz; - if ('\0' != *sz) { + while (('\"' != **sz && '\0' != **sz) && *sz != bufferEnd) { + ++*sz; + } + if ('\0' != **sz) { const char *szStart = ++(*sz); - while ('\"' != **sz && '\0' != *sz) - ++sz; - if ('\0' != *sz) { + + while (('\"' != **sz && '\0' != **sz) && *sz != bufferEnd) { + ++*sz; + } + if ('\0' != **sz) { const char *szEnd = (*sz++); out.length = (ai_uint32)(szEnd - szStart); ::memcpy(out.data, szStart, out.length); @@ -294,7 +311,7 @@ MD5MeshParser::MD5MeshParser(SectionArray &mSections) { BoneDesc &desc = mJoints.back(); const char *sz = elem.szStart; - AI_MD5_PARSE_STRING_IN_QUOTATION(&sz, desc.mName); + AI_MD5_PARSE_STRING_IN_QUOTATION(&sz, elem.end, desc.mName); AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber); @@ -314,7 +331,7 @@ MD5MeshParser::MD5MeshParser(SectionArray &mSections) { // shader attribute if (TokenMatch(sz, "shader", 6)) { AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber); - AI_MD5_PARSE_STRING_IN_QUOTATION(&sz, desc.mShader); + AI_MD5_PARSE_STRING_IN_QUOTATION(&sz, elem.end, desc.mShader); } // numverts attribute else if (TokenMatch(sz, "numverts", 8)) { @@ -406,7 +423,7 @@ MD5AnimParser::MD5AnimParser(SectionArray &mSections) { AnimBoneDesc &desc = mAnimatedBones.back(); const char *sz = elem.szStart; - AI_MD5_PARSE_STRING_IN_QUOTATION(&sz, desc.mName); + AI_MD5_PARSE_STRING_IN_QUOTATION(&sz, elem.end, desc.mName); AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber); // parent index - negative values are allowed (at least -1) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 9b0b964c0..bc5b7b16f 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -1193,6 +1193,10 @@ ENDIF () TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp) +add_compile_options( + "$<$:-O0;-g3;-ggdb>" +) + IF (ASSIMP_WARNINGS_AS_ERRORS) MESSAGE(STATUS "Treating all warnings as errors (for assimp library only)") IF (MSVC)