]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/utilscmn.cpp
It now compiles all these files without warnings in Unicode mode.
[wxWidgets.git] / src / common / utilscmn.cpp
index d590221e917a77ba274724ee7b5bc0c11ece6794..52b8878187060f46b40e249b37de2a950de351bb 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     29/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Julian Smart
 // Created:     29/01/98
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Julian Smart
-// Licence:    wxWindows license
+// Licence:     wxWindows license
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
 #include "wx/textdlg.h"
 #endif
 
 #include "wx/textdlg.h"
 #endif
 
+#include "wx/ioswrap.h"
+
 #if wxUSE_IOSTREAMH
 #if wxUSE_IOSTREAMH
-#include <iostream.h>
-#include <fstream.h>
+    #include <fstream.h>
 #else
 #else
-#include <iostream>
-#include <fstream>
-#  ifdef _MSC_VER
-      using namespace std;
-#  endif
+    #include <fstream>
 #endif
 
 #include <ctype.h>
 #endif
 
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
 #if !defined(__WATCOMC__)
 #include <stdlib.h>
 #include <string.h>
 #if !defined(__WATCOMC__)
-#if !(defined(_MSC_VER) && (_MSC_VER > 800))
-#include <errno.h>
-#endif
+    #if !(defined(_MSC_VER) && (_MSC_VER > 800))
+        #include <errno.h>
+    #endif
 #endif
 #include <time.h>
 #endif
 #include <time.h>
+#ifndef __MWERKS__
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/stat.h>
+#endif
+
+#ifdef __SALFORDC__
+#include <clib.h>
+#endif
 
 // Pattern matching code.
 // Yes, this path is deliberate (for Borland compilation)
 
 // Pattern matching code.
 // Yes, this path is deliberate (for Borland compilation)
 
 extern char *wxBuffer;
 
 
 extern char *wxBuffer;
 
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+static wxWindow *wxFindWindowByLabel1(const wxString& title, wxWindow * parent);
+static wxWindow *wxFindWindowByName1 (const wxString& title, wxWindow * parent);
+
+#ifdef __WXMAC__
+int strcasecmp(const char *str_1, const char *str_2)
+{
+  register char c1, c2;
+  do {
+    c1 = tolower(*str_1++);
+    c2 = tolower(*str_2++);
+  } while ( c1 && (c1 == c2) );
+
+  return c1 - c2;
+}
+
+int strncasecmp(const char *str_1, const char *str_2, size_t maxchar)
+{
+
+  register char c1, c2;
+  while( maxchar--)
+  {
+    c1 = tolower(*str_1++);
+    c2 = tolower(*str_2++);
+
+    if ( !c1 || c1!=c2 )
+                  return c1 - c2;
+
+  } ;
+
+  return 0 ;
+
+}
+#endif
 #ifdef __VMS__
 // we have no strI functions under VMS, therefore I have implemented
 // an inefficient but portable version: convert copies of strings to lowercase
 #ifdef __VMS__
 // we have no strI functions under VMS, therefore I have implemented
 // an inefficient but portable version: convert copies of strings to lowercase
@@ -118,16 +158,13 @@ int strncasecmp(const char *str_1, const char *str_2, size_t maxchar)
 #ifdef __WINDOWS__
 
 #ifndef __GNUWIN32__
 #ifdef __WINDOWS__
 
 #ifndef __GNUWIN32__
+#ifndef __MWERKS__
 #define strcasecmp stricmp
 #define strncasecmp strnicmp
 #define strcasecmp stricmp
 #define strncasecmp strnicmp
+#else
+#define strcasecmp _stricmp
+#define strncasecmp _strnicmp
 #endif
 #endif
-
-#ifdef _MSC_VER
-#pragma warning (disable : 4245)
-#endif
-
-#ifdef _MSC_VER
-#pragma warning (default : 4245)
 #endif
 
 #else
 #endif
 
 #else
@@ -140,7 +177,7 @@ extern "C"
   int strncasecmp (const char *, const char *, size_t);
 }
 #endif
   int strncasecmp (const char *, const char *, size_t);
 }
 #endif
-#endif                         /* __WXMSW__ */
+#endif  /* __WXMSW__ */
 
 
 char *
 
 
 char *
