54 #include "kmp_environment.h" 65 #include <crt_externs.h> 66 #define environ (*_NSGetEnviron()) 68 extern char **environ;
74 #error Unknown or unsupported OS. 79 static inline void *allocate(
size_t size) {
80 void *ptr = KMP_INTERNAL_MALLOC(size);
82 KMP_FATAL(MemoryAllocFailed);
87 char *__kmp_env_get(
char const *name) {
92 char const *value = getenv(name);
94 size_t len = KMP_STRLEN(value) + 1;
95 result = (
char *)KMP_INTERNAL_MALLOC(len);
97 KMP_FATAL(MemoryAllocFailed);
99 KMP_STRNCPY_S(result, len, value, len);
108 rc = GetEnvironmentVariable(name, NULL, 0);
110 DWORD error = GetLastError();
111 if (error != ERROR_ENVVAR_NOT_FOUND) {
112 __kmp_msg(kmp_ms_fatal, KMP_MSG(CantGetEnvVar, name), KMP_ERR(error),
118 result = (
char *)KMP_INTERNAL_MALLOC(len);
119 if (result == NULL) {
120 KMP_FATAL(MemoryAllocFailed);
122 rc = GetEnvironmentVariable(name, result, len);
126 DWORD error = GetLastError();
127 if (error != ERROR_SUCCESS) {
130 __kmp_msg(kmp_ms_fatal, KMP_MSG(CantGetEnvVar, name), KMP_ERR(error),
132 KMP_INTERNAL_FREE((
void *)result);
138 #error Unknown or unsupported OS. 147 void __kmp_env_free(
char const **value) {
149 KMP_DEBUG_ASSERT(value != NULL);
150 KMP_INTERNAL_FREE(CCAST(
char *, *value));
155 int __kmp_env_exists(
char const *name) {
158 char const *value = getenv(name);
159 return ((value == NULL) ? (0) : (1));
162 rc = GetEnvironmentVariable(name, NULL, 0);
164 DWORD error = GetLastError();
165 if (error != ERROR_ENVVAR_NOT_FOUND) {
166 __kmp_msg(kmp_ms_fatal, KMP_MSG(CantGetEnvVar, name), KMP_ERR(error),
173 #error Unknown or unsupported OS. 178 void __kmp_env_set(
char const *name,
char const *value,
int overwrite) {
181 int rc = setenv(name, value, overwrite);
188 __kmp_msg(kmp_ms_fatal, KMP_MSG(CantSetEnvVar, name),
189 KMP_HNT(NotEnoughMemory), __kmp_msg_null);
194 rc = GetEnvironmentVariable(name, NULL, 0);
199 DWORD error = GetLastError();
200 if (error != ERROR_ENVVAR_NOT_FOUND) {
201 __kmp_msg(kmp_ms_fatal, KMP_MSG(CantGetEnvVar, name), KMP_ERR(error),
205 rc = SetEnvironmentVariable(name, value);
207 DWORD error = GetLastError();
208 __kmp_msg(kmp_ms_fatal, KMP_MSG(CantSetEnvVar, name), KMP_ERR(error),
212 #error Unknown or unsupported OS. 217 void __kmp_env_unset(
char const *name) {
222 BOOL rc = SetEnvironmentVariable(name, NULL);
224 DWORD error = GetLastError();
225 __kmp_msg(kmp_ms_fatal, KMP_MSG(CantSetEnvVar, name), KMP_ERR(error),
229 #error Unknown or unsupported OS. 245 ___kmp_env_blk_parse_string(kmp_env_blk_t *block,
249 char const chr_delimiter =
'|';
250 char const str_delimiter[] = {chr_delimiter, 0};
253 kmp_env_var_t *vars = NULL;
258 bulk = __kmp_str_format(
"%s", env);
263 char const *ptr = bulk;
265 ptr = strchr(ptr, chr_delimiter);
275 vars = (kmp_env_var_t *)allocate((delimiters + 1) *
sizeof(kmp_env_var_t));
283 var = __kmp_str_token(bulk, str_delimiter, &buf);
284 while (var != NULL) {
286 __kmp_str_split(var,
'=', &name, &value);
287 KMP_DEBUG_ASSERT(count < delimiters + 1);
288 vars[count].name = name;
289 vars[count].value = value;
292 var = __kmp_str_token(NULL, str_delimiter, &buf);
299 block->count = count;
314 static void ___kmp_env_blk_parse_windows(
315 kmp_env_blk_t *block,
320 kmp_env_var_t *vars = NULL;
337 len = KMP_STRLEN(var);
340 size = size + len + 1;
343 len = KMP_STRLEN(var);
350 bulk = (
char *)allocate(size);
351 KMP_MEMCPY_S(bulk, size, env, size);
353 vars = (kmp_env_var_t *)allocate(count *
sizeof(kmp_env_var_t));
361 len = KMP_STRLEN(var);
364 __kmp_str_split(var,
'=', &name, &value);
365 vars[count].name = name;
366 vars[count].value = value;
370 len = KMP_STRLEN(var);
379 block->count = count;
391 ___kmp_env_blk_parse_unix(kmp_env_blk_t *block,
396 kmp_env_var_t *vars = NULL;
404 while (env[count] != NULL) {
405 size += KMP_STRLEN(env[count]) + 1;
411 bulk = (
char *)allocate(size);
412 vars = (kmp_env_var_t *)allocate(count *
sizeof(kmp_env_var_t));
422 for (i = 0; i < count; ++i) {
424 len = KMP_STRLEN(env[i]);
425 KMP_MEMCPY_S(var, size, env[i], len + 1);
427 __kmp_str_split(var,
'=', &name, &value);
429 vars[i].value = value;
438 block->count = count;
442 void __kmp_env_blk_init(kmp_env_blk_t *block,
447 ___kmp_env_blk_parse_string(block, bulk);
450 ___kmp_env_blk_parse_unix(block, environ);
453 char *mem = GetEnvironmentStrings();
455 DWORD error = GetLastError();
456 __kmp_msg(kmp_ms_fatal, KMP_MSG(CantGetEnvironment), KMP_ERR(error),
459 ___kmp_env_blk_parse_windows(block, mem);
460 FreeEnvironmentStrings(mem);
463 #error Unknown or unsupported OS. 469 static int ___kmp_env_var_cmp(
470 kmp_env_var_t
const *lhs, kmp_env_var_t
const *rhs) {
471 return strcmp(lhs->name, rhs->name);
474 void __kmp_env_blk_sort(
478 qsort(CCAST(kmp_env_var_t *, block->vars), block->count,
479 sizeof(kmp_env_var_t),
480 (int (*)(
void const *,
void const *)) & ___kmp_env_var_cmp);
484 void __kmp_env_blk_free(
488 KMP_INTERNAL_FREE(CCAST(kmp_env_var_t *, block->vars));
489 __kmp_str_free(&(block->bulk));
498 kmp_env_blk_t *block,
503 for (i = 0; i < block->count; ++i) {
504 if (strcmp(block->vars[i].name, name) == 0) {
505 return block->vars[i].value;