From 80458787de55bc949804b08e419b2db360501224 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 26 Jan 2006 06:06:56 +0000 Subject: [PATCH] Use Win32 API for putenv/getenv to avoid C runtime conflicts --- include/SDL_getenv.h | 2 +- src/SDL_getenv.c | 66 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/include/SDL_getenv.h b/include/SDL_getenv.h index 42037dd46..c06e59f64 100644 --- a/include/SDL_getenv.h +++ b/include/SDL_getenv.h @@ -1,7 +1,7 @@ /* Not all environments have a working getenv()/putenv() */ -#if defined(macintosh) || defined(_WIN32_WCE) +#if defined(macintosh) || defined(WIN32) || defined(_WIN32_WCE) #define NEED_SDL_GETENV #endif diff --git a/src/SDL_getenv.c b/src/SDL_getenv.c index 08fc55862..2da29d229 100644 --- a/src/SDL_getenv.c +++ b/src/SDL_getenv.c @@ -35,6 +35,70 @@ static char rcsid = #ifdef NEED_SDL_GETENV +#ifdef WIN32 + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include + +/* Note this isn't thread-safe! */ + +static char *SDL_envmem = NULL; /* Ugh, memory leak */ +static DWORD SDL_envmemlen = 0; + +/* Put a variable of the form "name=value" into the environment */ +int SDL_putenv(const char *variable) +{ + DWORD bufferlen; + char *value; + const char *sep; + + sep = strchr(variable, '='); + if ( sep == NULL ) { + return -1; + } + bufferlen = strlen(variable)+1; + if ( bufferlen > SDL_envmemlen ) { + char *newmem = (char *)realloc(SDL_envmem, bufferlen); + if ( newmem == NULL ) { + return -1; + } + SDL_envmem = newmem; + SDL_envmemlen = bufferlen; + } + strcpy(SDL_envmem, variable); + 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) +{ + DWORD bufferlen; + + bufferlen = GetEnvironmentVariable(name, SDL_envmem, SDL_envmemlen); + if ( bufferlen == 0 ) { + return NULL; + } + if ( bufferlen > SDL_envmemlen ) { + char *newmem = (char *)realloc(SDL_envmem, bufferlen); + if ( newmem == NULL ) { + return NULL; + } + SDL_envmem = newmem; + SDL_envmemlen = bufferlen; + GetEnvironmentVariable(name, SDL_envmem, SDL_envmemlen); + } + return SDL_envmem; +} + +#else /* roll our own */ + #include #include @@ -123,6 +187,8 @@ char *SDL_getenv(const char *name) return value; } +#endif /* WIN32 */ + #endif /* NEED_GETENV */ #ifdef TEST_MAIN