Fix unittest of AC-Loader.

pull/5421/head
Kim Kulling 2024-01-25 14:25:00 +01:00
parent a5583f3ec5
commit 6230e70d02
3 changed files with 47 additions and 24 deletions

View File

@ -92,7 +92,7 @@ inline const char *AcGetString(const char *buffer, const char *end, std::string
} }
++buffer; ++buffer;
const char *sz = buffer; const char *sz = buffer;
while ('\"' != *buffer || buffer != end) { while ('\"' != *buffer && buffer != end) {
if (IsLineEnd(*buffer)) { if (IsLineEnd(*buffer)) {
ASSIMP_LOG_ERROR("AC3D: Unexpected EOF/EOL in string"); ASSIMP_LOG_ERROR("AC3D: Unexpected EOF/EOL in string");
out = "ERROR"; 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, "spec", 4, 3, &mat.spec);
mBuffer.data = TAcCheckedLoadFloatArray(mBuffer.data, mBuffer.end, "shi", 3, 1, &mat.shin); mBuffer.data = TAcCheckedLoadFloatArray(mBuffer.data, mBuffer.end, "shi", 3, 1, &mat.shin);
mBuffer.data = TAcCheckedLoadFloatArray(mBuffer.data, mBuffer.end, "trans", 5, 1, &mat.trans); mBuffer.data = TAcCheckedLoadFloatArray(mBuffer.data, mBuffer.end, "trans", 5, 1, &mat.trans);
} else {
LoadObjectSection(rootObjects);
} }
} }

View File

