0
|
1
|
|
2 /* Not all environments have a working getenv()/putenv() */
|
|
3
|
|
4 #ifdef TEST_MAIN
|
|
5 #define NEED_SDL_GETENV
|
|
6 #endif
|
|
7
|
|
8 #include "SDL_getenv.h"
|
|
9
|
|
10 #ifdef NEED_SDL_GETENV
|
|
11
|
|
12 #include <stdlib.h>
|
|
13 #include <string.h>
|
|
14
|
|
15 static char **SDL_env = (char **)0;
|
|
16
|
|
17 /* Put a variable of the form "name=value" into the environment */
|
|
18 int SDL_putenv(const char *variable)
|
|
19 {
|
|
20 const char *name, *value;
|
|
21 int added;
|
|
22 int len, i;
|
|
23 char **new_env;
|
|
24 char *new_variable;
|
|
25
|
|
26 /* A little error checking */
|
|
27 if ( ! variable ) {
|
|
28 return(-1);
|
|
29 }
|
|
30 name = variable;
|
|
31 for ( value=variable; *value && (*value != '='); ++value ) {
|
|
32 /* Keep looking for '=' */ ;
|
|
33 }
|
|
34 if ( *value ) {
|
|
35 ++value;
|
|
36 } else {
|
|
37 return(-1);
|
|
38 }
|
|
39
|
|
40 /* Allocate memory for the variable */
|
|
41 new_variable = (char *)malloc(strlen(variable)+1);
|
|
42 if ( ! new_variable ) {
|
|
43 return(-1);
|
|
44 }
|
|
45 strcpy(new_variable, variable);
|
|
46
|
|
47 /* Actually put it into the environment */
|
|
48 added = 0;
|
|
49 i = 0;
|
|
50 if ( SDL_env ) {
|
|
51 /* Check to see if it's already there... */
|
|
52 len = (value - name);
|
|
53 for ( ; SDL_env[i]; ++i ) {
|
|
54 if ( strncmp(SDL_env[i], name, len) == 0 ) {
|
|
55 break;
|
|
56 }
|
|
57 }
|
|
58 /* If we found it, just replace the entry */
|
|
59 if ( SDL_env[i] ) {
|
|
60 free(SDL_env[i]);
|
|
61 SDL_env[i] = new_variable;
|
|
62 added = 1;
|
|
63 }
|
|
64 }
|
|
65
|
|
66 /* Didn't find it in the environment, expand and add */
|
|
67 if ( ! added ) {
|
|
68 new_env = realloc(SDL_env, (i+2)*sizeof(char *));
|
|
69 if ( new_env ) {
|
|
70 SDL_env = new_env;
|
|
71 SDL_env[i++] = new_variable;
|
|
72 SDL_env[i++] = (char *)0;
|
|
73 added = 1;
|
|
74 } else {
|
|
75 free(new_variable);
|
|
76 }
|
|
77 }
|
|
78 return (added ? 0 : -1);
|
|
79 }
|
|
80
|
|
81 /* Retrieve a variable named "name" from the environment */
|
|
82 char *SDL_getenv(const char *name)
|
|
83 {
|
|
84 int len, i;
|
|
85 char *value;
|
|
86
|
|
87 value = (char *)0;
|
|
88 if ( SDL_env ) {
|
|
89 len = strlen(name);
|
|
90 for ( i=0; SDL_env[i] && !value; ++i ) {
|
|
91 if ( (strncmp(SDL_env[i], name, len) == 0) &&
|
|
92 (SDL_env[i][len] == '=') ) {
|
|
93 value = &SDL_env[i][len+1];
|
|
94 }
|
|
95 }
|
|
96 }
|
|
97 return value;
|
|
98 }
|
|
99
|
|
100 #endif /* NEED_GETENV */
|
|
101
|
|
102 #ifdef TEST_MAIN
|
|
103 #include <stdio.h>
|
|
104
|
|
105 int main(int argc, char *argv[])
|
|
106 {
|
|
107 char *value;
|
|
108
|
|
109 printf("Checking for non-existent variable... ");
|
|
110 fflush(stdout);
|
|
111 if ( ! getenv("EXISTS") ) {
|
|
112 printf("okay\n");
|
|
113 } else {
|
|
114 printf("failed\n");
|
|
115 }
|
|
116 printf("Setting FIRST=VALUE1 in the environment... ");
|
|
117 fflush(stdout);
|
|
118 if ( putenv("FIRST=VALUE1") == 0 ) {
|
|
119 printf("okay\n");
|
|
120 } else {
|
|
121 printf("failed\n");
|
|
122 }
|
|
123 printf("Getting FIRST from the environment... ");
|
|
124 fflush(stdout);
|
|
125 value = getenv("FIRST");
|
|
126 if ( value && (strcmp(value, "VALUE1") == 0) ) {
|
|
127 printf("okay\n");
|
|
128 } else {
|
|
129 printf("failed\n");
|
|
130 }
|
|
131 printf("Setting SECOND=VALUE2 in the environment... ");
|
|
132 fflush(stdout);
|
|
133 if ( putenv("SECOND=VALUE2") == 0 ) {
|
|
134 printf("okay\n");
|
|
135 } else {
|
|
136 printf("failed\n");
|
|
137 }
|
|
138 printf("Getting SECOND from the environment... ");
|
|
139 fflush(stdout);
|
|
140 value = getenv("SECOND");
|
|
141 if ( value && (strcmp(value, "VALUE2") == 0) ) {
|
|
142 printf("okay\n");
|
|
143 } else {
|
|
144 printf("failed\n");
|
|
145 }
|
|
146 printf("Setting FIRST=NOVALUE in the environment... ");
|
|
147 fflush(stdout);
|
|
148 if ( putenv("FIRST=NOVALUE") == 0 ) {
|
|
149 printf("okay\n");
|
|
150 } else {
|
|
151 printf("failed\n");
|
|
152 }
|
|
153 printf("Getting FIRST from the environment... ");
|
|
154 fflush(stdout);
|
|
155 value = getenv("FIRST");
|
|
156 if ( value && (strcmp(value, "NOVALUE") == 0) ) {
|
|
157 printf("okay\n");
|
|
158 } else {
|
|
159 printf("failed\n");
|
|
160 }
|
|
161 printf("Checking for non-existent variable... ");
|
|
162 fflush(stdout);
|
|
163 if ( ! getenv("EXISTS") ) {
|
|
164 printf("okay\n");
|
|
165 } else {
|
|
166 printf("failed\n");
|
|
167 }
|
|
168 return(0);
|
|
169 }
|
|
170 #endif /* TEST_MAIN */
|
|
171
|