mirror of
https://github.com/yawut/SDL.git
synced 2026-09-03 06:35:26 -05:00
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
This commit is contained in:
@@ -32,143 +32,148 @@
|
||||
|
||||
/* Note this isn't thread-safe! */
|
||||
|
||||
static char *SDL_envmem = NULL; /* Ugh, memory leak */
|
||||
static char *SDL_envmem = NULL; /* Ugh, memory leak */
|
||||
static size_t SDL_envmemlen = 0;
|
||||
|
||||
/* Put a variable of the form "name=value" into the environment */
|
||||
int SDL_putenv(const char *variable)
|
||||
int
|
||||
SDL_putenv(const char *variable)
|
||||
{
|
||||
size_t bufferlen;
|
||||
char *value;
|
||||
const char *sep;
|
||||
size_t bufferlen;
|
||||
char *value;
|
||||
const char *sep;
|
||||
|
||||
sep = SDL_strchr(variable, '=');
|
||||
if ( sep == NULL ) {
|
||||
return -1;
|
||||
}
|
||||
bufferlen = SDL_strlen(variable)+1;
|
||||
if ( bufferlen > SDL_envmemlen ) {
|
||||
char *newmem = (char *)SDL_realloc(SDL_envmem, bufferlen);
|
||||
if ( newmem == NULL ) {
|
||||
return -1;
|
||||
}
|
||||
SDL_envmem = newmem;
|
||||
SDL_envmemlen = bufferlen;
|
||||
}
|
||||
SDL_strlcpy(SDL_envmem, variable, bufferlen);
|
||||
value = SDL_envmem + (sep - variable);
|
||||
*value++ = '\0';
|
||||
if ( !SetEnvironmentVariable(SDL_envmem, *value ? value : NULL) ) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
sep = SDL_strchr(variable, '=');
|
||||
if (sep == NULL) {
|
||||
return -1;
|
||||
}
|
||||
bufferlen = SDL_strlen(variable) + 1;
|
||||
if (bufferlen > SDL_envmemlen) {
|
||||
char *newmem = (char *) SDL_realloc(SDL_envmem, bufferlen);
|
||||
if (newmem == NULL) {
|
||||
return -1;
|
||||
}
|
||||
SDL_envmem = newmem;
|
||||
SDL_envmemlen = bufferlen;
|
||||
}
|
||||
SDL_strlcpy(SDL_envmem, variable, bufferlen);
|
||||
value = SDL_envmem + (sep - variable);
|
||||
*value++ = '\0';
|
||||
if (!SetEnvironmentVariable(SDL_envmem, *value ? value : NULL)) {
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Retrieve a variable named "name" from the environment */
|
||||
char *SDL_getenv(const char *name)
|
||||
char *
|
||||
SDL_getenv(const char *name)
|
||||
{
|
||||
size_t bufferlen;
|
||||
size_t bufferlen;
|
||||
|
||||
bufferlen = GetEnvironmentVariable(name, SDL_envmem, (DWORD)SDL_envmemlen);
|
||||
if ( bufferlen == 0 ) {
|
||||
return NULL;
|
||||
}
|
||||
if ( bufferlen > SDL_envmemlen ) {
|
||||
char *newmem = (char *)SDL_realloc(SDL_envmem, bufferlen);
|
||||
if ( newmem == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
SDL_envmem = newmem;
|
||||
SDL_envmemlen = bufferlen;
|
||||
GetEnvironmentVariable(name, SDL_envmem, (DWORD)SDL_envmemlen);
|
||||
}
|
||||
return SDL_envmem;
|
||||
bufferlen =
|
||||
GetEnvironmentVariable(name, SDL_envmem, (DWORD) SDL_envmemlen);
|
||||
if (bufferlen == 0) {
|
||||
return NULL;
|
||||
}
|
||||
if (bufferlen > SDL_envmemlen) {
|
||||
char *newmem = (char *) SDL_realloc(SDL_envmem, bufferlen);
|
||||
if (newmem == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
SDL_envmem = newmem;
|
||||
SDL_envmemlen = bufferlen;
|
||||
GetEnvironmentVariable(name, SDL_envmem, (DWORD) SDL_envmemlen);
|
||||
}
|
||||
return SDL_envmem;
|
||||
}
|
||||
|
||||
#else /* roll our own */
|
||||
|
||||
static char **SDL_env = (char **)0;
|
||||
static char **SDL_env = (char **) 0;
|
||||
|
||||
/* Put a variable of the form "name=value" into the environment */
|
||||
int SDL_putenv(const char *variable)
|
||||
int
|
||||
SDL_putenv(const char *variable)
|
||||
{
|
||||
const char *name, *value;
|
||||
int added;
|
||||
int len, i;
|
||||
char **new_env;
|
||||
char *new_variable;
|
||||
const char *name, *value;
|
||||
int added;
|
||||
int len, i;
|
||||
char **new_env;
|
||||
char *new_variable;
|
||||
|
||||
/* A little error checking */
|
||||
if ( ! variable ) {
|
||||
return(-1);
|
||||
}
|
||||
name = variable;
|
||||
for ( value=variable; *value && (*value != '='); ++value ) {
|
||||
/* Keep looking for '=' */ ;
|
||||
}
|
||||
if ( *value ) {
|
||||
++value;
|
||||
} else {
|
||||
return(-1);
|
||||
}
|
||||
/* A little error checking */
|
||||
if (!variable) {
|
||||
return (-1);
|
||||
}
|
||||
name = variable;
|
||||
for (value = variable; *value && (*value != '='); ++value) {
|
||||
/* Keep looking for '=' */ ;
|
||||
}
|
||||
if (*value) {
|
||||
++value;
|
||||
} else {
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* Allocate memory for the variable */
|
||||
new_variable = SDL_strdup(variable);
|
||||
if ( ! new_variable ) {
|
||||
return(-1);
|
||||
}
|
||||
/* Allocate memory for the variable */
|
||||
new_variable = SDL_strdup(variable);
|
||||
if (!new_variable) {
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/* Actually put it into the environment */
|
||||
added = 0;
|
||||
i = 0;
|
||||
if ( SDL_env ) {
|
||||
/* Check to see if it's already there... */
|
||||
len = (value - name);
|
||||
for ( ; SDL_env[i]; ++i ) {
|
||||
if ( SDL_strncmp(SDL_env[i], name, len) == 0 ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* If we found it, just replace the entry */
|
||||
if ( SDL_env[i] ) {
|
||||
SDL_free(SDL_env[i]);
|
||||
SDL_env[i] = new_variable;
|
||||
added = 1;
|
||||
}
|
||||
}
|
||||
/* Actually put it into the environment */
|
||||
added = 0;
|
||||
i = 0;
|
||||
if (SDL_env) {
|
||||
/* Check to see if it's already there... */
|
||||
len = (value - name);
|
||||
for (; SDL_env[i]; ++i) {
|
||||
if (SDL_strncmp(SDL_env[i], name, len) == 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* If we found it, just replace the entry */
|
||||
if (SDL_env[i]) {
|
||||
SDL_free(SDL_env[i]);
|
||||
SDL_env[i] = new_variable;
|
||||
added = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Didn't find it in the environment, expand and add */
|
||||
if ( ! added ) {
|
||||
new_env = SDL_realloc(SDL_env, (i+2)*sizeof(char *));
|
||||
if ( new_env ) {
|
||||
SDL_env = new_env;
|
||||
SDL_env[i++] = new_variable;
|
||||
SDL_env[i++] = (char *)0;
|
||||
added = 1;
|
||||
} else {
|
||||
SDL_free(new_variable);
|
||||
}
|
||||
}
|
||||
return (added ? 0 : -1);
|
||||
/* Didn't find it in the environment, expand and add */
|
||||
if (!added) {
|
||||
new_env = SDL_realloc(SDL_env, (i + 2) * sizeof(char *));
|
||||
if (new_env) {
|
||||
SDL_env = new_env;
|
||||
SDL_env[i++] = new_variable;
|
||||
SDL_env[i++] = (char *) 0;
|
||||
added = 1;
|
||||
} else {
|
||||
SDL_free(new_variable);
|
||||
}
|
||||
}
|
||||
return (added ? 0 : -1);
|
||||
}
|
||||
|
||||
/* Retrieve a variable named "name" from the environment */
|
||||
char *SDL_getenv(const char *name)
|
||||
char *
|
||||
SDL_getenv(const char *name)
|
||||
{
|
||||
int len, i;
|
||||
char *value;
|
||||
int len, i;
|
||||
char *value;
|
||||
|
||||
value = (char *)0;
|
||||
if ( SDL_env ) {
|
||||
len = SDL_strlen(name);
|
||||
for ( i=0; SDL_env[i] && !value; ++i ) {
|
||||
if ( (SDL_strncmp(SDL_env[i], name, len) == 0) &&
|
||||
(SDL_env[i][len] == '=') ) {
|
||||
value = &SDL_env[i][len+1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return value;
|
||||
value = (char *) 0;
|
||||
if (SDL_env) {
|
||||
len = SDL_strlen(name);
|
||||
for (i = 0; SDL_env[i] && !value; ++i) {
|
||||
if ((SDL_strncmp(SDL_env[i], name, len) == 0) &&
|
||||
(SDL_env[i][len] == '=')) {
|
||||
value = &SDL_env[i][len + 1];
|
||||
}
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
#endif /* __WIN32__ */
|
||||
@@ -178,70 +183,71 @@ char *SDL_getenv(const char *name)
|
||||
#ifdef TEST_MAIN
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
char *value;
|
||||
char *value;
|
||||
|
||||
printf("Checking for non-existent variable... ");
|
||||
fflush(stdout);
|
||||
if ( ! SDL_getenv("EXISTS") ) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Setting FIRST=VALUE1 in the environment... ");
|
||||
fflush(stdout);
|
||||
if ( SDL_putenv("FIRST=VALUE1") == 0 ) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Getting FIRST from the environment... ");
|
||||
fflush(stdout);
|
||||
value = SDL_getenv("FIRST");
|
||||
if ( value && (SDL_strcmp(value, "VALUE1") == 0) ) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Setting SECOND=VALUE2 in the environment... ");
|
||||
fflush(stdout);
|
||||
if ( SDL_putenv("SECOND=VALUE2") == 0 ) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Getting SECOND from the environment... ");
|
||||
fflush(stdout);
|
||||
value = SDL_getenv("SECOND");
|
||||
if ( value && (SDL_strcmp(value, "VALUE2") == 0) ) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Setting FIRST=NOVALUE in the environment... ");
|
||||
fflush(stdout);
|
||||
if ( SDL_putenv("FIRST=NOVALUE") == 0 ) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Getting FIRST from the environment... ");
|
||||
fflush(stdout);
|
||||
value = SDL_getenv("FIRST");
|
||||
if ( value && (SDL_strcmp(value, "NOVALUE") == 0) ) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Checking for non-existent variable... ");
|
||||
fflush(stdout);
|
||||
if ( ! SDL_getenv("EXISTS") ) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
return(0);
|
||||
printf("Checking for non-existent variable... ");
|
||||
fflush(stdout);
|
||||
if (!SDL_getenv("EXISTS")) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Setting FIRST=VALUE1 in the environment... ");
|
||||
fflush(stdout);
|
||||
if (SDL_putenv("FIRST=VALUE1") == 0) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Getting FIRST from the environment... ");
|
||||
fflush(stdout);
|
||||
value = SDL_getenv("FIRST");
|
||||
if (value && (SDL_strcmp(value, "VALUE1") == 0)) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Setting SECOND=VALUE2 in the environment... ");
|
||||
fflush(stdout);
|
||||
if (SDL_putenv("SECOND=VALUE2") == 0) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Getting SECOND from the environment... ");
|
||||
fflush(stdout);
|
||||
value = SDL_getenv("SECOND");
|
||||
if (value && (SDL_strcmp(value, "VALUE2") == 0)) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Setting FIRST=NOVALUE in the environment... ");
|
||||
fflush(stdout);
|
||||
if (SDL_putenv("FIRST=NOVALUE") == 0) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Getting FIRST from the environment... ");
|
||||
fflush(stdout);
|
||||
value = SDL_getenv("FIRST");
|
||||
if (value && (SDL_strcmp(value, "NOVALUE") == 0)) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
printf("Checking for non-existent variable... ");
|
||||
fflush(stdout);
|
||||
if (!SDL_getenv("EXISTS")) {
|
||||
printf("okay\n");
|
||||
} else {
|
||||
printf("failed\n");
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
#endif /* TEST_MAIN */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -60,7 +60,7 @@
|
||||
|
||||
#ifndef HAVE_QSORT
|
||||
|
||||
static char _ID[]="<qsort.c gjm 1.12 1998-03-19>";
|
||||
static char _ID[] = "<qsort.c gjm 1.12 1998-03-19>";
|
||||
|
||||
/* How many bytes are there per word? (Must be a power of 2,
|
||||
* and must in fact equal sizeof(int).)
|
||||
@@ -81,7 +81,7 @@ static char _ID[]="<qsort.c gjm 1.12 1998-03-19>";
|
||||
*/
|
||||
#define TRUNC_nonaligned 12
|
||||
#define TRUNC_aligned 12
|
||||
#define TRUNC_words 12*WORD_BYTES /* nb different meaning */
|
||||
#define TRUNC_words 12*WORD_BYTES /* nb different meaning */
|
||||
|
||||
/* We use a simple pivoting algorithm for shortish sub-arrays
|
||||
* and a more complicated one for larger ones. The threshold
|
||||
@@ -89,7 +89,11 @@ static char _ID[]="<qsort.c gjm 1.12 1998-03-19>";
|
||||
*/
|
||||
#define PIVOT_THRESHOLD 40
|
||||
|
||||
typedef struct { char * first; char * last; } stack_entry;
|
||||
typedef struct
|
||||
{
|
||||
char *first;
|
||||
char *last;
|
||||
} stack_entry;
|
||||
#define pushLeft {stack[stacktop].first=ffirst;stack[stacktop++].last=last;}
|
||||
#define pushRight {stack[stacktop].first=first;stack[stacktop++].last=llast;}
|
||||
#define doLeft {first=ffirst;llast=last;continue;}
|
||||
@@ -261,165 +265,187 @@ typedef struct { char * first; char * last; } stack_entry;
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static char * pivot_big(char *first, char *mid, char *last, size_t size,
|
||||
int compare(const void *, const void *)) {
|
||||
size_t d=(((last-first)/size)>>3)*size;
|
||||
char *m1,*m2,*m3;
|
||||
{ char *a=first, *b=first+d, *c=first+2*d;
|
||||
static char *
|
||||
pivot_big(char *first, char *mid, char *last, size_t size,
|
||||
int compare(const void *, const void *))
|
||||
{
|
||||
size_t d = (((last - first) / size) >> 3) * size;
|
||||
char *m1, *m2, *m3;
|
||||
{
|
||||
char *a = first, *b = first + d, *c = first + 2 * d;
|
||||
#ifdef DEBUG_QSORT
|
||||
fprintf(stderr,"< %d %d %d\n",*(int*)a,*(int*)b,*(int*)c);
|
||||
fprintf(stderr, "< %d %d %d\n", *(int *) a, *(int *) b, *(int *) c);
|
||||
#endif
|
||||
m1 = compare(a,b)<0 ?
|
||||
(compare(b,c)<0 ? b : (compare(a,c)<0 ? c : a))
|
||||
: (compare(a,c)<0 ? a : (compare(b,c)<0 ? c : b));
|
||||
}
|
||||
{ char *a=mid-d, *b=mid, *c=mid+d;
|
||||
m1 = compare(a, b) < 0 ?
|
||||
(compare(b, c) < 0 ? b : (compare(a, c) < 0 ? c : a))
|
||||
: (compare(a, c) < 0 ? a : (compare(b, c) < 0 ? c : b));
|
||||
}
|
||||
{
|
||||
char *a = mid - d, *b = mid, *c = mid + d;
|
||||
#ifdef DEBUG_QSORT
|
||||
fprintf(stderr,". %d %d %d\n",*(int*)a,*(int*)b,*(int*)c);
|
||||
fprintf(stderr, ". %d %d %d\n", *(int *) a, *(int *) b, *(int *) c);
|
||||
#endif
|
||||
m2 = compare(a,b)<0 ?
|
||||
(compare(b,c)<0 ? b : (compare(a,c)<0 ? c : a))
|
||||
: (compare(a,c)<0 ? a : (compare(b,c)<0 ? c : b));
|
||||
}
|
||||
{ char *a=last-2*d, *b=last-d, *c=last;
|
||||
m2 = compare(a, b) < 0 ?
|
||||
(compare(b, c) < 0 ? b : (compare(a, c) < 0 ? c : a))
|
||||
: (compare(a, c) < 0 ? a : (compare(b, c) < 0 ? c : b));
|
||||
}
|
||||
{
|
||||
char *a = last - 2 * d, *b = last - d, *c = last;
|
||||
#ifdef DEBUG_QSORT
|
||||
fprintf(stderr,"> %d %d %d\n",*(int*)a,*(int*)b,*(int*)c);
|
||||
fprintf(stderr, "> %d %d %d\n", *(int *) a, *(int *) b, *(int *) c);
|
||||
#endif
|
||||
m3 = compare(a,b)<0 ?
|
||||
(compare(b,c)<0 ? b : (compare(a,c)<0 ? c : a))
|
||||
: (compare(a,c)<0 ? a : (compare(b,c)<0 ? c : b));
|
||||
}
|
||||
m3 = compare(a, b) < 0 ?
|
||||
(compare(b, c) < 0 ? b : (compare(a, c) < 0 ? c : a))
|
||||
: (compare(a, c) < 0 ? a : (compare(b, c) < 0 ? c : b));
|
||||
}
|
||||
#ifdef DEBUG_QSORT
|
||||
fprintf(stderr,"-> %d %d %d\n",*(int*)m1,*(int*)m2,*(int*)m3);
|
||||
fprintf(stderr, "-> %d %d %d\n", *(int *) m1, *(int *) m2, *(int *) m3);
|
||||
#endif
|
||||
return compare(m1,m2)<0 ?
|
||||
(compare(m2,m3)<0 ? m2 : (compare(m1,m3)<0 ? m3 : m1))
|
||||
: (compare(m1,m3)<0 ? m1 : (compare(m2,m3)<0 ? m3 : m2));
|
||||
return compare(m1, m2) < 0 ?
|
||||
(compare(m2, m3) < 0 ? m2 : (compare(m1, m3) < 0 ? m3 : m1))
|
||||
: (compare(m1, m3) < 0 ? m1 : (compare(m2, m3) < 0 ? m3 : m2));
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
static void qsort_nonaligned(void *base, size_t nmemb, size_t size,
|
||||
int (*compare)(const void *, const void *)) {
|
||||
static void
|
||||
qsort_nonaligned(void *base, size_t nmemb, size_t size,
|
||||
int (*compare) (const void *, const void *))
|
||||
{
|
||||
|
||||
stack_entry stack[STACK_SIZE];
|
||||
int stacktop=0;
|
||||
char *first,*last;
|
||||
char *pivot=malloc(size);
|
||||
size_t trunc=TRUNC_nonaligned*size;
|
||||
assert(pivot!=0);
|
||||
stack_entry stack[STACK_SIZE];
|
||||
int stacktop = 0;
|
||||
char *first, *last;
|
||||
char *pivot = malloc(size);
|
||||
size_t trunc = TRUNC_nonaligned * size;
|
||||
assert(pivot != 0);
|
||||
|
||||
first=(char*)base; last=first+(nmemb-1)*size;
|
||||
first = (char *) base;
|
||||
last = first + (nmemb - 1) * size;
|
||||
|
||||
if ((size_t)(last-first)>trunc) {
|
||||
char *ffirst=first, *llast=last;
|
||||
while (1) {
|
||||
/* Select pivot */
|
||||
{ char * mid=first+size*((last-first)/size >> 1);
|
||||
Pivot(SWAP_nonaligned,size);
|
||||
memcpy(pivot,mid,size);
|
||||
}
|
||||
/* Partition. */
|
||||
Partition(SWAP_nonaligned,size);
|
||||
/* Prepare to recurse/iterate. */
|
||||
Recurse(trunc)
|
||||
if ((size_t) (last - first) > trunc) {
|
||||
char *ffirst = first, *llast = last;
|
||||
while (1) {
|
||||
/* Select pivot */
|
||||
{
|
||||
char *mid = first + size * ((last - first) / size >> 1);
|
||||
Pivot(SWAP_nonaligned, size);
|
||||
memcpy(pivot, mid, size);
|
||||
}
|
||||
/* Partition. */
|
||||
Partition(SWAP_nonaligned, size);
|
||||
/* Prepare to recurse/iterate. */
|
||||
Recurse(trunc)}
|
||||
}
|
||||
}
|
||||
PreInsertion(SWAP_nonaligned,TRUNC_nonaligned,size);
|
||||
Insertion(SWAP_nonaligned);
|
||||
free(pivot);
|
||||
PreInsertion(SWAP_nonaligned, TRUNC_nonaligned, size);
|
||||
Insertion(SWAP_nonaligned);
|
||||
free(pivot);
|
||||
}
|
||||
|
||||
static void qsort_aligned(void *base, size_t nmemb, 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 *))
|
||||
{
|
||||
|
||||
stack_entry stack[STACK_SIZE];
|
||||
int stacktop=0;
|
||||
char *first,*last;
|
||||
char *pivot=malloc(size);
|
||||
size_t trunc=TRUNC_aligned*size;
|
||||
assert(pivot!=0);
|
||||
stack_entry stack[STACK_SIZE];
|
||||
int stacktop = 0;
|
||||
char *first, *last;
|
||||
char *pivot = malloc(size);
|
||||
size_t trunc = TRUNC_aligned * size;
|
||||
assert(pivot != 0);
|
||||
|
||||
first=(char*)base; last=first+(nmemb-1)*size;
|
||||
first = (char *) base;
|
||||
last = first + (nmemb - 1) * size;
|
||||
|
||||
if ((size_t)(last-first)>trunc) {
|
||||
char *ffirst=first,*llast=last;
|
||||
while (1) {
|
||||
/* Select pivot */
|
||||
{ char * mid=first+size*((last-first)/size >> 1);
|
||||
Pivot(SWAP_aligned,size);
|
||||
memcpy(pivot,mid,size);
|
||||
}
|
||||
/* Partition. */
|
||||
Partition(SWAP_aligned,size);
|
||||
/* Prepare to recurse/iterate. */
|
||||
Recurse(trunc)
|
||||
if ((size_t) (last - first) > trunc) {
|
||||
char *ffirst = first, *llast = last;
|
||||
while (1) {
|
||||
/* Select pivot */
|
||||
{
|
||||
char *mid = first + size * ((last - first) / size >> 1);
|
||||
Pivot(SWAP_aligned, size);
|
||||
memcpy(pivot, mid, size);
|
||||
}
|
||||
/* Partition. */
|
||||
Partition(SWAP_aligned, size);
|
||||
/* Prepare to recurse/iterate. */
|
||||
Recurse(trunc)}
|
||||
}
|
||||
}
|
||||
PreInsertion(SWAP_aligned,TRUNC_aligned,size);
|
||||
Insertion(SWAP_aligned);
|
||||
free(pivot);
|
||||
PreInsertion(SWAP_aligned, TRUNC_aligned, size);
|
||||
Insertion(SWAP_aligned);
|
||||
free(pivot);
|
||||
}
|
||||
|
||||
static void qsort_words(void *base, size_t nmemb,
|
||||
int (*compare)(const void *, const void *)) {
|
||||
static void
|
||||
qsort_words(void *base, size_t nmemb,
|
||||
int (*compare) (const void *, const void *))
|
||||
{
|
||||
|
||||
stack_entry stack[STACK_SIZE];
|
||||
int stacktop=0;
|
||||
char *first,*last;
|
||||
char *pivot=malloc(WORD_BYTES);
|
||||
assert(pivot!=0);
|
||||
stack_entry stack[STACK_SIZE];
|
||||
int stacktop = 0;
|
||||
char *first, *last;
|
||||
char *pivot = malloc(WORD_BYTES);
|
||||
assert(pivot != 0);
|
||||
|
||||
first=(char*)base; last=first+(nmemb-1)*WORD_BYTES;
|
||||
first = (char *) base;
|
||||
last = first + (nmemb - 1) * WORD_BYTES;
|
||||
|
||||
if (last-first>TRUNC_words) {
|
||||
char *ffirst=first, *llast=last;
|
||||
while (1) {
|
||||
if (last - first > TRUNC_words) {
|
||||
char *ffirst = first, *llast = last;
|
||||
while (1) {
|
||||
#ifdef DEBUG_QSORT
|
||||
fprintf(stderr,"Doing %d:%d: ",
|
||||
(first-(char*)base)/WORD_BYTES,
|
||||
(last-(char*)base)/WORD_BYTES);
|
||||
fprintf(stderr, "Doing %d:%d: ",
|
||||
(first - (char *) base) / WORD_BYTES,
|
||||
(last - (char *) base) / WORD_BYTES);
|
||||
#endif
|
||||
/* Select pivot */
|
||||
{ char * mid=first+WORD_BYTES*((last-first) / (2*WORD_BYTES));
|
||||
Pivot(SWAP_words,WORD_BYTES);
|
||||
*(int*)pivot=*(int*)mid;
|
||||
}
|
||||
/* Select pivot */
|
||||
{
|
||||
char *mid =
|
||||
first + WORD_BYTES * ((last - first) / (2 * WORD_BYTES));
|
||||
Pivot(SWAP_words, WORD_BYTES);
|
||||
*(int *) pivot = *(int *) mid;
|
||||
}
|
||||
#ifdef DEBUG_QSORT
|
||||
fprintf(stderr,"pivot=%d\n",*(int*)pivot);
|
||||
fprintf(stderr, "pivot=%d\n", *(int *) pivot);
|
||||
#endif
|
||||
/* Partition. */
|
||||
Partition(SWAP_words,WORD_BYTES);
|
||||
/* Prepare to recurse/iterate. */
|
||||
Recurse(TRUNC_words)
|
||||
/* Partition. */
|
||||
Partition(SWAP_words, WORD_BYTES);
|
||||
/* Prepare to recurse/iterate. */
|
||||
Recurse(TRUNC_words)}
|
||||
}
|
||||
}
|
||||
PreInsertion(SWAP_words,(TRUNC_words/WORD_BYTES),WORD_BYTES);
|
||||
/* Now do insertion sort. */
|
||||
last=((char*)base)+nmemb*WORD_BYTES;
|
||||
for (first=((char*)base)+WORD_BYTES;first!=last;first+=WORD_BYTES) {
|
||||
/* Find the right place for |first|. My apologies for var reuse */
|
||||
int *pl=(int*)(first-WORD_BYTES),*pr=(int*)first;
|
||||
*(int*)pivot=*(int*)first;
|
||||
for (;compare(pl,pivot)>0;pr=pl,--pl) {
|
||||
*pr=*pl; }
|
||||
if (pr!=(int*)first) *pr=*(int*)pivot;
|
||||
}
|
||||
free(pivot);
|
||||
PreInsertion(SWAP_words, (TRUNC_words / WORD_BYTES), WORD_BYTES);
|
||||
/* Now do insertion sort. */
|
||||
last = ((char *) base) + nmemb * WORD_BYTES;
|
||||
for (first = ((char *) base) + WORD_BYTES; first != last;
|
||||
first += WORD_BYTES) {
|
||||
/* Find the right place for |first|. My apologies for var reuse */
|
||||
int *pl = (int *) (first - WORD_BYTES), *pr = (int *) first;
|
||||
*(int *) pivot = *(int *) first;
|
||||
for (; compare(pl, pivot) > 0; pr = pl, --pl) {
|
||||
*pr = *pl;
|
||||
}
|
||||
if (pr != (int *) first)
|
||||
*pr = *(int *) pivot;
|
||||
}
|
||||
free(pivot);
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void qsort(void *base, size_t nmemb, size_t size,
|
||||
int (*compare)(const void *, const void *)) {
|
||||
void
|
||||
qsort(void *base, size_t nmemb, size_t size,
|
||||
int (*compare) (const void *, const void *))
|
||||
{
|
||||
|
||||
if (nmemb<=1) return;
|
||||
if (((uintptr_t)base|size)&(WORD_BYTES-1))
|
||||
qsort_nonaligned(base,nmemb,size,compare);
|
||||
else if (size!=WORD_BYTES)
|
||||
qsort_aligned(base,nmemb,size,compare);
|
||||
else
|
||||
qsort_words(base,nmemb,compare);
|
||||
if (nmemb <= 1)
|
||||
return;
|
||||
if (((uintptr_t) base | size) & (WORD_BYTES - 1))
|
||||
qsort_nonaligned(base, nmemb, size, compare);
|
||||
else if (size != WORD_BYTES)
|
||||
qsort_aligned(base, nmemb, size, compare);
|
||||
else
|
||||
qsort_words(base, nmemb, compare);
|
||||
}
|
||||
|
||||
#endif /* !HAVE_QSORT */
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user