From: Ove Kaaven <ovek@arcticnet.no>
Date: Thu, 15 Apr 1999 18:09:48 +0000 (+0000)
Subject: Defer loading of character sets, and some anti-crash checks related to
X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a28d23bb2c4a5967a11dd4e392aff86275ae8c66

Defer loading of character sets, and some anti-crash checks related to
missing or incomplete LANG env var.


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

diff --git a/src/common/string.cpp b/src/common/string.cpp
index 3a3b470d62..4126813a50 100644
--- a/src/common/string.cpp
+++ b/src/common/string.cpp
@@ -1935,11 +1935,16 @@ static void wxLoadCharacterSets(void)
 {
   static bool already_loaded = FALSE;
 
+  if (already_loaded) return;
+
 #if defined(__UNIX__) && wxUSE_UNICODE
   // search through files in /usr/share/i18n/charmaps
-  for (wxString fname = ::wxFindFirstFile(_T("/usr/share/i18n/charmaps/*"));
+  wxString fname;
+  printf("Commencing load\n");
+  for (fname = ::wxFindFirstFile(_T("/usr/share/i18n/charmaps/*"));
        !fname.IsEmpty();
        fname = ::wxFindNextFile()) {
+    wxPrintf(_("Loading: %s\n"), fname.c_str());
     wxTextFile cmap(fname);
     if (cmap.Open()) {
       wxCharacterSet *cset = new wxCharacterSet;
@@ -1948,7 +1953,8 @@ static void wxLoadCharacterSets(void)
 
       wxPrintf(_T("yup, loaded %s\n"),fname.c_str());
 
-      for (wxString line = cmap.GetFirstLine();
+      wxString line;
+      for (line = cmap.GetFirstLine();
 	   !cmap.Eof();
 	   line = cmap.GetNextLine()) {
 	wxPrintf(_T("line contents: %s\n"),line.c_str());
@@ -2002,61 +2008,73 @@ static void wxLoadCharacterSets(void)
   already_loaded = TRUE;
 }
 
-static wxCharacterSet *wxFindCharacterSet(const wxString& charset)
+static wxCharacterSet *wxFindCharacterSet(const wxChar *charset)
 {
+  wxLoadCharacterSets();
   for (size_t n=0; n<wxCharsets.GetCount(); n++)
     if (wxCharsets[n].names.Index(charset) != wxNOT_FOUND)
       return &(wxCharsets[n]);
   return (wxCharacterSet *)NULL;
 }
 
-#if wxUSE_UNICODE
 WXDLLEXPORT_DATA(wxCSConv) wxConv_local((const wxChar *)NULL);
-#endif
 
 wxCSConv::wxCSConv(const wxChar *charset)
 {
-  wxLoadCharacterSets();
   if (!charset) {
 #ifdef __UNIX__
     wxChar *lang = wxGetenv(_T("LANG"));
-    wxChar *dot = wxStrchr(lang, _T('.'));
+    wxChar *dot = lang ? wxStrchr(lang, _T('.')) : (wxChar *)NULL;
     if (dot) charset = dot+1;
 #endif
   }
-  cset = (wxCharacterSet *) NULL;
-
+  m_cset = (wxCharacterSet *) NULL;
+  m_deferred = FALSE;
+  if (charset) {
 #ifdef __UNIX__
-  // first, convert the character set name to standard form
-  wxString codeset;
-  if (wxString(charset,3) == _T("ISO")) {
-    // make sure it's represented in the standard form: ISO_8859-1
-    codeset = _T("ISO_");
-    charset += 3;
-    if ((*charset == _T('-')) || (*charset == _T('_'))) charset++;
-    if (wxStrlen(charset)>4) {
-      if (wxString(charset,4) == _T("8859")) {
-	codeset << _T("8859-");
-	if (*charset == _T('-')) charset++;
+    // first, convert the character set name to standard form
+    wxString codeset;
+    if (wxString(charset,3).CmpNoCase(_T("ISO")) == 0) {
+      // make sure it's represented in the standard form: ISO_8859-1
+      codeset = _T("ISO_");
+      charset += 3;
+      if ((*charset == _T('-')) || (*charset == _T('_'))) charset++;
+      if (wxStrlen(charset)>4) {
+	if (wxString(charset,4) == _T("8859")) {
+	  codeset << _T("8859-");
+	  if (*charset == _T('-')) charset++;
+	}
       }
     }
-  }
-  codeset << charset;
-  codeset.MakeUpper();
-  cset = wxFindCharacterSet(codeset);
+    codeset << charset;
+    codeset.MakeUpper();
+    m_name = wxStrdup(codeset.c_str());
+    m_deferred = TRUE;
 #endif
+  }
+}
+
+wxCSConv::~wxCSConv()
+{
+  free(m_name);
 }
 
-wxCSConv::~wxCSConv(void)
+void wxCSConv::LoadNow()
 {
+//  wxPrintf(_T("Conversion request\n"));
+  if (m_deferred) {
+    m_cset = wxFindCharacterSet(m_name);
+    m_deferred = FALSE;
+  }
 }
 
 size_t wxCSConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const
 {
+  ((wxCSConv *)this)->LoadNow(); // discard constness
   if (buf) {
-    if (cset) {
+    if (m_cset) {
       for (size_t c=0; c<=n; c++)
-	buf[c] = cset->data[psz[c]];
+	buf[c] = m_cset->data[psz[c]];
     } else {
       // latin-1 (direct)
       for (size_t c=0; c<=n; c++)
@@ -2068,11 +2086,12 @@ size_t wxCSConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const
 
 size_t wxCSConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const
 {
+  ((wxCSConv *)this)->LoadNow(); // discard constness
   if (buf) {
-    if (cset) {
+    if (m_cset) {
       for (size_t c=0; c<=n; c++) {
 	size_t n;
-	for (n=0; (n<256) && (cset->data[n] != psz[c]); n++);
+	for (n=0; (n<256) && (m_cset->data[n] != psz[c]); n++);
 	buf[c] = (n>0xff) ? '?' : n;
       }
     } else {
diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp
index 813ca852f5..6aa00a6cd9 100644
--- a/src/common/utilscmn.cpp
+++ b/src/common/utilscmn.cpp
@@ -743,12 +743,12 @@ void wxEnableTopLevelWindows(bool enable)
 // Yield to other apps/messages and disable user input
 bool wxSafeYield(wxWindow *win)
 {
-   wxEnableTopLevelWindow(FALSE);
+   wxEnableTopLevelWindows(FALSE);
    // always enable ourselves
    if ( win )
       win->Enable(TRUE);
    bool rc = wxYield();
-   wxEnableToplevelWindows(TRUE);
+   wxEnableTopLevelWindows(TRUE);
    return rc;
 }