From: Tim Kientzle Date: Sat, 31 May 2025 02:33:34 +0000 (-0700) Subject: Merge pull request #2650 from stoeckmann/string_sort X-Git-Tag: v3.8.1~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6050823986b3806d7839f614e61e84a1f9a1df02;p=thirdparty%2Flibarchive.git Merge pull request #2650 from stoeckmann/string_sort archive_utility_string_sort: Use qsort directly (cherry picked from commit e2eda9e68b7174eb37b80c0dd4761e71a989db5c) --- diff --git a/libarchive/archive.h b/libarchive/archive.h index be8381413..8e2a882e9 100644 --- a/libarchive/archive.h +++ b/libarchive/archive.h @@ -1250,8 +1250,10 @@ __LA_DECL int archive_match_include_gname_w(struct archive *, const wchar_t *); /* Utility functions */ +#if ARCHIVE_VERSION_NUMBER < 4000000 /* Convenience function to sort a NULL terminated list of strings */ __LA_DECL int archive_utility_string_sort(char **); +#endif #ifdef __cplusplus } diff --git a/libarchive/archive_util.c b/libarchive/archive_util.c index 3a8caad52..900abd0c3 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