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;
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);
}
}

View File

@ -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<float>(*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<float>(*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)

View File

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