]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/string.cpp
Minor header cleaning.
[wxWidgets.git] / src / common / string.cpp
index 20608e466becb8cb9bcdc74f6e8222d03988cecd..b0bc3a1864c3d7ff25ab176fefa6f00a5d76e2aa 100644 (file)
@@ -1677,6 +1677,8 @@ int wxString::Find(const wxChar *pszSub) const
 
 // the implementation of all the functions below is exactly the same so factor
 // it out
 
 // the implementation of all the functions below is exactly the same so factor
 // it out
+#ifndef __WATCOMC__
+
 template <typename T>
 bool wxStringToIntType(const wxChar *start,
                        T *val,
 template <typename T>
 bool wxStringToIntType(const wxChar *start,
                        T *val,
@@ -1696,20 +1698,66 @@ bool wxStringToIntType(const wxChar *start,
     return !*end && (end != start) && (errno != ERANGE);
 }
 
     return !*end && (end != start) && (errno != ERANGE);
 }
 
+#define wxSTR2INT(val, b, func) return wxStringToIntType(c_str(), val, b, func)
+
+#else // __WATCOMC__
+
+//  FIXME, TODO, ASAP !!! - ugly trick to make release for Open Watcom possible
+//  without changing code flow for other compilers
+
+#define wxSTR2INT(val, base, func)                                            \
+    wxCHECK_MSG( val, false, _T("NULL output pointer") );                     \
+    wxASSERT_MSG( !base || (base > 1 && base <= 36), _T("invalid base") );    \
+                                                                              \
+    errno = 0;                                                                \
+                                                                              \
+    wxChar *end;                                                              \
+    *val = (*func)(c_str(), &end, base);                                      \
+                                                                              \
+    return !*end && (end != c_str()) && (errno != ERANGE)
+
+#endif // !__WATCOMC__/__WATCOMC__
+
 bool wxString::ToLong(long *val, int base) const
 {
 bool wxString::ToLong(long *val, int base) const
 {
-    return wxStringToIntType(c_str(), val, base, wxStrtol);
+    wxSTR2INT(val, base, wxStrtol);
 }
 
 bool wxString::ToULong(unsigned long *val, int base) const
 {
 }
 
 bool wxString::ToULong(unsigned long *val, int base) const
 {
-    return wxStringToIntType(c_str(), val, base, wxStrtoul);
+    wxSTR2INT(val, base, wxStrtoul);
+}
+
+bool wxString::ToLongLong(wxLongLong_t *val, int base) const
+{
+#ifdef wxHAS_STRTOLL
+    wxSTR2INT(val, base, wxStrtoll);
+#else
+    // TODO: implement this ourselves
+    wxUnusedVar(val);
+    wxUnusedVar(base);
+    return false;
+#endif // wxHAS_STRTOLL
+}
+
+bool wxString::ToULongLong(wxULongLong_t *val, int base) const
+{
+#ifdef wxHAS_STRTOLL
+    wxSTR2INT(val, base, wxStrtoull);
+#else
+    // TODO: implement this ourselves
+    wxUnusedVar(val);
+    wxUnusedVar(base);
+    return false;
+#endif
 }
 
 bool wxString::ToDouble(double *val) const
 {
     wxCHECK_MSG( val, false, _T("NULL pointer in wxString::ToDouble") );
 
 }
 
 bool wxString::ToDouble(double *val) const
 {
     wxCHECK_MSG( val, false, _T("NULL pointer in wxString::ToDouble") );
 
+    errno = 0;
+
     const wxChar *start = c_str();
     wxChar *end;
     *val = wxStrtod(start, &end);
     const wxChar *start = c_str();
     wxChar *end;
     *val = wxStrtod(start, &end);
@@ -1793,9 +1841,11 @@ int wxString::PrintfV(const wxChar* pszFormat, va_list argptr)
             // current size of the buffer
             size *= 2;
         }
             // current size of the buffer
             size *= 2;
         }
-        else if ( len > size )
+        else if ( len >= size )
         {
         {
-            size = len;
+            // some vsnprintf() implementations NUL-terminate the buffer and
+            // some don't in len == size case, to be safe always add 1
+            size = len + 1;
         }
         else // ok, there was enough space
         {
         }
         else // ok, there was enough space
         {