X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=filematch.c;h=997116766de56c1bf599543a16cb69dc0d9dfa21;hp=4bacbc15a1704029ff223c09b98a8c369bff8bf1;hb=9b793d68226cc30e873aa027ffc74c0fc98c5514;hpb=0f80ff51ff9f369233d17b3377d3a0d34b4c8e5a diff --git a/filematch.c b/filematch.c index 4bacbc15..99711676 100644 --- a/filematch.c +++ b/filematch.c @@ -117,22 +117,37 @@ void stringlistappend(stringlist_t *list, const char *text) list->numstrings++; } -void stringlistsort(stringlist_t *list) +static int stringlistsort_cmp(const void *a, const void *b) +{ + return strcasecmp(*(const char **)a, *(const char **)b); +} + +void stringlistsort(stringlist_t *list, qboolean uniq) { int i, j; - char *temp; - // this is a selection sort (finds the best entry for each slot) - for (i = 0;i < list->numstrings - 1;i++) + if(list->numstrings < 1) + return; + qsort(&list->strings[0], list->numstrings, sizeof(list->strings[0]), stringlistsort_cmp); + if(uniq) { - for (j = i + 1;j < list->numstrings;j++) + // i: the item to read + // j: the item last written + for (i = 1, j = 0; i < list->numstrings; ++i) { - if (strcasecmp(list->strings[i], list->strings[j]) > 0) - { - temp = list->strings[i]; - list->strings[i] = list->strings[j]; - list->strings[j] = temp; - } + char *save; + if(!strcasecmp(list->strings[i], list->strings[j])) + continue; + ++j; + save = list->strings[j]; + list->strings[j] = list->strings[i]; + list->strings[i] = save; + } + for(i = j+1; i < list->numstrings; ++i) + { + if (list->strings[i]) + Z_Free(list->strings[i]); } + list->numstrings = j+1; } }