diff options
Diffstat (limited to 'libarchive/archive_util.c')
-rw-r--r-- | libarchive/archive_util.c | 76 |
1 files changed, 16 insertions, 60 deletions
diff --git a/libarchive/archive_util.c b/libarchive/archive_util.c index 3a8caad5262b..900abd0c3c62 100644 --- a/libarchive/archive_util.c +++ b/libarchive/archive_util.c @@ -77,7 +77,9 @@ #define O_CLOEXEC 0 #endif -static int archive_utility_string_sort_helper(char **, unsigned int); +#if ARCHIVE_VERSION_NUMBER < 4000000 +static int __LA_LIBC_CC archive_utility_string_sort_helper(const void *, const void *); +#endif /* Generic initialization of 'struct archive' objects. */ int @@ -629,74 +631,28 @@ __archive_ensure_cloexec_flag(int fd) #endif } +#if ARCHIVE_VERSION_NUMBER < 4000000 /* - * Utility function to sort a group of strings using quicksort. + * Utility functions to sort a group of strings using quicksort. */ static int -archive_utility_string_sort_helper(char **strings, unsigned int n) +__LA_LIBC_CC +archive_utility_string_sort_helper(const void *p1, const void *p2) { - unsigned int i, lesser_count, greater_count; - char **lesser, **greater, **tmp, *pivot; - int retval1, retval2; - - /* A list of 0 or 1 elements is already sorted */ - if (n <= 1) - return (ARCHIVE_OK); - - lesser_count = greater_count = 0; - lesser = greater = NULL; - pivot = strings[0]; - for (i = 1; i < n; i++) - { - if (strcmp(strings[i], pivot) < 0) - { - lesser_count++; - tmp = realloc(lesser, lesser_count * sizeof(*tmp)); - if (!tmp) { - free(greater); - free(lesser); - return (ARCHIVE_FATAL); - } - lesser = tmp; - lesser[lesser_count - 1] = strings[i]; - } - else - { - greater_count++; - tmp = realloc(greater, greater_count * sizeof(*tmp)); - if (!tmp) { - free(greater); - free(lesser); - return (ARCHIVE_FATAL); - } - greater = tmp; - greater[greater_count - 1] = strings[i]; - } - } + const char * const * const s1 = p1; + const char * const * const s2 = p2; - /* quicksort(lesser) */ - retval1 = archive_utility_string_sort_helper(lesser, lesser_count); - for (i = 0; i < lesser_count; i++) - strings[i] = lesser[i]; - free(lesser); - - /* pivot */ - strings[lesser_count] = pivot; - - /* quicksort(greater) */ - retval2 = archive_utility_string_sort_helper(greater, greater_count); - for (i = 0; i < greater_count; i++) - strings[lesser_count + 1 + i] = greater[i]; - free(greater); - - return (retval1 < retval2) ? retval1 : retval2; + return strcmp(*s1, *s2); } int archive_utility_string_sort(char **strings) { - unsigned int size = 0; - while (strings[size] != NULL) + size_t size = 0; + while (strings[size] != NULL) size++; - return archive_utility_string_sort_helper(strings, size); + qsort(strings, size, sizeof(char *), + archive_utility_string_sort_helper); + return (ARCHIVE_OK); } +#endif |