librazor/razor.c
changeset 362 cf88b5df2884
parent 351 48b0adfe3059
child 363 c75a2d5caae9
     1.1 --- a/librazor/razor.c	Thu Jan 22 22:54:45 2009 +0000
     1.2 +++ b/librazor/razor.c	Fri May 01 16:43:37 2009 +0100
     1.3 @@ -504,7 +504,7 @@
     1.4  razor_set_find_entry(struct razor_set *set,
     1.5  		     struct razor_entry *dir, const char *pattern)
     1.6  {
     1.7 -	struct razor_entry *e;
     1.8 +	struct razor_entry *e, *subdir;
     1.9  	const char *n, *pool = set->file_string_pool.data;
    1.10  	int len;
    1.11  
    1.12 @@ -512,15 +512,18 @@
    1.13  	assert (dir != NULL);
    1.14  	assert (pattern != NULL);
    1.15  
    1.16 -	e = (struct razor_entry *) set->files.data + dir->start;
    1.17 +	e = dir;
    1.18  	do {
    1.19  		n = pool + e->name;
    1.20 -		if (strcmp(pattern + 1, n) == 0)
    1.21 +		if (strcmp(pattern, n) == 0)
    1.22  			return e;
    1.23  		len = strlen(n);
    1.24 -		if (e->start != 0 && strncmp(pattern + 1, n, len) == 0 &&
    1.25 -		    pattern[len + 1] == '/') {
    1.26 -			return razor_set_find_entry(set, e, pattern + len + 1);
    1.27 +		if (e->start != 0 && strncmp(pattern, n, len) == 0 &&
    1.28 +		    pattern[len] == '/') {
    1.29 +			subdir = (struct razor_entry *) set->files.data +
    1.30 +				 e->start;
    1.31 +			return razor_set_find_entry(set, subdir,
    1.32 +						    pattern + len + 1);
    1.33  		}
    1.34  	} while (!((e++)->flags & RAZOR_ENTRY_LAST));
    1.35  
    1.36 @@ -531,10 +534,10 @@
    1.37  list_dir(struct razor_set *set, struct razor_entry *dir,
    1.38  	 char *prefix, const char *pattern)
    1.39  {
    1.40 -	struct razor_entry *e;
    1.41 +	struct razor_entry *e, *subdir;
    1.42  	const char *n, *pool = set->file_string_pool.data;
    1.43  
    1.44 -	e = (struct razor_entry *) set->files.data + dir->start;
    1.45 +	e = dir;
    1.46  	do {
    1.47  		n = pool + e->name;
    1.48  		if (pattern && pattern[0] && fnmatch(pattern, n, 0) != 0)
    1.49 @@ -544,7 +547,9 @@
    1.50  			char *sub = prefix + strlen (prefix);
    1.51  			*sub = '/';
    1.52  			strcpy (sub + 1, n);
    1.53 -			list_dir(set, e, prefix, pattern);
    1.54 +			subdir = (struct razor_entry *) set->files.data +
    1.55 +				 e->start;
    1.56 +			list_dir(set, subdir, prefix, pattern);
    1.57  			*sub = '\0';
    1.58  		}
    1.59  	} while (!((e++)->flags & RAZOR_ENTRY_LAST));
    1.60 @@ -553,20 +558,28 @@
    1.61  RAZOR_EXPORT void
    1.62  razor_set_list_files(struct razor_set *set, const char *pattern)
    1.63  {
    1.64 -	struct razor_entry *e;
    1.65 +	struct razor_entry *root, *e;
    1.66  	char buffer[512], *p, *base;
    1.67  
    1.68  	assert (set != NULL);
    1.69  
    1.70 -	if (pattern == NULL || !strcmp (pattern, "/")) {
    1.71 -		buffer[0] = '\0';
    1.72 -		list_dir(set, set->files.data, buffer, NULL);
    1.73 +	root = (struct razor_entry *) set->files.data;
    1.74 +
    1.75 +	if (pattern == NULL) {
    1.76 +		p = set->file_string_pool.data;
    1.77 +		e = root;
    1.78 +		do {
    1.79 +			if (e->start) {
    1.80 +				strcpy(buffer, p + e->name);
    1.81 +				list_dir(set, root + e->start, buffer, NULL);
    1.82 +			}
    1.83 +		} while (!((e++)->flags & RAZOR_ENTRY_LAST));
    1.84  		return;
    1.85  	}
    1.86  
    1.87  	strcpy(buffer, pattern);
    1.88 -	e = razor_set_find_entry(set, set->files.data, buffer);
    1.89 -	if (e && e->start > 0) {
    1.90 +	e = razor_set_find_entry(set, root, buffer);
    1.91 +	if (e && e->start) {
    1.92  		base = NULL;
    1.93  	} else {
    1.94  		p = strrchr(buffer, '/');
    1.95 @@ -577,9 +590,9 @@
    1.96  			base = NULL;
    1.97  		}
    1.98  	}
    1.99 -	e = razor_set_find_entry(set, set->files.data, buffer);
   1.100 -	if (e && e->start != 0)
   1.101 -		list_dir(set, e, buffer, base);
   1.102 +	e = razor_set_find_entry(set, root, buffer);
   1.103 +	if (e && e->start)
   1.104 +		list_dir(set, root + e->start, buffer, base);
   1.105  }
   1.106  
   1.107  RAZOR_EXPORT void