]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
add support for C11 Annex K qsort_s()
authorYann Collet <cyan@fb.com>
Tue, 11 Mar 2025 20:30:25 +0000 (13:30 -0700)
committerYann Collet <cyan@fb.com>
Tue, 11 Mar 2025 21:10:35 +0000 (14:10 -0700)
standard defined re-entrant variant of qsort().
Unfortunately, Annex K is optional.

.github/workflows/dev-short-tests.yml
lib/dictBuilder/cover.c

index 164dc15c7e81fe6349e6580a0d0aff30c8483c61..da35ec67556414ed6c321657da1b072ca95622b8 100644 (file)
@@ -693,7 +693,7 @@ jobs:
       - name: Install musl-tools
         run: |
           sudo apt install -y musl-tools
-      - name: Compile the project with musl-gcc
+      - name: Compile with musl-gcc and test-zstd
         run: |
           CC=musl-gcc CFLAGS="-Werror -O3" CPPFLAGS=-DZDICT_QSORT=ZDICT_QSORT_C90 make -j -C tests test-zstd V=1
 
index 9ed360033bbc0c717cce253e0cf73ed58261d68c..467c1b17f68c6326b40eda2931103004ff8ec8db 100644 (file)
@@ -29,6 +29,8 @@
 # endif
 #endif
 
+#define __STDC_WANT_LIB_EXT1__ 1 /* request C11 Annex K, which includes qsort_s() */
+
 #include <stdio.h>  /* fprintf */
 #include <stdlib.h> /* malloc, free, qsort_r */
 
@@ -68,8 +70,9 @@
 #define ZDICT_QSORT_C90 ZDICT_QSORT_MIN
 #define ZDICT_QSORT_GNU 1
 #define ZDICT_QSORT_APPLE 2
-#define ZDICT_QSORT_MSVC ZDICT_QSORT_MAX
-#define ZDICT_QSORT_MAX 3
+#define ZDICT_QSORT_MSVC 3
+#define ZDICT_QSORT_C11 ZDICT_QSORT_MAX
+#define ZDICT_QSORT_MAX 4
 
 #ifndef ZDICT_QSORT
 # if defined(__APPLE__)
@@ -77,7 +80,9 @@
 # elif defined(_GNU_SOURCE)
 #   define ZDICT_QSORT ZDICT_QSORT_GNU /* uses qsort_r() */
 # elif defined(_WIN32) && defined(_MSC_VER)
-#   define ZDICT_QSORT ZDICT_QSORT_MSVC /* uses qsort_s() */
+#   define ZDICT_QSORT ZDICT_QSORT_MSVC /* uses qsort_s() with a different order for parameters */
+# elif defined(STDC_LIB_EXT1) && (STDC_LIB_EXT1 > 0) /* C11 Annex K */
+#   define ZDICT_QSORT ZDICT_QSORT_C11 /* uses qsort_s() */
 # else
 #   define ZDICT_QSORT ZDICT_QSORT_C90 /* uses standard qsort() which is not re-entrant (requires global variable) */
 # endif
@@ -204,7 +209,7 @@ static U32 *COVER_map_at(COVER_map_t *map, U32 key) {
  */
 static void COVER_map_remove(COVER_map_t *map, U32 key) {
   U32 i = COVER_map_index(map, key);
-  COVER_map_pair_t *del = &map->data[i];
+  COVER_map_pair_tdel = &map->data[i];
   U32 shift = 1;
   if (del->value == MAP_EMPTY_VALUE) {
     return;
@@ -307,7 +312,7 @@ static int COVER_cmp8(COVER_ctx_t *ctx, const void *lp, const void *rp) {
  */
 #if (ZDICT_QSORT == ZDICT_QSORT_MSVC) || (ZDICT_QSORT == ZDICT_QSORT_APPLE)
 static int WIN_CDECL COVER_strict_cmp(void* g_coverCtx, const void* lp, const void* rp) {
-#elif (ZDICT_QSORT == ZDICT_QSORT_GNU)
+#elif (ZDICT_QSORT == ZDICT_QSORT_GNU) || (ZDICT_QSORT == ZDICT_QSORT_C11)
 static int COVER_strict_cmp(const void *lp, const void *rp, void *g_coverCtx) {
 #else /* C90 fallback.*/
 static int COVER_strict_cmp(const void *lp, const void *rp) {
@@ -323,7 +328,7 @@ static int COVER_strict_cmp(const void *lp, const void *rp) {
  */
 #if (ZDICT_QSORT == ZDICT_QSORT_MSVC) || (ZDICT_QSORT == ZDICT_QSORT_APPLE)
 static int WIN_CDECL COVER_strict_cmp8(void* g_coverCtx, const void* lp, const void* rp) {
-#elif (ZDICT_QSORT == ZDICT_QSORT_GNU)
+#elif (ZDICT_QSORT == ZDICT_QSORT_GNU) || (ZDICT_QSORT == ZDICT_QSORT_C11)
 static int COVER_strict_cmp8(const void *lp, const void *rp, void *g_coverCtx) {
 #else /* C90 fallback.*/
 static int COVER_strict_cmp8(const void *lp, const void *rp) {
@@ -355,6 +360,10 @@ static void stableSort(COVER_ctx_t *ctx)
     qsort_s(ctx->suffix, ctx->suffixSize, sizeof(U32),
             (ctx->d <= 8 ? &COVER_strict_cmp8 : &COVER_strict_cmp),
             ctx);
+#elif (ZDICT_QSORT == ZDICT_QSORT_C11)
+    qsort_s(ctx->suffix, ctx->suffixSize, sizeof(U32),
+            (ctx->d <= 8 ? &COVER_strict_cmp8 : &COVER_strict_cmp),
+            ctx);
 #elif defined(__OpenBSD__)
     /* On OpenBSD, qsort() is not guaranteed to be stable, their mergesort() is.
      * Note(@cyan): qsort() is never guaranteed to be stable,