From efd820a1655f808107a1984d55124ea142c66fa6 Mon Sep 17 00:00:00 2001 From: Tim Surber Date: Wed, 10 Apr 2024 23:31:58 +0200 Subject: [PATCH] backport qsort warning fix --- .../astrometry/include/astrometry/ioutils.h | 9 +++ .../include/astrometry/os-features-config.h | 4 +- .../include/astrometry/permutedsort.h | 2 +- stellarsolver/astrometry/os-features.h | 16 ------ stellarsolver/astrometry/util/bl-sort.c | 3 +- stellarsolver/astrometry/util/ioutils.c | 2 +- .../astrometry/util/os-features-test.c | 57 ------------------- stellarsolver/astrometry/util/os-features.c | 6 +- stellarsolver/astrometry/util/permutedsort.c | 3 +- .../astrometry/util/qsort_reentrant.c | 37 +++--------- 10 files changed, 27 insertions(+), 112 deletions(-) diff --git a/stellarsolver/astrometry/include/astrometry/ioutils.h b/stellarsolver/astrometry/include/astrometry/ioutils.h index 07f7eecf..e5cf63c8 100644 --- a/stellarsolver/astrometry/include/astrometry/ioutils.h +++ b/stellarsolver/astrometry/include/astrometry/ioutils.h @@ -31,6 +31,15 @@ char* dirname(const char* path); extern uint32_t ENDIAN_DETECTOR; +void QSORT_R(void* base, size_t nmembers, size_t member_size, + void* token, int (*compar)(void *, const void *, const void *)); + +/** + You should define the "comparison" function like this: + static int QSORT_COMPARISON_FUNCTION(my_comparison, void* token, const void* v1, const void* v2) { + */ +#define QSORT_COMPARISON_FUNCTION(func, thunk, v1, v2) func(thunk, v1, v2) + int copy_file(const char* infn, const char* outfn); int pad_fid(FILE* fid, size_t len, char pad); diff --git a/stellarsolver/astrometry/include/astrometry/os-features-config.h b/stellarsolver/astrometry/include/astrometry/os-features-config.h index a246d428..bcc336e9 100644 --- a/stellarsolver/astrometry/include/astrometry/os-features-config.h +++ b/stellarsolver/astrometry/include/astrometry/os-features-config.h @@ -1,4 +1,4 @@ -#define NEED_DECLARE_QSORT_R 0 -#define NEED_QSORT_R 1 +#define NEED_DECLARE_QSORT_R 1 +#define NEED_QSORT_R 0 #define NEED_SWAP_QSORT_R 0 #define HAVE_NETPBM 0 \ No newline at end of file diff --git a/stellarsolver/astrometry/include/astrometry/permutedsort.h b/stellarsolver/astrometry/include/astrometry/permutedsort.h index 23c1a7e9..d3590160 100644 --- a/stellarsolver/astrometry/include/astrometry/permutedsort.h +++ b/stellarsolver/astrometry/include/astrometry/permutedsort.h @@ -7,7 +7,7 @@ #define PERMUTED_SORT_H // for QSORT_COMPARISON_FUNCTION -#include "os-features.h" +#include "ioutils.h" /* Computes the permutation array that will cause the "realarray" to be diff --git a/stellarsolver/astrometry/os-features.h b/stellarsolver/astrometry/os-features.h index 2c2a9d19..90dd375f 100644 --- a/stellarsolver/astrometry/os-features.h +++ b/stellarsolver/astrometry/os-features.h @@ -108,22 +108,6 @@ -Ubuntu 8.10 */ -#if NEED_DECLARE_QSORT_R -//// NOTE: this declaration must match os-features-test.c . -void qsort_r(void *base, size_t nmemb, size_t sz, - void *userdata, - int (*compar)(void *, const void *, const void *)); -#endif - -#if NEED_SWAP_QSORT_R -#define QSORT_R(a,b,c,d,e) qsort_r(a,b,c,e,d) -#define QSORT_COMPARISON_FUNCTION(func, thunk, v1, v2) func(v1, v2, thunk) - -#else -#define QSORT_R qsort_r -#define QSORT_COMPARISON_FUNCTION(func, thunk, v1, v2) func(thunk, v1, v2) - -#endif // As suggested in http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Function-Names.html #if __STDC_VERSION__ < 199901L diff --git a/stellarsolver/astrometry/util/bl-sort.c b/stellarsolver/astrometry/util/bl-sort.c index 70123660..a024d271 100644 --- a/stellarsolver/astrometry/util/bl-sort.c +++ b/stellarsolver/astrometry/util/bl-sort.c @@ -3,6 +3,8 @@ # Licensed under a 3-clause BSD style license - see LICENSE */ +#include "ioutils.h" // for QSORT_R + #include "bl-sort.h" // for qsort_r #include "os-features.h" @@ -166,4 +168,3 @@ static int sort_helper_pl(const void* v1, const void* v2, void* userdata) { void pl_sort(pl* list, int (*compare)(const void* v1, const void* v2)) { bl_sort_with_userdata(list, sort_helper_pl, compare); } - diff --git a/stellarsolver/astrometry/util/ioutils.c b/stellarsolver/astrometry/util/ioutils.c index c490fb8c..b4ecba0b 100644 --- a/stellarsolver/astrometry/util/ioutils.c +++ b/stellarsolver/astrometry/util/ioutils.c @@ -43,7 +43,7 @@ #include "os-features.h" #include "ioutils.h" -//#include "os-features.h" +#include "qsort_reentrant.c" #include "errors.h" #include "log.h" diff --git a/stellarsolver/astrometry/util/os-features-test.c b/stellarsolver/astrometry/util/os-features-test.c index 445ac1cd..a274c16b 100644 --- a/stellarsolver/astrometry/util/os-features-test.c +++ b/stellarsolver/astrometry/util/os-features-test.c @@ -14,63 +14,6 @@ int main() { } #endif -#ifdef TEST_QSORT_R -static int cmp(void* u, const void* a, const void* b) { - return 0; -} -int main() { - int array; - int baton; - qsort_r(&array, 1, sizeof(int), &baton, cmp); - //printf("#define NEED_QSORT_R 0\n"); - return 0; -} -#endif - -#ifdef TEST_DECLARE_QSORT_R -// Test whether just declaring qsort_r as we do causes a compile failure. - -void qsort_r(void *base, size_t nmemb, size_t sz, - void *userdata, - int (*compar)(void *, const void *, const void *)); - -int main() { - //printf("#define NEED_DECLARE_QSORT_R 1\n"); - return 0; -} -#endif - -#ifdef TEST_SWAP_QSORT_R -// Use the result of TEST_DECLARE_QSORT_R and TEST_NEED_QSORT_R, or else -// this test will fail with a warning about undefined qsort_r -// Include .c rather than .h because we test with: -// gcc -o (exec) os-features-test.c -// and if NEED_QSORT_R, os-features.c includes qsort_reentrant.c -#include "os-features-config.h.tmp" -#define DONT_INCLUDE_OS_FEATURES_CONFIG_H 1 -#include "os-features.c" -#undef DONT_INCLUDE_OS_FEATURES_CONFIG_H -// Test whether qsort_r works unswapped. (ie, qsort_r matches the definition of -// QSORT_R defined in the os-features.h documentation.) -static int sortfunc(void* thunk, const void* v1, const void* v2) { - const int* i1 = v1; - const int* i2 = v2; - if (*i1 < *i2) - return -1; - if (*i1 > *i2) - return 1; - return 0; -} -int main() { - int array[] = { 4, 17, 88, 34, 12, 12, 17 }; - int N = sizeof(array)/sizeof(int); - int mythunk = 42; - qsort_r(array, N, sizeof(int), &mythunk, sortfunc); - //printf("#define NEED_SWAP_QSORT_R 0\n"); - return 0; -} -#endif - #if defined(TEST_NETPBM) || defined(TEST_NETPBM_MAKE) #include int main(int argc, char** args) { diff --git a/stellarsolver/astrometry/util/os-features.c b/stellarsolver/astrometry/util/os-features.c index 0c7d2b95..e95d463b 100644 --- a/stellarsolver/astrometry/util/os-features.c +++ b/stellarsolver/astrometry/util/os-features.c @@ -37,8 +37,4 @@ //int fdatasync(int fd) { // return fsync(fd); //} -//#endif - -#if NEED_QSORT_R -#include "qsort_reentrant.c" -#endif +//#endif \ No newline at end of file diff --git a/stellarsolver/astrometry/util/permutedsort.c b/stellarsolver/astrometry/util/permutedsort.c index 0bc42298..e37b7e19 100644 --- a/stellarsolver/astrometry/util/permutedsort.c +++ b/stellarsolver/astrometry/util/permutedsort.c @@ -17,7 +17,8 @@ #endif #include "permutedsort.h" -#include "os-features.h" // for qsort_r +#include "os-features.h" +#include "ioutils.h" int* permutation_init(int* perm, int N) { int i; diff --git a/stellarsolver/astrometry/util/qsort_reentrant.c b/stellarsolver/astrometry/util/qsort_reentrant.c index 982aa3e1..bce9147a 100644 --- a/stellarsolver/astrometry/util/qsort_reentrant.c +++ b/stellarsolver/astrometry/util/qsort_reentrant.c @@ -35,14 +35,14 @@ #endif //__FBSDID("$FreeBSD: src/sys/libkern/qsort.c,v 1.15 2004/07/15 23:58:23 glebius Exp $"); -// Astrometry: We want reentrant! -#define I_AM_QSORT_R -#ifdef I_AM_QSORT_R +// Astrometry.net: we lightly modified this file: +// - renamed qsort_r to QSORT_R to avoid clashes with system version +// - removed the preprocessor magic that support re-entrant and non- +// functions in the same source code. + typedef int cmp_t(void *, const void *, const void *); -#else -typedef int cmp_t(const void *, const void *); -#endif + static __inline char *med3(char *, char *, char *, cmp_t *, void *); static __inline void swapfunc(char *, char *, int, int); @@ -84,32 +84,17 @@ swapfunc(char *a, char *b, int n, int swaptype) #define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype) -#ifdef I_AM_QSORT_R #define CMP(t, x, y) (cmp((t), (x), (y))) -#else -#define CMP(t, x, y) (cmp((x), (y))) -#endif static __inline char * -med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk -#ifndef I_AM_QSORT_R -__unused -#endif -) +med3(char *a, char *b, char *c, cmp_t *cmp, void *thunk) { return CMP(thunk, a, b) < 0 ? (CMP(thunk, b, c) < 0 ? b : (CMP(thunk, a, c) < 0 ? c : a )) :(CMP(thunk, b, c) > 0 ? b : (CMP(thunk, a, c) < 0 ? a : c )); } -#ifdef I_AM_QSORT_R -void -qsort_r(void *a, size_t n, size_t es, void *thunk, cmp_t *cmp) -#else -#define thunk NULL -void -qsort(void *a, size_t n, size_t es, cmp_t *cmp) -#endif +void QSORT_R(void *a, size_t n, size_t es, void *thunk, cmp_t *cmp) { char *pa, *pb, *pc, *pd, *pl, *pm, *pn; int d, r, swaptype, swap_cnt; @@ -177,11 +162,7 @@ loop: SWAPINIT(a, es); r = min(pd - pc, pn - pd - es); vecswap(pb, pn - r, r); if ((r = pb - pa) > es) -#ifdef I_AM_QSORT_R - qsort_r(a, r / es, es, thunk, cmp); -#else - qsort(a, r / es, es, cmp); -#endif + QSORT_R(a, r / es, es, thunk, cmp); if ((r = pd - pc) > es) { /* Iterate rather than recurse to save stack space */ a = pn - r;