diff --git a/include/Nazara/Core/String.hpp b/include/Nazara/Core/String.hpp index 43d3d9680..8707dacb3 100644 --- a/include/Nazara/Core/String.hpp +++ b/include/Nazara/Core/String.hpp @@ -46,7 +46,7 @@ class NAZARA_API NzString : public NzHashable NzString& Append(const char* string); NzString& Append(const NzString& string); - void Clear(); + void Clear(bool keepBuffer = false); bool Contains(char character, int start = 0, nzUInt32 flags = None) const; bool Contains(const char* string, int start = 0, nzUInt32 flags = None) const; diff --git a/include/Nazara/Math/Basic.hpp b/include/Nazara/Math/Basic.hpp index 1049f2837..ec374efe2 100644 --- a/include/Nazara/Math/Basic.hpp +++ b/include/Nazara/Math/Basic.hpp @@ -40,7 +40,7 @@ template bool NzNumberEquals(T a, T b); inline NzString NzNumberToString(long long number, nzUInt8 radix = 10); template T NzRadians(T radians); template T NzRadianToDegree(T radians); -inline long long NzStringToNumber(NzString str, nzUInt8 radix = 10); +inline long long NzStringToNumber(NzString str, nzUInt8 radix = 10, bool* ok = nullptr); #include diff --git a/include/Nazara/Math/Basic.inl b/include/Nazara/Math/Basic.inl index d86a7c84e..8655680f5 100644 --- a/include/Nazara/Math/Basic.inl +++ b/include/Nazara/Math/Basic.inl @@ -195,7 +195,7 @@ NzString NzNumberToString(long long number, nzUInt8 radix) if (number == 0) return '0'; - static const char* symbols("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + static const char* symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; bool negative; if (number < 0) @@ -238,12 +238,16 @@ T NzRadianToDegree(T radians) return radians * (180.0/M_PI); } -long long NzStringToNumber(NzString str, nzUInt8 radix) +long long NzStringToNumber(NzString str, nzUInt8 radix, bool* ok) { #if NAZARA_MATH_SAFE if (radix < 2 || radix > 36) { NazaraError("Radix must be between 2 and 36"); + + if (ok) + *ok = false; + return 0; } #endif @@ -269,11 +273,18 @@ long long NzStringToNumber(NzString str, nzUInt8 radix) else { NazaraError("str is not a valid number"); + + if (ok) + *ok = false; + return 0; } } while (*++digit); + if (ok) + *ok = true; + return (negative) ? -static_cast(total) : total; } diff --git a/src/Nazara/Core/String.cpp b/src/Nazara/Core/String.cpp index 53395d609..dcbb6b564 100644 --- a/src/Nazara/Core/String.cpp +++ b/src/Nazara/Core/String.cpp @@ -22,6 +22,7 @@ inline unsigned int nzPow2(unsigned int n) { unsigned int x = 1; + // Tant que x est plus petit que n, on décale ses bits vers la gauche, ce qui revient à multiplier par deux while(x <= n) x <<= 1; @@ -265,9 +266,17 @@ NzString& NzString::Append(const NzString& string) return *this; } -void NzString::Clear() +void NzString::Clear(bool keepBuffer) { - ReleaseString(); + if (keepBuffer) + { + ReleaseString(); + + m_sharedString->size = 0; + m_sharedString->string = nullptr; + } + else + ReleaseString(); } bool NzString::Contains(char character, int start, nzUInt32 flags) const @@ -3842,7 +3851,7 @@ bool NzString::ToBool(bool* value, nzUInt32 flags) const bool NzString::ToDouble(double* value) const { - if (m_sharedString->size) + if (m_sharedString->size == 0) return false; if (value) @@ -3853,13 +3862,15 @@ bool NzString::ToDouble(double* value) const bool NzString::ToInteger(long long* value, nzUInt8 base) const { - if (!IsNumber(base)) - return false; - if (value) - *value = NzStringToNumber(*this, base); + { + bool ok; + *value = NzStringToNumber(*this, base, &ok); - return true; + return ok; + } + else + return IsNumber(base); } NzString NzString::ToLower(nzUInt32 flags) const diff --git a/src/Nazara/Renderer/GLSLShader.cpp b/src/Nazara/Renderer/GLSLShader.cpp index e60cd8be9..9c3569fa2 100644 --- a/src/Nazara/Renderer/GLSLShader.cpp +++ b/src/Nazara/Renderer/GLSLShader.cpp @@ -98,6 +98,7 @@ bool NzGLSLShader::Compile() glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &length); if (length > 1) { + m_log.Clear(true); m_log.Reserve(length+19-1); // La taille retournée est celle du buffer (Avec caractère de fin) m_log.Prepend("Linkage error: "); m_log.Resize(length+19-1); // Extension du buffer d'écriture pour ajouter le log @@ -129,7 +130,7 @@ bool NzGLSLShader::Create() glBindAttribLocation(m_program, attribIndex[nzElementUsage_Diffuse], "Diffuse"); glBindAttribLocation(m_program, attribIndex[nzElementUsage_Tangent], "Tangent"); - NzString uniformName = "TexCoordi"; + NzString uniformName = "TexCoord*"; for (unsigned int i = 0; i < 8; ++i) { uniformName[8] = '0'+i; @@ -242,6 +243,7 @@ bool NzGLSLShader::Load(nzShaderType type, const NzString& source) glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length); if (length > 1) { + m_log.Clear(true); m_log.Reserve(length+19-1); // La taille retournée est celle du buffer (Avec caractère de fin) m_log.Prepend("Compilation error: "); m_log.Resize(length+19-1); // Extension du buffer d'écriture pour ajouter le log