-#if defined(__UNIX__)
-
-// Get first file name matching given wild card.
-// Flags are reserved for future use.
-
-#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 )
- static DIR *gs_dirStream = (DIR *) NULL;
- static wxString gs_strFileSpec;
- static int gs_findFlags = 0;
-#endif
-
-wxString wxFindFirstFile(const wxChar *spec, int flags)
-{
- wxString result;
-#ifdef __VMS
- wxChar *specvms = NULL;
-#endif
-
-#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 )
- if (gs_dirStream)
- closedir(gs_dirStream); // edz 941103: better housekeping
-
- gs_findFlags = flags;
-
- gs_strFileSpec = spec;
-
- // Find path only so we can concatenate
- // found file onto path
- wxString path(wxPathOnly(gs_strFileSpec));
-
- // special case: path is really "/"
- if ( !path && gs_strFileSpec[0u] == wxT('/') )
-#ifdef __VMS
- {
- wxStrcpy( specvms , wxT( "[000000]" ) );
- gs_strFileSpec = specvms;
- wxString path_vms(wxPathOnly(gs_strFileSpec));
- path = path_vms;
- }
-#else
- path = wxT('/');
-#endif
- // path is empty => Local directory
- if ( !path )
-#ifdef __VMS
- {
- wxStrcpy( specvms , wxT( "[]" ) );
- gs_strFileSpec = specvms;
- wxString path_vms1(wxPathOnly(gs_strFileSpec));
- path = path_vms1;
- }
-#else
- path = wxT('.');
-#endif
-
- gs_dirStream = opendir(path.fn_str());
- if ( !gs_dirStream )
- {
- wxLogSysError(_("Can not enumerate files in directory '%s'"),
- path.c_str());
- }
- else
- {
- result = wxFindNextFile();
- }
-#endif // !VMS6.x or earlier
-
- return result;
-}
-
-wxString wxFindNextFile()
-{
- wxString result;
-
-#if !defined( __VMS__ ) || ( __VMS_VER >= 70000000 )
- wxCHECK_MSG( gs_dirStream, result, wxT("must call wxFindFirstFile first") );
-
- // Find path only so we can concatenate
- // found file onto path
- wxString path(wxPathOnly(gs_strFileSpec));
- wxString name(wxFileNameFromPath(gs_strFileSpec));
-
- /* MATTHEW: special case: path is really "/" */
- if ( !path && gs_strFileSpec[0u] == wxT('/'))
- path = wxT('/');
-
- // Do the reading
- struct dirent *nextDir;
- for ( nextDir = readdir(gs_dirStream);
- nextDir != NULL;
- nextDir = readdir(gs_dirStream) )
- {
- 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() )
- {
- result = path;
- if ( path != wxT('/') )
- result += wxT('/');
- }
-
- result += nextDir->d_name;
-
- // 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);
-
- // and only return directories when flags & wxDIR
- if ( !gs_findFlags ||
- ((gs_findFlags & wxDIR) && isdir) ||
- ((gs_findFlags & wxFILE) && !isdir) )
- {
- return result;
- }
- }
- }
-
- result.Empty(); // not found
-
- closedir(gs_dirStream);
- gs_dirStream = (DIR *) NULL;
-#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 g_iter_spec ;
-
-wxString wxFindFirstFile(const wxChar *spec, int flags)
-{
- wxString result;
-
- g_iter_spec = spec ;
- g_iter_spec.MakeUpper() ;
- g_iter_flags = flags; /* MATTHEW: [5] Remember flags */
-
- // Find path only so we can concatenate found file onto path
- wxString path(wxPathOnly(spec));
- FSSpec fsspec ;
-
- wxMacFilename2FSSpec( path , &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 ;
- wxString name ;
-
- while(1)
- {
- 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) ;
-
- wxString name = wxMacFSSpec2MacFilename( &spec ) ;
- if ( g_iter_spec.Right(4)==(":*.*") || g_iter_spec.Right(2)==(":*") || name.Upper().Matches(g_iter_spec) )
- return name ;
- }
- return wxEmptyString ;
-}
-
-#elif defined(__WXMSW__)
-
-#ifdef __WIN32__
- 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
-
-static wxString gs_strFileSpec;
-static int gs_findFlags = 0;
-
-wxString wxFindFirstFile(const wxChar *spec, int flags)
-{
- wxString result;
-
- 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 << wxT('\\');
-
-#ifdef __WIN32__
- if ( gs_hFileStruct != INVALID_HANDLE_VALUE )
- FindClose(gs_hFileStruct);
-
- gs_hFileStruct = ::FindFirstFile(WXSTRINGCAST spec, &gs_findDataStruct);
-
- if ( gs_hFileStruct == INVALID_HANDLE_VALUE )
- {
- result.Empty();
-
- return result;
- }
-
- bool isdir = !!(gs_findDataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
-
- if (isdir && !(flags & wxDIR))
- return wxFindNextFile();
- else if (!isdir && flags && !(flags & wxFILE))
- return wxFindNextFile();
-
- result += gs_findDataStruct.cFileName;
-
- return result;
-#else // !Win32
- int flag = _A_NORMAL;
- if (flags & wxDIR)
- flag = _A_SUBDIR;
-
-#ifdef __BORLANDC__
- if (findfirst(WXSTRINGCAST spec, &gs_findDataStruct, flag) == 0)
-#else
- if (_dos_findfirst(WXSTRINGCAST spec, flag, &gs_findDataStruct) == 0)
-#endif
- {
- 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();
-
- result +=
-#ifdef __BORLANDC__
- gs_findDataStruct.ff_name
-#else
- gs_findDataStruct.name
-#endif
- ;
- }
-
- return result;
-#endif // __WIN32__
-}
-
-
-wxString wxFindNextFile()
-{
- wxString result;
-
- // Find path only so we can concatenate found file onto path
- wxString path(wxPathOnly(gs_strFileSpec));
-
-try_again:
-
-#ifdef __WIN32__
- if (gs_hFileStruct == INVALID_HANDLE_VALUE)
- return result;
-
- 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);
-
- if (isdir && !(gs_findFlags & wxDIR))
- goto try_again;
- else if (!isdir && gs_findFlags && !(gs_findFlags & wxFILE))
- goto try_again;
-
- if ( !path.IsEmpty() )
- result << path << wxT('\\');
- result << gs_findDataStruct.cFileName;
- }
-
- return result;
-#else // Win16
-
-#ifdef __BORLANDC__
- if (findnext(&gs_findDataStruct) == 0)
-#else
- if (_dos_findnext(&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))
- goto try_again;
- } else if (gs_findFlags && !(gs_findFlags & wxFILE))
- goto try_again;
-
-
- result +=
-#ifdef __BORLANDC__
- gs_findDataStruct.ff_name
-#else
- gs_findDataStruct.name
-#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;
-}
-
-#else // generic implementation:
-