// Modified by: Ron Lee
// Created: 09/04/99
// RCS-ID: $Id$
-// Copyright: (c) wxWindows copyright
+// Copyright: (c) wxWidgets copyright
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
(strcasecmp(cur_locale + strlen(cur_locale) - 4, "utf8")) ||
(strcasecmp(cur_locale + strlen(cur_locale) - 5, "utf-8"))) {
// nope, don't use libc conversion
- return FALSE;
+ return false;
}
}
#endif
- return TRUE;
+ return true;
}
// ============================================================================
{
static char s_szFlags[256] = "%";
size_t flagofs = 1;
- bool adj_left = FALSE,
- in_prec = FALSE,
- prec_dot = FALSE,
- done = FALSE;
+ bool adj_left = false,
+ in_prec = false,
+ prec_dot = false,
+ done = false;
int ilen = 0;
size_t min_width = 0,
max_width = wxSTRING_MAXLEN;
if (in_prec && !prec_dot) \
{ \
s_szFlags[flagofs++] = '.'; \
- prec_dot = TRUE; \
+ prec_dot = true; \
}
#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('\0'):
APPEND_CH(_T('\0'));
- done = TRUE;
+ done = true;
break;
case wxT('%'):
APPEND_CH(_T('%'));
- done = TRUE;
+ done = true;
break;
case wxT('#'):
case wxT('-'):
CHECK_PREC
- adj_left = TRUE;
+ adj_left = true;
s_szFlags[flagofs++] = ch;
break;
case wxT('.'):
CHECK_PREC
- in_prec = TRUE;
- prec_dot = FALSE;
+ in_prec = true;
+ prec_dot = false;
max_width = 0;
// dot will be auto-added to s_szFlags if non-negative
// number follows
APPEND_STR(tmp);
}
- done = TRUE;
+ done = true;
break;
case wxT('e'):
APPEND_STR(tmp);
}
- done = TRUE;
+ done = true;
break;
case wxT('p'):
wxConvLibc.cMB2WX(szScratch);
APPEND_STR(tmp);
- done = TRUE;
+ done = true;
}
break;
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);
- done = TRUE;
+ 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;
- 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);
+ 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;
case wxT('n'):
long int *val = va_arg(argptr, long int *);
*val = lenCur;
}
- done = TRUE;
+ done = true;
break;
default:
// bad format, leave unchanged
APPEND_CH(_T('%'));
APPEND_CH(ch);
- done = TRUE;
+ done = true;
break;
}
}
// 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_PUTS
+int wxPuts(const wxChar *ws)
+{
+ int rc = wxFputs(ws, stdout);
+ if ( rc != -1 )
+ {
+ if ( wxFputs(L"\n", stdout) == -1 )
+ return -1;
+
+ rc++;
+ }
+
+ return rc;
+}
+#endif // wxNEED_PUTS
+
+#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
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);
- // note that wxString::Format() uses wxVsnprintf(), not wxSprintf(), so
+ // note that wxString::FormatV() uses wxVsnprintf(), not wxSprintf(), so
// it's safe to implement this one in terms of it
- wxString s(wxString::Format(format, argptr));
+ wxString s(wxString::FormatV(format, argptr));
wxStrcpy(str, s);
va_end(argptr);
WXDLLEXPORT int wxToupper(wxChar ch) { return (wxChar)CharUpper((LPTSTR)(ch)); }
#endif
+#if defined(__DARWIN__) && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 )
+
+WXDLLEXPORT size_t wxInternalMbstowcs (wchar_t * out, const char * in, size_t outlen)
+{
+ if (!out)
+ {
+ size_t outsize = 0;
+ while(*in++)
+ outsize++;
+ return outsize;
+ }
+
+ const char* origin = in;
+
+ while (outlen-- && *in)
+ {
+ *out++ = (wchar_t) *in++;
+ }
+
+ *out = '\0';
+
+ return in - origin;
+}
+
+WXDLLEXPORT size_t wxInternalWcstombs (char * out, const wchar_t * in, size_t outlen)
+{
+ if (!out)
+ {
+ size_t outsize = 0;
+ while(*in++)
+ outsize++;
+ return outsize;
+ }
+
+ const wchar_t* origin = in;
+
+ while (outlen-- && *in)
+ {
+ *out++ = (char) *in++;
+ }
+
+ *out = '\0';
+
+ return in - origin;
+}
+
+#if defined(wxNEED_WX_CTYPE_H)
+
+#include <CoreFoundation/CoreFoundation.h>
+
+#define cfalnumset CFCharacterSetGetPredefined(kCFCharacterSetAlphaNumeric)
+#define cfalphaset CFCharacterSetGetPredefined(kCFCharacterSetLetter)
+#define cfcntrlset CFCharacterSetGetPredefined(kCFCharacterSetControl)
+#define cfdigitset CFCharacterSetGetPredefined(kCFCharacterSetDecimalDigit)
+//CFCharacterSetRef cfgraphset = kCFCharacterSetControl && !' '
+#define cflowerset CFCharacterSetGetPredefined(kCFCharacterSetLowercaseLetter)
+//CFCharacterSetRef cfprintset = !kCFCharacterSetControl
+#define cfpunctset CFCharacterSetGetPredefined(kCFCharacterSetPunctuation)
+#define cfspaceset CFCharacterSetGetPredefined(kCFCharacterSetWhitespaceAndNewline)
+#define cfupperset CFCharacterSetGetPredefined(kCFCharacterSetUppercaseLetter)
+
+WXDLLEXPORT int wxIsalnum(wxChar ch) { return CFCharacterSetIsCharacterMember(cfalnumset, ch); }
+WXDLLEXPORT int wxIsalpha(wxChar ch) { return CFCharacterSetIsCharacterMember(cfalphaset, ch); }
+WXDLLEXPORT int wxIscntrl(wxChar ch) { return CFCharacterSetIsCharacterMember(cfcntrlset, ch); }
+WXDLLEXPORT int wxIsdigit(wxChar ch) { return CFCharacterSetIsCharacterMember(cfdigitset, ch); }
+WXDLLEXPORT int wxIsgraph(wxChar ch) { return !CFCharacterSetIsCharacterMember(cfcntrlset, ch) && ch != ' '; }
+WXDLLEXPORT int wxIslower(wxChar ch) { return CFCharacterSetIsCharacterMember(cflowerset, ch); }
+WXDLLEXPORT int wxIsprint(wxChar ch) { return !CFCharacterSetIsCharacterMember(cfcntrlset, ch); }
+WXDLLEXPORT int wxIspunct(wxChar ch) { return CFCharacterSetIsCharacterMember(cfpunctset, ch); }
+WXDLLEXPORT int wxIsspace(wxChar ch) { return CFCharacterSetIsCharacterMember(cfspaceset, ch); }
+WXDLLEXPORT int wxIsupper(wxChar ch) { return CFCharacterSetIsCharacterMember(cfupperset, ch); }
+WXDLLEXPORT int wxIsxdigit(wxChar ch) { return wxIsdigit(ch) || (ch>='a' && ch<='f') || (ch>='A' && ch<='F'); }
+WXDLLEXPORT int wxTolower(wxChar ch) { return (wxChar)tolower((char)(ch)); }
+WXDLLEXPORT int wxToupper(wxChar ch) { return (wxChar)toupper((char)(ch)); }
+
+#endif // wxNEED_WX_CTYPE_H
+
+#endif // defined(__DARWIN__) and OSX <= 10.2
+
#ifndef wxStrdupA
WXDLLEXPORT char *wxStrdupA(const char *s)
}
#endif
+#if wxUSE_WCHAR_T && !defined(HAVE_WCSLEN)
+WXDLLEXPORT size_t wxWcslen(const wchar_t *s)
+{
+ size_t n = 0;
+ while ( *s++ )
+ n++;
+
+ return n;
+}
+#endif
+
// ----------------------------------------------------------------------------
// string.h functions
// ----------------------------------------------------------------------------
#ifdef wxNEED_WX_STRING_H
+
+// RN: These need to be c externed for the regex lib
+#ifdef __cplusplus
+extern "C" {
+#endif
+
WXDLLEXPORT wxChar * wxStrcat(wxChar *dest, const wxChar *src)
{
wxChar *ret = dest;
return ret;
}
+WXDLLEXPORT size_t wxStrlen_(const wxChar *s)
+{
+ size_t n = 0;
+ while ( *s++ )
+ n++;
+
+ return n;
+}
+
+
WXDLLEXPORT wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n)
{
wxChar *ret = dest;
WXDLLEXPORT const wxChar *wxStrstr(const wxChar *haystack, const wxChar *needle)
{
- wxCHECK_RET( needle, NULL, _T("NULL argument in wxStrstr") );
+ wxASSERT_MSG( needle != NULL, _T("NULL argument in wxStrstr") );
// VZ: this is not exactly the most efficient string search algorithm...
return NULL;
}
+#ifdef __cplusplus
+}
+#endif
+
WXDLLEXPORT double wxStrtod(const wxChar *nptr, wxChar **endptr)
{
const wxChar *start = nptr;
while ((wxIsdigit(*nptr) && (*nptr - wxT('0') < base)) ||
(wxIsalpha(*nptr) && (wxToupper(*nptr) - wxT('A') + 10 < base))) nptr++;
- wxString data(nptr, nptr-start);
+ wxString data(start, nptr-start);
wxWX2MBbuf dat = data.mb_str(wxConvLocal);
char *rdat = wxMBSTRINGCAST dat;
long int ret = strtol(dat, &rdat, base);
return ret;
}
+
+WXDLLEXPORT unsigned long int wxStrtoul(const wxChar *nptr, wxChar **endptr, int base)
+{
+ return (unsigned long int) wxStrtol(nptr, endptr, base);
+}
+
#endif // wxNEED_WX_STRING_H
#ifdef wxNEED_WX_STDIO_H
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 );
+ // 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
- const char *val = getenv( name );
+ return getenv(name);
#endif
-
- if (!val) return (wxChar *)NULL;
- // printf( "home %s\n", val );
-
- // convert it,
-#if wxUSE_UNICODE
- data = (wxObject *)new wxString(val, wxConvLocal);
-#else
- data = (wxObject *)new wxString(val);
-#endif
-
- // and store it
- env.Put(name, data);
- }
- // return converted env var
- return (wxChar *)((wxString *)data)->c_str();
}
int WXDLLEXPORT wxSystem(const wxChar *psz)
// missing C RTL functions
// ----------------------------------------------------------------------------
-#if (defined(__MWERKS__) && !defined(__MACH__) && (__MSL__ < 0x00008000)) || \
- defined(__WXWINCE__)
+#if wxNEED_STRDUP
+
char *strdup(const char *s)
{
char *dest = (char*) malloc( strlen( s ) + 1 ) ;
strcpy( dest , s ) ;
return dest ;
}
-#endif
-
-#if (defined(__MWERKS__) && !defined(__MACH__)) || (defined(__WXWINCE__) && _WIN32_WCE <= 211)
-
-int isascii( int c )
-{
- return ( c >= 0 && c < 128 );
-}
-#endif
+#endif // wxNEED_STRDUP
#if defined(__WXWINCE__) && (_WIN32_WCE <= 211)
-#if (_WIN32_WCE < 300)
+
void *calloc( size_t num, size_t size )
{
void** ptr = (void **)malloc(num * size);
memset( ptr, 0, num * size);
return ptr;
}
-#endif
-
-int isspace(int c)
-{
- return (c == ' ');
-}
-#endif
+#endif // __WXWINCE__ <= 211