value is outside the range of built-in long type), an assert will be triggered
 in debug mode.
 
+\membersection{wxLongLong::ToString}\label{wxlonglongtostring}
+
+\constfunc{wxString}{ToString}{\void}
+
+Returns the string representation of a wxLongLong.
+
 \membersection{wxLongLong::operator$+$}\label{wxlonglongoperatorplus}
 
 \constfunc{wxLongLong}{operator$+$}{\param{const wxLongLong\& }{ll}}
 
 #endif
 
 #include "wx/defs.h"
-#include "wx/wxchar.h"
+#include "wx/string.h"
 
 #include <limits.h>     // for LONG_MAX
 
         // negation operator
     wxLongLongNative operator-() const
         { return wxLongLongNative(-m_ll); }
+    wxLongLongNative& Negate() { m_ll = -m_ll; return *this; }
 
         // subtraction
     wxLongLongNative operator-(const wxLongLongNative& ll) const
         { return m_ll >= l; }
 
     // miscellaneous
+
+        // return the string representation of this number
+    wxString ToString() const;
+
         // conversion to byte array: returns a pointer to static buffer!
     void *asArray() const;
 
                 wxLongLongWx& remainder) const;
 
     // input/output
+
+    // return the string representation of this number
+    wxString ToString() const;
+
+    void *asArray() const;
+
 #if wxUSE_STD_IOSTREAM
     friend wxSTD ostream& operator<<(wxSTD ostream&, const wxLongLongWx&);
 #endif // wxUSE_STD_IOSTREAM
 
-    void *asArray() const;
-
 private:
     // long is at least 32 bits, so represent our 64bit number as 2 longs
 
 
 //#define TEST_ARRAYS
 //#define TEST_CHARSET
 //#define TEST_CMDLINE
-#define TEST_DATETIME
+//#define TEST_DATETIME
 //#define TEST_DIR
 //#define TEST_DLLLOADER
 //#define TEST_ENVIRON
 //#define TEST_LIST
 //#define TEST_LOCALE
 //#define TEST_LOG
-//#define TEST_LONGLONG
+#define TEST_LONGLONG
 //#define TEST_MIME
 //#define TEST_PATHLIST
 //#define TEST_REGCONF
 
 #include <wx/utils.h>
 
+static void TestDiskInfo()
+{
+    puts("*** Testing wxGetDiskSpace() ***\n");
+
+    for ( ;; )
+    {
+        char pathname[128];
+        printf("\nEnter a directory name: ");
+        if ( !fgets(pathname, WXSIZEOF(pathname), stdin) )
+            break;
+
+        // kill the last '\n'
+        pathname[strlen(pathname) - 1] = 0;
+
+        wxLongLong total, free;
+        if ( !wxGetDiskSpace(pathname, &total, &free) )
+        {
+            wxPuts(_T("ERROR: wxGetDiskSpace failed."));
+        }
+        else
+        {
+            wxPrintf(_T("%s total bytes, %s free bytes on '%s'.\n"),
+                    total.ToString().c_str(),
+                    free.ToString().c_str(),
+                    pathname);
+        }
+    }
+}
+
 static void TestOsInfo()
 {
     puts("*** Testing OS info functions ***\n");
 // get a random 64 bit number
 #define RAND_LL()   MAKE_LL(rand(), rand(), rand(), rand())
 
+static const long testLongs[] =
+{
+    0,
+    1,
+    -1,
+    LONG_MAX,
+    LONG_MIN,
+    0x1234,
+    -0x1234
+};
+
 #if wxUSE_LONGLONG_WX
 inline bool operator==(const wxLongLongWx& a, const wxLongLongNative& b)
     { return a.GetHi() == b.GetHi() && a.GetLo() == b.GetLo(); }
 #if wxUSE_LONGLONG_WX
     puts("*** Testing wxLongLong comparison ***\n");
 
-    static const long testLongs[] =
-    {
-        0,
-        1,
-        -1,
-        LONG_MAX,
-        LONG_MIN,
-        0x1234,
-        -0x1234
-    };
-
     static const long ls[2] =
     {
         0x1234,
 
     wxLongLongWx lls[2];
     lls[0] = ls[0];
-    lls[1] = ls[1]; 
+    lls[1] = ls[1];
 
     for ( size_t n = 0; n < WXSIZEOF(testLongs); n++ )
     {
 #endif // wxUSE_LONGLONG_WX
 }
 
+static void TestLongLongPrint()
+{
+    wxPuts(_T("*** Testing wxLongLong printing ***\n"));
+
+    for ( size_t n = 0; n < WXSIZEOF(testLongs); n++ )
+    {
+        wxLongLong ll = testLongs[n];
+        wxPrintf(_T("%ld == %s\n"), testLongs[n], ll.ToString().c_str());
+    }
+
+    wxLongLong ll(0x12345678, 0x87654321);
+    wxPrintf(_T("0x1234567887654321 = %s\n"), ll.ToString().c_str());
+
+    ll.Negate();
+    wxPrintf(_T("-0x1234567887654321 = %s\n"), ll.ToString().c_str());
+}
+
 #undef MAKE_LL
 #undef RAND_LL
 
         TestAddition();
         TestLongLongConversion();
         TestBitOperations();
+        TestLongLongComparison();
     }
-    TestLongLongComparison();
+    TestLongLongPrint();
 #endif // TEST_LONGLONG
 
 #ifdef TEST_HASH
 #endif // TEST_MIME
 
 #ifdef TEST_INFO_FUNCTIONS
-    TestOsInfo();
-    TestUserInfo();
+    TestDiskInfo();
+    if ( 0 )
+    {
+        TestOsInfo();
+        TestUserInfo();
+    }
 #endif // TEST_INFO_FUNCTIONS
 
 #ifdef TEST_PATHLIST
 
     return temp;
 }
 
-#if wxUSE_STD_IOSTREAM
-
-// input/output
-wxSTD ostream& operator<< (wxSTD 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.GetValue() >> i) & 1);
-    }
-
-    return o << result;
-}
-
-#endif // wxUSE_STD_IOSTREAM
-
 #endif // wxUSE_LONGLONG_NATIVE
 
 // ============================================================================
     //     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,
     Divide(ll, quotient, remainder);
 
     *this = quotient;
-    
+
     return *this;
 }
 
     return temp;
 }
 
-#if wxUSE_STD_IOSTREAM
+#endif // wxUSE_LONGLONG_WX
 
-// input/output
-wxSTD ostream& operator<< (wxSTD ostream& o, const wxLongLongWx& ll)
+wxString
+#ifdef wxUSE_LONGLONG_NATIVE
+wxLongLongNative
+#else
+wxLognLongWx
+#endif
+::ToString() const
 {
-    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