]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Merge pull request #2650 from stoeckmann/string_sort
authorTim Kientzle <kientzle@acm.org>
Sat, 31 May 2025 02:33:34 +0000 (19:33 -0700)
committerMartin Matuska <martin@matuska.de>
Sat, 31 May 2025 19:25:32 +0000 (21:25 +0200)
archive_utility_string_sort: Use qsort directly

(cherry picked from commit e2eda9e68b7174eb37b80c0dd4761e71a989db5c)

libarchive/archive.h
libarchive/archive_util.c

index be8381413da2a38d5412c171b1a225958d77542a..8e2a882e9d317a1327568b9469bbf84cc50284b7 100644 (file)
@@ -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
 }
index 3a8caad5262b5c33812baaeaf34fc7a70e36fc22..900abd0c3c62027c8ee1a71962a7c5313d29e752 100644 (file)
@@ -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