52 #include "kmp_environment.h" 63 #include <crt_externs.h> 64 #define environ (*_NSGetEnviron()) 66 extern char **environ;
72 #error Unknown or unsupported OS. 77 static inline void *allocate(
size_t size) {
78 void *ptr = KMP_INTERNAL_MALLOC(size);
80 KMP_FATAL(MemoryAllocFailed);
85 char *__kmp_env_get(
char const *name) {
90 char const *value = getenv(name);
92 size_t len = KMP_STRLEN(value) + 1;
93 result = (
char *)KMP_INTERNAL_MALLOC(len);
95 KMP_FATAL(MemoryAllocFailed);
97 KMP_STRNCPY_S(result, len, value, len);
106 rc = GetEnvironmentVariable(name, NULL, 0);
108 DWORD error = GetLastError();
109 if (error != ERROR_ENVVAR_NOT_FOUND) {
110 __kmp_fatal(KMP_MSG(CantGetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
115 result = (
char *)KMP_INTERNAL_MALLOC(len);
116 if (result == NULL) {
117 KMP_FATAL(MemoryAllocFailed);
119 rc = GetEnvironmentVariable(name, result, len);
123 DWORD error = GetLastError();
124 if (error != ERROR_SUCCESS) {
127 __kmp_fatal(KMP_MSG(CantGetEnvVar, name), KMP_ERR(error),
129 KMP_INTERNAL_FREE((
void *)result);
135 #error Unknown or unsupported OS. 144 void __kmp_env_free(
char const **value) {
146 KMP_DEBUG_ASSERT(value != NULL);
147 KMP_INTERNAL_FREE(CCAST(
char *, *value));
152 int __kmp_env_exists(
char const *name) {
155 char const *value = getenv(name);
156 return ((value == NULL) ? (0) : (1));
159 rc = GetEnvironmentVariable(name, NULL, 0);
161 DWORD error = GetLastError();
162 if (error != ERROR_ENVVAR_NOT_FOUND) {
163 __kmp_fatal(KMP_MSG(CantGetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
169 #error Unknown or unsupported OS. 174 void __kmp_env_set(
char const *name,
char const *value,
int overwrite) {
177 int rc = setenv(name, value, overwrite);
184 __kmp_fatal(KMP_MSG(CantSetEnvVar, name), KMP_HNT(NotEnoughMemory),
190 rc = GetEnvironmentVariable(name, NULL, 0);
195 DWORD error = GetLastError();
196 if (error != ERROR_ENVVAR_NOT_FOUND) {
197 __kmp_fatal(KMP_MSG(CantGetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
200 rc = SetEnvironmentVariable(name, value);
202 DWORD error = GetLastError();
203 __kmp_fatal(KMP_MSG(CantSetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
206 #error Unknown or unsupported OS. 211 void __kmp_env_unset(
char const *name) {
216 BOOL rc = SetEnvironmentVariable(name, NULL);
218 DWORD error = GetLastError();
219 __kmp_fatal(KMP_MSG(CantSetEnvVar, name), KMP_ERR(error), __kmp_msg_null);
222 #error Unknown or unsupported OS. 238 ___kmp_env_blk_parse_string(kmp_env_blk_t *block,
242 char const chr_delimiter =
'|';
243 char const str_delimiter[] = {chr_delimiter, 0};
246 kmp_env_var_t *vars = NULL;
251 bulk = __kmp_str_format(
"%s", env);
256 char const *ptr = bulk;
258 ptr = strchr(ptr, chr_delimiter);
268 vars = (kmp_env_var_t *)allocate((delimiters + 1) *
sizeof(kmp_env_var_t));
276 var = __kmp_str_token(bulk, str_delimiter, &buf);
277 while (var != NULL) {
279 __kmp_str_split(var,
'=', &name, &value);
280 KMP_DEBUG_ASSERT(count < delimiters + 1);
281 vars[count].name = name;
282 vars[count].value = value;
285 var = __kmp_str_token(NULL, str_delimiter, &buf);
292 block->count = count;
306 static void ___kmp_env_blk_parse_windows(
307 kmp_env_blk_t *block,
312 kmp_env_var_t *vars = NULL;
329 len = KMP_STRLEN(var);
332 size = size + len + 1;
335 len = KMP_STRLEN(var);
342 bulk = (
char *)allocate(size);
343 KMP_MEMCPY_S(bulk, size, env, size);
345 vars = (kmp_env_var_t *)allocate(count *
sizeof(kmp_env_var_t));
353 len = KMP_STRLEN(var);
356 __kmp_str_split(var,
'=', &name, &value);
357 vars[count].name = name;
358 vars[count].value = value;
362 len = KMP_STRLEN(var);
370 block->count = count;
381 ___kmp_env_blk_parse_unix(kmp_env_blk_t *block,
386 kmp_env_var_t *vars = NULL;
394 while (env[count] != NULL) {
395 size += KMP_STRLEN(env[count]) + 1;
401 bulk = (
char *)allocate(size);
402 vars = (kmp_env_var_t *)allocate(count *
sizeof(kmp_env_var_t));
412 for (i = 0; i < count; ++i) {
414 len = KMP_STRLEN(env[i]);
415 KMP_MEMCPY_S(var, size, env[i], len + 1);
417 __kmp_str_split(var,
'=', &name, &value);
419 vars[i].value = value;
428 block->count = count;
431 void __kmp_env_blk_init(kmp_env_blk_t *block,
436 ___kmp_env_blk_parse_string(block, bulk);
439 ___kmp_env_blk_parse_unix(block, environ);
442 char *mem = GetEnvironmentStrings();
444 DWORD error = GetLastError();
445 __kmp_fatal(KMP_MSG(CantGetEnvironment), KMP_ERR(error),
448 ___kmp_env_blk_parse_windows(block, mem);
449 FreeEnvironmentStrings(mem);
452 #error Unknown or unsupported OS. 458 static int ___kmp_env_var_cmp(
459 kmp_env_var_t
const *lhs, kmp_env_var_t
const *rhs) {
460 return strcmp(lhs->name, rhs->name);
463 void __kmp_env_blk_sort(
467 qsort(CCAST(kmp_env_var_t *, block->vars), block->count,
468 sizeof(kmp_env_var_t),
469 (int (*)(
void const *,
void const *)) & ___kmp_env_var_cmp);
473 void __kmp_env_blk_free(
477 KMP_INTERNAL_FREE(CCAST(kmp_env_var_t *, block->vars));
478 __kmp_str_free(&(block->bulk));
487 kmp_env_blk_t *block,
492 for (i = 0; i < block->count; ++i) {
493 if (strcmp(block->vars[i].name, name) == 0) {
494 return block->vars[i].value;