+ }
+
+ if (!is_pattern && pattern[i]) /* no pattern and directory part */
+ {
+ i++; /* skip dir sep */
+ memcpy(prefix + prefix_len, pattern + off, i - off);
+ prefix[prefix_len + i - off] = '\0';
+ glob_r(res, pattern, i, prefix);
+ prefix[prefix_len] = '\0';
+ }
+ else if ((res->flags & YAZ_FILE_GLOB_FAIL_NOTEXIST) &&
+ !is_pattern && !pattern[i])
+ {
+ strcpy(prefix + prefix_len, pattern + off);
+ add_entry(res, prefix);
+ }
+ else
+ {
+ DIR * dir = opendir(*prefix ? prefix : "." );
+
+ if (dir)
+ {
+ struct dirent *ent;
+
+ while ((ent = readdir(dir)))
+ {
+ int r;
+ memcpy(prefix + prefix_len, pattern + off, i - off);
+ prefix[prefix_len + i - off] = '\0';
+ r = yaz_match_glob(prefix + prefix_len, ent->d_name);
+ prefix[prefix_len] = '\0';
+
+ if (r)
+ {
+ strcpy(prefix + prefix_len, ent->d_name);
+ if (pattern[i])
+ {
+ glob_r(res, pattern, i, prefix);
+ }
+ else
+ {
+ add_entry(res, prefix);
+ }
+ prefix[prefix_len] = '\0';
+ }
+ }
+ closedir(dir);
+ }
+ }
+}
+
+static int cmp_entry(const void *a, const void *b)
+{
+ struct res_entry *ent_a = *(struct res_entry **) a;
+ struct res_entry *ent_b = *(struct res_entry **) b;
+ return strcmp(ent_a->file, ent_b->file);
+}
+
+static void sort_them(yaz_glob_res_t res)
+{
+ size_t i;
+ struct res_entry **ent_p;
+ struct res_entry **ent = nmem_malloc(res->nmem, sizeof(*ent) * res->number_of_entries);
+ struct res_entry *ent_i = res->entries;
+ for (i = 0; i < res->number_of_entries; i++)
+ {
+ ent[i] = ent_i;
+ ent_i = ent_i->next;
+ }
+ qsort(ent, res->number_of_entries, sizeof(*ent), cmp_entry);
+ ent_p = &res->entries;
+ for (i = 0; i < res->number_of_entries; i++)
+ {
+ *ent_p = ent[i];
+ ent_p = &ent[i]->next;
+ }
+ *ent_p = 0;