51 #include "kmp_environment.h"
62 #include <crt_externs.h>
63 #define environ (*_NSGetEnviron())
65 extern char **environ;
71 #error Unknown or unsupported OS.
76 static inline void *allocate(
size_t size) {
77 void *ptr = KMP_INTERNAL_MALLOC(size);
79 KMP_FATAL(MemoryAllocFailed);
84 char *__kmp_env_get(
char const *name) {
89 char const *value = getenv(name);
91 size_t len = KMP_STRLEN(value) + 1;
92 result = (
char *)KMP_INTERNAL_MALLOC(len);
94 KMP_FATAL(MemoryAllocFailed);
96 KMP_STRNCPY_S(result, len, value, len);
105 rc = GetEnvironmentVariable(name, NULL, 0);
107 DWORD error = GetLastError();
108 if (error != ERROR_ENVVAR_NOT_FOUND) {
109 __kmp_fatal(KMP_MSG(CantGetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
114 result = (
char *)KMP_INTERNAL_MALLOC(len);
115 if (result == NULL) {
116 KMP_FATAL(MemoryAllocFailed);
118 rc = GetEnvironmentVariable(name, result, len);
122 DWORD error = GetLastError();
123 if (error != ERROR_SUCCESS) {
126 __kmp_fatal(KMP_MSG(CantGetEnvVar, name), KMP_ERR(error),
128 KMP_INTERNAL_FREE((
void *)result);
134 #error Unknown or unsupported OS.
143 void __kmp_env_free(
char const **value) {
145 KMP_DEBUG_ASSERT(value != NULL);
146 KMP_INTERNAL_FREE(CCAST(
char *, *value));
151 int __kmp_env_exists(
char const *name) {
154 char const *value = getenv(name);
155 return ((value == NULL) ? (0) : (1));
158 rc = GetEnvironmentVariable(name, NULL, 0);
160 DWORD error = GetLastError();
161 if (error != ERROR_ENVVAR_NOT_FOUND) {
162 __kmp_fatal(KMP_MSG(CantGetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
168 #error Unknown or unsupported OS.
173 void __kmp_env_set(
char const *name,
char const *value,
int overwrite) {
176 int rc = setenv(name, value, overwrite);
183 __kmp_fatal(KMP_MSG(CantSetEnvVar, name), KMP_HNT(NotEnoughMemory),
189 rc = GetEnvironmentVariable(name, NULL, 0);
194 DWORD error = GetLastError();
195 if (error != ERROR_ENVVAR_NOT_FOUND) {
196 __kmp_fatal(KMP_MSG(CantGetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
199 rc = SetEnvironmentVariable(name, value);
201 DWORD error = GetLastError();
202 __kmp_fatal(KMP_MSG(CantSetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
205 #error Unknown or unsupported OS.
210 void __kmp_env_unset(
char const *name) {
215 BOOL rc = SetEnvironmentVariable(name, NULL);
217 DWORD error = GetLastError();
218 __kmp_fatal(KMP_MSG(CantSetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
221 #error Unknown or unsupported OS.
237 ___kmp_env_blk_parse_string(kmp_env_blk_t *block,
241 char const chr_delimiter =
'|';
242 char const str_delimiter[] = {chr_delimiter, 0};
245 kmp_env_var_t *vars = NULL;
250 bulk = __kmp_str_format(
"%s", env);
255 char const *ptr = bulk;
257 ptr = strchr(ptr, chr_delimiter);
267 vars = (kmp_env_var_t *)allocate((delimiters + 1) *
sizeof(kmp_env_var_t));
275 var = __kmp_str_token(bulk, str_delimiter, &buf);
276 while (var != NULL) {
278 __kmp_str_split(var,
'=', &name, &value);
279 KMP_DEBUG_ASSERT(count < delimiters + 1);
280 vars[count].name = name;
281 vars[count].value = value;
284 var = __kmp_str_token(NULL, str_delimiter, &buf);
291 block->count = count;
305 static void ___kmp_env_blk_parse_windows(
306 kmp_env_blk_t *block,
311 kmp_env_var_t *vars = NULL;
328 len = KMP_STRLEN(var);
331 size = size + len + 1;
334 len = KMP_STRLEN(var);
341 bulk = (
char *)allocate(size);
342 KMP_MEMCPY_S(bulk, size, env, size);
344 vars = (kmp_env_var_t *)allocate(count *
sizeof(kmp_env_var_t));
352 len = KMP_STRLEN(var);
355 __kmp_str_split(var,
'=', &name, &value);
356 vars[count].name = name;
357 vars[count].value = value;
361 len = KMP_STRLEN(var);
369 block->count = count;
381 ___kmp_env_blk_parse_unix(kmp_env_blk_t *block,
385 kmp_env_var_t *vars = NULL;
391 while (env[count] != NULL) {
392 size += KMP_STRLEN(env[count]) + 1;
398 bulk = (
char *)allocate(size);
399 vars = (kmp_env_var_t *)allocate(count *
sizeof(kmp_env_var_t));
409 for (i = 0; i < count; ++i) {
411 len = KMP_STRLEN(env[i]);
412 KMP_MEMCPY_S(var, size, env[i], len + 1);
414 __kmp_str_split(var,
'=', &name, &value);
416 vars[i].value = value;
425 block->count = count;
429 void __kmp_env_blk_init(kmp_env_blk_t *block,
434 ___kmp_env_blk_parse_string(block, bulk);
437 ___kmp_env_blk_parse_unix(block, environ);
440 char *mem = GetEnvironmentStrings();
442 DWORD error = GetLastError();
443 __kmp_fatal(KMP_MSG(CantGetEnvironment), KMP_ERR(error),
446 ___kmp_env_blk_parse_windows(block, mem);
447 FreeEnvironmentStrings(mem);
450 #error Unknown or unsupported OS.
456 static int ___kmp_env_var_cmp(
457 kmp_env_var_t
const *lhs, kmp_env_var_t
const *rhs) {
458 return strcmp(lhs->name, rhs->name);
461 void __kmp_env_blk_sort(
465 qsort(CCAST(kmp_env_var_t *, block->vars), block->count,
466 sizeof(kmp_env_var_t),
467 (int (*)(
void const *,
void const *)) & ___kmp_env_var_cmp);
471 void __kmp_env_blk_free(
475 KMP_INTERNAL_FREE(CCAST(kmp_env_var_t *, block->vars));
476 __kmp_str_free(&(block->bulk));
484 __kmp_env_blk_var(kmp_env_blk_t *block,
489 for (i = 0; i < block->count; ++i) {
490 if (strcmp(block->vars[i].name, name) == 0) {
491 return block->vars[i].value;