wxVsnprintf_ fix: added %ls,%lc handling (patch 937094)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26865 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2004-04-18 21:35:06 +00:00
parent 8dae91699c
commit 210f4bcd66

View File

@@ -198,10 +198,12 @@ int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax,
} }
#define APPEND_CH(ch) \ #define APPEND_CH(ch) \
if ( lenCur == lenMax ) \ { \
return -1; \ if ( lenCur == lenMax ) \
\ return -1; \
buf[lenCur++] = ch \
buf[lenCur++] = ch; \
}
#define APPEND_STR(s) \ #define APPEND_STR(s) \
{ \ { \
@@ -419,46 +421,71 @@ int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax,
case wxT('c'): case wxT('c'):
{ {
wxChar val = va_arg(argptr, int); int val = va_arg(argptr, int);
// we don't need to honor padding here, do we? #if wxUSE_UNICODE
if (ilen == -1)
{
const char buf[2] = { val, 0 };
val = wxString(buf, wxConvLibc)[0u];
}
#elif wxUSE_WCHAR_T
if (ilen == 1)
{
const wchar_t buf[2] = { val, 0 };
val = wxString(buf, wxConvLibc)[0u];
}
#endif
size_t i;
if (!adj_left)
for (i = 1; i < min_width; i++)
APPEND_CH(_T(' '));
APPEND_CH(val); APPEND_CH(val);
if (adj_left)
for (i = 1; i < min_width; i++)
APPEND_CH(_T(' '));
done = TRUE; done = TRUE;
} }
break; break;
case wxT('s'): case wxT('s'):
if (ilen == -1)
{ {
// wx extension: we'll let %hs mean non-Unicode const wxChar *val = NULL;
// strings
char *val = va_arg(argptr, char *);
#if wxUSE_UNICODE #if wxUSE_UNICODE
// ASCII->Unicode constructor handles max_width wxString s;
// right
wxString s(val, wxConvLibc, max_width); if (ilen == -1)
#else
size_t len = wxSTRING_MAXLEN;
if (val)
{ {
for ( len = 0; // wx extension: we'll let %hs mean non-Unicode
val[len] && (len < max_width); // strings
len++ ) char *v = va_arg(argptr, char *);
;
if (v)
val = s = wxString(v, wxConvLibc);
}
else
#elif wxUSE_WCHAR_T
wxString s;
if (ilen == 1)
{
// %ls means Unicode strings
wchar_t *v = va_arg(argptr, wchar_t *);
if (v)
val = s = wxString(v, wxConvLibc);
} }
else else
val = wxT("(null)");
wxString s(val, len);
#endif #endif
if (s.Len() < min_width) {
s.Pad(min_width - s.Len(), wxT(' '), adj_left); val = va_arg(argptr, wxChar *);
}
size_t len = 0;
APPEND_STR(s);
}
else
{
wxChar *val = va_arg(argptr, wxChar *);
size_t len = wxSTRING_MAXLEN;
if (val) if (val)
{ {
for ( len = 0; for ( len = 0;
@@ -466,16 +493,32 @@ int WXDLLEXPORT wxVsnprintf_(wxChar *buf, size_t lenMax,
len++ ) len++ )
; ;
} }
else else if (max_width >= 6)
{
val = wxT("(null)"); val = wxT("(null)");
len = 6;
}
else
{
val = wxT("");
len = 0;
}
wxString s(val, len); size_t i;
if (s.Len() < min_width)
s.Pad(min_width - s.Len(), wxT(' '), adj_left);
APPEND_STR(s); if (!adj_left)
for (i = len; i < min_width; i++)
APPEND_CH(_T(' '));
for (i = 0; i < len; i++)
APPEND_CH(val[i]);
if (adj_left)
for (i = len; i < min_width; i++)
APPEND_CH(_T(' '));
done = TRUE;
} }
done = TRUE;
break; break;
case wxT('n'): case wxT('n'):