summaryrefslogtreecommitdiff
path: root/sci-libs/stellarsolver/files/stellarsolver-2.5-qsort-warning.patch
blob: 72acd2adc9c61c007dc3cac35299ddfe384f4df4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
From efd820a1655f808107a1984d55124ea142c66fa6 Mon Sep 17 00:00:00 2001
From: Tim Surber <me@timsurber.de>
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 <pam.h>
 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;