#include #include #include // ------------------------------------------------------------------------- std::set< std::string > cpPlugins::OS:: LoadDirContents( const std::string& path, bool recursive, const std::string& pattern ) { // Prepare inputs and outputs std::stringstream path_stream; path_stream << path << cpPlugins_PATH_SEPARATOR; std::string path_str = path_stream.str( ); std::set< std::string > output; // Process data tinydir_dir dir; if( tinydir_open_sorted( &dir, path.c_str( ) ) != -1 ) { for( auto i = 0; i < dir.n_files; i++ ) { tinydir_file file; if( tinydir_readfile_n( &dir, &file , i ) != -1 ) { std::string fname = path_str + file.name; if( file.is_dir ) { if( recursive ) { if( fname != "." && fname != ".." ) { auto tmp = cpPlugins::OS::LoadDirContents( fname, true ); output.insert( tmp.begin( ), tmp.end( ) ); } // fi } // fi } else { if( pattern != "" ) { if( cpPlugins::OS::Glob( fname, pattern ) ) output.insert( fname ); } else output.insert( fname ); } // fi } // fi } // rof } // fi tinydir_close( &dir ); return( output ); } // ------------------------------------------------------------------------ void cpPlugins::OS:: SplitPath( std::string& dname, std::string& fname, const std::string& path ) { auto found = path.find_last_of( "/\\" ); dname = path.substr( 0, found ); fname = path.substr( found + 1 ); } // ------------------------------------------------------------------------ int cpPlugins::OS:: GlobMatch( const char* target, const char* pattern ) { char* pat = const_cast< char* >( pattern ); char* end = strchr( pat, ']' ); char* ptr; if( *pat == '[' && end != NULL ) { if( end == pat + 1 ) { end = strchr( pat + 2, ']' ); if( end == NULL ) return( 0 ); } // fi if( end - pat == 4 && pat[ 2 ] == '-' && pat[ 1 ] <= pattern[ 3 ] ) { if( *target >= pat[ 1 ] && *target <= pat[ 3 ] ) return( 5 ); else return( 0 ); } // fi ptr = strchr( pat + 1, *target ); if( ptr != NULL && ptr < end ) return( end - pat + 1 ); else return( 0 ); } // fi if( *pat == '?' && *target != 0 ) return( 1 ); if( *pat == '*' ) return( 0 ); if( *target == 0 || *pat == 0 ) return( 0 ); if( *target == *pat ) return( 1 ); return( 0 ); } // ------------------------------------------------------------------------ bool cpPlugins::OS:: Glob( const std::string& line, const std::string& pattern ) { const char* target = line.c_str( ); const char* pat = pattern.c_str( ); int gobble; while( ( gobble = GlobMatch( target, pat ) ) ) { target++; pat += gobble; } // elihw if( *target == 0 && *pat == 0 ) return( true ); else if( *pat == '*' ) { while( pat[ 1 ] == '*' ) pat++; if( pat[ 1 ] == 0 ) return( true ); while( *target ) if( Glob( target++, pat + 1 ) ) return( 1 ); } // fi return( false ); } // eof - $RCSfile$