]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxchar.cpp, which contains:
authorOve Kaaven <ovek@arcticnet.no>
Mon, 12 Apr 1999 19:56:38 +0000 (19:56 +0000)
committerOve Kaaven <ovek@arcticnet.no>
Mon, 12 Apr 1999 19:56:38 +0000 (19:56 +0000)
wxMB2WC, wxWC2MB (wrappers for mbstowcs and wcstombs)
wxStrdup and thread-safe wxStrtok, for when libc does not supply it
wxSetlocale, wxSprintf, wxVsprintf, wxAtof, wxAtoi, wxAtol, wxGetenv,
wxSystem: Unicode-supporting wrappers

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2104 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/wxchar.cpp [new file with mode: 0644]
src/gtk.inc
src/motif.inc
src/stubs.inc

diff --git a/src/common/wxchar.cpp b/src/common/wxchar.cpp
new file mode 100644 (file)
index 0000000..0057aba
--- /dev/null
@@ -0,0 +1,175 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        wxchar.cpp
+// Purpose:     wxChar implementation
+// Author:      Ove Kåven
+// Modified by:
+// Created:     09/04/99
+// RCS-ID:      $Id$
+// Copyright:   (c) wxWindows copyright
+// Licence:     wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+  #pragma implementation "wxchar.h"
+#endif
+
+// ===========================================================================
+// headers, declarations, constants
+// ===========================================================================
+
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+  #pragma hdrstop
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+
+#ifndef WX_PRECOMP
+  #include "wx/defs.h"
+  #include "wx/wxchar.h"
+  #include "wx/string.h"
+  #include "wx/hash.h"
+#endif
+
+size_t wxMB2WC(wchar_t *buf, const char *psz, size_t n)
+{
+  if (buf) {
+    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
+  mbstate_t mbstate;  
+  return mbsrtowcs((wchar_t *) NULL, &psz, 0, &mbstate);
+#else  // !GNU libc
+  return mbstowcs((wchar_t *) NULL, psz, 0);
+#endif // GNU
+}
+
+size_t wxWC2MB(char *buf, const wchar_t *pwz, size_t n)
+{
+  if (buf) {
+    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
+  mbstate_t mbstate;  
+  return wcsrtombs((char *) NULL, &pwz, 0, &mbstate);
+#else  // !GNU libc
+  return wcstombs((char *) NULL, pwz, 0);
+#endif // GNU
+}
+
+#ifndef wxStrdup
+wxChar * WXDLLEXPORT wxStrdup(const wxChar *psz)
+{
+  size_t size = (wxStrlen(psz) + 1) * sizeof(wxChar);
+  wxChar *ret = (wxChar *) malloc(size);
+  memcpy(ret, psz, size);
+  return ret;
+}
+#endif
+
+#ifndef wxStrtok
+wxChar * WXDLLEXPORT wxStrtok(wxChar *psz, const wxChar *delim, wxChar **save_ptr)
+{
+  if (!psz) psz = *save_ptr;
+  psz += wxStrspn(psz, delim);
+  if (!*psz) {
+    *save_ptr = (wxChar *)NULL;
+    return (wxChar *)NULL;
+  }
+  wxChar *ret = psz;
+  psz = wxStrpbrk(psz, delim);
+  if (!psz) *save_ptr = (wxChar*)NULL;
+  else {
+    *psz = _T('\0');
+    *save_ptr = psz + 1;
+  }
+  return ret;
+}
+#endif
+
+#ifndef wxSetlocale
+wxChar * WXDLLEXPORT wxSetlocale(int category, const wxChar *locale)
+{
+  setlocale(category, wxConv_libc.cWX2MB(locale));
+  // FIXME
+  return (wxChar *)NULL;
+}
+#endif
+
+#ifdef wxNEED_WX_STDIO_H
+int WXDLLEXPORT wxSprintf(wxChar *buf, const wxChar *fmt, ...)
+{
+  va_list argptr;
+  int ret;
+
+  va_start(argptr, fmt);
+  ret = wxVsprintf(buf, fmt, argptr);
+  va_end(argptr);
+  return ret;
+}
+
+int WXDLLEXPORT wxVsprintf(wxChar *buf, const wxChar *fmt, va_list argptr)
+{
+  // this might be sort of inefficient, but it doesn't matter since
+  // we'd prefer people to use wxString::Printf directly instead anyway
+  wxString str;
+  str.PrintfV(fmt,argptr);
+  wxStrcpy(buf,str.c_str());
+  return str.Len();
+}
+#endif
+
+#ifdef wxNEED_WX_STDLIB_H
+double   WXDLLEXPORT wxAtof(const wxChar *psz)
+{
+  return atof(wxConv_libc.cWX2MB(psz));
+}
+
+int      WXDLLEXPORT wxAtoi(const wxChar *psz)
+{
+  return atoi(wxConv_libc.cWX2MB(psz));
+}
+
+long     WXDLLEXPORT wxAtol(const wxChar *psz)
+{
+  return atol(wxConv_libc.cWX2MB(psz));
+}
+
+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,
+    const char *val = getenv(wxConv_libc.cWX2MB(name));
+    if (!val) return (wxChar *)NULL;
+    // convert it,
+    data = (wxObject *)new wxString(val);
+    // and store it
+    env.Put(name, data);
+  }
+  // return converted env var
+  return (wxChar *)((wxString *)data)->c_str();
+}
+
+int      WXDLLEXPORT wxSystem(const wxChar *psz)
+{
+  return system(wxConv_libc.cWX2MB(psz));
+}
+
+#endif
index c6e4cbd1d9ab0f5bb30eb1e9c258239d79bc83cd..7ea985ba2375095ac4a9c1d3c9481c557204e6b7 100644 (file)
@@ -74,6 +74,7 @@ LIB_CPP_SRC=\
  common/resource.cpp \
  common/wxexpr.cpp \
  common/process.cpp \
+ common/wxchar.cpp \
 \
  gtk/accel.cpp \
  gtk/app.cpp \
index 0d26fbe0d8f5fa05741acf5cbc65e3524e45edea..f320372d6ee591af7b3ec545a2b012a4d2b93047 100644 (file)
@@ -71,6 +71,7 @@ LIB_CPP_SRC=\
  common/http.cpp \
  common/url.cpp \
  common/tokenzr.cpp \
+ common/wxchar.cpp \
 \
  motif/accel.cpp \
  motif/app.cpp \
index 2b9b930ef4e944978ad872303b1e9d917c117af5..79bec90696aa6f7edd9832640d71fb01f8c222fa 100644 (file)
@@ -65,6 +65,7 @@ LIB_CPP_SRC=\
  common/http.cpp \
  common/url.cpp \
  common/tokenzr.cpp \
+ common/wxchar.cpp \
 \
  stubs/accel.cpp \
  stubs/app.cpp \