• Sam Lantinga's avatar
    Fixed bug #925 · 9d25ba27
    Sam Lantinga authored
    Changed "win32" to "windows"
    
    --HG--
    rename : include/SDL_config_win32.h => include/SDL_config_windows.h
    rename : src/events/scancodes_win32.h => src/events/scancodes_windows.h
    rename : src/haptic/win32/SDL_syshaptic.c => src/haptic/windows/SDL_syshaptic.c
    rename : src/joystick/win32/SDL_dxjoystick.c => src/joystick/windows/SDL_dxjoystick.c
    rename : src/joystick/win32/SDL_dxjoystick_c.h => src/joystick/windows/SDL_dxjoystick_c.h
    rename : src/joystick/win32/SDL_mmjoystick.c => src/joystick/windows/SDL_mmjoystick.c
    rename : src/loadso/win32/SDL_sysloadso.c => src/loadso/windows/SDL_sysloadso.c
    rename : src/main/win32/SDL_win32_main.c => src/main/windows/SDL_windows_main.c
    rename : src/main/win32/version.rc => src/main/windows/version.rc
    rename : src/thread/win32/SDL_sysmutex.c => src/thread/windows/SDL_sysmutex.c
    rename : src/thread/win32/SDL_syssem.c => src/thread/windows/SDL_syssem.c
    rename : src/thread/win32/SDL_systhread.c => src/thread/windows/SDL_systhread.c
    rename : src/thread/win32/SDL_systhread_c.h => src/thread/windows/SDL_systhread_c.h
    rename : src/thread/win32/win_ce_semaphore.c => src/thread/windows/win_ce_semaphore.c
    rename : src/thread/win32/win_ce_semaphore.h => src/thread/windows/win_ce_semaphore.h
    rename : src/timer/win32/SDL_systimer.c => src/timer/windows/SDL_systimer.c
    rename : src/video/win32/SDL_ceddrawrender.c => src/video/windows/SDL_ceddrawrender.c
    rename : src/video/win32/SDL_ceddrawrender.h => src/video/windows/SDL_ceddrawrender.h
    rename : src/video/win32/SDL_d3drender.c => src/video/windows/SDL_d3drender.c
    rename : src/video/win32/SDL_d3drender.h => src/video/windows/SDL_d3drender.h
    rename : src/video/win32/SDL_gapirender.c => src/video/windows/SDL_gapirender.c
    rename : src/video/win32/SDL_gapirender.h => src/video/windows/SDL_gapirender.h
    rename : src/video/win32/SDL_gapirender_c.h => src/video/windows/SDL_gapirender_c.h
    rename : src/video/win32/SDL_gdirender.c => src/video/windows/SDL_gdirender.c
    rename : src/video/win32/SDL_gdirender.h => src/video/windows/SDL_gdirender.h
    rename : src/video/win32/SDL_msctf.h => src/video/windows/SDL_msctf.h
    rename : src/video/win32/SDL_vkeys.h => src/video/windows/SDL_vkeys.h
    rename : src/video/win32/SDL_win32clipboard.c => src/video/windows/SDL_windowsclipboard.c
    rename : src/video/win32/SDL_win32clipboard.h => src/video/windows/SDL_windowsclipboard.h
    rename : src/video/win32/SDL_win32events.c => src/video/windows/SDL_windowsevents.c
    rename : src/video/win32/SDL_win32events.h => src/video/windows/SDL_windowsevents.h
    rename : src/video/win32/SDL_win32gamma.c => src/video/windows/SDL_windowsgamma.c
    rename : src/video/win32/SDL_win32gamma.h => src/video/windows/SDL_windowsgamma.h
    rename : src/video/win32/SDL_win32keyboard.c => src/video/windows/SDL_windowskeyboard.c
    rename : src/video/win32/SDL_win32keyboard.h => src/video/windows/SDL_windowskeyboard.h
    rename : src/video/win32/SDL_win32modes.c => src/video/windows/SDL_windowsmodes.c
    rename : src/video/win32/SDL_win32modes.h => src/video/windows/SDL_windowsmodes.h
    rename : src/video/win32/SDL_win32mouse.c => src/video/windows/SDL_windowsmouse.c
    rename : src/video/win32/SDL_win32mouse.h => src/video/windows/SDL_windowsmouse.h
    rename : src/video/win32/SDL_win32opengl.c => src/video/windows/SDL_windowsopengl.c
    rename : src/video/win32/SDL_win32opengl.h => src/video/windows/SDL_windowsopengl.h
    rename : src/video/win32/SDL_win32shape.c => src/video/windows/SDL_windowsshape.c
    rename : src/video/win32/SDL_win32shape.h => src/video/windows/SDL_windowsshape.h
    rename : src/video/win32/SDL_win32video.c => src/video/windows/SDL_windowsvideo.c
    rename : src/video/win32/SDL_win32video.h => src/video/windows/SDL_windowsvideo.h
    rename : src/video/win32/SDL_win32window.c => src/video/windows/SDL_windowswindow.c
    rename : src/video/win32/SDL_win32window.h => src/video/windows/SDL_windowswindow.h
    rename : src/video/win32/wmmsg.h => src/video/windows/wmmsg.h
    9d25ba27
