X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8b9518ee4a9cb8f6d4934afaed07aea011ec5ab1..a994f81b947bd6ec0e7611988b3ebc1ae3e9df5a:/src/common/utilscmn.cpp?ds=sidebyside diff --git a/src/common/utilscmn.cpp b/src/common/utilscmn.cpp index 196f506ae7..57fcf3bd32 100644 --- a/src/common/utilscmn.cpp +++ b/src/common/utilscmn.cpp @@ -6,11 +6,11 @@ // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1998 Julian Smart -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ -#pragma implementation "utilscmn.h" +#pragma implementation "utils.h" #endif // For compilers that support precompilation, includes "wx.h". @@ -26,27 +26,36 @@ #include "wx/window.h" #include "wx/menu.h" #include "wx/frame.h" +#include "wx/msgdlg.h" +#include "wx/textdlg.h" #endif -#if USE_IOSTREAMH -#include +#include "wx/ioswrap.h" + +#if wxUSE_IOSTREAMH + #include #else -#include + #include #endif -#include #include #include #include #include #if !defined(__WATCOMC__) -#if !(defined(_MSC_VER) && (_MSC_VER > 800)) -#include -#endif + #if !(defined(_MSC_VER) && (_MSC_VER > 800)) + #include + #endif #endif #include +#ifndef __MWERKS__ #include #include +#endif + +#ifdef __SALFORDC__ +#include +#endif // Pattern matching code. // Yes, this path is deliberate (for Borland compilation) @@ -56,7 +65,7 @@ #include "../common/glob.inc" #endif -#ifdef __WINDOWS__ +#ifdef __WXMSW__ #include "windows.h" #endif @@ -64,6 +73,36 @@ extern char *wxBuffer; +#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 @@ -112,16 +151,13 @@ int strncasecmp(const char *str_1, const char *str_2, size_t maxchar) #ifdef __WINDOWS__ #ifndef __GNUWIN32__ +#ifndef __MWERKS__ #define strcasecmp stricmp #define strncasecmp strnicmp +#else +#define strcasecmp _stricmp +#define strncasecmp _strnicmp #endif - -#ifdef _MSC_VER -#pragma warning (disable : 4245) -#endif - -#ifdef _MSC_VER -#pragma warning (default : 4245) #endif #else @@ -134,7 +170,7 @@ extern "C" int strncasecmp (const char *, const char *, size_t); } #endif -#endif /* __WINDOWS__ */ +#endif /* __WXMSW__ */ char * @@ -144,7 +180,7 @@ copystring (const char *s) 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; } @@ -152,7 +188,7 @@ copystring (const char *s) // Id generation static long wxCurrentId = 100; -long +long wxNewId (void) { return wxCurrentId++; @@ -161,25 +197,25 @@ wxNewId (void) long wxGetCurrentId(void) { return wxCurrentId; } -void +void wxRegisterId (long id) { if (id >= wxCurrentId) wxCurrentId = id + 1; } -void +void StringToFloat (char *s, float *number) { if (s && *s && number) - *number = (float) strtod (s, NULL); + *number = (float) strtod (s, (char **) NULL); } -void +void StringToDouble (char *s, double *number) { if (s && *s && number) - *number = strtod (s, NULL); + *number = strtod (s, (char **) NULL); } char * @@ -201,18 +237,18 @@ DoubleToString (double number, const char *fmt) return buf; } -void +void StringToInt (char *s, int *number) { if (s && *s && number) - *number = (int) strtol (s, NULL, 10); + *number = (int) strtol (s, (char **) NULL, 10); } -void +void StringToLong (char *s, long *number) { if (s && *s && number) - *number = strtol (s, NULL, 10); + *number = strtol (s, (char **) NULL, 10); } char * @@ -238,20 +274,20 @@ static char hexArray[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A' 'C', 'D', 'E', 'F' }; // Convert 2-digit hex number to decimal -int wxHexToDec(char *buf) +int wxHexToDec(const wxString& buf) { int firstDigit, secondDigit; - - if (buf[0] >= 'A') - firstDigit = buf[0] - 'A' + 10; + + if (buf.GetChar(0) >= 'A') + firstDigit = buf.GetChar(0) - 'A' + 10; else - firstDigit = buf[0] - '0'; + firstDigit = buf.GetChar(0) - '0'; - if (buf[1] >= 'A') - secondDigit = buf[1] - 'A' + 10; + if (buf.GetChar(1) >= 'A') + secondDigit = buf.GetChar(1) - 'A' + 10; else - secondDigit = buf[1] - '0'; - + secondDigit = buf.GetChar(1) - '0'; + return firstDigit * 16 + secondDigit; } @@ -265,8 +301,16 @@ void wxDecToHex(int dec, char *buf) buf[2] = 0; } +// Convert decimal integer to 2-character hex string +wxString wxDecToHex(int dec) +{ + char buf[3]; + wxDecToHex(dec, buf); + return wxString(buf); +} + // Match a string INDEPENDENT OF CASE -bool +bool StringMatch (char *str1, char *str2, bool subString, bool exact) { if (str1 == NULL || str2 == NULL) @@ -283,15 +327,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++) - { - 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) - return TRUE; + return TRUE; } else { @@ -299,7 +343,7 @@ StringMatch (char *str1, char *str2, bool subString, bool exact) int len2 = strlen (str2); if (strncasecmp (str1, str2, wxMin (len1, len2)) == 0) - return TRUE; + return TRUE; } return FALSE; @@ -309,8 +353,8 @@ StringMatch (char *str1, char *str2, bool subString, bool exact) // [volatile] wxString wxNow( void ) { - time_t now = time(NULL); - char *date = ctime(&now); + time_t now = time((time_t *) NULL); + char *date = ctime(&now); date[24] = '\0'; return wxString(date); } @@ -344,38 +388,46 @@ wxGetEmailAddress (char *address, int maxSize) char *wxStripMenuCodes (char *in, char *out) { if (!in) - return NULL; - + return (char *) NULL; + if (!out) out = copystring(in); char *tmpOut = out; - + while (*in) { if (*in == '&') - { - // Check && -> &, &x -> x - if (*++in == '&') - *out++ = *in++; - } + { + // Check && -> &, &x -> x + if (*++in == '&') + *out++ = *in++; + } 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 - break; - } + break; + } else - *out++ = *in++; - } // while + *out++ = *in++; + } // while *out = '\0'; return tmpOut; } +wxString wxStripMenuCodes(const wxString& str) +{ + char *buf = new char[str.Length() + 1]; + wxStripMenuCodes((char*) (const char*) str, buf); + wxString str1(buf); + delete[] buf; + return str1; +} /* * Window search functions @@ -400,15 +452,15 @@ wxFindWindowByLabel (const wxString& title, wxWindow * parent) 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() + { + wxWindow *win = (wxWindow *) node->Data (); + wxWindow *retwin = wxFindWindowByLabel1 (title, win); + if (retwin) + return retwin; + } // for() } - return NULL; + return (wxWindow *) NULL; } // Recursive @@ -418,22 +470,22 @@ wxFindWindowByLabel1 (const wxString& title, wxWindow * parent) if (parent) { if (parent->GetLabel() == title) - return parent; + return 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().First (); node; node = node->Next ()) + { + wxWindow *win = (wxWindow *) node->Data (); + wxWindow *retwin = wxFindWindowByLabel1 (title, win); + if (retwin) + return retwin; + } // for() } - return NULL; // Not found + return (wxWindow *) NULL; // Not found } @@ -455,12 +507,12 @@ wxFindWindowByName (const wxString& title, wxWindow * parent) 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() + { + wxWindow *win = (wxWindow *) node->Data (); + wxWindow *retwin = wxFindWindowByName1 (title, win); + if (retwin) + return retwin; + } // for() } // Failed? Try by label instead. @@ -473,28 +525,28 @@ wxFindWindowByName1 (const wxString& title, wxWindow * 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 ()) - { - wxWindow *win = (wxWindow *) node->Data (); - wxWindow *retwin = wxFindWindowByName1 (title, win); - if (retwin) - return retwin; - } // for() + 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() } - return NULL; // Not found + return (wxWindow *) NULL; // Not found } // Returns menu item id or -1 if none. -int +int wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& itemString) { wxMenuBar *menuBar = frame->GetMenuBar (); @@ -503,62 +555,18 @@ wxFindMenuItemId (wxFrame * frame, const wxString& menuString, const wxString& i return menuBar->FindMenuItem (menuString, itemString); } -/* - * wxDebugStreamBuf - */ -#if !defined(_WINDLL) - -wxDebugStreamBuf::wxDebugStreamBuf(void) -{ - if (allocate()) setp(base(),ebuf()); -} - -int wxDebugStreamBuf::overflow(int WXUNUSED(i)) -{ - int len = pptr() - pbase(); - char *txt = new char[len+1]; - strncpy(txt, pbase(), len); - txt[len] = '\0'; -#ifdef __WINDOWS__ - 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 __WINDOWS__ - 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. -> +> 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 @@ -571,8 +579,8 @@ DOS, and Mac platforms (it's from the ALS Prolog main). /*--------------------------------------------------------------------* | 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. *--------------------------------------------------------------------*/ @@ -580,7 +588,7 @@ static void whereami(name) char *name; { - register char *cutoff = NULL; /* stifle -Wall */ + register char *cutoff = NULL; /* stifle -Wall */ register char *s; register char *t; int cc; @@ -593,117 +601,117 @@ whereami(name) 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__) - int drive; - char *newrbuf; + int drive; + char *newrbuf; - newrbuf = imagedir; + newrbuf = imagedir; #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 - if (getcwd(newrbuf, 1024) == 0) { /* } */ + if (getcwd(newrbuf, 1024) == 0) { /* } */ #endif #else /* DOS */ #ifdef HAVE_GETWD - if (getwd(imagedir) == 0) { /* } */ + if (getwd(imagedir) == 0) { /* } */ #else /* !HAVE_GETWD */ - if (getcwd(imagedir, 1024) == 0) { + if (getcwd(imagedir, 1024) == 0) { #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__)) - else - (*t++ = DIR_SEPARATOR); + else + (*t++ = DIR_SEPARATOR); #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 { - /*-------------------------------------------------------------* - * 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__ - if ((s = getenv("Commands")) == (char *) 0) + if ((s = getenv("Commands")) == (char *) 0) #else - if ((s = getenv("PATH")) == (char *) 0) + if ((s = getenv("PATH")) == (char *) 0) #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); + } } @@ -716,27 +724,117 @@ whereami(name) #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 */ - 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 + +/* + * N.B. these convenience functions must be separate from msgdlgg.cpp, textdlgg.cpp + * since otherwise the generic code may be pulled in unnecessarily. + */ + +int wxMessageBox(const wxString& message, const wxString& caption, long style, + wxWindow *parent, int WXUNUSED(x), int WXUNUSED(y) ) +{ + wxMessageDialog dialog(parent, message, caption, style); + + int ans = dialog.ShowModal(); + switch ( ans ) + { + case wxID_OK: + return wxOK; + break; + case wxID_YES: + return wxYES; + break; + case wxID_NO: + return wxNO; + break; + default: + case wxID_CANCEL: + return wxCANCEL; + break; + } + return ans; +} + +wxString wxGetTextFromUser(const wxString& message, const wxString& caption, + const wxString& defaultValue, wxWindow *parent, + int x, int y, bool WXUNUSED(centre) ) +{ + wxTextEntryDialog dialog(parent, message, caption, defaultValue, wxOK|wxCANCEL, wxPoint(x, y)); + if (dialog.ShowModal() == wxID_OK) + return dialog.GetValue(); + else + 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 +// Overloaded functions, taking a wxString +bool wxGetHostName(wxString& name) +{ + bool success = wxGetHostName(wxBuffer, 500); + if (success) + { + name = wxBuffer; + return TRUE; + } + else + return FALSE; +} + +bool wxGetUserId(wxString& buf) +{ + bool success = wxGetUserId(wxBuffer, 500); + if (success) + { + buf = wxBuffer; + return TRUE; + } + else + return FALSE; +} + +bool wxGetUserName(wxString& buf) +{ + bool success = wxGetUserName(wxBuffer, 500); + if (success) + { + buf = wxBuffer; + return TRUE; + } + else + return FALSE; +} +