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