]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/wxchar.cpp
don't write the strings to the stream one char at a time, it's *horribly* slow
[wxWidgets.git] / src / common / wxchar.cpp
index c2deb9b203f7e07da49a1659989851071dda8f37..25adbfad8da56c2bcaddb6705690005a25c06cb6 100644 (file)
 #endif
 
 #if defined(__WIN32__) && defined(wxNEED_WX_CTYPE_H)
-#include <windef.h>
-#include <winbase.h>
-#include <winnls.h>
-#include <winnt.h>
+  #include <windef.h>
+  #include <winbase.h>
+  #include <winnls.h>
+  #include <winnt.h>
 #endif
 
 #if wxUSE_WCHAR_T
@@ -58,11 +58,8 @@ size_t WXDLLEXPORT wxMB2WC(wchar_t *buf, const char *psz, size_t n)
     return mbstowcs(buf, psz, n);
   }
 
-  // NB: GNU libc5 wcstombs() is completely broken, don't use it (it doesn't
-  //     honor the 3rd parameter, thus it will happily crash here).
-#if wxUSE_WCSRTOMBS
-  // don't know if it's really needed (or if we can pass NULL), but better safe
-  // than quick
+  // assume that we have mbsrtowcs() too if we have wcsrtombs()
+#ifdef HAVE_WCSRTOMBS
   mbstate_t mbstate;
   return mbsrtowcs((wchar_t *) NULL, &psz, 0, &mbstate);
 #else  // !GNU libc
@@ -81,31 +78,28 @@ size_t WXDLLEXPORT wxWC2MB(char *buf, const wchar_t *pwz, size_t n)
     return wcstombs(buf, pwz, n);
   }
 
-  // NB: GNU libc5 wcstombs() is completely broken, don't use it (it doesn't
-  //     honor the 3rd parameter, thus it will happily crash here).
-#if wxUSE_WCSRTOMBS
-  // don't know if it's really needed (or if we can pass NULL), but better safe
-  // than quick
+#if HAVE_WCSRTOMBS
   mbstate_t mbstate;
   return wcsrtombs((char *) NULL, &pwz, 0, &mbstate);
 #else  // !GNU libc
   return wcstombs((char *) NULL, pwz, 0);
 #endif // GNU
 }
-#endif
+#endif // wxUSE_WCHAR_T
 
 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"))) {
+       (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;
     }
@@ -168,6 +162,19 @@ int WXDLLEXPORT wxStricmp(const wxChar *psz1, const wxChar *psz2)
 }
 #endif
 
+#ifndef wxStricmp
+int WXDLLEXPORT wxStrnicmp(const wxChar *s1, const wxChar *s2, size_t n)
+{
+  register wxChar c1, c2;
+  while (n && ((c1 = wxTolower(*s1)) == (c2 = wxTolower(*s2)) ) && c1) n--, s1++, s2++;
+  if (n) {
+    if (c1 < c2) return -1;
+    if (c1 > c2) return 1;
+  }
+  return 0;
+}
+#endif
+
 #ifndef wxStrtok
 WXDLLEXPORT wxChar * wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr)
 {
@@ -278,12 +285,20 @@ WXDLLEXPORT size_t wxStrspn(const wxChar *s, const wxChar *accept)
 
 WXDLLEXPORT wxChar * wxStrstr(const wxChar *haystack, const wxChar *needle)
 {
-  wxChar *fnd;
-  while ((fnd = wxStrchr(haystack, *needle))) {
-    if (!wxStrcmp(fnd, needle)) return fnd;
-    haystack = fnd + 1;
-  }
-  return (wxChar *)NULL;
+    wxCHECK_RET( needle, NULL, _T("NULL argument in wxStrstr") );
+
+    const size_t len = wxStrlen(needle);
+
+    wxChar *fnd;
+    while ( (fnd = wxStrchr(haystack, *needle)) )
+    {
+        if ( !wxStrncmp(fnd, needle, len) )
+            return fnd;
+
+        haystack = fnd + 1;
+    }
+
+    return (wxChar *)NULL;
 }
 
 WXDLLEXPORT double wxStrtod(const wxChar *nptr, wxChar **endptr)
@@ -354,6 +369,16 @@ WXDLLEXPORT FILE * wxFreopen(const wxChar *path, const wxChar *mode, FILE *strea
   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;