// Created: 04/01/98
// RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
-#pragma implementation
-#pragma implementation "utils.h"
+// Note: this is done in utilscmn.cpp now.
+// #pragma implementation
+// #pragma implementation "utils.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/utils.h"
#include "wx/app.h"
#include "wx/cursor.h"
-#endif
+#endif //WX_PRECOMP
#include "wx/msw/private.h"
#include "wx/timer.h"
#ifndef __GNUWIN32__
#include <direct.h>
#include <dos.h>
-#endif
+#endif //GNUWIN32
#ifdef __GNUWIN32__
#include <sys/unistd.h>
#include <sys/stat.h>
#ifndef __MINGW32__
#include <std.h>
-#endif
+#endif //MINGW32
-#define stricmp strcasecmp
-#endif
+#endif //GNUWIN32
+
+#include "wx/log.h"
#ifdef __BORLANDC__ // Please someone tell me which version of Borland needs
// this (3.1 I believe) and how to test for it.
// Can't assume we have NIS (PC-NFS) or some other ID daemon
// So we ...
- if ( (user = getenv("USER")) == NULL &&
- (user = getenv("LOGNAME")) == NULL ) {
+ if ( (user = getenv("USER")) == NULL &&
+ (user = getenv("LOGNAME")) == NULL ) {
// Use wxWindows configuration data (comming soon)
GetProfileString(WX_SECTION, eUSERID, default_id, buf, maxSize - 1);
} else
// }
#else
#if !defined(__WATCOMC__) && !defined(__GNUWIN32__) && USE_PENWINDOWS
- extern HANDLE hPenWin; // PenWindows Running?
- if (hPenWin)
+ extern HANDLE g_hPenWin; // PenWindows Running?
+ if (g_hPenWin)
{
// PenWindows Does have a user concept!
// Get the current owner of the recognizer
void wxBell(void)
{
#ifdef __WIN32__
- Beep(1000,1000) ; // 1kHz during 1 sec.
+ Beep(1000,1000) ; // 1kHz during 1 sec.
#else
MessageBeep(-1) ;
#endif
if (majorVsn) *majorVsn = info.dwMajorVersion;
if (minorVsn) *minorVsn = info.dwMinorVersion;
switch (info.dwPlatformId)
- {
- case VER_PLATFORM_WIN32s:
- return wxWIN32S;
- break;
- case VER_PLATFORM_WIN32_WINDOWS:
- return wxWIN95;
- break;
- case VER_PLATFORM_WIN32_NT:
- return wxWINDOWS_NT;
- break;
- }
+ {
+ case VER_PLATFORM_WIN32s:
+ return wxWIN32S;
+ break;
+ case VER_PLATFORM_WIN32_WINDOWS:
+ return wxWIN95;
+ break;
+ case VER_PLATFORM_WIN32_NT:
+ return wxWINDOWS_NT;
+ break;
+ }
}
- return wxWINDOWS; // error if we get here, return generic value
+ return wxWINDOWS; // error if we get here, return generic value
#else
// Win16 code...
int retValue ;
# ifdef __WINDOWS_386__
retValue = wxWIN386;
# else
-# if !defined(__WATCOMC__) && !defined(GNUWIN32)
- extern HANDLE hPenWin;
- retValue = hPenWin ? wxPENWINDOWS : wxWINDOWS ;
+# if !defined(__WATCOMC__) && !defined(GNUWIN32) && USE_PENWINDOWS
+ extern HANDLE g_hPenWin;
+ retValue = g_hPenWin ? wxPENWINDOWS : wxWINDOWS ;
# endif
# endif
// @@@@ To be completed. I don't have the manual here...
return (wxBusyCursorCount > 0);
}
+const char* WXDLLEXPORT wxGetHomeDir(wxString *pstr)
+{
+ wxString& strDir = *pstr;
+
+ #ifdef __UNIX__
+ const char *szHome = getenv("HOME");
+ if ( szHome == NULL ) {
+ // we're homeless...
+ wxLogWarning(_("can't find user's HOME, using current directory."));
+ strDir = ".";
+ }
+ else
+ strDir = szHome;
+
+ // add a trailing slash if needed
+ if ( strDir.Last() != '/' )
+ strDir << '/';
+ #else // Windows
+ #ifdef __WIN32__
+ const char *szHome = getenv("HOMEDRIVE");
+ if ( szHome != NULL )
+ strDir << szHome;
+ szHome = getenv("HOMEPATH");
+ if ( szHome != NULL ) {
+ strDir << szHome;
+
+ // the idea is that under NT these variables have default values
+ // of "%systemdrive%:" and "\\". As we don't want to create our
+ // config files in the root directory of the system drive, we will
+ // create it in our program's dir. However, if the user took care
+ // to set HOMEPATH to something other than "\\", we suppose that he
+ // knows what he is doing and use the supplied value.
+ if ( strcmp(szHome, "\\") != 0 )
+ return strDir.c_str();
+ }
+
+ #else // Win16
+ // Win16 has no idea about home, so use the working directory instead
+ #endif // WIN16/32
+
+ // 260 was taken from windef.h
+ #ifndef MAX_PATH
+ #define MAX_PATH 260
+ #endif
+
+ wxString strPath;
+ ::GetModuleFileName(::GetModuleHandle(NULL),
+ strPath.GetWriteBuf(MAX_PATH), MAX_PATH);
+ strPath.UngetWriteBuf();
+
+ // extract the dir name
+ wxSplitPath(strPath, &strDir, NULL, NULL);
+
+ #endif // UNIX/Win
+
+ return strDir.c_str();
+}
+
// Hack for MS-DOS
char *wxGetUserHome (const wxString& user)
{
char tmp[64];
if (wxGetUserId(tmp, sizeof(tmp)/sizeof(char))) {
// Guests belong in the temp dir
- if (stricmp(tmp, "annonymous") == 0) {
- if ((home = getenv("TMP")) != NULL ||
- (home = getenv("TMPDIR")) != NULL ||
- (home = getenv("TEMP")) != NULL)
- return *home ? home : "\\";
+ if (Stricmp(tmp, "annonymous") == 0) {
+ if ((home = getenv("TMP")) != NULL ||
+ (home = getenv("TMPDIR")) != NULL ||
+ (home = getenv("TEMP")) != NULL)
+ return *home ? home : "\\";
}
- if (stricmp(tmp, WXSTRINGCAST user1) == 0)
- user1 = "";
+ if (Stricmp(tmp, WXSTRINGCAST user1) == 0)
+ user1 = "";
}
}
if (user1 == "")
// in long calculations.
bool wxCheckForInterrupt(wxWindow *wnd)
{
- if(wnd){
- MSG msg;
- HWND win= (HWND) wnd->GetHWND();
- while(PeekMessage(&msg,win,0,0,PM_REMOVE)){
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return TRUE;//*** temporary?
- }
- else{
- wxError("wnd==NULL !!!");
- return FALSE;//*** temporary?
- }
+ if(wnd){
+ MSG msg;
+ HWND win= (HWND) wnd->GetHWND();
+ while(PeekMessage(&msg,win,0,0,PM_REMOVE)){
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ return TRUE;//*** temporary?
+ }
+ else{
+ wxError("wnd==NULL !!!");
+ return FALSE;//*** temporary?
+ }
}
// MSW only: get user-defined resource from the .res file.
ReleaseDC(NULL, dc);
}
+bool wxDirExists(const wxString& dir)
+{
+ /* MATTHEW: [6] Always use same code for Win32, call FindClose */
+#if defined(__WIN32__)
+ WIN32_FIND_DATA fileInfo;
+#else
+#ifdef __BORLANDC__
+ struct ffblk fileInfo;
+#else
+ struct find_t fileInfo;
+#endif
+#endif
+
+#if defined(__WIN32__)
+ HANDLE h = FindFirstFile((LPTSTR) WXSTRINGCAST dir,(LPWIN32_FIND_DATA)&fileInfo);
+
+ if (h==INVALID_HANDLE_VALUE)
+ return FALSE;
+ else {
+ FindClose(h);
+ return ((fileInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
+ }
+#else
+ // In Borland findfirst has a different argument
+ // ordering from _dos_findfirst. But _dos_findfirst
+ // _should_ be ok in both MS and Borland... why not?
+#ifdef __BORLANDC__
+ return ((findfirst(WXSTRINGCAST dir, &fileInfo, _A_SUBDIR) == 0 && (fileInfo.ff_attrib & _A_SUBDIR) != 0));
+#else
+ return (((_dos_findfirst(WXSTRINGCAST dir, _A_SUBDIR, &fileInfo) == 0) && (fileInfo.attrib & _A_SUBDIR)) != 0);
+#endif
+#endif
+}
+
+#if 0
+//------------------------------------------------------------------------
+// wild character routines
+//------------------------------------------------------------------------
+
+bool wxIsWild( const wxString& pattern )
+{
+ wxString tmp = pattern;
+ char *pat = WXSTRINGCAST(tmp);
+ while (*pat) {
+ switch (*pat++) {
+ case '?': case '*': case '[': case '{':
+ return TRUE;
+ case '\\':
+ if (!*pat++)
+ return FALSE;
+ }
+ }
+ return FALSE;
+};
+
+
+bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special )
+{
+ wxString tmp1 = pat;
+ char *pattern = WXSTRINGCAST(tmp1);
+ wxString tmp2 = text;
+ char *str = WXSTRINGCAST(tmp2);
+ char c;
+ char *cp;
+ bool done = FALSE, ret_code, ok;
+ // Below is for vi fans
+ const char OB = '{', CB = '}';
+
+ // dot_special means '.' only matches '.'
+ if (dot_special && *str == '.' && *pattern != *str)
+ return FALSE;
+
+ while ((*pattern != '\0') && (!done)
+ && (((*str=='\0')&&((*pattern==OB)||(*pattern=='*')))||(*str!='\0'))) {
+ switch (*pattern) {
+ case '\\':
+ pattern++;
+ if (*pattern != '\0')
+ pattern++;
+ break;
+ case '*':
+ pattern++;
+ ret_code = FALSE;
+ while ((*str!='\0')
+ && (!(ret_code=wxMatchWild(pattern, str++, FALSE))))
+ /*loop*/;
+ if (ret_code) {
+ while (*str != '\0')
+ str++;
+ while (*pattern != '\0')
+ pattern++;
+ }
+ break;
+ case '[':
+ pattern++;
+ repeat:
+ if ((*pattern == '\0') || (*pattern == ']')) {
+ done = TRUE;
+ break;
+ }
+ if (*pattern == '\\') {
+ pattern++;
+ if (*pattern == '\0') {
+ done = TRUE;
+ break;
+ }
+ }
+ if (*(pattern + 1) == '-') {
+ c = *pattern;
+ pattern += 2;
+ if (*pattern == ']') {
+ done = TRUE;
+ break;
+ }
+ if (*pattern == '\\') {
+ pattern++;
+ if (*pattern == '\0') {
+ done = TRUE;
+ break;
+ }
+ }
+ if ((*str < c) || (*str > *pattern)) {
+ pattern++;
+ goto repeat;
+ }
+ } else if (*pattern != *str) {
+ pattern++;
+ goto repeat;
+ }
+ pattern++;
+ while ((*pattern != ']') && (*pattern != '\0')) {
+ if ((*pattern == '\\') && (*(pattern + 1) != '\0'))
+ pattern++;
+ pattern++;
+ }
+ if (*pattern != '\0') {
+ pattern++, str++;
+ }
+ break;
+ case '?':
+ pattern++;
+ str++;
+ break;
+ case OB:
+ pattern++;
+ while ((*pattern != CB) && (*pattern != '\0')) {
+ cp = str;
+ ok = TRUE;
+ while (ok && (*cp != '\0') && (*pattern != '\0')
+ && (*pattern != ',') && (*pattern != CB)) {
+ if (*pattern == '\\')
+ pattern++;
+ ok = (*pattern++ == *cp++);
+ }
+ if (*pattern == '\0') {
+ ok = FALSE;
+ done = TRUE;
+ break;
+ } else if (ok) {
+ str = cp;
+ while ((*pattern != CB) && (*pattern != '\0')) {
+ if (*++pattern == '\\') {
+ if (*++pattern == CB)
+ pattern++;
+ }
+ }
+ } else {
+ while (*pattern!=CB && *pattern!=',' && *pattern!='\0') {
+ if (*++pattern == '\\') {
+ if (*++pattern == CB || *pattern == ',')
+ pattern++;
+ }
+ }
+ }
+ if (*pattern != '\0')
+ pattern++;
+ }
+ break;
+ default:
+ if (*str == *pattern) {
+ str++, pattern++;
+ } else {
+ done = TRUE;
+ }
+ }
+ }
+ while (*pattern == '*')
+ pattern++;
+ return ((*str == '\0') && (*pattern == '\0'));
+};
+
+#endif
+