@ -138,14 +138,16 @@ bool MD5Parser::ParseSection(Section &out) {
char *sz = buffer; char *sz = buffer;
while (!IsSpaceOrNewLine(*buffer)) { while (!IsSpaceOrNewLine(*buffer)) {
++buffer; ++buffer;
if (buffer == bufferEnd) if (buffer == bufferEnd) {
return false; return false;
}
} }
out.mName = std::string(sz, (uintptr_t)(buffer - sz)); out.mName = std::string(sz, (uintptr_t)(buffer - sz));
while (IsSpace(*buffer)) { while (IsSpace(*buffer)) {
++buffer; ++buffer;
if (buffer == bufferEnd) if (buffer == bufferEnd) {
return false; return false;
}
} }
bool running = true; bool running = true;
@ -153,14 +155,16 @@ bool MD5Parser::ParseSection(Section &out) {
if ('{' == *buffer) { if ('{' == *buffer) {
// it is a normal section so read all lines // it is a normal section so read all lines
++buffer; ++buffer;
if (buffer == bufferEnd) if (buffer == bufferEnd) {
return false; return false;
}
bool run = true; bool run = true;
while (run) { while (run) {
while (IsSpaceOrNewLine(*buffer)) { while (IsSpaceOrNewLine(*buffer)) {
++buffer; ++buffer;
if (buffer == bufferEnd) if (buffer == bufferEnd) {
return false; return false;
}
} }
if ('\0' == *buffer) { if ('\0' == *buffer) {
return false; // seems this was the last section return false; // seems this was the last section
@ -180,14 +184,16 @@ bool MD5Parser::ParseSection(Section &out) {
// terminate the line with zero // terminate the line with zero
while (!IsLineEnd(*buffer)) { while (!IsLineEnd(*buffer)) {
++buffer; ++buffer;
if (buffer == bufferEnd) if (buffer == bufferEnd) {
return false; return false;
}
} }
if (*buffer) { if (*buffer) {
++lineNumber; ++lineNumber;
*buffer++ = '\0'; *buffer++ = '\0';
if (buffer == bufferEnd) if (buffer == bufferEnd) {
return false; return false;
}
} }
} }
break; break;
@ -195,8 +201,9 @@ bool MD5Parser::ParseSection(Section &out) {
// it is an element at global scope. Parse its value and go on // it is an element at global scope. Parse its value and go on
sz = buffer; sz = buffer;
while (!IsSpaceOrNewLine(*buffer++)) { while (!IsSpaceOrNewLine(*buffer++)) {
if (buffer == bufferEnd) if (buffer == bufferEnd) {
return false; return false;
}
} }
out.mGlobalValue = std::string(sz, (uintptr_t)(buffer - sz)); out.mGlobalValue = std::string(sz, (uintptr_t)(buffer - sz));
continue; continue;
@ -206,8 +213,9 @@ bool MD5Parser::ParseSection(Section &out) {
if (buffer == bufferEnd) if (buffer == bufferEnd)
return false; return false;
while (IsSpaceOrNewLine(*buffer)) { while (IsSpaceOrNewLine(*buffer)) {
if (buffer == bufferEnd) if (buffer == bufferEnd) {
break; break;
}
++buffer; ++buffer;
} }
return '\0' != *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) // 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) { inline void AI_MD5_READ_TRIPLE(aiVector3D &vec, const char **sz, const char *bufferEnd, int linenumber) {
AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber); AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber);
if ('(' != **sz++) if ('(' != **sz) {
MD5Parser::ReportWarning("Unexpected token: ( was expected", linenumber); MD5Parser::ReportWarning("Unexpected token: ( was expected", linenumber);
++*sz;
}
++*sz;
AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber); AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber);
*sz = fast_atoreal_move<float>(*sz, (float &)vec.x); *sz = fast_atoreal_move<float>(*sz, (float &)vec.x);
AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber); 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); AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber);
*sz = fast_atoreal_move<float>(*sz, (float &)vec.z); *sz = fast_atoreal_move<float>(*sz, (float &)vec.z);
AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber); AI_MD5_SKIP_SPACES(sz, bufferEnd, linenumber);
if (')' != **sz++) { if (')' != **sz) {
MD5Parser::ReportWarning("Unexpected token: ) was expected", linenumber); MD5Parser::ReportWarning("Unexpected token: ) was expected", linenumber);
} }
++*sz;
} }
// parse a string, enclosed in quotation marks or not // 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 == '\"'); bool bQuota = (**sz == '\"');
const char *szStart = *sz; const char *szStart = *sz;
while (!IsSpaceOrNewLine(*sz)) while (!IsSpaceOrNewLine(*sz)) {
++sz; ++*sz;
if (*sz == bufferEnd) break;
}
const char *szEnd = *sz; const char *szEnd = *sz;
if (bQuota) { if (bQuota) {
szStart++; 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 // 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; out.length = 0u;
while ('\"' != **sz && '\0' != *sz) while (('\"' != **sz && '\0' != **sz) && *sz != bufferEnd) {
++sz; ++*sz;
if ('\0' != *sz) { }
if ('\0' != **sz) {
const char *szStart = ++(*sz); const char *szStart = ++(*sz);
while ('\"' != **sz && '\0' != *sz)
++sz; while (('\"' != **sz && '\0' != **sz) && *sz != bufferEnd) {
if ('\0' != *sz) { ++*sz;
}
if ('\0' != **sz) {
const char *szEnd = (*sz++); const char *szEnd = (*sz++);
out.length = (ai_uint32)(szEnd - szStart); out.length = (ai_uint32)(szEnd - szStart);
::memcpy(out.data, szStart, out.length); ::memcpy(out.data, szStart, out.length);
@ -294,7 +311,7 @@ MD5MeshParser::MD5MeshParser(SectionArray &mSections) {
BoneDesc &desc = mJoints.back(); BoneDesc &desc = mJoints.back();
const char *sz = elem.szStart; 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); AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
@ -314,7 +331,7 @@ MD5MeshParser::MD5MeshParser(SectionArray &mSections) {
// shader attribute // shader attribute
if (TokenMatch(sz, "shader", 6)) { if (TokenMatch(sz, "shader", 6)) {
AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber); 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 // numverts attribute
else if (TokenMatch(sz, "numverts", 8)) { else if (TokenMatch(sz, "numverts", 8)) {
@ -406,7 +423,7 @@ MD5AnimParser::MD5AnimParser(SectionArray &mSections) {
AnimBoneDesc &desc = mAnimatedBones.back(); AnimBoneDesc &desc = mAnimatedBones.back();
const char *sz = elem.szStart; 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); AI_MD5_SKIP_SPACES(&sz, elem.end, elem.iLineNumber);
// parent index - negative values are allowed (at least -1) // parent index - negative values are allowed (at least -1)

View File

@ -1193,6 +1193,10 @@ ENDIF ()
TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp) TARGET_USE_COMMON_OUTPUT_DIRECTORY(assimp)
add_compile_options(
"$<$<CONFIG:DEBUG>:-O0;-g3;-ggdb>"
)
IF (ASSIMP_WARNINGS_AS_ERRORS) IF (ASSIMP_WARNINGS_AS_ERRORS)
MESSAGE(STATUS "Treating all warnings as errors (for assimp library only)") MESSAGE(STATUS "Treating all warnings as errors (for assimp library only)")
IF (MSVC) IF (MSVC)