+#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 ;
+}
+