X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b1d4dd7add411ebff1ce4a8d1d992e0e43ee26b1..1eb1eae717bea7942825313db9074529927db482:/src/common/filefn.cpp diff --git a/src/common/filefn.cpp b/src/common/filefn.cpp index b46955c5f9..f6d5b9d69f 100644 --- a/src/common/filefn.cpp +++ b/src/common/filefn.cpp @@ -6,7 +6,7 @@ // Created: 29/01/98 // RCS-ID: $Id$ // Copyright: (c) 1998 Julian Smart -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -59,10 +59,18 @@ #ifndef __MWERKS__ #include #include +#else +#ifdef __MACH__ +#include +#include +#include +#include #else #include #include #include + #include +#endif #endif #ifdef __UNIX__ @@ -214,34 +222,43 @@ void wxPathList::Add (const wxString& path) // Add paths e.g. from the PATH environment variable void wxPathList::AddEnvList (const wxString& envVariable) { - static const wxChar PATH_TOKS[] = + static const wxChar PATH_TOKS[] = #ifdef __WINDOWS__ - wxT(" ;"); // Don't seperate with colon in DOS (used for drive) + /* + The space has been removed from the tokenizers, otherwise a + path such as "C:\Program Files" would be split into 2 paths: + "C:\Program" and "Files" + */ +// wxT(" ;"); // Don't seperate with colon in DOS (used for drive) + wxT(";"); // Don't seperate with colon in DOS (used for drive) #else wxT(" :;"); #endif - wxChar *val = wxGetenv (WXSTRINGCAST envVariable); - if (val && *val) + wxChar *val = wxGetenv (WXSTRINGCAST envVariable); + if (val && *val) { - wxChar *s = copystring (val); - wxChar *save_ptr, *token = wxStrtok (s, PATH_TOKS, &save_ptr); + wxChar *s = copystring (val); + wxChar *save_ptr, *token = wxStrtok (s, PATH_TOKS, &save_ptr); - if (token) - { - Add (copystring (token)); - while (token) - { - if ((token = wxStrtok ((wxChar *) NULL, PATH_TOKS, &save_ptr)) != NULL) - Add (wxString(token)); - } - } + if (token) + { + Add(token); + while (token) + { + if ( (token = wxStrtok ((wxChar *) NULL, PATH_TOKS, &save_ptr)) + != NULL ) + { + Add(token); + } + } + } - // suppress warning about unused variable save_ptr when wxStrtok() is a - // macro which throws away its third argument - save_ptr = token; + // suppress warning about unused variable save_ptr when wxStrtok() is a + // macro which throws away its third argument + save_ptr = token; - delete [] s; + delete [] s; } } @@ -272,9 +289,9 @@ bool wxPathList::Member (const wxString& path) path.CompareTo (path2) == 0 #endif ) - return true; + return TRUE; } - return false; + return FALSE; } wxString wxPathList::FindValidPath (const wxString& file) @@ -354,23 +371,23 @@ wxIsAbsolutePath (const wxString& filename) // "MacOS:MyText.txt" is absolute whereas "MyDir:MyText.txt" // is not. Or maybe ":MyDir:MyText.txt" has to be used? RR. if (filename.Find(':') != wxNOT_FOUND && filename[0] != ':') - return true ; + return TRUE ; #else // Unix like or Windows if (filename[0] == wxT('/')) - return true; + return TRUE; #endif #ifdef __VMS__ if ((filename[0] == wxT('[') && filename[1] != wxT('.'))) - return true; + return TRUE; #endif #ifdef __WINDOWS__ // MSDOS like if (filename[0] == wxT('\\') || (wxIsalpha (filename[0]) && filename[1] == wxT(':'))) - return true; + return TRUE; #endif } - return false ; + return FALSE ; } /* @@ -549,7 +566,7 @@ wxChar *wxExpandPath(wxChar *buf, const wxChar *name) s = nm; d = lnm; #ifdef __WXMSW__ - q = false; + q = FALSE; #else q = nm[0] == wxT('\\') && nm[1] == wxT('~'); #endif @@ -865,7 +882,7 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) int j; OSErr theErr; OSStatus theStatus; - Boolean isDirectory = false; + Boolean isDirectory = FALSE; Str255 theParentPath = "\p"; FSSpec theParentSpec; FSRef theParentRef; @@ -926,7 +943,7 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) (*myPath)[length-1] = 0 ; // create path string for return value - wxString result( (char*) *myPath ) ; + wxString result = wxMacMakeStringFromCString( *myPath ) ; // free allocated handle ::HUnlock( myPath ) ; @@ -939,7 +956,8 @@ wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) // Mac file names are POSIX (Unix style) under Darwin // therefore the conversion functions below are not needed -static char sMacFileNameConversion[ 1000 ] ; +static wxChar sMacFileNameConversion[ 1000 ] ; +static char scMacFileNameConversion[ 1000 ] ; #endif void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) @@ -956,10 +974,10 @@ void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) if ( strchr( path , ':' ) == NULL ) { // try whether it is a volume / or a mounted volume - strncpy( sMacFileNameConversion , path , 1000 ) ; - sMacFileNameConversion[998] = 0 ; - strcat( sMacFileNameConversion , ":" ) ; - err = FSpLocationFromFullPath( strlen(sMacFileNameConversion) , sMacFileNameConversion , spec ) ; + strncpy( scMacFileNameConversion , path , 1000 ) ; + scMacFileNameConversion[998] = 0 ; + strcat( scMacFileNameConversion , ":" ) ; + err = FSpLocationFromFullPath( strlen(scMacFileNameConversion) , scMacFileNameConversion , spec ) ; } else { @@ -968,15 +986,22 @@ void wxMacFilename2FSSpec( const char *path , FSSpec *spec ) #endif } +#if wxUSE_UNICODE +WXDLLEXPORT void wxMacFilename2FSSpec( const wxChar *path , FSSpec *spec ) +{ + return wxMacFilename2FSSpec( wxMacStringToCString( wxString( path ) ) , spec ) ; +} +#endif + #ifndef __DARWIN__ -wxString wxMac2UnixFilename (const char *str) +wxString wxMac2UnixFilename (const wxChar *str) { - char *s = sMacFileNameConversion ; - strcpy( s , str ) ; + wxChar *s = sMacFileNameConversion ; + wxStrcpy( s , str ) ; if (s) { - memmove( s+1 , s ,strlen( s ) + 1) ; + memmove( s+1 , s ,wxStrlen( s ) + 1 * sizeof(wxChar)) ; if ( *s == ':' ) *s = '.' ; else @@ -994,25 +1019,25 @@ wxString wxMac2UnixFilename (const char *str) return wxString(sMacFileNameConversion) ; } -wxString wxUnix2MacFilename (const char *str) +wxString wxUnix2MacFilename (const wxChar *str) { - char *s = sMacFileNameConversion ; - strcpy( s , str ) ; + wxChar *s = sMacFileNameConversion ; + wxStrcpy( 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 ) ) ; + memmove( s , s+1 ,wxStrlen( s ) * sizeof(wxChar)) ; } else if ( *s == '/' ) { // absolute path -> on mac just start with the drive name - memmove( s , s+1 ,strlen( s ) ) ; + memmove( s , s+1 ,wxStrlen( s ) * sizeof(wxChar) ) ; } else { - wxASSERT_MSG( 1 , "unkown path beginning" ) ; + wxASSERT_MSG( 1 , wxT("unkown path beginning") ) ; } while (*s) { @@ -1022,7 +1047,7 @@ wxString wxUnix2MacFilename (const char *str) if ( *(s+1) == '.' && *(s+2) == '.' && ( (*(s+3) == '/' || *(s+3) == '\\') ) ) { *s = ':'; - memmove( s+1 , s+3 ,strlen( s+3 ) + 1 ) ; + memmove( s+1 , s+3 ,(wxStrlen( s+3 ) + 1)*sizeof(wxChar) ) ; } else *s = ':'; @@ -1030,7 +1055,7 @@ wxString wxUnix2MacFilename (const char *str) s++ ; } } - return wxString (sMacFileNameConversion) ; + return wxString(sMacFileNameConversion) ; } wxString wxMacFSSpec2UnixFilename( const FSSpec *spec ) @@ -1088,7 +1113,7 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil { wxString outfile; if ( !wxGetTempFileName( wxT("cat"), outfile) ) - return false; + return FALSE; FILE *fp1 = (FILE *) NULL; FILE *fp2 = (FILE *) NULL; @@ -1104,7 +1129,7 @@ wxConcatFiles (const wxString& file1, const wxString& file2, const wxString& fil fclose (fp2); if (fp3) fclose (fp3); - return false; + return FALSE; } int ch; @@ -1135,11 +1160,11 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) wxLogSysError(_("Failed to copy the file '%s' to '%s'"), file1.c_str(), file2.c_str()); - return false; + return FALSE; } #elif defined(__WXPM__) if ( ::DosCopy(file2, file2, overwrite ? DCPY_EXISTING : 0) != 0 ) - return false; + return FALSE; #else // !Win32 wxStructStat fbuf; @@ -1150,13 +1175,13 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) // from it anyhow wxLogSysError(_("Impossible to get permissions for file '%s'"), file1.c_str()); - return false; + return FALSE; } // open file1 for reading wxFile fileIn(file1, wxFile::read); if ( !fileIn.IsOpened() ) - return false; + return FALSE; // remove file2, if it exists. This is needed for creating // file2 with the correct permissions in the next step @@ -1164,7 +1189,7 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) { wxLogSysError(_("Impossible to overwrite the file '%s'"), file2.c_str()); - return false; + return FALSE; } #ifdef __UNIX__ @@ -1175,10 +1200,10 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) // create file2 with the same permissions than file1 and open it for // writing - + wxFile fileOut; if ( !fileOut.Create(file2, overwrite, fbuf.st_mode & 0777) ) - return false; + return FALSE; #ifdef __UNIX__ /// restore the old umask @@ -1192,21 +1217,21 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) { count = fileIn.Read(buf, WXSIZEOF(buf)); if ( fileIn.Error() ) - return false; + return FALSE; // end of file? if ( !count ) break; if ( fileOut.Write(buf, count) < count ) - return false; + return FALSE; } // we can expect fileIn to be closed successfully, but we should ensure // that fileOut was closed as some write errors (disk full) might not be // detected before doing this if ( !fileIn.Close() || !fileOut.Close() ) - return false; + return FALSE; #if !defined(__VISAGECPP__) && !defined(__WXMAC__) || defined(__UNIX__) // no chmod in VA. Should be some permission API for HPFS386 partitions @@ -1215,12 +1240,12 @@ wxCopyFile (const wxString& file1, const wxString& file2, bool overwrite) { wxLogSysError(_("Impossible to set permissions for the file '%s'"), file2.c_str()); - return false; + return FALSE; } #endif // OS/2 || Mac #endif // __WXMSW__ && __WIN32__ - return true; + return TRUE; } bool @@ -1228,15 +1253,15 @@ wxRenameFile (const wxString& file1, const wxString& file2) { // Normal system call if ( wxRename (file1, file2) == 0 ) - return true; + return TRUE; // Try to copy if (wxCopyFile(file1, file2)) { wxRemoveFile(file1); - return true; + return TRUE; } // Give up - return false; + return FALSE; } bool wxRemoveFile(const wxString& file) @@ -1246,6 +1271,8 @@ bool wxRemoveFile(const wxString& file) || defined(__WATCOMC__) \ || defined(__GNUWIN32__) int res = wxRemove(file); +#elif defined(__WXMAC__) + int res = unlink(wxFNCONV(file)); #else int res = unlink(OS_FILENAME(file)); #endif @@ -1256,14 +1283,18 @@ bool wxRemoveFile(const wxString& file) bool wxMkdir(const wxString& dir, int perm) { #if defined(__WXMAC__) && !defined(__UNIX__) - return (mkdir( dir , 0 ) == 0); + return (mkdir( wxFNCONV(dir) , 0 ) == 0); #else // !Mac const wxChar *dirname = dir.c_str(); // 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(__DOS__))) || (defined(__GNUWIN32__) && !defined(__MINGW32__)) || defined(__WINE__) || defined(__WXMICROWIN__) + #ifndef MSVCRT if ( mkdir(wxFNCONV(dirname), perm) != 0 ) + #else + if ( mkdir(wxFNCONV(dirname)) != 0 ) + #endif #elif defined(__WXPM__) if (::DosCreateDir((PSZ)dirname, NULL) != 0) // enhance for EAB's?? #elif defined(__DOS__) @@ -1282,23 +1313,23 @@ bool wxMkdir(const wxString& dir, int perm) { wxLogSysError(_("Directory '%s' couldn't be created"), dirname); - return false; + return FALSE; } - return true; + return TRUE; #endif // Mac/!Mac } bool wxRmdir(const wxString& dir, int WXUNUSED(flags)) { #ifdef __VMS__ - return false; //to be changed since rmdir exists in VMS7.x + return FALSE; //to be changed since rmdir exists in VMS7.x #elif defined(__WXPM__) return (::DosDeleteDir((PSZ)dir.c_str()) == 0); #else #ifdef __SALFORDC__ - return false; // What to do? + return FALSE; // What to do? #else return (wxRmDir(OS_FILENAME(dir)) == 0); #endif @@ -1375,7 +1406,7 @@ wxString wxFindFirstFile(const wxChar *spec, int flags) wxSplitPath(spec, &gs_dirPath, NULL, NULL); if ( gs_dirPath.IsEmpty() ) gs_dirPath = wxT("."); - if ( gs_dirPath.Last() != wxFILE_SEP_PATH ) + if ( !wxEndsWithPathSeparator(gs_dirPath ) ) gs_dirPath << wxFILE_SEP_PATH; if (gs_dir) @@ -1434,17 +1465,17 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) buf = new wxChar[sz + 1]; } - bool ok = false; + bool ok = FALSE; // for the compilers which have Unicode version of _getcwd(), call it // directly, for the others call the ANSI version and do the translation #if !wxUSE_UNICODE #define cbuf buf #else // wxUSE_UNICODE - bool needsANSI = true; + bool needsANSI = TRUE; #if !defined(HAVE_WGETCWD) || wxUSE_UNICODE_MSLU - // This is not legal code as the compiler + // This is not legal code as the compiler // is allowed destroy the wxCharBuffer. // wxCharBuffer c_buffer(sz); // char *cbuf = (char*)(const char*)c_buffer; @@ -1455,11 +1486,11 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) #if wxUSE_UNICODE_MSLU if ( wxGetOsVersion() != wxWIN95 ) #else - char *cbuf = NULL; // never really used because needsANSI will always be false + char *cbuf = NULL; // never really used because needsANSI will always be FALSE #endif { ok = _wgetcwd(buf, sz) != NULL; - needsANSI = false; + needsANSI = FALSE; } #endif @@ -1484,15 +1515,12 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) cwdSpec.parID = pb.ioFCBParID; cwdSpec.name[0] = 0 ; wxString res = wxMacFSSpec2MacFilename( &cwdSpec ) ; - - strcpy( cbuf , res ) ; - cbuf[res.length()]=0 ; - - ok = true; + wxStrcpy( buf , res ) ; + ok = TRUE; } else { - ok = false; + ok = FALSE; } #elif defined(__VISAGECPP__) || (defined (__OS2__) && defined (__WATCOMC__)) APIRET rc; @@ -1505,7 +1533,7 @@ wxChar *wxGetWorkingDirectory(wxChar *buf, int sz) ok = getcwd(cbuf, sz) != NULL; #endif // platform - #if wxUSE_UNICODE + #if wxUSE_UNICODE && !defined(__WXMAC__) // finally convert the result to Unicode if needed wxConvFile.MB2WC(buf, cbuf, sz); #endif // wxUSE_UNICODE @@ -1555,7 +1583,7 @@ wxString wxGetCwd() wxGetWorkingDirectory(buffer, _MAXPATHLEN); wxString str( buffer ); delete [] buffer; - + return str; } @@ -1616,11 +1644,11 @@ bool wxEndsWithPathSeparator(const wxChar *pszFileName) return len && wxIsPathSeparator(pszFileName[len - 1]); } -// find a file in a list of directories, returns false if not found +// find a file in a list of directories, returns FALSE if not found bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFile) { // we assume that it's not empty - wxCHECK_MSG( !wxIsEmpty(pszFile), false, + wxCHECK_MSG( !wxIsEmpty(pszFile), FALSE, _T("empty file name in wxFindFileInPath")); // skip path separator in the beginning of the file name if present @@ -1655,7 +1683,7 @@ bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFi delete [] szPath; - return pc != NULL; // if true => we breaked from the loop + return pc != NULL; // if TRUE => we breaked from the loop } void WXDLLEXPORT wxSplitPath(const wxChar *pszFileName, @@ -1673,7 +1701,7 @@ time_t WXDLLEXPORT wxFileModificationTime(const wxString& filename) { wxStructStat buf; wxStat( filename, &buf); - + return buf.st_mtime; } @@ -1686,18 +1714,18 @@ bool wxIsWild( const wxString& pattern ) { wxString tmp = pattern; wxChar *pat = WXSTRINGCAST(tmp); - while (*pat) + while (*pat) { - switch (*pat++) + switch (*pat++) { case wxT('?'): case wxT('*'): case wxT('['): case wxT('{'): - return true; + return TRUE; case wxT('\\'): if (!*pat++) - return false; + return FALSE; } } - return false; + return FALSE; } /* @@ -1713,7 +1741,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) /* Match if both are empty. */ return pat.empty(); } - + const wxChar *m = pat.c_str(), *n = text.c_str(), *ma = NULL, @@ -1727,9 +1755,9 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) if (dot_special && (*n == wxT('.'))) { - /* Never match so that hidden Unix files + /* Never match so that hidden Unix files * are never found. */ - return false; + return FALSE; } for (;;) @@ -1746,7 +1774,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) { m++; if (!*n++) - return false; + return FALSE; } else { @@ -1755,7 +1783,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) m++; /* Quoting "nothing" is a bad thing */ if (!*m) - return false; + return FALSE; } if (!*m) { @@ -1765,9 +1793,9 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) * match */ if (!*n) - return true; + return TRUE; if (just) - return true; + return TRUE; just = 0; goto not_matched; } @@ -1799,7 +1827,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) * impossible to match it */ if (!*n) - return false; + return FALSE; if (mp) { m = mp; @@ -1821,7 +1849,7 @@ bool wxMatchWild( const wxString& pat, const wxString& text, bool dot_special ) count = acount; } else - return false; + return FALSE; } } }