wxFindFirst/NextFile() now return wxString and not "char *", wxGetCwd() added

(to be used instead of wxGetWorkingDirectory)


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1656 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-02-09 17:04:29 +00:00
parent 30b21f9a04
commit 7af89395ba
4 changed files with 342 additions and 310 deletions

View File

@@ -10,7 +10,7 @@
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "filefn.h"
#pragma implementation "filefn.h"
#endif
// For compilers that support precompilation, includes "wx.h".
@@ -18,11 +18,11 @@
#include "wx/defs.h"
#ifdef __BORLANDC__
#pragma hdrstop
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/defs.h"
#include "wx/defs.h"
#endif
#include "wx/utils.h"
@@ -46,42 +46,42 @@
#include <time.h>
#ifndef __MWERKS__
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/stat.h>
#else
#include <stat.h>
#include <unistd.h>
#include <stat.h>
#include <unistd.h>
#endif
#ifdef __UNIX__
#include <unistd.h>
#include <dirent.h>
#include <unistd.h>
#include <dirent.h>
#endif
#ifdef __WINDOWS__
#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__)
#include <direct.h>
#include <dos.h>
#endif
#endif
#include <direct.h>
#include <dos.h>
#endif // __WINDOWS__
#endif // native Win compiler
#ifdef __GNUWIN32__
#ifndef __TWIN32__
#include <sys/unistd.h>
#endif
#ifndef __TWIN32__
#include <sys/unistd.h>
#endif
#define stricmp strcasecmp
#define stricmp strcasecmp
#endif
#ifdef __BORLANDC__ // Please someone tell me which version of Borland needs
// this (3.1 I believe) and how to test for it.
// If this works for Borland 4.0 as well, then no worries.
#include <dir.h>
#include <dir.h>
#endif
#ifdef __SALFORDC__
#include <dir.h>
#include <unix.h>
#include <dir.h>
#include <unix.h>
#endif
#include "wx/setup.h"
@@ -89,29 +89,29 @@
// No, Cygwin doesn't appear to have fnmatch.h after all.
#if defined(HAVE_FNMATCH_H)
#include "fnmatch.h"
#include "fnmatch.h"
#endif
#ifdef __WINDOWS__
#include "windows.h"
#include "windows.h"
#endif
#define _MAXPATHLEN 500
extern char *wxBuffer;
#ifdef __WXMAC__
extern char gwxMacFileName[] ;
extern char gwxMacFileName2[] ;
extern char gwxMacFileName3[] ;
extern char gwxMacFileName[] ;
extern char gwxMacFileName2[] ;
extern char gwxMacFileName3[] ;
#endif
#if !USE_SHARED_LIBRARIES
IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList)
IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList)
#endif
void wxPathList::Add (const wxString& path)
{
wxStringList::Add ((char *)(const char *)path);
wxStringList::Add ((char *)(const char *)path);
}
// Add paths e.g. from the PATH environment variable
@@ -148,13 +148,12 @@ void wxPathList::AddEnvList (const wxString& envVariable)
// to the list if not already there.
void wxPathList::EnsureFileAccessible (const wxString& path)
{
wxString path1(path);
char *path_only = wxPathOnly (WXSTRINGCAST path1);
if (path_only)
{
if (!Member (wxString(path_only)))
Add (wxString(path_only));
}
wxString path_only(wxPathOnly(path));
if ( !path_only.IsEmpty() )
{
if ( !Member(path_only) )
Add(path_only);
}
}
bool wxPathList::Member (const wxString& path)
@@ -391,7 +390,7 @@ char *wxCopyAbsolutePath(const wxString& filename)
if (! IsAbsolutePath(wxExpandPath(wxBuffer, filename))) {
char buf[_MAXPATHLEN];
buf[0] = '\0';
wxGetWorkingDirectory(buf, sizeof(buf)/sizeof(char));
wxGetWorkingDirectory(buf, WXSIZEOF(buf));
char ch = buf[strlen(buf) - 1];
#ifdef __WXMSW__
if (ch != '\\' && ch != '/')
@@ -1135,268 +1134,280 @@ char *wxGetTempFileName(const wxString& prefix, char *buf)
// Flags are reserved for future use.
#ifndef __VMS__
static DIR *wxDirStream = (DIR *) NULL;
static char *wxFileSpec = (char *) NULL;
static int wxFindFileFlags = 0;
static DIR *gs_dirStream = (DIR *) NULL;
static wxString gs_strFileSpec;
static int gs_findFlags = 0;
#endif
char *wxFindFirstFile(const char *spec, int flags)
wxString wxFindFirstFile(const char *spec, int flags)
{
wxString result;
#ifndef __VMS__
if (wxDirStream)
closedir(wxDirStream); // edz 941103: better housekeping
if (gs_dirStream)
closedir(gs_dirStream); // edz 941103: better housekeping
wxFindFileFlags = flags;
gs_findFlags = flags;
if (wxFileSpec)
delete[] wxFileSpec;
wxFileSpec = copystring(spec);
gs_strFileSpec = spec;
// Find path only so we can concatenate
// found file onto path
char *p = wxPathOnly(wxFileSpec);
// Find path only so we can concatenate
// found file onto path
wxString path(wxPathOnly(gs_strFileSpec));
/* MATTHEW: special case: path is really "/" */
if (p && !*p && *wxFileSpec == '/')
p = "/";
/* MATTHEW: p is NULL => Local directory */
if (!p)
p = ".";
// special case: path is really "/"
if ( !path && gs_strFileSpec[0u] == '/' )
path = '/';
// path is empty => Local directory
if ( !path )
path = '.';
if ((wxDirStream=opendir(p))==NULL)
return (char *) NULL;
gs_dirStream = opendir(path);
if ( !gs_dirStream )
{
wxLogSysError(_("Can not enumerate files in directory '%s'"),
path.c_str());
}
else
{
result = wxFindNextFile();
}
#endif // !VMS
/* MATTHEW: [5] wxFindNextFile can do the rest of the work */
return wxFindNextFile();
#endif
// ifndef __VMS__
return (char *) NULL;
return result;
}
char *wxFindNextFile(void)
wxString wxFindNextFile()
{
wxString result;
#ifndef __VMS__
static char buf[400]; // FIXME static buffer
wxCHECK_MSG( gs_dirStream, result, "must call wxFindFirstFile first" );
/* MATTHEW: [2] Don't crash if we read too many times */
if (!wxDirStream)
return (char *) NULL;
// Find path only so we can concatenate
// found file onto path
wxString path(wxPathOnly(gs_strFileSpec));
wxString name(wxFileNameFromPath(gs_strFileSpec));
// Find path only so we can concatenate
// found file onto path
char *p = wxPathOnly(wxFileSpec);
char *n = wxFileNameFromPath(wxFileSpec);
/* MATTHEW: special case: path is really "/" */
if ( !path && gs_strFileSpec[0u] == '/')
path = '/';
/* MATTHEW: special case: path is really "/" */
if (p && !*p && *wxFileSpec == '/')
p = "/";
// Do the reading
struct dirent *nextDir;
for ( nextDir = readdir(gs_dirStream);
nextDir != NULL;
nextDir = readdir(gs_dirStream) )
{
if (wxMatchWild(name, nextDir->d_name))
{
result.Empty();
if ( !path.IsEmpty() )
{
result = path;
if ( path != '/' )
result += '/';
}
// Do the reading
struct dirent *nextDir;
for (nextDir = readdir(wxDirStream); nextDir != NULL; nextDir = readdir(wxDirStream))
{
result += nextDir->d_name;
/* MATTHEW: [5] Only return "." and ".." when they match, and only return
directories when flags & wxDIR */
if (wxMatchWild(n, nextDir->d_name)) {
bool isdir;
// Only return "." and ".." when they match
bool isdir;
if ( (strcmp(nextDir->d_name, ".") == 0) ||
(strcmp(nextDir->d_name, "..") == 0))
{
if ( (gs_findFlags & wxDIR) != 0 )
isdir = TRUE;
else
continue;
}
else
isdir = wxDirExists(result);
buf[0] = 0;
if (p && *p) {
strcpy(buf, p);
if (strcmp(p, "/") != 0)
strcat(buf, "/");
}
strcat(buf, nextDir->d_name);
if ((strcmp(nextDir->d_name, ".") == 0) ||
(strcmp(nextDir->d_name, "..") == 0)) {
if (wxFindFileFlags && !(wxFindFileFlags & wxDIR))
continue;
isdir = TRUE;
} else
isdir = wxDirExists(buf);
if (!wxFindFileFlags
|| ((wxFindFileFlags & wxDIR) && isdir)
|| ((wxFindFileFlags & wxFILE) && !isdir))
return buf;
// and only return directories when flags & wxDIR
if ( !gs_findFlags ||
((gs_findFlags & wxDIR) && isdir) ||
((gs_findFlags & wxFILE) && !isdir) )
{
return result;
}
}
}
}
closedir(wxDirStream);
wxDirStream = (DIR *) NULL;
#endif
// ifndef __VMS__
return (char *) NULL;
result.Empty(); // not found
closedir(gs_dirStream);
gs_dirStream = (DIR *) NULL;
#endif // !VMS
return result;
}
#elif defined(__WXMSW__)
#ifdef __WIN32__
HANDLE wxFileStrucHandle = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA wxFileStruc;
#else
#ifdef __BORLANDC__
static struct ffblk wxFileStruc;
#else
static struct _find_t wxFileStruc;
#endif
#endif
static wxString wxFileSpec = "";
static int wxFindFileFlags;
static HANDLE gs_hFileStruct = INVALID_HANDLE_VALUE;
static WIN32_FIND_DATA gs_findDataStruct;
#else // Win16
#ifdef __BORLANDC__
static struct ffblk gs_findDataStruct;
#else
static struct _find_t gs_findDataStruct;
#endif // Borland
#endif // Win32/16
char *wxFindFirstFile(const char *spec, int flags)
static wxString gs_strFileSpec;
static int gs_findFlags = 0;
wxString wxFindFirstFile(const char *spec, int flags)
{
wxFileSpec = spec;
wxFindFileFlags = flags; /* MATTHEW: [5] Remember flags */
wxString result;
// Find path only so we can concatenate
// found file onto path
wxString path1(wxFileSpec);
char *p = wxPathOnly(WXSTRINGCAST path1);
if (p && (strlen(p) > 0))
strcpy(wxBuffer, p);
else
wxBuffer[0] = 0;
gs_strFileSpec = spec;
gs_findFlags = flags; /* MATTHEW: [5] Remember flags */
// Find path only so we can concatenate found file onto path
wxString path(wxPathOnly(gs_strFileSpec));
if ( !path.IsEmpty() )
result << path << '\\';
#ifdef __WIN32__
if (wxFileStrucHandle != INVALID_HANDLE_VALUE)
FindClose(wxFileStrucHandle);
if ( gs_hFileStruct != INVALID_HANDLE_VALUE )
FindClose(gs_hFileStruct);
wxFileStrucHandle = ::FindFirstFile(WXSTRINGCAST spec, &wxFileStruc);
gs_hFileStruct = ::FindFirstFile(WXSTRINGCAST spec, &gs_findDataStruct);
if (wxFileStrucHandle == INVALID_HANDLE_VALUE)
return NULL;
if ( gs_hFileStruct == INVALID_HANDLE_VALUE )
{
wxLogSysError(_("Can not enumerate files in directory '%s'"),
path.c_str());
bool isdir = !!(wxFileStruc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
result.Empty();
if (isdir && !(flags & wxDIR))
return wxFindNextFile();
else if (!isdir && flags && !(flags & wxFILE))
return wxFindNextFile();
return result;
}
if (wxBuffer[0] != 0)
strcat(wxBuffer, "\\");
strcat(wxBuffer, wxFileStruc.cFileName);
return wxBuffer;
#else
bool isdir = !!(gs_findDataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
int flag = _A_NORMAL;
if (flags & wxDIR) /* MATTHEW: [5] Use & */
flag = _A_SUBDIR;
#ifdef __BORLANDC__
if (findfirst(WXSTRINGCAST spec, &wxFileStruc, flag) == 0)
#else
if (_dos_findfirst(WXSTRINGCAST spec, flag, &wxFileStruc) == 0)
#endif
{
/* MATTHEW: [5] Check directory flag */
char attrib;
#ifdef __BORLANDC__
attrib = wxFileStruc.ff_attrib;
#else
attrib = wxFileStruc.attrib;
#endif
if (attrib & _A_SUBDIR) {
if (!(wxFindFileFlags & wxDIR))
if (isdir && !(flags & wxDIR))
return wxFindNextFile();
} else if (wxFindFileFlags && !(wxFindFileFlags & wxFILE))
else if (!isdir && flags && !(flags & wxFILE))
return wxFindNextFile();
result += gs_findDataStruct.cFileName;
return result;
#else
int flag = _A_NORMAL;
if (flags & wxDIR) /* MATTHEW: [5] Use & */
flag = _A_SUBDIR;
#ifdef __BORLANDC__
if (findfirst(WXSTRINGCAST spec, &gs_findDataStruct, flag) == 0)
#else
if (_dos_findfirst(WXSTRINGCAST spec, flag, &gs_findDataStruct) == 0)
#endif
{
/* MATTHEW: [5] Check directory flag */
char attrib;
#ifdef __BORLANDC__
attrib = gs_findDataStruct.ff_attrib;
#else
attrib = gs_findDataStruct.attrib;
#endif
if (attrib & _A_SUBDIR) {
if (!(gs_findFlags & wxDIR))
return wxFindNextFile();
} else if (gs_findFlags && !(gs_findFlags & wxFILE))
return wxFindNextFile();
if (wxBuffer[0] != 0)
strcat(wxBuffer, "\\");
result +=
#ifdef __BORLANDC__
strcat(wxBuffer, wxFileStruc.ff_name);
gs_findDataStruct.ff_name
#else
strcat(wxBuffer, wxFileStruc.name);
gs_findDataStruct.name
#endif
return wxBuffer;
}
else
return NULL;
;
}
#endif // __WIN32__
return result;
}
char *wxFindNextFile(void)
wxString wxFindNextFile()
{
// Find path only so we can concatenate
// found file onto path
wxString p2(wxFileSpec);
char *p = wxPathOnly(WXSTRINGCAST p2);
if (p && (strlen(p) > 0))
strcpy(wxBuffer, p);
else
wxBuffer[0] = 0;
wxString result;
try_again:
// Find path only so we can concatenate found file onto path
wxString path(wxPathOnly(gs_strFileSpec));
try_again:
#ifdef __WIN32__
if (wxFileStrucHandle == INVALID_HANDLE_VALUE)
return NULL;
if (gs_hFileStruct == INVALID_HANDLE_VALUE)
return NULL;
bool success = (FindNextFile(wxFileStrucHandle, &wxFileStruc) != 0);
if (!success) {
FindClose(wxFileStrucHandle);
wxFileStrucHandle = INVALID_HANDLE_VALUE;
return NULL;
}
bool success = (FindNextFile(gs_hFileStruct, &gs_findDataStruct) != 0);
if (!success)
{
FindClose(gs_hFileStruct);
gs_hFileStruct = INVALID_HANDLE_VALUE;
}
else
{
bool isdir = !!(gs_findDataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
bool isdir = !!(wxFileStruc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
if (isdir && !(gs_findFlags & wxDIR))
goto try_again;
else if (!isdir && gs_findFlags && !(gs_findFlags & wxFILE))
goto try_again;
if (isdir && !(wxFindFileFlags & wxDIR))
goto try_again;
else if (!isdir && wxFindFileFlags && !(wxFindFileFlags & wxFILE))
goto try_again;
if ( !path.IsEmpty() )
result << path << '\\';
result << gs_findDataStruct.cFileName;
}
if (wxBuffer[0] != 0)
strcat(wxBuffer, "\\");
strcat(wxBuffer, wxFileStruc.cFileName);
return wxBuffer;
#else
return result;
#else // Win16
#ifdef __BORLANDC__
if (findnext(&wxFileStruc) == 0)
if (findnext(&gs_findDataStruct) == 0)
#else
if (_dos_findnext(&wxFileStruc) == 0)
if (_dos_findnext(&gs_findDataStruct) == 0)
#endif
{
/* MATTHEW: [5] Check directory flag */
char attrib;
{
/* MATTHEW: [5] Check directory flag */
char attrib;
#ifdef __BORLANDC__
attrib = wxFileStruc.ff_attrib;
attrib = gs_findDataStruct.ff_attrib;
#else
attrib = wxFileStruc.attrib;
attrib = gs_findDataStruct.attrib;
#endif
if (attrib & _A_SUBDIR) {
if (!(wxFindFileFlags & wxDIR))
goto try_again;
} else if (wxFindFileFlags && !(wxFindFileFlags & wxFILE))
goto try_again;
if (attrib & _A_SUBDIR) {
if (!(gs_findFlags & wxDIR))
goto try_again;
} else if (gs_findFlags && !(gs_findFlags & wxFILE))
goto try_again;
if (wxBuffer[0] != 0)
strcat(wxBuffer, "\\");
result +=
#ifdef __BORLANDC__
strcat(wxBuffer, wxFileStruc.ff_name);
gs_findDataStruct.ff_name
#else
strcat(wxBuffer, wxFileStruc.name);
#endif
return wxBuffer;
}
else
return NULL;
gs_findDataStruct.name
#endif
;
}
#endif // Win32/16
return result;
}
#endif
// __WXMSW__
#endif // Unix/Windows
// Get current working directory.
// If buf is NULL, allocates space using new, else
@@ -1416,6 +1427,11 @@ char *wxGetWorkingDirectory(char *buf, int sz)
return buf;
}
wxString wxGetCwd()
{
return wxString(wxGetWorkingDirectory());
}
bool wxSetWorkingDirectory(const wxString& d)
{
#if defined( __UNIX__ ) || defined( __WXMAC__ )
@@ -1490,11 +1506,14 @@ bool wxFindFileInPath(wxString *pStr, const char *pszPath, const char *pszFile)
wxString strFile;
char *pc;
for ( pc = strtok(szPath, PATH_SEP); pc; pc = strtok((char *) NULL, PATH_SEP) ) {
for ( pc = strtok(szPath, wxPATH_SEP);
pc != NULL;
pc = strtok((char *) NULL, wxPATH_SEP) )
{
// search for the file in this directory
strFile = pc;
if ( !wxEndsWithPathSeparator(pc) )
strFile += FILE_SEP_PATH;
strFile += wxFILE_SEP_PATH;
strFile += pszFile;
if ( FileExists(strFile) ) {
@@ -1515,9 +1534,9 @@ void WXDLLEXPORT wxSplitPath(const char *pszFileName,
{
wxCHECK_RET( pszFileName, "NULL file name in wxSplitPath" );
const char *pDot = strrchr(pszFileName, FILE_SEP_EXT);
const char *pSepUnix = strrchr(pszFileName, FILE_SEP_PATH_UNIX);
const char *pSepDos = strrchr(pszFileName, FILE_SEP_PATH_DOS);
const char *pDot = strrchr(pszFileName, wxFILE_SEP_EXT);
const char *pSepUnix = strrchr(pszFileName, wxFILE_SEP_PATH_UNIX);
const char *pSepDos = strrchr(pszFileName, wxFILE_SEP_PATH_DOS);
// take the last of the two: nPosUnix containts the last slash in the
// filename