+++ /dev/null
-#include <cpPlugins/OS/DirContents.h>
-#include <cpPlugins/OS/tinydir.h>
-#include <sstream>
-
-// -------------------------------------------------------------------------
-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, path_str + 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$