SDL_getenv.c 6.84 KB
/*
    SDL - Simple DirectMedia Layer
    Copyright (C) 1997-2010 Sam Lantinga

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    Sam Lantinga
    slouken@libsdl.org
*/
#include "SDL_config.h"

#include "SDL_stdinc.h"

#ifndef HAVE_GETENV

#if defined(__WINDOWS__) && !defined(_WIN32_WCE)

#define WIN32_LEAN_AND_MEAN
#include <windows.h>

/* Note this isn't thread-safe! */

static char *SDL_envmem = NULL; /* Ugh, memory leak */
static size_t SDL_envmemlen = 0;

/* Put a variable into the environment */
int
SDL_setenv(const char *name, const char *value, int overwrite)
{
    if (!overwrite) {
        char ch = 0;
        const size_t len = GetEnvironmentVariable(name, &ch, sizeof (ch));
        if (len > 0) {
            return 0;  /* asked not to overwrite existing value. */
        }
    }
    if (!SetEnvironmentVariable(name, *value ? value : NULL)) {
        return -1;
    }
    return 0;
}

/* Retrieve a variable named "name" from the environment */
char *
SDL_getenv(const char *name)
{
    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;
}

#else /* roll our own */

static char **SDL_env = (char **) 0;

/* Put a variable into the environment */
int
SDL_setenv(const char *name, const char *value, int overwrite)
{
    int added;
    int len, i;
    char **new_env;
    char *new_variable;

    /* A little error checking */
    if (!name || !value) {
        return (-1);
    }

    /* See if it already exists */
    if (!overwrite && SDL_getenv(name)) {
        return 0;
    }

    /* Allocate memory for the variable */
    len = SDL_strlen(name) + SDL_strlen(value) + 2;
    new_variable = (char *) SDL_malloc(len);
    if (!new_variable) {
        return (-1);
    }

    SDL_snprintf(new_variable, len, "%s=%s", name, value);
    value = new_variable + SDL_strlen(name) + 1;
    name = new_variable;

    /* 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);
}

/* Retrieve a variable named "name" from the environment */
char *
SDL_getenv(const char *name)
{
    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;
}

#endif /* __WINDOWS__ */

#endif /* !HAVE_GETENV */


/* We have a real environment table, but no real setenv? Fake it w/ putenv. */
#if (defined(HAVE_GETENV) && defined(HAVE_PUTENV) && !defined(HAVE_SETENV))
int
SDL_setenv(const char *name, const char *value, int overwrite)
{
    size_t len;
    char *new_variable;

    if (getenv(name) != NULL) {
        if (overwrite) {
            unsetenv(name);
        } else {
            return 0;  /* leave the existing one there. */
        }
    }

    /* This leaks. Sorry. Get a better OS so we don't have to do this. */
    len = SDL_strlen(name) + SDL_strlen(value) + 2;
    new_variable = (char *) SDL_malloc(len);
    if (!new_variable) {
        return (-1);
    }

    SDL_snprintf(new_variable, len, "%s=%s", name, value);
    return putenv(new_variable);
}
#endif


#ifdef TEST_MAIN
#include <stdio.h>

int
main(int argc, char *argv[])
{
    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_setenv("FIRST", "VALUE1", 0) == 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_setenv("SECOND", "VALUE2", 0) == 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_setenv("FIRST", "NOVALUE", 1) == 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: */