diff --git a/src/juce_core/text/juce_String.cpp b/src/juce_core/text/juce_String.cpp index 2cb7f8660b..ab8dfda205 100644 --- a/src/juce_core/text/juce_String.cpp +++ b/src/juce_core/text/juce_String.cpp @@ -265,10 +265,31 @@ const String String::charToString (const tchar character) throw() } // pass in a pointer to the END of a buffer.. -static tchar* intToCharString (tchar* t, const int n) +static tchar* int64ToCharString (tchar* t, const int64 n) throw() { - int v = abs (n); *--t = 0; + int64 v = (n >= 0) ? n : -n; + + do + { + *--t = (tchar) (T('0') + (int) (v % 10)); + v /= 10; + + } while (v > 0); + + if (n < 0) + *--t = T('-'); + + return t; +} + +static tchar* intToCharString (tchar* t, const int n) throw() +{ + if (n == 0x80000000) // (would cause an overflow) + return int64ToCharString (t, n); + + *--t = 0; + int v = abs (n); do { @@ -283,7 +304,7 @@ static tchar* intToCharString (tchar* t, const int n) return t; } -static tchar* uintToCharString (tchar* t, unsigned int v) +static tchar* uintToCharString (tchar* t, unsigned int v) throw() { *--t = 0; @@ -299,8 +320,8 @@ static tchar* uintToCharString (tchar* t, unsigned int v) String::String (const int number) throw() { - tchar buffer [64]; - tchar* const end = buffer + 64; + tchar buffer [16]; + tchar* const end = buffer + 16; const tchar* const t = intToCharString (end, number); const int numChars = (int) (end - t); @@ -310,8 +331,8 @@ String::String (const int number) throw() String::String (const unsigned int number) throw() { - tchar buffer [64]; - tchar* const end = buffer + 64; + tchar buffer [16]; + tchar* const end = buffer + 16; const tchar* const t = uintToCharString (end, number); const int numChars = (int) (end - t); @@ -321,8 +342,8 @@ String::String (const unsigned int number) throw() String::String (const short number) throw() { - tchar buffer [64]; - tchar* const end = buffer + 64; + tchar buffer [16]; + tchar* const end = buffer + 16; const tchar* const t = intToCharString (end, (int) number); const int numChars = (int) (end - t); @@ -332,8 +353,8 @@ String::String (const short number) throw() String::String (const unsigned short number) throw() { - tchar buffer [64]; - tchar* const end = buffer + 64; + tchar buffer [16]; + tchar* const end = buffer + 16; const tchar* const t = uintToCharString (end, (unsigned int) number); const int numChars = (int) (end - t); @@ -343,32 +364,19 @@ String::String (const unsigned short number) throw() String::String (const int64 number) throw() { - tchar buffer [64]; - tchar* const end = buffer + 64; - tchar* t = end; - - *--t = 0; - int64 v = (number >= 0) ? number : -number; - - do - { - *--t = (tchar)(T('0') + (int) (v % 10)); - v /= 10; - - } while (v > 0); - - if (number < 0) - *--t = T('-'); + tchar buffer [32]; + tchar* const end = buffer + 32; + const tchar* const t = int64ToCharString (end, number); - const int len = (int) (((char*) end) - ((char*) t)); - createInternal (len - 1); - memcpy (text->text, t, len); + const int numChars = (int) (end - t); + createInternal (numChars - 1); + memcpy (text->text, t, numChars * sizeof (tchar)); } String::String (const uint64 number) throw() { - tchar buffer [64]; - tchar* const end = buffer + 64; + tchar buffer [32]; + tchar* const end = buffer + 32; tchar* t = end; *--t = 0; @@ -376,14 +384,14 @@ String::String (const uint64 number) throw() do { - *--t = (tchar)(T('0') + (int) (v % 10)); + *--t = (tchar) (T('0') + (int) (v % 10)); v /= 10; } while (v > 0); - const int len = (int) (((char*) end) - ((char*) t)); - createInternal (len - 1); - memcpy (text->text, t, len); + const int numChars = (int) (end - t); + createInternal (numChars - 1); + memcpy (text->text, t, numChars * sizeof (tchar)); } // a double-to-string routine that actually uses the number of dec. places you asked for