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:
@@ -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'):
|
||||||
|
Reference in New Issue
Block a user