diff -r 48b0adfe3059 -r 2523d03a840e librazor/razor.c --- a/librazor/razor.c Thu Jan 22 22:54:45 2009 +0000 +++ b/librazor/razor.c Wed Apr 29 17:00:01 2009 +0100 @@ -504,7 +504,7 @@ razor_set_find_entry(struct razor_set *set, struct razor_entry *dir, const char *pattern) { - struct razor_entry *e; + struct razor_entry *e, *subdir; const char *n, *pool = set->file_string_pool.data; int len; @@ -512,15 +512,18 @@ assert (dir != NULL); assert (pattern != NULL); - e = (struct razor_entry *) set->files.data + dir->start; + e = dir; do { n = pool + e->name; - if (strcmp(pattern + 1, n) == 0) + if (strcmp(pattern, n) == 0) return e; len = strlen(n); - if (e->start != 0 && strncmp(pattern + 1, n, len) == 0 && - pattern[len + 1] == '/') { - return razor_set_find_entry(set, e, pattern + len + 1); + if (e->start != 0 && strncmp(pattern, n, len) == 0 && + pattern[len] == '/') { + subdir = (struct razor_entry *) set->files.data + + e->start; + return razor_set_find_entry(set, subdir, + pattern + len + 1); } } while (!((e++)->flags & RAZOR_ENTRY_LAST)); @@ -531,10 +534,10 @@ list_dir(struct razor_set *set, struct razor_entry *dir, char *prefix, const char *pattern) { - struct razor_entry *e; + struct razor_entry *e, *subdir; const char *n, *pool = set->file_string_pool.data; - e = (struct razor_entry *) set->files.data + dir->start; + e = dir; do { n = pool + e->name; if (pattern && pattern[0] && fnmatch(pattern, n, 0) != 0) @@ -544,7 +547,9 @@ char *sub = prefix + strlen (prefix); *sub = '/'; strcpy (sub + 1, n); - list_dir(set, e, prefix, pattern); + subdir = (struct razor_entry *) set->files.data + + e->start; + list_dir(set, subdir, prefix, pattern); *sub = '\0'; } } while (!((e++)->flags & RAZOR_ENTRY_LAST)); @@ -553,20 +558,28 @@ RAZOR_EXPORT void razor_set_list_files(struct razor_set *set, const char *pattern) { - struct razor_entry *e; + struct razor_entry *root, *e; char buffer[512], *p, *base; assert (set != NULL); - if (pattern == NULL || !strcmp (pattern, "/")) { - buffer[0] = '\0'; - list_dir(set, set->files.data, buffer, NULL); + root = (struct razor_entry *) set->files.data; + + if (pattern == NULL) { + p = set->file_string_pool.data; + e = root; + do { + if (e->start) { + strcpy(buffer, p + e->name); + list_dir(set, root + e->start, buffer, NULL); + } + } while (!((e++)->flags & RAZOR_ENTRY_LAST)); return; } strcpy(buffer, pattern); - e = razor_set_find_entry(set, set->files.data, buffer); - if (e && e->start > 0) { + e = razor_set_find_entry(set, root, buffer); + if (e && e->start) { base = NULL; } else { p = strrchr(buffer, '/'); @@ -577,9 +590,9 @@ base = NULL; } } - e = razor_set_find_entry(set, set->files.data, buffer); - if (e && e->start != 0) - list_dir(set, e, buffer, base); + e = razor_set_find_entry(set, root, buffer); + if (e && e->start) + list_dir(set, root + e->start, buffer, base); } RAZOR_EXPORT void