Utility/OBJParser: Abort parsing when there's more than one error per two line

Former-commit-id: b8126ca529f91492a1d116da7cb446b8eaa25a90 [formerly c33f7b8d27ba18303b839693aa3ef056d1f48ae1]
Former-commit-id: 701965304b9e51ddf1ee2233559f2f97d4a51894
This commit is contained in:
Lynix 2016-07-29 13:37:44 +02:00
parent 9fa7267523
commit 5d6cee8291
3 changed files with 45 additions and 23 deletions

View File

@ -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<Mesh> m_meshes;
std::vector<String> m_materials;
@ -99,6 +99,7 @@ namespace Nz
mutable StringStream m_outputStream;
bool m_keepLastLine;
unsigned int m_lineCount;
unsigned int m_errorCount;
};
}

View File

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

View File

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