Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
264 lines (240 loc) · 7.06 KB

SDL_getenv.c

File metadata and controls

264 lines (240 loc) · 7.06 KB
 
1
2
/*
Simple DirectMedia Layer
Feb 15, 2013
Feb 15, 2013
3
Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "SDL_config.h"
#include "SDL_stdinc.h"
Mar 15, 2013
Mar 15, 2013
25
#if !defined(SDL_setenv) && defined(__WIN32__)
26
27
28
29
#include "../core/windows/SDL_windows.h"
/* Note this isn't thread-safe! */
static char *SDL_envmem = NULL; /* Ugh, memory leak */
static size_t SDL_envmemlen = 0;
Mar 15, 2013
Mar 15, 2013
30
31
#endif
32
33
/* Put a variable into the environment */
Mar 15, 2013
Mar 15, 2013
34
35
36
37
#ifdef SDL_setenv
#undef SDL_setenv
int SDL_setenv(const char *name, const char *value, int overwrite) { return SDL_setenv_inline(name, value, overwrite); }
#elif defined(__WIN32__)
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
int
SDL_setenv(const char *name, const char *value, int overwrite)
{
if (!overwrite) {
char ch = 0;
const size_t len = GetEnvironmentVariableA(name, &ch, sizeof (ch));
if (len > 0) {
return 0; /* asked not to overwrite existing value. */
}
}
if (!SetEnvironmentVariableA(name, *value ? value : NULL)) {
return -1;
}
return 0;
}
Mar 15, 2013
Mar 15, 2013
53
54
55
56
/* We have a real environment table, but no real setenv? Fake it w/ putenv. */
#elif (defined(HAVE_GETENV) && defined(HAVE_PUTENV) && !defined(HAVE_SETENV))
int
SDL_setenv(const char *name, const char *value, int overwrite)
Mar 15, 2013
Mar 15, 2013
58
59
size_t len;
char *new_variable;
Mar 15, 2013
Mar 15, 2013
61
62
63
64
65
if (getenv(name) != NULL) {
if (overwrite) {
unsetenv(name);
} else {
return 0; /* leave the existing one there. */
Mar 15, 2013
Mar 15, 2013
69
70
71
72
73
74
/* 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);
}
Mar 15, 2013
Mar 15, 2013
76
77
78
79
SDL_snprintf(new_variable, len, "%s=%s", name, value);
return putenv(new_variable);
}
#else /* roll our own */
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
static char **SDL_env = (char **) 0;
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);
}
Mar 15, 2013
Mar 15, 2013
143
#endif
144
145
/* Retrieve a variable named "name" from the environment */
Mar 15, 2013
Mar 15, 2013
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#ifdef SDL_getenv
#undef SDL_getenv
char *SDL_getenv(const char *name) { return SDL_getenv_inline(name); }
#elif defined(__WIN32__)
char *
SDL_getenv(const char *name)
{
size_t bufferlen;
bufferlen =
GetEnvironmentVariableA(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;
GetEnvironmentVariableA(name, SDL_envmem, (DWORD) SDL_envmemlen);
}
return SDL_envmem;
}
#else
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
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
#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: */