// 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,
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
{
- return wxStringToIntType(c_str(), val, base, wxStrtol);
+ wxSTR2INT(val, base, wxStrtol);
}
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
// 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
{