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)];
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; i<n; ++i ) string[i] = filter1[i];
+ string[n] = 0;
}
- else
- {
+ else {
strcpy(string, filter1);
done = 1;
}
}
- else
- {
- if(!token_number)
+ else {
+ if( !token_number )
strcpy(string, filter);
else
done = 1;
}
-// Process the token
- if(string[0] != 0)
- {
- char *path = file->name;
- subfilter1 = string;
- token_done = 0;
+ if( string[0] ) { // Process the token
+ const char *path = url;
+ const char *subfilter1 = string, *subfilter2 = 0;
+ int token_done = 0;
result = 0;
-
- do
- {
+ 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<n; ++i ) string2[i] = subfilter1[i];
+ string2[n] = 0;
}
- else
- {
+ else {
strcpy(string2, subfilter1);
token_done = 1;
}
- if(string2[0] != 0)
- {
-// Subfilter must exist at some later point in the string
- if(subfilter1 > 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)
{