]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/longlong.cpp
blind fix for wxGIFDecoder::ReadGIF
[wxWidgets.git] / src / common / longlong.cpp
index d85b5420fb4b017f5316c7ff7e3a9be8cd85bd45..d0cda3912dd7029039d1fdd41e62ec18a6aa00c2 100644 (file)
 #if wxUSE_LONGLONG
 #include "wx/longlong.h"
 
+#if defined(__MWERKS__) && defined(__WXMSW__)
+#include <string.h>     // for memset()
+#else
 #include <memory.h>     // for memset()
+#endif
+
 #include <math.h>       // for fabs()
 
 // ============================================================================
@@ -57,27 +62,6 @@ void *wxLongLongNative::asArray() const
     return temp;
 }
 
-#if wxUSE_STD_IOSTREAM
-
-// input/output
-ostream& operator<< (ostream& o, const wxLongLongNative& ll)
-{
-    char result[65];
-
-    memset(result, 'A', 64);
-
-    result[64] = '\0';
-
-    for (int i = 0; i < 64; i++)
-    {
-        result[63 - i] = '0' + (char) ((ll.m_ll >> i) & 1);
-    }
-
-    return o << result;
-}
-
-#endif // wxUSE_STD_IOSTREAM
-
 #endif // wxUSE_LONGLONG_NATIVE
 
 // ============================================================================
@@ -478,7 +462,7 @@ void wxLongLongWx::Divide(const wxLongLongWx& divisorIn,
     //     Use of this program, for any purpose, is granted the author, Ian
     //     Kaplan, as long as this copyright notice is included in the source
     //     code or any source code derived from this program. The user assumes
-    //     all responsibility for using this code. 
+    //     all responsibility for using this code.
 
     // init everything
     wxLongLongWx dividend = *this,
@@ -592,7 +576,7 @@ wxLongLongWx& wxLongLongWx::operator/=(const wxLongLongWx& ll)
     Divide(ll, quotient, remainder);
 
     *this = quotient;
-    
+
     return *this;
 }
 
@@ -626,27 +610,53 @@ void *wxLongLongWx::asArray(void) const
     return temp;
 }
 
-#if wxUSE_STD_IOSTREAM
+#endif // wxUSE_LONGLONG_WX
 
-// input/output
-ostream& operator<< (ostream& o, const wxLongLongWx& ll)
+wxString
+#if wxUSE_LONGLONG_NATIVE
+wxLongLongNative::ToString() const
+#else
+wxLongLongWx::ToString() const
+#endif
 {
-    char result[65];
+    // TODO: this is awfully inefficient, anything better?
+    wxString result;
 
-    memset(result, 'A', 64);
+    wxLongLong ll = *this;
 
-    result[64] = '\0';
+    bool neg;
+    if ( ll < 0 )
+    {
+        ll.Negate();
+        neg = TRUE;
+    }
+    else
+    {
+        neg = FALSE;
+    }
 
-    for (int i = 0; i < 32; i++)
+    while ( ll != 0 )
     {
-        result[31 - i] = (char) ('0' + (int) ((ll.m_hi >> i) & 1));
-        result[63 - i] = (char) ('0' + (int) ((ll.m_lo >> i) & 1));
+        result.Prepend((wxChar)(_T('0') + (ll % 10).ToLong()));
+        ll /= 10;
     }
 
-    return o << result;
+    if ( result.empty() )
+        result = _T('0');
+    else if ( neg )
+        result.Prepend(_T('-'));
+
+    return result;
 }
-#endif // wxUSE_STD_IOSTREAM
 
-#endif // wxUSE_LONGLONG_NATIVE
+#if wxUSE_STD_IOSTREAM
+
+// input/output
+wxSTD ostream& operator<< (wxSTD ostream& o, const wxLongLong& ll)
+{
+    return o << ll.ToString();
+}
+
+#endif // wxUSE_STD_IOSTREAM
 
 #endif // wxUSE_LONGLONG