SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.

This commit is contained in:
Sam Lantinga
2006-07-10 21:04:37 +00:00
parent 8f3655506a
commit 6bc598ea61
686 changed files with 117556 additions and 98661 deletions

View File

@@ -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

View File

@@ -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