From: Adam Dickmeiss Date: Tue, 2 Nov 2010 15:47:50 +0000 (+0100) Subject: yaz_file_glob sorts files X-Git-Tag: v4.1.4~14^2~25 X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=commitdiff_plain;h=25ede22cdd0f258801b169ecb6c787bf8e08ed54;hp=a668cd0857e0141abba373761d77dbd556b6414a yaz_file_glob sorts files --- diff --git a/src/file_glob.c b/src/file_glob.c index 065b5c5..fb92e0a 100644 --- a/src/file_glob.c +++ b/src/file_glob.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -97,6 +98,34 @@ static void glob_r(yaz_glob_res_t res, const char *pattern, size_t off, } } +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; +} + int yaz_file_glob(const char *pattern, yaz_glob_res_t *res) { char prefix[FILENAME_MAX+1]; @@ -109,6 +138,7 @@ int yaz_file_glob(const char *pattern, yaz_glob_res_t *res) (*res)->entries = 0; (*res)->last_entry = &(*res)->entries; glob_r(*res, pattern, 0, prefix); + sort_them(*res); return 0; }