]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wxchar.cpp
add #error for platforms with weird sizeof(wchar_t)
[wxWidgets.git] / src / common / wxchar.cpp
index 23bc691780d23ccd8f9bde547f36b1960567467b..f9e73aed8a35434b91f3e26ed5327a9179a97027 100644 (file)
@@ -31,6 +31,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <locale.h>
+#include <time.h>
 
 #ifndef WX_PRECOMP
   #include "wx/defs.h"
@@ -51,7 +52,7 @@ size_t WXDLLEXPORT wxMB2WC(wchar_t *buf, const char *psz, size_t n)
 {
   if (buf) {
     if (!n || !*psz) {
-      if (n) *buf = _T('\0');
+      if (n) *buf = wxT('\0');
       return 0;
     }
     return mbstowcs(buf, psz, n);
@@ -62,7 +63,7 @@ size_t WXDLLEXPORT wxMB2WC(wchar_t *buf, const char *psz, size_t 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);
@@ -85,7 +86,7 @@ size_t WXDLLEXPORT wxWC2MB(char *buf, const wchar_t *pwz, size_t 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 wcsrtombs((char *) NULL, &pwz, 0, &mbstate);
 #else  // !GNU libc
   return wcstombs((char *) NULL, pwz, 0);
@@ -96,13 +97,13 @@ size_t WXDLLEXPORT wxWC2MB(char *buf, const wchar_t *pwz, size_t n)
 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
@@ -180,7 +181,7 @@ WXDLLEXPORT wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_pt
   psz = wxStrpbrk(psz, delim);
   if (!psz) *save_ptr = (wxChar*)NULL;
   else {
-    *psz = _T('\0');
+    *psz = wxT('\0');
     *save_ptr = psz + 1;
   }
   return ret;
@@ -188,11 +189,11 @@ WXDLLEXPORT wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_pt
 #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
 
@@ -234,6 +235,16 @@ WXDLLEXPORT wxChar * wxStrncat(wxChar *dest, const wxChar *src, size_t n)
   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;
@@ -281,21 +292,21 @@ WXDLLEXPORT double wxStrtod(const wxChar *nptr, wxChar **endptr)
 
   // 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));
@@ -309,21 +320,21 @@ WXDLLEXPORT long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base)
 
   // 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));
@@ -333,6 +344,26 @@ WXDLLEXPORT long int wxStrtol(const wxChar *nptr, wxChar **endptr, int base)
 #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;
@@ -455,3 +486,21 @@ int      WXDLLEXPORT wxSystem(const wxChar *psz)
 }
 
 #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