From d5091bbb71fcb7e8d4443017d627bc6117c1ce87 Mon Sep 17 00:00:00 2001 From: Nicky Kitchingman <91986609+nickykitchingman@users.noreply.github.com> Date: Thu, 22 Jan 2026 10:34:08 +0000 Subject: [PATCH] Fix some recently implemented comparisons of token strings (#6452) * Fix some recently implemented comparisons of token strings. Previously, the `keyword` included the following space along with the token, which broke the string comparison using the equality operator. * Rename `getEndOfToken` -> `getNextDelimiter`, to reflect the actual usage --- code/AssetLib/Obj/ObjFileMtlImporter.cpp | 20 ++++++++++---------- code/AssetLib/Obj/ObjTools.h | 24 ++++++++++++++++++------ 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/code/AssetLib/Obj/ObjFileMtlImporter.cpp b/code/AssetLib/Obj/ObjFileMtlImporter.cpp index 5f34e5363..e6ab3acd2 100644 --- a/code/AssetLib/Obj/ObjFileMtlImporter.cpp +++ b/code/AssetLib/Obj/ObjFileMtlImporter.cpp @@ -253,10 +253,10 @@ void ObjFileMtlImporter::load() { { // Save start of token (after 'm') auto tokenStart = m_DataIt; // points to 'm' - auto tokenEnd = getNextToken(m_DataIt, m_DataItEnd); // move iterator to end of token + auto tokenEnd = getNextDelimiter(m_DataIt, m_DataItEnd); // move iterator to end of token std::string keyword(tokenStart, tokenEnd); - m_DataIt = tokenEnd; // advance iterator + m_DataIt = getNextWord(tokenEnd, m_DataItEnd); // advance iterator if (keyword.compare(0, 3, "map") == 0) { // starts with "map", treat as texture map @@ -279,9 +279,9 @@ void ObjFileMtlImporter::load() { case 'r': // refl (map) or roughness (float) { auto tokenStart = m_DataIt; // points to 'r' - auto tokenEnd = getNextToken(m_DataIt, m_DataItEnd); + auto tokenEnd = getNextDelimiter(m_DataIt, m_DataItEnd); std::string keyword(tokenStart, tokenEnd); - m_DataIt = tokenEnd; + m_DataIt = getNextWord(tokenEnd, m_DataItEnd); if (keyword == "roughness" || keyword == "rough") { getFloatIfMaterialValid(&ObjFile::Material::roughness); @@ -303,9 +303,9 @@ void ObjFileMtlImporter::load() { case 'a': { auto tokenStart = m_DataIt; - auto tokenEnd = getNextToken(m_DataIt, m_DataItEnd); + auto tokenEnd = getNextDelimiter(m_DataIt, m_DataItEnd); std::string keyword(tokenStart, tokenEnd); - m_DataIt = tokenEnd; + m_DataIt = getNextWord(tokenEnd, m_DataItEnd); if (keyword == "aniso" || keyword == "anisotropy") { getFloatIfMaterialValid(&ObjFile::Material::anisotropy); @@ -322,9 +322,9 @@ void ObjFileMtlImporter::load() { case 's': { auto tokenStart = m_DataIt; - auto tokenEnd = getNextToken(m_DataIt, m_DataItEnd); + auto tokenEnd = getNextDelimiter(m_DataIt, m_DataItEnd); std::string keyword(tokenStart, tokenEnd); - m_DataIt = tokenEnd; + m_DataIt = getNextWord(tokenEnd,m_DataItEnd); if (keyword == "subsurface" || keyword == "scattering") { getFloatIfMaterialValid(&ObjFile::Material::subsurface_scattering); @@ -343,9 +343,9 @@ void ObjFileMtlImporter::load() { case 'c': { auto tokenStart = m_DataIt; - auto tokenEnd = getNextToken(m_DataIt, m_DataItEnd); + auto tokenEnd = getNextDelimiter(m_DataIt, m_DataItEnd); std::string keyword(tokenStart, tokenEnd); - m_DataIt = tokenEnd; + m_DataIt = getNextWord(tokenEnd, m_DataItEnd); if (ai_stdStrToLower(keyword) == "clearcoat") { getFloatIfMaterialValid(&ObjFile::Material::clearcoat); diff --git a/code/AssetLib/Obj/ObjTools.h b/code/AssetLib/Obj/ObjTools.h index b6407c2c8..e3ae2076e 100644 --- a/code/AssetLib/Obj/ObjTools.h +++ b/code/AssetLib/Obj/ObjTools.h @@ -85,6 +85,23 @@ inline Char_T getNextWord(Char_T pBuffer, Char_T pEnd) { return pBuffer; } +/** + * @brief Returns next space + * @param[in] pBuffer Pointer to data buffer + * @param[in] pEnd Pointer to end of buffer + * @return Pointer to next space + */ +template +inline Char_T getNextDelimiter(Char_T pBuffer, Char_T pEnd) { + while (!isEndOfBuffer(pBuffer, pEnd)) { + if (IsSpaceOrNewLine(*pBuffer)) { + break; + } + ++pBuffer; + } + return pBuffer; +} + /** * @brief Returns pointer a next token * @param[in] pBuffer Pointer to data buffer @@ -93,12 +110,7 @@ inline Char_T getNextWord(Char_T pBuffer, Char_T pEnd) { */ template inline Char_T getNextToken(Char_T pBuffer, Char_T pEnd) { - while (!isEndOfBuffer(pBuffer, pEnd)) { - if (IsSpaceOrNewLine(*pBuffer)) { - break; - } - ++pBuffer; - } + pBuffer = getNextDelimiter(pBuffer, pEnd); return getNextWord(pBuffer, pEnd); }