X-Git-Url: https://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Ffilesystem.C;h=60cdadb5f993f1fbc1a162b777ed33afcdd7c367;hp=62bf1a5a47573522a7568c8d6aeb91343b393bdc;hb=cb73d14fe59acbe8eba0a62f4af26a23072201fa;hpb=1baa507d5e5bff7918b9b579f018fd74636797fe diff --git a/cinelerra-5.1/guicast/filesystem.C b/cinelerra-5.1/guicast/filesystem.C index 62bf1a5a..60cdadb5 100644 --- a/cinelerra-5.1/guicast/filesystem.C +++ b/cinelerra-5.1/guicast/filesystem.C @@ -43,7 +43,7 @@ FileItem::FileItem() reset(); } -FileItem::FileItem(char *path, char *name, int is_dir, +FileItem::FileItem(const char *path, const char *name, int is_dir, int64_t size, time_t mtime, int item_no) { this->path = new char[strlen(path)]; @@ -284,125 +284,89 @@ int FileSystem::combine(ArrayList *dir_list, ArrayList *fi return 0; } -int FileSystem::test_filter(FileItem *file) +int FileSystem::test_filter(const char *url, const char *filter) { - char *filter1 = 0, *filter2 = filter, *subfilter1, *subfilter2; - int result = 0; - int done = 0, token_done; - int token_number = 0; - -// Don't filter directories - if(file->is_dir) return 0; + char string[BCTEXTLEN], string2[BCTEXTLEN]; + const char *filter1 = 0, *filter2 = filter; + int done = 0, result = 0, token_number = 0; -// Empty filename string - if(!file->name) return 1; - - do - { -// Get next token + do { // Get next token filter1 = strchr(filter2, '['); string[0] = 0; - -// Get next filter - if(filter1) - { - filter1++; - filter2 = strchr(filter1, ']'); - - if(filter2) - { - int i; - for(i = 0; filter1 + i < filter2; i++) - string[i] = filter1[i]; - string[i] = 0; + if( filter1 ) { // Get next filter + filter2 = strchr(++filter1, ']'); + if( filter2 ) { + int n = filter2 - filter1; + for( int i=0; iname; - subfilter1 = string; - token_done = 0; - result = 0; - - do - { + if( string[0] ) { // Process the token + const char *path = url; + const char *subfilter1 = string, *subfilter2 = 0; + int token_done = 0; + do { string2[0] = 0; subfilter2 = strchr(subfilter1, '*'); - - if(subfilter2) - { - int i; - for(i = 0; subfilter1 + i < subfilter2; i++) - string2[i] = subfilter1[i]; - - string2[i] = 0; + if( subfilter2 ) { + int n = subfilter2 - subfilter1; + for( int i=0; i string) - { - if(!strstr(path, string2)) - { - result = 1; - token_done = 1; - } + if( string2[0] ) { // Subfilter exists + if( subfilter1 > string ) { + const char *cp = strstr(path, string2); + if( !cp ) + result = token_done = 1; else - path = strstr(path, string2) + strlen(string2); + path = cp + strlen(string2); } - else -// Subfilter must exist at this point in the string - { - if(strncmp(path, string2, strlen(string2))) -// if(strncasecmp(path, string2, strlen(string2))) - { - result = 1; - token_done = 1; - } + else { // Subfilter exists + if( strncmp(path, string2, strlen(string2)) ) // strncasecmp? + result = token_done = 1; else - path += strlen(string2); + path += strlen(string2); } // String must terminate after subfilter - if(!subfilter2) - { - if(*path != 0) - { - result = 1; - token_done = 1; - } + if( !subfilter2 ) { + if( *path ) + result = token_done = 1; } } subfilter1 = subfilter2 + 1; // Let pass if no subfilter - }while(!token_done && !result); + } while( !token_done && !result ); } - token_number++; - }while(!done && result); + ++token_number; + } while( !done && result ); return result; } +int FileSystem::test_filter(FileItem *file) +{ +// Don't filter directories + if( file->is_dir ) return 0; + if( !file->name ) return 1; + return test_filter(file->name, this->filter); +} int FileSystem::scan_directory(const char *new_dir) {