#include <stdlib.h>
#include <string.h>
#include <locale.h>
+#include <time.h>
#ifndef WX_PRECOMP
#include "wx/defs.h"
{
if (buf) {
if (!n || !*psz) {
- if (n) *buf = _T('\0');
+ if (n) *buf = wxT('\0');
return 0;
}
return mbstowcs(buf, psz, n);
#if wxUSE_WCSRTOMBS
// don't know if it's really needed (or if we can pass NULL), but better safe
// than quick
- mbstate_t mbstate;
+ mbstate_t mbstate;
return mbsrtowcs((wchar_t *) NULL, &psz, 0, &mbstate);
#else // !GNU libc
return mbstowcs((wchar_t *) NULL, psz, 0);
#if wxUSE_WCSRTOMBS
// don't know if it's really needed (or if we can pass NULL), but better safe
// than quick
- mbstate_t mbstate;
+ mbstate_t mbstate;
return wcsrtombs((char *) NULL, &pwz, 0, &mbstate);
#else // !GNU libc
return wcstombs((char *) NULL, pwz, 0);
bool WXDLLEXPORT wxOKlibc()
{
#if wxUSE_WCHAR_T && defined(__UNIX__) && defined(__GLIBC__)
- // GNU libc uses UTF-8 even when it shouldn't
- wchar_t res;
+ // glibc 2.0 uses UTF-8 even when it shouldn't
+ wchar_t res = 0;
if ((MB_CUR_MAX == 2) &&
- (wxMB2WC(&res, "\xdd\xa5", 1)>0) &&
+ (wxMB2WC(&res, "\xdd\xa5", 1) == 1) &&
(res==0x765)) {
// this is UTF-8 allright, check whether that's what we want
- char *cur_locale = setlocale(LC_ALL, NULL);
+ char *cur_locale = setlocale(LC_CTYPE, NULL);
if ((strlen(cur_locale) < 4) ||
(strcasecmp(cur_locale + strlen(cur_locale) - 4, "utf8"))) {
// nope, don't use libc conversion
psz = wxStrpbrk(psz, delim);
if (!psz) *save_ptr = (wxChar*)NULL;
else {
- *psz = _T('\0');
+ *psz = wxT('\0');
*save_ptr = psz + 1;
}
return ret;
#endif
#ifndef wxSetlocale
-WXDLLEXPORT wxChar * wxSetlocale(int category, const wxChar *locale)
+WXDLLEXPORT wxWCharBuffer wxSetlocale(int category, const wxChar *locale)
{
- setlocale(category, wxConvLibc.cWX2MB(locale));
- // FIXME
- return (wxChar *)NULL;
+ char *localeOld = setlocale(category, wxConvLibc.cWX2MB(locale));
+
+ return wxWCharBuffer(wxConvLibc.cMB2WC(localeOld));
}
#endif
return ret;
}
+WXDLLEXPORT int wxStrncmp(const wxChar *s1, const wxChar *s2, size_t n)
+{
+ while (n && (*s1 == *s2) && *s1) n--, s1++, s2++;
+ if (n) {
+ if ((wxUChar)*s1 < (wxUChar)*s2) return -1;
+ if ((wxUChar)*s1 > (wxUChar)*s2) return 1;
+ }
+ return 0;
+}
+
WXDLLEXPORT wxChar * wxStrncpy(wxChar *dest, const wxChar *src, size_t n)
{
wxChar *ret = dest;
// FIXME: only correct for C locale
while (wxIsspace(*nptr)) nptr++;
- if (*nptr == _T('+') || *nptr == _T('-')) nptr++;
+ if (*nptr == wxT('+') || *nptr == wxT('-')) nptr++;
while (wxIsdigit(*nptr)) nptr++;
- if (*nptr == _T('.')) {
+ if (*nptr == wxT('.')) {
nptr++;
while (wxIsdigit(*nptr)) nptr++;
}
- if (*nptr == _T('E') || *nptr == _T('e')) {
+ if (*nptr == wxT('E') || *nptr == wxT('e')) {
nptr++;
- if (*nptr == _T('+') || *nptr == _T('-')) nptr++;
+ if (*nptr == wxT('+') || *nptr == wxT('-')) nptr++;
while (wxIsdigit(*nptr)) nptr++;
}
wxString data(nptr, nptr-start);
wxWX2MBbuf dat = data.mb_str(wxConvLibc);
- char *rdat = MBSTRINGCAST dat;
+ char *rdat = wxMBSTRINGCAST dat;
double ret = strtod(dat, &rdat);
if (endptr) *endptr = (wxChar *)(start + (rdat - (const char *)dat));
// FIXME: only correct for C locale
while (wxIsspace(*nptr)) nptr++;
- if (*nptr == _T('+') || *nptr == _T('-')) nptr++;
+ if (*nptr == wxT('+') || *nptr == wxT('-')) nptr++;
if (((base == 0) || (base == 16)) &&
- (nptr[0] == _T('0') && nptr[1] == _T('x'))) {
+ (nptr[0] == wxT('0') && nptr[1] == wxT('x'))) {
nptr += 2;
base = 16;
}
- else if ((base == 0) && (nptr[0] == _T('0'))) base = 8;
+ else if ((base == 0) && (nptr[0] == wxT('0'))) base = 8;
else if (base == 0) base = 10;
- while ((wxIsdigit(*nptr) && (*nptr - _T('0') < base)) ||
- (wxIsalpha(*nptr) && (wxToupper(*nptr) - _T('A') + 10 < base))) nptr++;
+ while ((wxIsdigit(*nptr) && (*nptr - wxT('0') < base)) ||
+ (wxIsalpha(*nptr) && (wxToupper(*nptr) - wxT('A') + 10 < base))) nptr++;
wxString data(nptr, nptr-start);
wxWX2MBbuf dat = data.mb_str(wxConvLibc);
- char *rdat = MBSTRINGCAST dat;
+ char *rdat = wxMBSTRINGCAST dat;
long int ret = strtol(dat, &rdat, base);
if (endptr) *endptr = (wxChar *)(start + (rdat - (const char *)dat));
#endif
#ifdef wxNEED_WX_STDIO_H
+WXDLLEXPORT FILE * wxFopen(const wxChar *path, const wxChar *mode)
+{
+ return fopen(wxConvFile.cWX2MB(path), wxConvLibc.cWX2MB(mode));
+}
+
+WXDLLEXPORT FILE * wxFreopen(const wxChar *path, const wxChar *mode, FILE *stream)
+{
+ return freopen(wxConvFile.cWX2MB(path), wxConvLibc.cWX2MB(mode), stream);
+}
+
+WXDLLEXPORT int wxRemove(const wxChar *path)
+{
+ return remove(wxConvFile.cWX2MB(path));
+}
+
+WXDLLEXPORT int wxRename(const wxChar *oldpath, const wxChar *newpath)
+{
+ return rename(wxConvFile.cWX2MB(oldpath), wxConvFile.cWX2MB(newpath));
+}
+
int WXDLLEXPORT wxPrintf(const wxChar *fmt, ...)
{
va_list argptr;
}
#endif
+
+#ifdef wxNEED_WX_TIME_H
+WXDLLEXPORT size_t wxStrftime(wxChar *s, size_t max, const wxChar *fmt, const struct tm *tm)
+{
+ if (!max) return 0;
+ char *buf = (char *)malloc(max);
+ size_t ret = strftime(buf, max, wxConvLibc.cWX2MB(fmt), tm);
+ if (ret) {
+ wxStrcpy(s, wxConvLibc.cMB2WX(buf));
+ free(buf);
+ return wxStrlen(s);
+ } else {
+ free(buf);
+ *s = 0;
+ return 0;
+ }
+}
+#endif