#if wxUSE_UNICODE
#undef wxUSE_EXPERIMENTAL_PRINTF
- #define wxUSE_EXPERIMENTAL_PRINTF 1
+ #ifndef wvsnprintf
+ #define wxUSE_EXPERIMENTAL_PRINTF 1
+ #endif
#endif
// allocating extra space for each string consumes more memory but speeds up
#endif //std::string compatibility
-extern int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len,
- const wxChar *format, va_list argptr)
-{
-#if wxUSE_UNICODE
- // FIXME should use wvsnprintf() or whatever if it's available
- wxString s;
- int iLen = s.PrintfV(format, argptr);
- if ( iLen != -1 )
- {
- wxStrncpy(buf, s.c_str(), len);
- buf[len-1] = wxT('\0');
- }
-
- return iLen;
-#else // ANSI
- // vsnprintf() will not terminate the string with '\0' if there is not
- // enough place, but we want the string to always be NUL terminated
- int rc = wxVsnprintfA(buf, len - 1, format, argptr);
- if ( rc == -1 )
- {
- buf[len] = 0;
- }
-
- return rc;
-#endif // Unicode/ANSI
-}
-
-extern int WXDLLEXPORT wxSnprintf(wxChar *buf, size_t len,
- const wxChar *format, ...)
-{
- va_list argptr;
- va_start(argptr, format);
-
- int iLen = wxVsnprintf(buf, len, format, argptr);
-
- va_end(argptr);
-
- return iLen;
-}
-
// ----------------------------------------------------------------------------
// private classes
// ----------------------------------------------------------------------------
// 2) sizeof(wxStringData) for housekeeping info
wxStringData* pData = (wxStringData*)
malloc(sizeof(wxStringData) + (nLen + EXTRA_ALLOC + 1)*sizeof(wxChar));
-
+
if ( pData == NULL ) {
// allocation failures are handled by the caller
return FALSE;
}
-
+
pData->nRefs = 1;
pData->nDataLength = nLen;
pData->nAllocLength = nLen + EXTRA_ALLOC;
pData = (wxStringData*)
realloc(pData, sizeof(wxStringData) + (nLen + 1)*sizeof(wxChar));
-
+
if ( pData == NULL ) {
// allocation failures are handled by the caller
// keep previous data since reallocation failed
// allocation failure handled by caller
return FALSE;
}
-
+
pData->nRefs = 1;
pData->nDataLength = 0;
pData->nAllocLength = nLen;
// other common string functions
// ===========================================================================
+#if wxUSE_UNICODE
+
+wxString wxString::FromAscii(const char *ascii)
+{
+ if (!ascii)
+ return wxEmptyString;
+
+ size_t len = strlen( ascii );
+ wxString res;
+
+ if ( len )
+ {
+ wxStringBuffer buf(res, len);
+
+ wchar_t *dest = buf;
+
+ for ( ;; )
+ {
+ if ( (*dest++ = (wchar_t)(unsigned char)*ascii++) == L'\0' )
+ break;
+ }
+ }
+
+ return res;
+}
+
+const wxCharBuffer wxString::ToAscii() const
+{
+ // this will allocate enough space for the terminating NUL too
+ wxCharBuffer buffer(length());
+
+ signed char *dest = (signed char *)buffer.data();
+
+ const wchar_t *pwc = c_str();
+ for ( ;; )
+ {
+ *dest++ = *pwc > SCHAR_MAX ? '_' : *pwc;
+
+ // the output string can't have embedded NULs anyhow, so we can safely
+ // stop at first of them even if we do have any
+ if ( !*pwc++ )
+ break;
+ }
+
+ return buffer;
+}
+
+#endif // Unicode
+
// ---------------------------------------------------------------------------
// simple sub-string extraction
// ---------------------------------------------------------------------------
wxFAIL_MSG( _T("out of memory in wxString::MakeUpper") );
return *this;
}
-
+
for ( wxChar *p = m_pchData; *p; p++ )
*p = (wxChar)wxToupper(*p);
Grow(nInsert);
for (size_t i = 0; i < nInsert; i++)
- {
+ {
// the string data must not be deleted!
str.GetStringData()->Lock();