%s to %ls conversion
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16566 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1479,8 +1479,6 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz)
|
||||
#if wxUSE_UNICODE
|
||||
// finally convert the result to Unicode if needed
|
||||
wxConvFile.MB2WC(buf, cbuf, sz);
|
||||
// wxString tmp = wxString::FromAscii( cbuf );
|
||||
// wxStrcpy( buf, tmp.c_str() );
|
||||
#endif // wxUSE_UNICODE
|
||||
}
|
||||
|
||||
|
@@ -186,74 +186,6 @@ wxSTD ostream& operator<<(wxSTD ostream& os, const wxString& str)
|
||||
|
||||
#endif //std::string compatibility
|
||||
|
||||
#ifndef wxVsnprintf
|
||||
int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len,
|
||||
const wxChar *format, va_list argptr)
|
||||
{
|
||||
#if wxUSE_UNICODE
|
||||
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
|
||||
}
|
||||
#else
|
||||
// GNU libc 2.2 only has for wxVsnprintf for Unicode called vswprintf
|
||||
// so we imitate wxVsprintf using it.
|
||||
int WXDLLEXPORT wxVsprintf(wxChar *buf,
|
||||
const wxChar *format,
|
||||
va_list argptr)
|
||||
{
|
||||
return vswprintf( buf, 10000, format, argptr );
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef wxSnprintf
|
||||
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;
|
||||
}
|
||||
#else
|
||||
// GNU libc 2.2 only has for wxSnprintf for Unicode called swprintf
|
||||
// so we imitate wxSprintf using it.
|
||||
int WXDLLEXPORT wxSprintf(wxChar *buf,
|
||||
const wxChar *format,
|
||||
...) ATTRIBUTE_PRINTF_2
|
||||
{
|
||||
va_list argptr;
|
||||
va_start(argptr, format);
|
||||
|
||||
int iLen = swprintf(buf, 10000, format, argptr);
|
||||
|
||||
va_end(argptr);
|
||||
|
||||
return iLen;
|
||||
}
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// private classes
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@@ -28,9 +28,9 @@
|
||||
#endif
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/app.h"
|
||||
#include "wx/toplevel.h"
|
||||
#include "wx/dcclient.h"
|
||||
#include "wx/app.h"
|
||||
#endif // WX_PRECOMP
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@@ -119,6 +119,265 @@ size_t WXDLLEXPORT wcslen(const wchar_t *s)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef wxNEED_PRINTF_CONVERSION
|
||||
|
||||
#define CONVERT_FORMAT_1 \
|
||||
wxChar *new_format = (wxChar*) format; \
|
||||
size_t old_len = wxStrlen( format ); \
|
||||
int n = 0; \
|
||||
size_t i; \
|
||||
for (i = 0; i < old_len; i++) \
|
||||
{ \
|
||||
if ( (format[i] == L'%') && \
|
||||
((i < old_len) && ((format[i+1] == L's') || (format[i+1] == L'c'))) && \
|
||||
((i == 0) || (format[i-1] != L'%')) ) \
|
||||
{ \
|
||||
n++; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
if (n > 0) \
|
||||
{ \
|
||||
new_format = new wxChar[old_len+n+1]; \
|
||||
wxChar *s = new_format; \
|
||||
\
|
||||
for (i = 0; i < old_len+1; i++) \
|
||||
{ \
|
||||
if ( (format[i] == L'%') && \
|
||||
((i < old_len) && ((format[i+1] == L's') || (format[i+1] == L'c'))) && \
|
||||
((i == 0) || (format[i-1] != L'%')) ) \
|
||||
{ \
|
||||
*s = L'%'; \
|
||||
s++; \
|
||||
*s = L'l'; \
|
||||
s++; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
*s = format[i]; \
|
||||
s++; \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
#define CONVERT_FORMAT_2 \
|
||||
if (n > 0) \
|
||||
delete [] new_format;
|
||||
|
||||
|
||||
int wxScanf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_2
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
va_list argptr;
|
||||
va_start(argptr, format);
|
||||
|
||||
int ret = vwscanf( new_format, argptr );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
va_end(argptr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxSscanf( const wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
va_list argptr;
|
||||
va_start(argptr, format);
|
||||
|
||||
int ret = vswscanf( str, new_format, argptr );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
va_end(argptr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxFscanf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
va_list argptr;
|
||||
va_start(argptr, format);
|
||||
|
||||
int ret = vfwscanf(stream, new_format, argptr);
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
va_end(argptr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxVsscanf( const wxChar *str, const wxChar *format, va_list ap )
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
int ret = vswscanf( str, new_format, ap );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxPrintf( const wxChar *format, ... ) ATTRIBUTE_PRINTF_2
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
va_list argptr;
|
||||
va_start(argptr, format);
|
||||
|
||||
int ret = vwprintf( new_format, argptr );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
va_end(argptr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxSnprintf( wxChar *str, size_t size, const wxChar *format, ... ) ATTRIBUTE_PRINTF_4
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
va_list argptr;
|
||||
va_start(argptr, format);
|
||||
|
||||
int ret = vswprintf( str, size, new_format, argptr );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
va_end(argptr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxSprintf( wxChar *str, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
va_list argptr;
|
||||
va_start(argptr, format);
|
||||
|
||||
// Ugly
|
||||
int ret = vswprintf( str, 10000, new_format, argptr );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
va_end(argptr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxFprintf( FILE *stream, const wxChar *format, ... ) ATTRIBUTE_PRINTF_3
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
va_list argptr;
|
||||
va_start( argptr, format );
|
||||
|
||||
int ret = vfwprintf( stream, new_format, argptr );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
va_end(argptr);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxVfprint( FILE *stream, const wxChar *format, va_list ap )
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
int ret = vfwprintf( stream, new_format, ap );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxVprintf( const wxChar *format, va_list ap )
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
int ret = vwprintf( new_format, ap );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxVsnprintf( wxChar *str, size_t size, const wxChar *format, va_list ap )
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
int ret = vswprintf( str, size, new_format, ap );
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wxVsprintf( wxChar *str, const wxChar *format, va_list ap )
|
||||
{
|
||||
CONVERT_FORMAT_1
|
||||
|
||||
// This is so ugly
|
||||
int ret = vswprintf(str, 10000, new_format, ap);
|
||||
|
||||
CONVERT_FORMAT_2
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(wxVsnprintf) && !defined(wxHAS_VSNPRINTF)
|
||||
int WXDLLEXPORT wxVsnprintf(wxChar *buf, size_t len,
|
||||
const wxChar *format, va_list argptr)
|
||||
{
|
||||
#if wxUSE_UNICODE
|
||||
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
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !defined(wxSnprintf) && !defined(wxHAS_SNPRINTF)
|
||||
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;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(__WIN32__) && defined(wxNEED_WX_CTYPE_H)
|
||||
inline WORD wxMSW_ctype(wxChar ch)
|
||||
{
|
||||
|
Reference in New Issue
Block a user