X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a17e237f4ada1196d7c0f0c23d4dface749c587a..6342bd1ab36c1957684c00d408d09fba65d33db6:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index e65513fc99..9c79a5d13a 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -29,12 +29,8 @@ #pragma hdrstop #endif -#ifndef WX_PRECOMP - #include "wx/defs.h" -#endif - #include "wx/utils.h" -#include +#include "wx/intl.h" // there are just too many of those... #ifdef __VISUALC__ @@ -66,9 +62,9 @@ #include #endif -#ifdef __OS2__ - #include +#ifdef __WXPM__ #include + #include "wx/os2/private.h" #endif #ifdef __WINDOWS__ #if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__) @@ -81,8 +77,6 @@ #ifndef __TWIN32__ #include #endif - - #define stricmp strcasecmp #endif #ifdef __BORLANDC__ // Please someone tell me which version of Borland needs @@ -114,15 +108,17 @@ #define _MAXPATHLEN 500 +extern wxChar *wxBuffer; + #ifdef __WXMAC__ - extern wxChar gwxMacFileName[] ; - extern wxChar gwxMacFileName2[] ; - extern wxChar gwxMacFileName3[] ; + +#include "morefile.h" +#include "moreextr.h" +#include "fullpath.h" +#include "fspcompa.h" #endif -#if !USE_SHARED_LIBRARIES IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList) -#endif // ---------------------------------------------------------------------------- // private globals @@ -130,6 +126,14 @@ static wxChar wxFileFunctionsBuffer[4*_MAXPATHLEN]; +#if defined(__VISAGECPP__) && __IBMCPP__ >= 400 +// +// VisualAge C++ V4.0 cannot have any external linkage const decs +// in headers included by more than one primary source +// +const off_t wxInvalidOffset = (off_t)-1; +#endif + // ============================================================================ // implementation // ============================================================================ @@ -264,21 +268,15 @@ wxFileExists (const wxString& filename) return TRUE; #elif defined(__WXMAC__) struct stat stbuf; - wxStrcpy( gwxMacFileName , filename ) ; - wxUnix2MacFilename( gwxMacFileName ) ; - if (gwxMacFileName && stat (WXSTRINGCAST gwxMacFileName, &stbuf) == 0) - return TRUE; + if (filename && stat (wxUnix2MacFilename(filename), &stbuf) == 0 ) + return TRUE; return FALSE ; #else -#ifdef __SALFORDC__ - struct _stat stbuf; -#else - struct stat stbuf; -#endif - - if ((filename != wxT("")) && stat (wxFNSTRINGCAST filename.fn_str(), &stbuf) == 0) + wxStructStat stbuf; + if ((filename != wxT("")) && wxStat (wxFNSTRINGCAST filename.fn_str(), &stbuf) == 0) return TRUE; + return FALSE; #endif } @@ -564,7 +562,7 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) /* prefix ~ */ if (nm[1] == SEP || nm[1] == 0) { /* ~/filename */ - // FIXME: wxGetUserHome could return temporary storage in Unicode mode + // FIXME: wxGetUserHome could return temporary storage in Unicode mode if ((s = WXSTRINGCAST wxGetUserHome(wxT(""))) != NULL) { if (*++nm) nm++; @@ -578,7 +576,7 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) was_sep = (*s == SEP); nnm = *s ? s + 1 : s; *s = 0; - // FIXME: wxGetUserHome could return temporary storage in Unicode mode + // FIXME: wxGetUserHome could return temporary storage in Unicode mode if ((home = WXSTRINGCAST wxGetUserHome(wxString(nm + 1))) == NULL) { if (was_sep) /* replace only if it was there: */ *s = SEP; @@ -612,7 +610,6 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) return wxRealPath(buf); } - /* Contract Paths to be build upon an environment variable component: @@ -826,68 +823,119 @@ wxString wxPathOnly (const wxString& path) // Also, convert to lower case, since case is significant in UNIX. #ifdef __WXMAC__ -void -wxMac2UnixFilename (wxChar *s) + +static char sMacFileNameConversion[ 1000 ] ; + +wxString wxMac2UnixFilename (const char *str) { - if (s) - { - memmove( s+1 , s ,(strlen( s ) + 1)*sizeof(wxChar)) ; - if ( *s == wxT(':') ) - *s = wxT('.') ; - else - *s = wxT('/') ; - - while (*s) - { - if (*s == wxT(':')) - *s = wxT('/'); - else - *s = wxTolower(*s); // Case INDEPENDENT - s++; - } - } + char *s = sMacFileNameConversion ; + strcpy( s , str ) ; + if (s) + { + memmove( s+1 , s ,strlen( s ) + 1) ; + if ( *s == ':' ) + *s = '.' ; + else + *s = '/' ; + + while (*s) + { + if (*s == ':') + *s = '/'; + else + *s = wxTolower (*s); // Case INDEPENDENT + s++; + } + } + return wxString (sMacFileNameConversion) ; } -void -wxUnix2MacFilename (wxChar *s) +wxString wxUnix2MacFilename (const char *str) { - if (s) - { - if ( *s == wxT('.') ) - { - // relative path , since it goes on with slash which is translated to a : - memmove( s , s+1 ,strlen( s )*sizeof(wxChar) ) ; - } - else if ( *s == wxT('/') ) - { - // absolute path -> on mac just start with the drive name - memmove( s , s+1 ,strlen( s )*sizeof(wxChar) ) ; - } - else - { - wxASSERT_MSG( 1 , wxT("unknown path beginning") ) ; - } - while (*s) - { - if (*s == wxT('/') || *s == wxT('\\')) - *s = wxT(':'); + char *s = sMacFileNameConversion ; + strcpy( s , str ) ; + if (s) + { + if ( *s == '.' ) + { + // relative path , since it goes on with slash which is translated to a : + memmove( s , s+1 ,strlen( s ) ) ; + } + else if ( *s == '/' ) + { + // absolute path -> on mac just start with the drive name + memmove( s , s+1 ,strlen( s ) ) ; + } + else + { + wxASSERT_MSG( 1 , "unkown path beginning" ) ; + } + while (*s) + { + if (*s == '/' || *s == '\\') + { + // convert any back-directory situations + if ( *(s+1) == '.' && *(s+2) == '.' && ( (*(s+3) == '/' || *(s+3) == '\\') ) ) + { + *s = ':'; + memmove( s+1 , s+3 ,strlen( s+3 ) + 1 ) ; + } + else + *s = ':'; + } - s++ ; - } - } + s++ ; + } + } + return wxString (sMacFileNameConversion) ; +} + +wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) +{ + Handle myPath ; + short length ; + + FSpGetFullPath( spec , &length , &myPath ) ; + ::SetHandleSize( myPath , length + 1 ) ; + ::HLock( myPath ) ; + (*myPath)[length] = 0 ; + if ( length > 0 && (*myPath)[length-1] ==':' ) + (*myPath)[length-1] = 0 ; + + wxString result( (char*) *myPath ) ; + ::HUnlock( myPath ) ; + ::DisposeHandle( myPath ) ; + return result ; +} + +wxString wxMacFSSpec2UnixFilename( const FSSpec *spec ) +{ + return wxMac2UnixFilename( wxMacFSSpec2MacFilename( spec) ) ; +} + +void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) +{ + FSpLocationFromFullPath( strlen(path ) , path , spec ) ; } + +void wxUnixFilename2FSSpec( const char *path , FSSpec *spec ) +{ + wxString var = wxUnix2MacFilename( path ) ; + wxMacFilename2FSSpec( var , spec ) ; +} + #endif void -wxDos2UnixFilename (wxChar *s) +wxDos2UnixFilename (char *s) { if (s) while (*s) { - if (*s == wxT('\\')) - *s = wxT('/'); -#if defined(__WXMSW__) || defined(__WXPM__) + if (*s == '\\') + *s = '/'; +#ifdef __WXMSW__ else - *s = wxTolower(*s); // Case INDEPENDENT + *s = wxTolower (*s); // Case INDEPENDENT #endif s++; } @@ -897,7 +945,7 @@ void #if defined(__WXMSW__) || defined(__WXPM__) wxUnix2DosFilename (wxChar *s) #else -wxUnix2DosFilename (wxChar *WXUNUSED(s)) +wxUnix2DosFilename (wxChar *WXUNUSED(s) ) #endif { // Yes, I really mean this to happen under DOS only! JACS @@ -923,20 +971,13 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil FILE *fp3 = (FILE *) NULL; // Open the inputs and outputs #ifdef __WXMAC__ - wxStrcpy( gwxMacFileName , file1 ) ; - wxUnix2MacFilename( gwxMacFileName ) ; - wxStrcpy( gwxMacFileName2 , file2) ; - wxUnix2MacFilename( gwxMacFileName2 ) ; - wxStrcpy( gwxMacFileName3 , outfile) ; - wxUnix2MacFilename( gwxMacFileName3 ) ; - - if ((fp1 = fopen (gwxMacFileName, "rb")) == NULL || - (fp2 = fopen (gwxMacFileName2, "rb")) == NULL || - (fp3 = fopen (gwxMacFileName3, "wb")) == NULL) + if ((fp1 = fopen (wxUnix2MacFilename( file1 ), "rb")) == NULL || + (fp2 = fopen (wxUnix2MacFilename( file2 ), "rb")) == NULL || + (fp3 = fopen (wxUnix2MacFilename( outfile ), "wb")) == NULL) #else - if ((fp1 = fopen (wxFNSTRINGCAST file1.fn_str(), "rb")) == NULL || - (fp2 = fopen (wxFNSTRINGCAST file2.fn_str(), "rb")) == NULL || - (fp3 = fopen (wxFNCONV(outfile), "wb")) == NULL) + if ((fp1 = wxFopen (WXSTRINGCAST file1, wxT("rb"))) == NULL || + (fp2 = wxFopen (WXSTRINGCAST file2, wxT("rb"))) == NULL || + (fp3 = wxFopen (outfile, wxT("wb"))) == NULL) #endif { if (fp1) @@ -972,18 +1013,13 @@ wxCopyFile (const wxString& file1, const wxString& file2) int ch; #ifdef __WXMAC__ - wxStrcpy( gwxMacFileName , file1 ) ; - wxUnix2MacFilename( gwxMacFileName ) ; - wxStrcpy( gwxMacFileName2 , file2) ; - wxUnix2MacFilename( gwxMacFileName2 ) ; - - if ((fd1 = fopen (gwxMacFileName, "rb")) == NULL) + if ((fd1 = fopen (wxUnix2MacFilename( file1 ), "rb")) == NULL) return FALSE; - if ((fd2 = fopen (gwxMacFileName2, "wb")) == NULL) + if ((fd2 = fopen (wxUnix2MacFilename( file2 ), "wb")) == NULL) #else - if ((fd1 = fopen (wxFNSTRINGCAST file1.fn_str(), "rb")) == NULL) + if ((fd1 = wxFopen (WXSTRINGCAST file1, wxT("rb"))) == NULL) return FALSE; - if ((fd2 = fopen (wxFNSTRINGCAST file2.fn_str(), "wb")) == NULL) + if ((fd2 = wxFopen (WXSTRINGCAST file2, wxT("wb"))) == NULL) #endif { fclose (fd1); @@ -1002,16 +1038,11 @@ bool wxRenameFile (const wxString& file1, const wxString& file2) { #ifdef __WXMAC__ - wxStrcpy( gwxMacFileName , file1 ) ; - wxUnix2MacFilename( gwxMacFileName ) ; - wxStrcpy( gwxMacFileName2 , file2) ; - wxUnix2MacFilename( gwxMacFileName2 ) ; - - if (0 == rename (gwxMacFileName, gwxMacFileName2)) + if (0 == rename (wxUnix2MacFilename( file1 ), wxUnix2MacFilename( file2 ))) return TRUE; #else // Normal system call - if (0 == rename (wxFNSTRINGCAST file1.fn_str(), wxFNSTRINGCAST file2.fn_str())) + if (0 == wxRename (wxCSTRINGCAST file1, wxCSTRINGCAST file2)) return TRUE; #endif // Try to copy @@ -1026,11 +1057,9 @@ wxRenameFile (const wxString& file1, const wxString& file2) bool wxRemoveFile(const wxString& file) { #if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__) - int flag = remove(wxFNSTRINGCAST file.fn_str()); + int flag = wxRemove(file); #elif defined( __WXMAC__ ) - wxStrcpy( gwxMacFileName , file ) ; - wxUnix2MacFilename( gwxMacFileName ) ; - int flag = unlink(gwxMacFileName); + int flag = unlink(wxUnix2MacFilename( file )); #else int flag = unlink(wxFNSTRINGCAST file.fn_str()); #endif @@ -1040,19 +1069,18 @@ bool wxRemoveFile(const wxString& file) bool wxMkdir(const wxString& dir, int perm) { #if defined( __WXMAC__ ) - wxStrcpy( gwxMacFileName , dir ) ; - wxUnix2MacFilename( gwxMacFileName ) ; - const wxChar *dirname = gwxMacFileName; + return (mkdir(wxUnix2MacFilename( dir ) , 0 ) == 0); #else // !Mac const wxChar *dirname = dir.c_str(); -#endif // Mac/!Mac // assume mkdir() has 2 args on non Windows-OS/2 platforms and on Windows too // for the GNU compiler #if (!(defined(__WXMSW__) || defined(__WXPM__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WXWINE__) if ( mkdir(wxFNCONV(dirname), perm) != 0 ) -#else // MSW and OS/2 - if ( mkdir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 ) +#elif defined(__WXPM__) + if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's?? +#else // !MSW and !OS/2 VAC++ + if ( wxMkDir(wxFNSTRINGCAST wxFNCONV(dirname)) != 0 ) #endif // !MSW/MSW { wxLogSysError(_("Directory '%s' couldn't be created"), dirname); @@ -1061,22 +1089,23 @@ bool wxMkdir(const wxString& dir, int perm) } return TRUE; +#endif // Mac/!Mac } bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) { #ifdef __VMS__ - return FALSE; + return FALSE; //to be changed since rmdir exists in VMS7.x #elif defined( __WXMAC__ ) - wxStrcpy( gwxMacFileName , dir ) ; - wxUnix2MacFilename( gwxMacFileName ) ; - return (rmdir(WXSTRINGCAST gwxMacFileName) == 0); + return (rmdir(wxUnix2MacFilename( dir )) == 0); +#elif defined(__WXPM__) + return (::DosDeleteDir((PSZ)dir.c_str()) == 0); #else #ifdef __SALFORDC__ return FALSE; // What to do? #else - return (rmdir(wxFNSTRINGCAST dir.fn_str()) == 0); + return (wxRmDir(wxFNSTRINGCAST dir.fn_str()) == 0); #endif #endif @@ -1086,7 +1115,7 @@ bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) bool wxDirExists(const wxString& dir) { #ifdef __VMS__ - return FALSE; + return FALSE; //To be changed since stat exists in VMS7.x #elif !defined(__WXMSW__) struct stat sbuf; return (stat(dir.fn_str(), &sbuf) != -1) && S_ISDIR(sbuf.st_mode) ? TRUE : FALSE; @@ -1131,19 +1160,31 @@ bool wxDirExists(const wxString& dir) // does the path exists? (may have or not '/' or '\\' at the end) bool wxPathExists(const wxChar *pszPathName) { - /* Windows API returns -1 from stat for "c:\dir\" if "c:\dir" exists - * OTOH, we should change "d:" to "d:\" and leave "\" as is. */ - wxString strPath(pszPathName); - if ( wxEndsWithPathSeparator(pszPathName) && pszPathName[1] != wxT('\0') ) - strPath.Last() = wxT('\0'); + wxString strPath(pszPathName); +#ifdef __WINDOWS__ + // Windows fails to find directory named "c:\dir\" even if "c:\dir" exists, + // so remove all trailing backslashes from the path - but don't do this for + // the pathes "d:\" (which are different from "d:") nor for just "\" + while ( wxEndsWithPathSeparator(strPath) ) + { + size_t len = strPath.length(); + if ( len == 1 || strPath[len - 1] == _T(':') ) + break; -#ifdef __SALFORDC__ - struct _stat st; + strPath.Truncate(len - 1); + } +#endif // __WINDOWS__ + + wxStructStat st; +#ifndef __VISAGECPP__ + return wxStat(wxFNSTRINGCAST strPath.fn_str(), &st) == 0 && + ((st.st_mode & S_IFMT) == S_IFDIR); #else - struct stat st; + // S_IFMT not supported in VA compilers.. st_mode is a 2byte value only + return wxStat(wxFNSTRINGCAST strPath.fn_str(), &st) == 0 && + (st.st_mode == S_IFDIR); #endif - return stat(wxFNSTRINGCAST strPath.fn_str(), &st) == 0 && (st.st_mode & S_IFDIR); } // Get a temporary filename, opening and closing the file. @@ -1192,6 +1233,18 @@ wxChar *wxGetTempFileName(const wxString& prefix, wxChar *buf) #endif } +bool wxGetTempFileName(const wxString& prefix, wxString& buf) +{ + wxChar buf2[512]; + if (wxGetTempFileName(prefix, buf2) != (wxChar*) NULL) + { + buf = buf2; + return TRUE; + } + else + return FALSE; +} + // Get first file name matching given wild card. #ifdef __UNIX__ @@ -1199,7 +1252,7 @@ wxChar *wxGetTempFileName(const wxString& prefix, wxChar *buf) // Get first file name matching given wild card. // Flags are reserved for future use. -#ifndef __VMS__ +#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 ) static DIR *gs_dirStream = (DIR *) NULL; static wxString gs_strFileSpec; static int gs_findFlags = 0; @@ -1209,7 +1262,7 @@ wxString wxFindFirstFile(const wxChar *spec, int flags) { wxString result; -#ifndef __VMS__ +#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 ) if (gs_dirStream) closedir(gs_dirStream); // edz 941103: better housekeping @@ -1238,7 +1291,7 @@ wxString wxFindFirstFile(const wxChar *spec, int flags) { result = wxFindNextFile(); } -#endif // !VMS +#endif // !VMS6.x or earlier return result; } @@ -1247,7 +1300,7 @@ wxString wxFindNextFile() { wxString result; -#ifndef __VMS__ +#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 ) wxCHECK_MSG( gs_dirStream, result, wxT("must call wxFindFirstFile first") ); // Find path only so we can concatenate @@ -1265,7 +1318,9 @@ wxString wxFindNextFile() nextDir != NULL; nextDir = readdir(gs_dirStream) ) { - if (wxMatchWild(name, nextDir->d_name)) + if (wxMatchWild(name, nextDir->d_name, FALSE) && // RR: added FALSE to find hidden files + strcmp(nextDir->d_name, ".") && + strcmp(nextDir->d_name, "..") ) { result.Empty(); if ( !path.IsEmpty() ) @@ -1304,11 +1359,89 @@ wxString wxFindNextFile() closedir(gs_dirStream); gs_dirStream = (DIR *) NULL; -#endif // !VMS +#endif // !VMS6.2 or earlier return result; } +#elif defined(__WXMAC__) + +struct MacDirectoryIterator +{ + CInfoPBRec m_CPB ; + wxInt16 m_index ; + long m_dirId ; + Str255 m_name ; +} ; + +static int g_iter_flags ; + +static MacDirectoryIterator g_iter ; + +wxString wxFindFirstFile(const wxChar *spec, int flags) +{ + wxString result; + + g_iter_flags = flags; /* MATTHEW: [5] Remember flags */ + + // Find path only so we can concatenate found file onto path + wxString path(wxPathOnly(spec)); + if ( !path.IsEmpty() ) + result << path << wxT('\\'); + + FSSpec fsspec ; + + wxUnixFilename2FSSpec( result , &fsspec ) ; + g_iter.m_CPB.hFileInfo.ioVRefNum = fsspec.vRefNum ; + g_iter.m_CPB.hFileInfo.ioNamePtr = g_iter.m_name ; + g_iter.m_index = 0 ; + + Boolean isDir ; + FSpGetDirectoryID( &fsspec , &g_iter.m_dirId , &isDir ) ; + if ( !isDir ) + return wxEmptyString ; + + return wxFindNextFile( ) ; +} + +wxString wxFindNextFile() +{ + wxString result; + + short err = noErr ; + + while ( err == noErr ) + { + g_iter.m_index++ ; + g_iter.m_CPB.dirInfo.ioFDirIndex = g_iter.m_index; + g_iter.m_CPB.dirInfo.ioDrDirID = g_iter.m_dirId; /* we need to do this every time */ + err = PBGetCatInfoSync((CInfoPBPtr)&g_iter.m_CPB); + if ( err != noErr ) + break ; + + if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) != 0 && (g_iter_flags & wxDIR) ) // we have a directory + break ; + + if ( ( g_iter.m_CPB.dirInfo.ioFlAttrib & ioDirMask) == 0 && !(g_iter_flags & wxFILE ) ) + continue ; + + // hit ! + break ; + } + if ( err != noErr ) + { + return wxEmptyString ; + } + FSSpec spec ; + + FSMakeFSSpecCompat(g_iter.m_CPB.hFileInfo.ioVRefNum, + g_iter.m_dirId, + g_iter.m_name, + &spec) ; + + return wxMacFSSpec2UnixFilename( &spec ) ; +} + #elif defined(__WXMSW__) #ifdef __WIN32__ @@ -1360,9 +1493,9 @@ wxString wxFindFirstFile(const wxChar *spec, int flags) result += gs_findDataStruct.cFileName; return result; -#else +#else // !Win32 int flag = _A_NORMAL; - if (flags & wxDIR) /* MATTHEW: [5] Use & */ + if (flags & wxDIR) flag = _A_SUBDIR; #ifdef __BORLANDC__ @@ -1371,7 +1504,6 @@ wxString wxFindFirstFile(const wxChar *spec, int flags) if (_dos_findfirst(WXSTRINGCAST spec, flag, &gs_findDataStruct) == 0) #endif { - /* MATTHEW: [5] Check directory flag */ char attrib; #ifdef __BORLANDC__ @@ -1394,11 +1526,12 @@ wxString wxFindFirstFile(const wxChar *spec, int flags) #endif ; } -#endif // __WIN32__ return result; +#endif // __WIN32__ } + wxString wxFindNextFile() { wxString result; @@ -1465,12 +1598,56 @@ try_again: #endif ; } + + return result; #endif // Win32/16 +} + +#elif defined(__WXPM__) + +wxString wxFindFirstFile(const wxChar *spec, int flags) +{ + wxString result; + + /* + // TODO: figure something out here for OS/2 + gs_strFileSpec = spec; + gs_findFlags = flags; + + // Find path only so we can concatenate found file onto path + wxString path(wxPathOnly(gs_strFileSpec)); + if ( !path.IsEmpty() ) + result << path << wxT('\\'); + + int flag = _A_NORMAL; + if (flags & wxDIR) + flag = _A_SUBDIR; + + if (_dos_findfirst(WXSTRINGCAST spec, flag, &gs_findDataStruct) == 0) + { + char attrib; + attrib = gs_findDataStruct.attrib; + + if (attrib & _A_SUBDIR) { + if (!(gs_findFlags & wxDIR)) + return wxFindNextFile(); + } else if (gs_findFlags && !(gs_findFlags & wxFILE)) + return wxFindNextFile(); + result += gs_findDataStruct.name; + } + */ + return result; +} + +wxString wxFindNextFile() +{ + wxString result; + // TODO: return result; } -#endif // Unix/Windows +#endif // Unix/Windows/OS/2 // Get current working directory. // If buf is NULL, allocates space using new, else @@ -1483,13 +1660,42 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) char *cbuf = new char[sz+1]; #ifdef _MSC_VER if (_getcwd(cbuf, sz) == NULL) { +#elif defined( __WXMAC__) + enum + { + SFSaveDisk = 0x214, CurDirStore = 0x398 + }; + FSSpec cwdSpec ; + + FSMakeFSSpec( - *(short *) SFSaveDisk , *(long *) CurDirStore , NULL , &cwdSpec ) ; + wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ; + strcpy( buf , res ) ; + if (0) { #else if (getcwd(cbuf, sz) == NULL) { #endif delete [] cbuf; -#else +#else // wxUnicode #ifdef _MSC_VER if (_getcwd(buf, sz) == NULL) { +#elif defined( __WXMAC__) + enum + { + SFSaveDisk = 0x214, CurDirStore = 0x398 + }; + FSSpec cwdSpec ; + + FSMakeFSSpec( - *(short *) SFSaveDisk , *(long *) CurDirStore , NULL , &cwdSpec ) ; + wxString res = wxMacFSSpec2UnixFilename( &cwdSpec ) ; + strcpy( buf , res ) ; + if (0) { +#elif(__VISAGECPP__) + APIRET rc; + rc = ::DosQueryCurrentDir( 0 // current drive + ,buf + ,(PULONG)&sz + ); + if (rc != 0) { #else if (getcwd(buf, sz) == NULL) { #endif @@ -1519,8 +1725,10 @@ wxString wxGetCwd() bool wxSetWorkingDirectory(const wxString& d) { -#if defined( __UNIX__ ) || defined( __WXMAC__ ) || defined(__WXPM__) +#if defined( __UNIX__ ) || defined( __WXMAC__ ) return (chdir(wxFNSTRINGCAST d.fn_str()) == 0); +#elif defined(__WXPM__) + return (::DosSetCurrentDir((PSZ)d.c_str()) == 0); #elif defined(__WINDOWS__) #ifdef __WIN32__ @@ -1579,7 +1787,7 @@ bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFi { // we assume that it's not empty wxCHECK_MSG( !wxIsEmpty(pszFile), FALSE, - _("empty file name in wxFindFileInPath")); + _T("empty file name in wxFindFileInPath")); // skip path separator in the beginning of the file name if present if ( wxIsPathSeparator(*pszFile) ) @@ -1634,14 +1842,18 @@ void WXDLLEXPORT wxSplitPath(const wxChar *pszFileName, #else // assume Unix const wxChar *pLastSeparator = wxStrrchr(pszFileName, wxFILE_SEP_PATH_UNIX); - if ( pDot == pszFileName ) + if ( pDot ) { - // under Unix files like .profile are treated in a special way - pDot = NULL; + if ( (pDot == pszFileName) || (*(pDot - 1) == wxFILE_SEP_PATH_UNIX) ) + { + // under Unix, dot may be (and commonly is) the first character of the + // filename, don't treat the entire filename as extension in this case + pDot = NULL; + } } #endif // MSW/Unix - if ( pDot < pLastSeparator ) + if ( pDot && (pDot < pLastSeparator) ) { // the dot is part of the path, not the start of the extension pDot = NULL; @@ -1672,6 +1884,15 @@ void WXDLLEXPORT wxSplitPath(const wxChar *pszFileName, } } +time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) +{ + wxStructStat buf; + + wxStat(filename.fn_str(), &buf); + return buf.st_mtime; +} + + //------------------------------------------------------------------------ // wild character routines //------------------------------------------------------------------------