@@ -150,7 +187,7 @@ copystring (const char *s)
   size_t len = strlen (s) + 1;
 
   char *news = new char[len];
   size_t len = strlen (s) + 1;
 
   char *news = new char[len];
-  memcpy (news, s, len);       // Should be the fastest
+  memcpy (news, s, len);    // Should be the fastest
 
   return news;
 }
 
   return news;
 }
@@ -158,7 +195,7 @@ copystring (const char *s)
 // Id generation
 static long wxCurrentId = 100;
 
 // Id generation
 static long wxCurrentId = 100;
 
-long 
+long
 wxNewId (void)
 {
   return wxCurrentId++;
 wxNewId (void)
 {
   return wxCurrentId++;
@@ -167,21 +204,21 @@ wxNewId (void)
 long
 wxGetCurrentId(void) { return wxCurrentId; }
 
 long
 wxGetCurrentId(void) { return wxCurrentId; }
 
-void 
+void
 wxRegisterId (long id)
 {
   if (id >= wxCurrentId)
     wxCurrentId = id + 1;
 }
 
 wxRegisterId (long id)
 {
   if (id >= wxCurrentId)
     wxCurrentId = id + 1;
 }
 
-void 
+void
 StringToFloat (char *s, float *number)
 {
   if (s && *s && number)
     *number = (float) strtod (s, (char **) NULL);
 }
 
 StringToFloat (char *s, float *number)
 {
   if (s && *s && number)
     *number = (float) strtod (s, (char **) NULL);
 }
 
-void 
+void
 StringToDouble (char *s, double *number)
 {
   if (s && *s && number)
 StringToDouble (char *s, double *number)
 {
   if (s && *s && number)
@@ -207,14 +244,14 @@ DoubleToString (double number, const char *fmt)
   return buf;
 }
 
   return buf;
 }
 
-void 
+void
 StringToInt (char *s, int *number)
 {
   if (s && *s && number)
     *number = (int) strtol (s, (char **) NULL, 10);
 }
 
 StringToInt (char *s, int *number)
 {
   if (s && *s && number)
     *number = (int) strtol (s, (char **) NULL, 10);
 }
 
-void 
+void
 StringToLong (char *s, long *number)
 {
   if (s && *s && number)
 StringToLong (char *s, long *number)
 {
   if (s && *s && number)
@@ -247,7 +284,7 @@ static char hexArray[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A'
 int wxHexToDec(const wxString& buf)
 {
   int firstDigit, secondDigit;
 int wxHexToDec(const wxString& buf)
 {
   int firstDigit, secondDigit;
-  
+
   if (buf.GetChar(0) >= 'A')
     firstDigit = buf.GetChar(0) - 'A' + 10;
   else
   if (buf.GetChar(0) >= 'A')
     firstDigit = buf.GetChar(0) - 'A' + 10;
   else
@@ -257,7 +294,7 @@ int wxHexToDec(const wxString& buf)
     secondDigit = buf.GetChar(1) - 'A' + 10;
   else
     secondDigit = buf.GetChar(1) - '0';
     secondDigit = buf.GetChar(1) - 'A' + 10;
   else
     secondDigit = buf.GetChar(1) - '0';
-    
+
   return firstDigit * 16 + secondDigit;
 }
 
   return firstDigit * 16 + secondDigit;
 }
 
@@ -280,7 +317,7 @@ wxString wxDecToHex(int dec)
 }
 
 // Match a string INDEPENDENT OF CASE
 }
 
 // Match a string INDEPENDENT OF CASE
-bool 
+bool
 StringMatch (char *str1, char *str2, bool subString, bool exact)
 {
   if (str1 == NULL || str2 == NULL)
 StringMatch (char *str1, char *str2, bool subString, bool exact)
 {
   if (str1 == NULL || str2 == NULL)
@@ -297,15 +334,15 @@ StringMatch (char *str1, char *str2, bool subString, bool exact)
       // Search for str1 in str2
       // Slow .... but acceptable for short strings
       for (i = 0; i <= len2 - len1; i++)
       // Search for str1 in str2
       // Slow .... but acceptable for short strings
       for (i = 0; i <= len2 - len1; i++)
-       {
-         if (strncasecmp (str1, str2 + i, len1) == 0)
-           return TRUE;
-       }
+        {
+          if (strncasecmp (str1, str2 + i, len1) == 0)
+            return TRUE;
+        }
     }
   else if (exact)
     {
       if (strcasecmp (str1, str2) == 0)
     }
   else if (exact)
     {
       if (strcasecmp (str1, str2) == 0)
-       return TRUE;
+        return TRUE;
     }
   else
     {
     }
   else
     {
@@ -313,7 +350,7 @@ StringMatch (char *str1, char *str2, bool subString, bool exact)
       int len2 = strlen (str2);
 
       if (strncasecmp (str1, str2, wxMin (len1, len2)) == 0)
       int len2 = strlen (str2);
 
       if (strncasecmp (str1, str2, wxMin (len1, len2)) == 0)
-       return TRUE;
+        return TRUE;
     }
 
   return FALSE;
     }
 
   return FALSE;
@@ -324,33 +361,11 @@ StringMatch (char *str1, char *str2, bool subString, bool exact)
 wxString wxNow( void )
 {
   time_t now = time((time_t *) NULL);
 wxString wxNow( void )
 {
   time_t now = time((time_t *) NULL);
-  char *date = ctime(&now); 
+  char *date = ctime(&now);
   date[24] = '\0';
   return wxString(date);
 }
 
   date[24] = '\0';
   return wxString(date);
 }
 
-/* Get Full RFC822 style email address */
-bool
-wxGetEmailAddress (char *address, int maxSize)
-{
-  char host[65];
-  char user[65];
-
-  if (wxGetHostName(host, 64) == FALSE)
-    return FALSE;
-  if (wxGetUserId(user, 64) == FALSE)
-    return FALSE;
-
-  char tmp[130];
-  strcpy(tmp, user);
-  strcat(tmp, "@");
-  strcat(tmp, host);
-
-  strncpy(address, tmp, maxSize - 1);
-  address[maxSize-1] = '\0';
-  return TRUE;
-}
-
 /*
  * Strip out any menu codes
  */
 /*
  * Strip out any menu codes
  */
@@ -359,31 +374,31 @@ char *wxStripMenuCodes (char *in, char *out)
 {
   if (!in)
     return (char *) NULL;
 {
   if (!in)
     return (char *) NULL;
-    
+
   if (!out)
     out = copystring(in);
 
   char *tmpOut = out;
   if (!out)
     out = copystring(in);
 
   char *tmpOut = out;
-  
+
   while (*in)
     {
       if (*in == '&')
   while (*in)
     {
       if (*in == '&')
-       {
-         // Check && -> &, &x -> x
-         if (*++in == '&')
-           *out++ = *in++;
-       }
+        {
+          // Check && -> &, &x -> x
+          if (*++in == '&')
+            *out++ = *in++;
+        }
       else if (*in == '\t')
       else if (*in == '\t')
-       {
+        {
           // Remove all stuff after \t in X mode, and let the stuff as is
           // in Windows mode.
           // Accelerators are handled in wx_item.cc for Motif, and are not
           // YET supported in XView
           // Remove all stuff after \t in X mode, and let the stuff as is
           // in Windows mode.
           // Accelerators are handled in wx_item.cc for Motif, and are not
           // YET supported in XView
-         break;
-       }
+          break;
+        }
       else
       else
-       *out++ = *in++;
-    }                          // while
+        *out++ = *in++;
+    }                                // while
 
   *out = '\0';
 
 
   *out = '\0';
 
@@ -410,53 +425,54 @@ wxString wxStripMenuCodes(const wxString& str)
  *
  */
 
  *
  */
 
-static wxWindow *wxFindWindowByLabel1 (const wxString& title, wxWindow * parent);
-
 wxWindow *
 wxFindWindowByLabel (const wxString& title, wxWindow * parent)
 {
 wxWindow *
 wxFindWindowByLabel (const wxString& title, wxWindow * parent)
 {
-  if (parent)
+    if (parent)
     {
     {
-      return wxFindWindowByLabel1 (title, parent);
+        return wxFindWindowByLabel1(title, parent);
     }
     }
-  else
+    else
     {
     {
-      for (wxNode * node = wxTopLevelWindows.First (); node; node = node->Next ())
-       {
-         wxWindow *win = (wxWindow *) node->Data ();
-         wxWindow *retwin = wxFindWindowByLabel1 (title, win);
-         if (retwin)
-           return retwin;
-       }                       // for()
+        for ( wxWindowList::Node * node = wxTopLevelWindows.GetFirst();
+              node;
+              node = node->GetNext() )
+        {
+            wxWindow *win = node->GetData();
+            wxWindow *retwin = wxFindWindowByLabel1 (title, win);
+            if (retwin)
+                return retwin;
+        }                        // for()
 
     }
 
     }
-  return (wxWindow *) NULL;
+    return (wxWindow *) NULL;
 }
 
 // Recursive
 static wxWindow *
 wxFindWindowByLabel1 (const wxString& title, wxWindow * parent)
 {
 }
 
 // Recursive
 static wxWindow *
 wxFindWindowByLabel1 (const wxString& title, wxWindow * parent)
 {
-  if (parent)
+    if (parent)
     {
     {
-      if (parent->GetLabel() == title)
-               return parent;
+        if (parent->GetLabel() == title)
+            return parent;
     }
 
     }
 
-  if (parent)
+    if (parent)
     {
     {
-      for (wxNode * node = parent->GetChildren().First (); node; node = node->Next ())
-       {
-         wxWindow *win = (wxWindow *) node->Data ();
-         wxWindow *retwin = wxFindWindowByLabel1 (title, win);
-         if (retwin)
-           return retwin;
-       }                       // for()
+        for ( wxNode * node = parent->GetChildren().GetFirst();
+              node;
+              node = node->GetNext() )
+        {
+            wxWindow *win = (wxWindow *)node->GetData();
+            wxWindow *retwin = wxFindWindowByLabel1 (title, win);
+            if (retwin)
+                return retwin;
+        }
 
     }
 
 
     }
 
-  return (wxWindow *) NULL;                    // Not found
-
+    return (wxWindow *) NULL;                        // Not found
 }
 
 /*
 }
 
 /*
@@ -465,28 +481,29 @@ wxFindWindowByLabel1 (const wxString& title, wxWindow * parent)
  *
  */
 
  *
  */
 
-static wxWindow *wxFindWindowByName1 (const wxString& title, wxWindow * parent);
-
 wxWindow *
 wxFindWindowByName (const wxString& title, wxWindow * parent)
 {
 wxWindow *
 wxFindWindowByName (const wxString& title, wxWindow * parent)
 {
-  if (parent)
+    if (parent)
     {
     {
-      return wxFindWindowByName1 (title, parent);
+        return wxFindWindowByName1 (title, parent);
     }
     }
-  else
+    else
     {
     {
-      for (wxNode * node = wxTopLevelWindows.First (); node; node = node->Next ())
-       {
-         wxWindow *win = (wxWindow *) node->Data ();
-         wxWindow *retwin = wxFindWindowByName1 (title, win);
-         if (retwin)
-           return retwin;
-       }                       // for()
+        for ( wxWindowList::Node * node = wxTopLevelWindows.GetFirst();
+              node;
+              node = node->GetNext() )
+        {
+            wxWindow *win = node->GetData();
+            wxWindow *retwin = wxFindWindowByName1 (title, win);
+            if (retwin)
+                return retwin;
+        }
 
     }
 
     }
-  // Failed? Try by label instead.
-  return wxFindWindowByLabel(title, parent);
+
+    // Failed? Try by label instead.
+    return wxFindWindowByLabel(title, parent);
 }
 
 // Recursive
 }
 
 // Recursive
@@ -495,28 +512,28 @@ wxFindWindowByName1 (const wxString& title, wxWindow * parent)
 {
   if (parent)
     {
 {
   if (parent)
     {
-       if ( parent->GetName() == title )
-                       return parent;
+            if ( parent->GetName() == title )
+                        return parent;
     }
 
   if (parent)
     {
       for (wxNode * node = parent->GetChildren().First (); node; node = node->Next ())
     }
 
   if (parent)
     {
       for (wxNode * node = parent->GetChildren().First (); node; node = node->Next ())
-       {
-         wxWindow *win = (wxWindow *) node->Data ();
-         wxWindow *retwin = wxFindWindowByName1 (title, win);
-         if (retwin)
-           return retwin;
-       }                       // for()
+        {
+          wxWindow *win = (wxWindow *) node->Data ();
+          wxWindow *retwin = wxFindWindowByName1 (title, win);
+          if (retwin)
+            return retwin;
+        }                        // for()
 
     }
 
 
     }
 
-  return (wxWindow *) NULL;                    // Not found
+  return (wxWindow *) NULL;                        // Not found
 
 }
 
 // Returns menu item id or -1 if none.
 
 }
 
 // Returns menu item id or -1 if none.
-int 
+int
 wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& itemString)
 {
   wxMenuBar *menuBar = frame->GetMenuBar ();
 wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& itemString)
 {
   wxMenuBar *menuBar = frame->GetMenuBar ();
@@ -525,66 +542,18 @@ wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& i
   return menuBar->FindMenuItem (menuString, itemString);
 }
 
   return menuBar->FindMenuItem (menuString, itemString);
 }
 
-/*
- * wxDebugStreamBuf
- */
-#if !defined(_WINDLL)
-wxDebugStreamBuf::wxDebugStreamBuf(void)
-{
-       // <iostream> usage doesn't need this, and i have no idea how to simulate it.
-#if wxUSE_IOSTREAMH
-       if (allocate())
-         setp(base(),ebuf());
-#endif
-}
-
-int wxDebugStreamBuf::overflow(int WXUNUSED(i))
-{
-  int len = pptr() - pbase();
-  char *txt = new char[len+1];
-  strncpy(txt, pbase(), len);
-  txt[len] = '\0';
-#ifdef __WXMSW__
-  OutputDebugString((LPCSTR)txt);
-#else
-  fprintf(stderr, txt);
-#endif
-  setp(pbase(), epptr());
-  delete[] txt;
-  return EOF;
-}
-
-int wxDebugStreamBuf::sync(void)
-{
-  int len = pptr() - pbase();
-  char *txt = new char[len+1];
-  strncpy(txt, pbase(), len);
-  txt[len] = '\0';
-#ifdef __WXMSW__
-  OutputDebugString((LPCSTR)txt);
-#else
-  fprintf(stderr, txt);
-#endif
-  setp(pbase(), epptr());
-  delete[] txt;
-  return 0;
-}
-
-#endif
-
 /*
 On Fri, 21 Jul 1995, Paul Craven wrote:
 
 > Is there a way to find the path of running program's executable? I can get
 > my home directory, and the current directory, but I don't know how to get the
 > executable directory.
 /*
 On Fri, 21 Jul 1995, Paul Craven wrote:
 
 > Is there a way to find the path of running program's executable? I can get
 > my home directory, and the current directory, but I don't know how to get the
 > executable directory.
-> 
+>
 
 The code below (warty as it is), does what you want on most Unix,
 DOS, and Mac platforms (it's from the ALS Prolog main).
 
 
 The code below (warty as it is), does what you want on most Unix,
 DOS, and Mac platforms (it's from the ALS Prolog main).
 
-|| Ken Bowen      Applied Logic Systems, Inc.         PO Box 180,     
+|| Ken Bowen      Applied Logic Systems, Inc.         PO Box 180,
 ||====            Voice:  +1 (617)965-9191            Newton Centre,
 ||                FAX:    +1 (617)965-1636            MA  02159  USA
                   Email:  ken@als.com        WWW: http://www.als.com
 ||====            Voice:  +1 (617)965-9191            Newton Centre,
 ||                FAX:    +1 (617)965-1636            MA  02159  USA
                   Email:  ken@als.com        WWW: http://www.als.com
@@ -597,8 +566,8 @@ DOS, and Mac platforms (it's from the ALS Prolog main).
 
 /*--------------------------------------------------------------------*
  | whereami is given a filename f in the form:  whereami(argv[0])
 
 /*--------------------------------------------------------------------*
  | whereami is given a filename f in the form:  whereami(argv[0])
- | It returns the directory in which the executable file (containing 
- | this code [main.c] ) may be found.  A dot will be returned to indicate 
+ | It returns the directory in which the executable file (containing
+ | this code [main.c] ) may be found.  A dot will be returned to indicate
  | the current directory.
  *--------------------------------------------------------------------*/
 
  | the current directory.
  *--------------------------------------------------------------------*/
 
@@ -606,7 +575,7 @@ static void
 whereami(name)
     char *name;
 {
 whereami(name)
     char *name;
 {
-    register char *cutoff = NULL;      /* stifle -Wall */
+    register char *cutoff = NULL;        /* stifle -Wall */
     register char *s;
     register char *t;
     int   cc;
     register char *s;
     register char *t;
     int   cc;
@@ -619,117 +588,117 @@ whereami(name)
 
     if (access(name, R_OK) == 0) {
 
 
     if (access(name, R_OK) == 0) {
 
-       /*-------------------------------------------------------------*
-        * The file was accessible without any other work.  But the current
-        * working directory might change on us, so if it was accessible
-        * through the cwd, then we should get it for later accesses.
-        *-------------------------------------------------------------*/
+        /*-------------------------------------------------------------*
+         * The file was accessible without any other work.  But the current
+         * working directory might change on us, so if it was accessible
+         * through the cwd, then we should get it for later accesses.
+         *-------------------------------------------------------------*/
 
 
-       t = imagedir;
-       if (!absolute_pathname(name)) {
+        t = imagedir;
+        if (!absolute_pathname(name)) {
 #if defined(DOS) || defined(__WIN32__)
 #if defined(DOS) || defined(__WIN32__)
-           int   drive;
-           char *newrbuf;
+            int   drive;
+            char *newrbuf;
 
 
-           newrbuf = imagedir;
+            newrbuf = imagedir;
 #ifndef __DJGPP__
 #ifndef __DJGPP__
-           if (*(name + 1) == ':') {
-               if (*name >= 'a' && *name <= 'z')
-                   drive = (int) (*name - 'a' + 1);
-               else
-                   drive = (int) (*name - 'A' + 1);
-               *newrbuf++ = *name;
-               *newrbuf++ = *(name + 1);
-               *newrbuf++ = DIR_SEPARATOR;
-           }
-           else {
-               drive = 0;
-               *newrbuf++ = DIR_SEPARATOR;
-           }
-           if (getcwd(newrbuf, drive) == 0) {  /* } */
+            if (*(name + 1) == ':') {
+                if (*name >= 'a' && *name <= 'z')
+                    drive = (int) (*name - 'a' + 1);
+                else
+                    drive = (int) (*name - 'A' + 1);
+                *newrbuf++ = *name;
+                *newrbuf++ = *(name + 1);
+                *newrbuf++ = DIR_SEPARATOR;
+            }
+            else {
+                drive = 0;
+                *newrbuf++ = DIR_SEPARATOR;
+            }
+            if (getcwd(newrbuf, drive) == 0) {        /* } */
 #else
 #else
-           if (getcwd(newrbuf, 1024) == 0) {   /* } */
+            if (getcwd(newrbuf, 1024) == 0) {        /* } */
 #endif
 #else  /* DOS */
 #ifdef HAVE_GETWD
 #endif
 #else  /* DOS */
 #ifdef HAVE_GETWD
-           if (getwd(imagedir) == 0) {         /* } */
+            if (getwd(imagedir) == 0) {                /* } */
 #else  /* !HAVE_GETWD */
 #else  /* !HAVE_GETWD */
-           if (getcwd(imagedir, 1024) == 0) {
+            if (getcwd(imagedir, 1024) == 0) {
 #endif /* !HAVE_GETWD */
 #endif /* DOS */
 #endif /* !HAVE_GETWD */
 #endif /* DOS */
-               fatal_error(FE_GETCWD, 0);
-           }
-           for (; *t; t++)     /* Set t to end of buffer */
-               ;
-           if (*(t - 1) == DIR_SEPARATOR)      /* leave slash if already
-                                                * last char
-                                                */
-               cutoff = t - 1;
-           else {
-               cutoff = t;     /* otherwise put one in */
-               *t++ = DIR_SEPARATOR;
-           }
-       }
+                fatal_error(FE_GETCWD, 0);
+            }
+            for (; *t; t++)        /* Set t to end of buffer */
+                ;
+            if (*(t - 1) == DIR_SEPARATOR)        /* leave slash if already
+                                                 * last char
+                                                 */
+                cutoff = t - 1;
+            else {
+                cutoff = t;        /* otherwise put one in */
+                *t++ = DIR_SEPARATOR;
+            }
+        }
 #if (!defined(__MAC__) && !defined(__DJGPP__) && !defined(__GO32__) && !defined(__WIN32__))
 #if (!defined(__MAC__) && !defined(__DJGPP__) && !defined(__GO32__) && !defined(__WIN32__))
-       else
-               (*t++ = DIR_SEPARATOR);
+        else
+                (*t++ = DIR_SEPARATOR);
 #endif
 
 #endif
 
-       /*-------------------------------------------------------------*
-        * Copy the rest of the string and set the cutoff if it was not
-        * already set.  If the first character of name is a slash, cutoff
-        * is not presently set but will be on the first iteration of the
-        * loop below.
-        *-------------------------------------------------------------*/
+        /*-------------------------------------------------------------*
+         * Copy the rest of the string and set the cutoff if it was not
+         * already set.  If the first character of name is a slash, cutoff
+         * is not presently set but will be on the first iteration of the
+         * loop below.
+         *-------------------------------------------------------------*/
 
 
-       for ((*name == DIR_SEPARATOR ? (s = name+1) : (s = name));;) {
-           if (*s == DIR_SEPARATOR)
-                       cutoff = t;
-           if (!(*t++ = *s++))
-                       break;
-       }
+        for ((*name == DIR_SEPARATOR ? (s = name+1) : (s = name));;) {
+            if (*s == DIR_SEPARATOR)
+                        cutoff = t;
+            if (!(*t++ = *s++))
+                        break;
+        }
 
     }
     else {
 
 
     }
     else {
 
-       /*-------------------------------------------------------------*
-        * Get the path list from the environment.  If the path list is
-        * inaccessible for any reason, leave with fatal error.
-        *-------------------------------------------------------------*/
+        /*-------------------------------------------------------------*
+         * Get the path list from the environment.  If the path list is
+         * inaccessible for any reason, leave with fatal error.
+         *-------------------------------------------------------------*/
 
 #ifdef __MAC__
 
 #ifdef __MAC__
-       if ((s = getenv("Commands")) == (char *) 0)
+        if ((s = getenv("Commands")) == (char *) 0)
 #else
 #else
-       if ((s = getenv("PATH")) == (char *) 0)
+        if ((s = getenv("PATH")) == (char *) 0)
 #endif
 #endif
-           fatal_error(FE_PATH, 0);
-
-       /*
-        * Copy path list into ebuf and set the source pointer to the
-        * beginning of this buffer.
-        */
-
-       strcpy(ebuf, s);
-       s = ebuf;
-
-       for (;;) {
-           t = imagedir;
-           while (*s && *s != PATH_SEPARATOR)
-               *t++ = *s++;
-           if (t > imagedir && *(t - 1) == DIR_SEPARATOR) 
-               ;               /* do nothing -- slash already is in place */
-           else
-               *t++ = DIR_SEPARATOR;   /* put in the slash */
-           cutoff = t - 1;     /* set cutoff */
-           strcpy(t, name);
-           if (access(imagedir, R_OK) == 0)
-               break;
-
-           if (*s)
-               s++;            /* advance source pointer */
-           else
-               fatal_error(FE_INFND, 0);
-       }
+            fatal_error(FE_PATH, 0);
+
+        /*
+         * Copy path list into ebuf and set the source pointer to the
+         * beginning of this buffer.
+         */
+
+        strcpy(ebuf, s);
+        s = ebuf;
+
+        for (;;) {
+            t = imagedir;
+            while (*s && *s != PATH_SEPARATOR)
+                *t++ = *s++;
+            if (t > imagedir && *(t - 1) == DIR_SEPARATOR)
+                ;                /* do nothing -- slash already is in place */
+            else
+                *t++ = DIR_SEPARATOR;        /* put in the slash */
+            cutoff = t - 1;        /* set cutoff */
+            strcpy(t, name);
+            if (access(imagedir, R_OK) == 0)
+                break;
+
+            if (*s)
+                s++;                /* advance source pointer */
+            else
+                fatal_error(FE_INFND, 0);
+        }
 
     }
 
 
     }
 
@@ -742,30 +711,53 @@ whereami(name)
 
 #ifdef HAVE_SYMLINK
     while ((cc = readlink(imagedir, ebuf, 512)) != -1) {
 
 #ifdef HAVE_SYMLINK
     while ((cc = readlink(imagedir, ebuf, 512)) != -1) {
-       ebuf[cc] = 0;
-       s = ebuf;
-       if (*s == DIR_SEPARATOR) {
-           t = imagedir;
-       }
-       else {
-           t = cutoff + 1;
-       }
-       for (;;) {
-           if (*s == DIR_SEPARATOR)
-               cutoff = t;     /* mark the last slash seen */
-           if (!(*t++ = *s++)) /* copy the character */
-               break;
-       }
+        ebuf[cc] = 0;
+        s = ebuf;
+        if (*s == DIR_SEPARATOR) {
+            t = imagedir;
+        }
+        else {
+            t = cutoff + 1;
+        }
+        for (;;) {
+            if (*s == DIR_SEPARATOR)
+                cutoff = t;        /* mark the last slash seen */
+            if (!(*t++ = *s++))        /* copy the character */
+                break;
+        }
     }
 
 #endif /* HAVE_SYMLINK */
 
     }
 
 #endif /* HAVE_SYMLINK */
 
-    strcpy(imagename, cutoff + 1);     /* keep the image name */
-    *(cutoff + 1) = 0;         /* chop off the filename part */
+    strcpy(imagename, cutoff + 1);        /* keep the image name */
+    *(cutoff + 1) = 0;                /* chop off the filename part */
 }
 
 #endif
 
 }
 
 #endif
 
+
+// Yield to other apps/messages and disable user input
+bool wxSafeYield(wxWindow *win)
+{
+    wxWindowList::Node *node;
+    for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() )
+    {
+        node->GetData()->Enable(FALSE);
+    }
+
+    // always enable ourselves
+    if ( win )
+        win->Enable(TRUE);
+    bool rc = wxYield();
+
+    for ( node = wxTopLevelWindows.GetFirst(); node; node = node->GetNext() )
+    {
+        node->GetData()->Enable(TRUE);
+    }
+
+    return rc;
+}
+
 /*
  * N.B. these convenience functions must be separate from msgdlgg.cpp, textdlgg.cpp
  * since otherwise the generic code may be pulled in unnecessarily.
 /*
  * N.B. these convenience functions must be separate from msgdlgg.cpp, textdlgg.cpp
  * since otherwise the generic code may be pulled in unnecessarily.
@@ -807,3 +799,93 @@ wxString wxGetTextFromUser(const wxString& message, const wxString& caption,
         return wxString("");
 }
 
         return wxString("");
 }
 
+#ifdef __MWERKS__
+char *strdup(const char *s)
+{
+        return strcpy( (char*) malloc( strlen( s ) + 1 ) , s ) ;
+}
+
+int isascii( int c )
+{
+        return ( c >= 0 && c < 128 ) ;
+}
+#endif
+
+// ----------------------------------------------------------------------------
+// network and user id functions
+// ----------------------------------------------------------------------------
+
+// Get Full RFC822 style email address
+bool wxGetEmailAddress(char *address, int maxSize)
+{
+    wxString email = wxGetEmailAddress();
+    if ( !email )
+        return FALSE;
+
+    strncpy(address, email, maxSize - 1);
+    address[maxSize - 1] = '\0';
+
+    return TRUE;
+}
+
+wxString wxGetEmailAddress()
+{
+    wxString email;
+
+    wxString host = wxGetHostName();
+    if ( !!host )
+    {
+        wxString user = wxGetUserId();
+        if ( !!user )
+        {
+            wxString email(user);
+            email << '@' << host;
+        }
+    }
+
+    return email;
+}
+
+wxString wxGetUserId()
+{
+    static const int maxLoginLen = 256; // FIXME arbitrary number
+
+    wxString buf;
+    bool ok = wxGetUserId(buf.GetWriteBuf(maxLoginLen), maxLoginLen);
+    buf.UngetWriteBuf();
+
+    if ( !ok )
+        buf.Empty();
+
+    return buf;
+}
+
+wxString wxGetUserName()
+{
+    static const int maxUserNameLen = 1024; // FIXME arbitrary number
+
+    wxString buf;
+    bool ok = wxGetUserName(buf.GetWriteBuf(maxUserNameLen), maxUserNameLen);
+    buf.UngetWriteBuf();
+
+    if ( !ok )
+        buf.Empty();
+
+    return buf;
+}
+
+wxString wxGetHostName()
+{
+    static const size_t hostnameSize = 257;
+
+    wxString buf;
+    bool ok = wxGetHostName(buf.GetWriteBuf(hostnameSize), hostnameSize);
+
+    buf.UngetWriteBuf();
+
+    if ( !ok )
+        buf.Empty();
+
+    return buf;
+}
+