22 #if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS)
23 #define SDL_DISABLE_ANALYZE_MACROS 1
26 #include "../SDL_internal.h"
30 #if defined(HAVE_QSORT)
32 SDL_qsort(
void *
base,
size_t nmemb,
size_t size,
int (*compare) (
const void *,
const void *))
42 #define assert SDL_assert
46 #define malloc SDL_malloc
54 #define memcpy SDL_memcpy
58 #define memmove SDL_memmove
62 #define qsortG SDL_qsort
159 static char _ID[]=
"<qsort.c gjm 1.15 2016-03-10>";
166 #define WORD_BYTES sizeof(int)
171 #define STACK_SIZE (8*sizeof(size_t))
180 #define TRUNC_nonaligned 12
181 #define TRUNC_aligned 12
182 #define TRUNC_words 12*WORD_BYTES
188 #define PIVOT_THRESHOLD 40
191 #define pushLeft {stack[stacktop].first=ffirst;stack[stacktop++].last=last;}
192 #define pushRight {stack[stacktop].first=first;stack[stacktop++].last=llast;}
193 #define doLeft {first=ffirst;llast=last;continue;}
194 #define doRight {ffirst=first;last=llast;continue;}
195 #define pop {if (--stacktop<0) break;\
196 first=ffirst=stack[stacktop].first;\
197 last=llast=stack[stacktop].last;\
268 #define Recurse(Trunc) \
269 { size_t l=last-ffirst,r=llast-first; \
271 if (r>=Trunc) doRight \
274 else if (l<=r) { pushLeft; doRight } \
275 else if (r>=Trunc) { pushRight; doLeft }\
280 #define Pivot(swapper,sz) \
281 if ((size_t)(last-first)>PIVOT_THRESHOLD*sz) mid=pivot_big(first,mid,last,sz,compare);\
283 if (compare(first,mid)<0) { \
284 if (compare(mid,last)>0) { \
286 if (compare(first,mid)>0) swapper(first,mid);\
290 if (compare(mid,last)>0) swapper(first,last)\
292 swapper(first,mid); \
293 if (compare(mid,last)>0) swapper(mid,last);\
296 first+=sz; last-=sz; \
304 #define Partition(swapper,sz) { \
306 while (compare(first,pivot)<0) first+=sz; \
307 while (compare(pivot,last)<0) last-=sz; \
309 swapper(first,last); \
310 first+=sz; last-=sz; } \
311 else if (first==last) { first+=sz; last-=sz; break; }\
312 } while (first<=last); \
326 #define PreInsertion(swapper,limit,sz) \
328 last=first + ((nmemb>limit ? limit : nmemb)-1)*sz;\
329 while (last!=base) { \
330 if (compare(first,last)>0) first=last; \
332 if (first!=base) swapper(first,(char*)base);
335 #define Insertion(swapper) \
336 last=((char*)base)+nmemb*size; \
337 for (first=((char*)base)+size;first!=last;first+=size) { \
341 for (test=first-size;compare(test,first)>0;test-=size) ; \
347 memcpy(pivot,first,size); \
348 memmove(test+size,test,first-test); \
349 memcpy(test,pivot,size); \
353 #define SWAP_nonaligned(a,b) { \
354 register char *aa=(a),*bb=(b); \
355 register size_t sz=size; \
356 do { register char t=*aa; *aa++=*bb; *bb++=t; } while (--sz); }
358 #define SWAP_aligned(a,b) { \
359 register int *aa=(int*)(a),*bb=(int*)(b); \
360 register size_t sz=size; \
361 do { register int t=*aa;*aa++=*bb; *bb++=t; } while (sz-=WORD_BYTES); }
363 #define SWAP_words(a,b) { \
364 register int t=*((int*)a); *((int*)a)=*((int*)b); *((int*)b)=t; }
369 int compare(
const void *,
const void *)) {
372 fprintf(stderr,
"pivot_big: first=%p last=%p size=%lu n=%lu\n",
first, (
unsigned long)last,
size, (
unsigned long)((last-
first+1)/
size));
377 fprintf(stderr,
"< %d %d %d @ %p %p %p\n",*(
int*)
a,*(
int*)
b,*(
int*)
c,
a,
b,
c);
379 m1 = compare(
a,
b)<0 ?
380 (compare(
b,
c)<0 ?
b : (compare(
a,
c)<0 ?
c :
a))
381 : (compare(
a,
c)<0 ?
a : (compare(
b,
c)<0 ?
c :
b));
383 {
char *
a=mid-
d, *
b=mid, *
c=mid+
d;
385 fprintf(stderr,
". %d %d %d @ %p %p %p\n",*(
int*)
a,*(
int*)
b,*(
int*)
c,
a,
b,
c);
387 m2 = compare(
a,
b)<0 ?
388 (compare(
b,
c)<0 ?
b : (compare(
a,
c)<0 ?
c :
a))
389 : (compare(
a,
c)<0 ?
a : (compare(
b,
c)<0 ?
c :
b));
391 {
char *
a=last-2*
d, *
b=last-
d, *
c=last;
393 fprintf(stderr,
"> %d %d %d @ %p %p %p\n",*(
int*)
a,*(
int*)
b,*(
int*)
c,
a,
b,
c);
395 m3 = compare(
a,
b)<0 ?
396 (compare(
b,
c)<0 ?
b : (compare(
a,
c)<0 ?
c :
a))
397 : (compare(
a,
c)<0 ?
a : (compare(
b,
c)<0 ?
c :
b));
400 fprintf(stderr,
"-> %d %d %d @ %p %p %p\n",*(
int*)m1,*(
int*)m2,*(
int*)m3, m1,m2,m3);
402 return compare(m1,m2)<0 ?
403 (compare(m2,m3)<0 ? m2 : (compare(m1,m3)<0 ? m3 : m1))
404 : (compare(m1,m3)<0 ? m1 : (compare(m2,m3)<0 ? m3 : m2));
410 int (*compare)(
const void *,
const void *)) {
421 if ((
size_t)(last-
first)>=trunc) {
422 char *ffirst=
first, *llast=last;
441 int (*compare)(
const void *,
const void *)) {
452 if ((
size_t)(last-
first)>=trunc) {
453 char *ffirst=
first,*llast=last;
472 int (*compare)(
const void *,
const void *)) {
483 char *ffirst=
first, *llast=last;
486 fprintf(stderr,
"Doing %d:%d: ",
493 *(
int*)pivot=*(
int*)mid;
495 fprintf(stderr,
"pivot = %p = #%lu = %d\n", mid, (
unsigned long)(((
int*)mid)-((
int*)
base)), *(
int*)mid);
501 fprintf(stderr,
"after partitioning first=#%lu last=#%lu\n", (
first-(
char*)
base)/4lu, (last-(
char*)
base)/4lu);
513 *(
int*)pivot=*(
int*)
first;
514 for (;compare(pl,pivot)>0;pr=pl,--pl) {
516 if (pr!=(
int*)
first) *pr=*(
int*)pivot;
524 int (*compare)(
const void *,
const void *)) {
526 if (nmemb<=1)
return;
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 SDL_AssertionHandler void SDL_SpinLock SDL_atomic_t int int return SDL_atomic_t return void void void return void return int return SDL_AudioSpec SDL_AudioSpec return int int return return int SDL_RWops int SDL_AudioSpec Uint8 ** d
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
#define Partition(swapper, sz)
#define SWAP_nonaligned(a, b)
static void qsort_nonaligned(void *base, size_t nmemb, size_t size, int(*compare)(const void *, const void *))
static char * pivot_big(char *first, char *mid, char *last, size_t size, int compare(const void *, const void *))
static void qsort_aligned(void *base, size_t nmemb, size_t size, int(*compare)(const void *, const void *))
#define Insertion(swapper)
#define PreInsertion(swapper, limit, sz)
#define Pivot(swapper, sz)
static void qsort_words(void *base, size_t nmemb, int(*compare)(const void *, const void *))
#define SWAP_aligned(a, b)
set set set set set set set set set set set set set set set set set set set set *set set set macro pixldst base