// Name: wxchar.cpp
// Purpose: wxChar implementation
// Author: Ove Kåven
-// Modified by:
+// Modified by: Ron Lee
// Created: 09/04/99
// RCS-ID: $Id$
-// Copyright: (c) wxWindows copyright
+// Copyright: (c) wxWidgets copyright
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
}
#define APPEND_CH(ch) \
- if ( lenCur == lenMax ) \
- return -1; \
- \
- buf[lenCur++] = ch
+ { \
+ if ( lenCur == lenMax ) \
+ return -1; \
+ \
+ buf[lenCur++] = ch; \
+ }
#define APPEND_STR(s) \
{ \
case wxT('c'):
{
- wxChar val = va_arg(argptr, int);
- // we don't need to honor padding here, do we?
+ int val = va_arg(argptr, int);
+#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);
+ if (adj_left)
+ for (i = 1; i < min_width; i++)
+ APPEND_CH(_T(' '));
+
done = TRUE;
}
break;
case wxT('s'):
- if (ilen == -1)
{
- // wx extension: we'll let %hs mean non-Unicode
- // strings
- char *val = va_arg(argptr, char *);
+ const wxChar *val = NULL;
#if wxUSE_UNICODE
- // ASCII->Unicode constructor handles max_width
- // right
- wxString s(val, wxConvLibc, max_width);
-#else
- size_t len = wxSTRING_MAXLEN;
- if (val)
+ wxString s;
+
+ if (ilen == -1)
{
- for ( len = 0;
- val[len] && (len < max_width);
- len++ )
- ;
+ // wx extension: we'll let %hs mean non-Unicode
+ // strings
+ 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
- val = wxT("(null)");
- wxString s(val, len);
#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)
{
for ( len = 0;
len++ )
;
}
- else
+ else if (max_width >= 6)
+ {
val = wxT("(null)");
+ len = 6;
+ }
+ else
+ {
+ val = wxT("");
+ len = 0;
+ }
+
+ size_t i;
+
+ if (!adj_left)
+ for (i = len; i < min_width; i++)
+ APPEND_CH(_T(' '));
+
+ for (i = 0; i < len; i++)
+ APPEND_CH(val[i]);
- wxString s(val, len);
- if (s.Len() < min_width)
- s.Pad(min_width - s.Len(), wxT(' '), adj_left);
+ if (adj_left)
+ for (i = len; i < min_width; i++)
+ APPEND_CH(_T(' '));
- APPEND_STR(s);
+ done = TRUE;
}
- done = TRUE;
break;
case wxT('n'):
}
#endif // wxSnprintf_
+#if defined(__DMC__)
+ /* Digital Mars adds count to _stprintf (C99) so convert */
+ #if wxUSE_UNICODE
+ int wxSprintf (wchar_t * __RESTRICT s, const wchar_t * __RESTRICT format, ... )
+ {
+ va_list arglist;
+
+ va_start( arglist, format );
+ int iLen = swprintf ( s, -1, format, arglist );
+ va_end( arglist );
+ return iLen ;
+ }
+
+ #endif // wxUSE_UNICODE
+
+#endif //__DMC__
+
// ----------------------------------------------------------------------------
// implement the standard IO functions for wide char if libc doesn't have them
// ----------------------------------------------------------------------------
-#ifdef wxNEED_FPUTWC
-
+#ifdef wxNEED_FPUTS
int wxFputs(const wchar_t *ws, FILE *stream)
{
// counting the number of wide characters written isn't worth the trouble,
// simply distinguish between ok and error
return fputs(wxConvLibc.cWC2MB(ws), stream) == -1 ? -1 : 0;
}
+#endif // wxNEED_FPUTS
+#ifdef wxNEED_PUTC
int /* not wint_t */ wxPutc(wchar_t wc, FILE *stream)
{
wchar_t ws[2] = { wc, L'\0' };
return wxFputs(ws, stream);
}
-
-#endif // wxNEED_FPUTWC
+#endif // wxNEED_PUTC
// NB: we only implement va_list functions here, the ones taking ... are
// defined below for wxNEED_PRINTF_CONVERSION case anyhow and we reuse
if ( rc != -1 )
{
// we can't do much better without Unicode support in libc...
- if ( fprintf(stream, "%s", s.mb_str()) == -1 )
+ if ( fprintf(stream, "%s", (const char*)s.mb_str() ) == -1 )
return -1;
}
So to use native functions in order to get our semantics we must do the
following translations in Unicode mode (nothing to do in ANSI mode):
- wxWindows specifier POSIX specifier
+ wxWidgets specifier POSIX specifier
----------------------------------------
%hc, %C, %hC %c
ch == _T('0') || ch == _T(' ') || ch == _T('#');
}
- void SkipDigits(const wxChar **ppc)
+ void SkipDigits(const wxChar **ptpc)
{
- while ( **ppc >= _T('0') && **ppc <= _T('9') )
- CopyFmtChar(*(*ppc)++);
+ while ( **ptpc >= _T('0') && **ptpc <= _T('9') )
+ CopyFmtChar(*(*ptpc)++);
}
// the translated format
va_list argptr;
va_start(argptr, format);
- // callers of wxSprintf() deserve what they get
- int ret = vswprintf( str, UINT_MAX, wxFormatConverter(format), argptr );
+ // note that wxString::FormatV() uses wxVsnprintf(), not wxSprintf(), so
+ // it's safe to implement this one in terms of it
+ wxString s(wxString::FormatV(format, argptr));
+ wxStrcpy(str, s);
va_end(argptr);
- return ret;
+ return s.length();
}
int wxFprintf( FILE *stream, const wxChar *format, ... )
int wxVsprintf( wxChar *str, const wxChar *format, va_list argptr )
{
// same as for wxSprintf()
- return vswprintf(str, UINT_MAX, wxFormatConverter(format), argptr);
+ return vswprintf(str, INT_MAX / 4, wxFormatConverter(format), argptr);
}
#endif // wxNEED_PRINTF_CONVERSION
WXDLLEXPORT int wxIsalnum(wxChar ch) { return IsCharAlphaNumeric(ch); }
WXDLLEXPORT int wxIsalpha(wxChar ch) { return IsCharAlpha(ch); }
-WXDLLEXPORT int wxIsctrl(wxChar ch) { return wxMSW_ctype(ch) & C1_CNTRL; }
+WXDLLEXPORT int wxIscntrl(wxChar ch) { return wxMSW_ctype(ch) & C1_CNTRL; }
WXDLLEXPORT int wxIsdigit(wxChar ch) { return wxMSW_ctype(ch) & C1_DIGIT; }
WXDLLEXPORT int wxIsgraph(wxChar ch) { return wxMSW_ctype(ch) & (C1_DIGIT|C1_PUNCT|C1_ALPHA); }
WXDLLEXPORT int wxIslower(wxChar ch) { return IsCharLower(ch); }
wxChar * WXDLLEXPORT wxGetenv(const wxChar *name)
{
- static wxHashTable env;
-
- // check if we already have stored the converted env var
- wxObject *data = env.Get(name);
- if (!data)
- {
- // nope, retrieve it,
-#if wxUSE_UNICODE
- wxCharBuffer buffer = wxConvLocal.cWX2MB(name);
- // printf( "buffer %s\n", (const char*) buffer );
- const char *val = getenv( (const char *)buffer );
-#else
- const char *val = getenv( name );
-#endif
-
- if (!val) return (wxChar *)NULL;
- // printf( "home %s\n", val );
-
- // convert it,
#if wxUSE_UNICODE
- data = (wxObject *)new wxString(val, wxConvLocal);
+ // NB: buffer returned by getenv() is allowed to be overwritten next
+ // time getenv() is called, so it is OK to use static string
+ // buffer to hold the data.
+ static wxWCharBuffer value((wxChar*)NULL);
+ value = wxConvLocal.cMB2WX(getenv(wxConvLocal.cWX2MB(name)));
+ return value.data();
#else
- data = (wxObject *)new wxString(val);
+ return getenv(name);
#endif
-
- // and store it
- env.Put(name, data);
- }
- // return converted env var
- return (wxChar *)((wxString *)data)->c_str();
}
int WXDLLEXPORT wxSystem(const wxChar *psz)
}
#endif // wxNEED_WX_TIME_H
+#ifndef wxCtime
+WXDLLEXPORT wxChar *wxCtime(const time_t *timep)
+{
+ static wxChar buf[128];
+
+ wxStrncpy( buf, wxConvertMB2WX( ctime( timep ) ), sizeof( buf ) );
+ buf[ sizeof( buf ) - 1 ] = _T('\0');
+
+ return buf;
+}
+#endif // wxCtime
+
#endif // wxUSE_WCHAR_T
// ----------------------------------------------------------------------------