From 5d6cee82919537e938548a34e8366d9a156d5632 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 29 Jul 2016 13:37:44 +0200 Subject: [PATCH] Utility/OBJParser: Abort parsing when there's more than one error per two line Former-commit-id: b8126ca529f91492a1d116da7cb446b8eaa25a90 [formerly c33f7b8d27ba18303b839693aa3ef056d1f48ae1] Former-commit-id: 701965304b9e51ddf1ee2233559f2f97d4a51894 --- include/Nazara/Utility/Formats/OBJParser.hpp | 3 +- include/Nazara/Utility/Formats/OBJParser.inl | 12 ++++- src/Nazara/Utility/Formats/OBJParser.cpp | 53 ++++++++++++-------- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/include/Nazara/Utility/Formats/OBJParser.hpp b/include/Nazara/Utility/Formats/OBJParser.hpp index 50fa58900..114f72635 100644 --- a/include/Nazara/Utility/Formats/OBJParser.hpp +++ b/include/Nazara/Utility/Formats/OBJParser.hpp @@ -86,7 +86,7 @@ namespace Nz inline void Error(const String& message); inline void Flush() const; inline void Warning(const String& message); - inline void UnrecognizedLine(bool error = false); + inline bool UnrecognizedLine(bool error = false); std::vector m_meshes; std::vector m_materials; @@ -99,6 +99,7 @@ namespace Nz mutable StringStream m_outputStream; bool m_keepLastLine; unsigned int m_lineCount; + unsigned int m_errorCount; }; } diff --git a/include/Nazara/Utility/Formats/OBJParser.inl b/include/Nazara/Utility/Formats/OBJParser.inl index 9d961d54f..054d57754 100644 --- a/include/Nazara/Utility/Formats/OBJParser.inl +++ b/include/Nazara/Utility/Formats/OBJParser.inl @@ -168,7 +168,7 @@ namespace Nz NazaraWarning(message + " at line #" + String::Number(m_lineCount)); } - inline void OBJParser::UnrecognizedLine(bool error) + inline bool OBJParser::UnrecognizedLine(bool error) { String message = "Unrecognized \"" + m_currentLine + '"'; @@ -176,6 +176,16 @@ namespace Nz Error(message); else Warning(message); + + m_errorCount++; + + if (m_lineCount > 20 && (m_errorCount * 100 / m_lineCount) > 50) + { + NazaraError("Aborting parsing because of error percentage"); + return false; //< Abort parsing if error percentage is too high + } + + return true; } } diff --git a/src/Nazara/Utility/Formats/OBJParser.cpp b/src/Nazara/Utility/Formats/OBJParser.cpp index bd189305f..7d3019c39 100644 --- a/src/Nazara/Utility/Formats/OBJParser.cpp +++ b/src/Nazara/Utility/Formats/OBJParser.cpp @@ -97,7 +97,8 @@ namespace Nz if (m_currentLine.GetSize() < 7) // Since we only treat triangles, this is the minimum length of a face line (f 1 2 3) { #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - UnrecognizedLine(); + if (!UnrecognizedLine()) + return false; #endif break; } @@ -106,7 +107,8 @@ namespace Nz if (vertexCount < 3) { #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - UnrecognizedLine(); + if (!UnrecognizedLine()) + return false; #endif break; } @@ -138,7 +140,8 @@ namespace Nz if (std::sscanf(&m_currentLine[pos], "%d%n", &p, &offset) != 1) { #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - UnrecognizedLine(); + if (!UnrecognizedLine()) + return false; #endif error = true; break; @@ -217,7 +220,8 @@ namespace Nz case 'm': //< MTLLib #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING if (m_currentLine.GetWord(0).ToLower() != "mtllib") - UnrecognizedLine(); + if (!UnrecognizedLine()) + return false; #endif m_mtlLib = m_currentLine.SubString(m_currentLine.GetWordPosition(1)); @@ -229,7 +233,8 @@ namespace Nz if (m_currentLine.GetSize() <= 2 || m_currentLine[1] != ' ') { #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - UnrecognizedLine(); + if (!UnrecognizedLine()) + return false; #endif break; } @@ -238,7 +243,8 @@ namespace Nz if (objectName.IsEmpty()) { #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - UnrecognizedLine(); + if (!UnrecognizedLine()) + return false; #endif break; } @@ -254,17 +260,20 @@ namespace Nz { String param = m_currentLine.SubString(2); if (param != "all" && param != "on" && param != "off" && !param.IsNumber()) - UnrecognizedLine(); + { + if (!UnrecognizedLine()) + return false; + } } - else - UnrecognizedLine(); + else if (!UnrecognizedLine()) + return false; break; #endif case 'u': //< Usemtl #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - if (m_currentLine.GetWord(0) != "usemtl") - UnrecognizedLine(); + if (m_currentLine.GetWord(0) != "usemtl" && !UnrecognizedLine()) + return false; #endif matName = m_currentLine.SubString(m_currentLine.GetWordPosition(1)); @@ -272,7 +281,8 @@ namespace Nz if (matName.IsEmpty()) { #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - UnrecognizedLine(); + if (!UnrecognizedLine()) + return false; #endif break; } @@ -288,8 +298,8 @@ namespace Nz if (paramCount >= 1) m_positions.push_back(vertex); #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - else - UnrecognizedLine(); + else if (!UnrecognizedLine()) + false; #endif } else if (word == "vn") @@ -299,8 +309,8 @@ namespace Nz if (paramCount == 3) m_normals.push_back(normal); #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - else - UnrecognizedLine(); + else if (!UnrecognizedLine()) + false; #endif } else if (word == "vt") @@ -310,13 +320,13 @@ namespace Nz if (paramCount >= 2) m_texCoords.push_back(uvw); #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - else - UnrecognizedLine(); + else if (!UnrecognizedLine()) + false; #endif } #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - else - UnrecognizedLine(); + else if (!UnrecognizedLine()) + false; #endif break; @@ -324,7 +334,8 @@ namespace Nz default: #if NAZARA_UTILITY_STRICT_RESOURCE_PARSING - UnrecognizedLine(); + if (!UnrecognizedLine()) + return false; #endif break; }