76 #include "kmp_environment.h"
86 #if KMP_OS_LINUX || KMP_OS_FREEBSD
87 extern char * * environ;
89 #include <crt_externs.h>
90 #define environ (*_NSGetEnviron())
92 #error Unknown or unsupported OS.
97 #error Unknown or unsupported OS.
108 void * ptr = KMP_INTERNAL_MALLOC( size );
110 KMP_FATAL( MemoryAllocFailed );
117 __kmp_env_get(
char const * name ) {
119 char * result = NULL;
122 char const * value = getenv( name );
123 if ( value != NULL ) {
124 size_t len = KMP_STRLEN( value ) + 1;
125 result = (
char *) KMP_INTERNAL_MALLOC( len );
126 if ( result == NULL ) {
127 KMP_FATAL( MemoryAllocFailed );
129 KMP_STRNCPY_S( result, len, value, len );
140 rc = GetEnvironmentVariable( name, NULL, 0 );
142 DWORD error = GetLastError();
143 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
146 KMP_MSG( CantGetEnvVar, name ),
154 result = (
char *) KMP_INTERNAL_MALLOC( len );
155 if ( result == NULL ) {
156 KMP_FATAL( MemoryAllocFailed );
158 rc = GetEnvironmentVariable( name, result, len );
162 DWORD error = GetLastError();
163 if ( error != ERROR_SUCCESS ) {
168 KMP_MSG( CantGetEnvVar, name ),
172 KMP_INTERNAL_FREE( (
void *) result );
178 #error Unknown or unsupported OS.
189 __kmp_env_free(
char const * * value ) {
191 KMP_DEBUG_ASSERT( value != NULL );
192 KMP_INTERNAL_FREE( (
void *) * value );
200 __kmp_env_exists(
char const * name ) {
203 char const * value = getenv( name );
204 return ( ( value == NULL ) ? ( 0 ) : ( 1 ) );
207 rc = GetEnvironmentVariable( name, NULL, 0 );
209 DWORD error = GetLastError();
210 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
213 KMP_MSG( CantGetEnvVar, name ),
222 #error Unknown or unsupported OS.
230 __kmp_env_set(
char const * name,
char const * value,
int overwrite ) {
233 int rc = setenv( name, value, overwrite );
242 KMP_MSG( CantSetEnvVar, name ),
243 KMP_HNT( NotEnoughMemory ),
250 rc = GetEnvironmentVariable( name, NULL, 0 );
255 DWORD error = GetLastError();
256 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
259 KMP_MSG( CantGetEnvVar, name ),
265 rc = SetEnvironmentVariable( name, value );
267 DWORD error = GetLastError();
270 KMP_MSG( CantSetEnvVar, name ),
276 #error Unknown or unsupported OS.
284 __kmp_env_unset(
char const * name ) {
289 BOOL rc = SetEnvironmentVariable( name, NULL );
291 DWORD error = GetLastError();
294 KMP_MSG( CantSetEnvVar, name ),
300 #error Unknown or unsupported OS.
321 ___kmp_env_blk_parse_string(
322 kmp_env_blk_t * block,
326 char const chr_delimiter =
'|';
327 char const str_delimiter[] = { chr_delimiter, 0 };
330 kmp_env_var_t * vars = NULL;
335 bulk = __kmp_str_format(
"%s", env );
340 char const * ptr = bulk;
342 ptr = strchr( ptr, chr_delimiter );
352 vars = (kmp_env_var_t *) allocate( ( delimiters + 1 ) *
sizeof( kmp_env_var_t ) );
360 var = __kmp_str_token( bulk, str_delimiter, & buf );
361 while ( var != NULL ) {
363 __kmp_str_split( var,
'=', & name, & value );
364 KMP_DEBUG_ASSERT( count < delimiters + 1 );
365 vars[ count ].name = name;
366 vars[ count ].value = value;
369 var = __kmp_str_token( NULL, str_delimiter, & buf );
376 block->count = count;
394 ___kmp_env_blk_parse_windows(
395 kmp_env_blk_t * block,
400 kmp_env_var_t * vars = NULL;
415 len = KMP_STRLEN( var );
418 size = size + len + 1;
420 len = KMP_STRLEN( var );
426 bulk = (
char *) allocate( size );
427 KMP_MEMCPY_S( bulk, size, env, size );
429 vars = (kmp_env_var_t *) allocate( count *
sizeof( kmp_env_var_t ) );
437 len = KMP_STRLEN( var );
440 __kmp_str_split( var,
'=', & name, & value );
441 vars[ count ].name = name;
442 vars[ count ].value = value;
446 len = KMP_STRLEN( var );
455 block->count = count;
469 ___kmp_env_blk_parse_unix(
470 kmp_env_blk_t * block,
475 kmp_env_var_t * vars = NULL;
483 while ( env[ count ] != NULL ) {
484 size += KMP_STRLEN( env[ count ] ) + 1;
490 bulk = (
char *) allocate( size );
491 vars = (kmp_env_var_t *) allocate( count *
sizeof( kmp_env_var_t ) );
501 for ( i = 0; i < count; ++ i ) {
503 len = KMP_STRLEN( env[ i ] );
504 KMP_MEMCPY_S( var, size, env[ i ], len + 1 );
506 __kmp_str_split( var,
'=', & name, & value );
507 vars[ i ].name = name;
508 vars[ i ].value = value;
517 block->count = count;
525 kmp_env_blk_t * block,
529 if ( bulk != NULL ) {
530 ___kmp_env_blk_parse_string( block, bulk );
533 ___kmp_env_blk_parse_unix( block, environ );
536 char * mem = GetEnvironmentStrings();
538 DWORD error = GetLastError();
541 KMP_MSG( CantGetEnvironment ),
546 ___kmp_env_blk_parse_windows( block, mem );
547 FreeEnvironmentStrings( mem );
550 #error Unknown or unsupported OS.
561 kmp_env_var_t
const * lhs,
562 kmp_env_var_t
const * rhs
564 return strcmp( lhs->name, rhs->name );
569 kmp_env_blk_t * block
573 (
void *) block->vars,
575 sizeof( kmp_env_var_t ),
576 ( int ( * )(
void const *,
void const * ) ) & ___kmp_env_var_cmp
585 kmp_env_blk_t * block
588 KMP_INTERNAL_FREE( (
void *) block->vars );
589 KMP_INTERNAL_FREE( (
void *) block->bulk );
601 kmp_env_blk_t * block,
606 for ( i = 0; i < block->count; ++ i ) {
607 if ( strcmp( block->vars[ i ].name, name ) == 0 ) {
608 return block->vars[ i ].value;