57 #include "kmp_environment.h" 68 #include <crt_externs.h> 69 #define environ (*_NSGetEnviron()) 71 extern char * * environ;
76 #error Unknown or unsupported OS. 87 void * ptr = KMP_INTERNAL_MALLOC( size );
89 KMP_FATAL( MemoryAllocFailed );
96 __kmp_env_get(
char const * name ) {
101 char const * value = getenv( name );
102 if ( value != NULL ) {
103 size_t len = KMP_STRLEN( value ) + 1;
104 result = (
char *) KMP_INTERNAL_MALLOC( len );
105 if ( result == NULL ) {
106 KMP_FATAL( MemoryAllocFailed );
108 KMP_STRNCPY_S( result, len, value, len );
119 rc = GetEnvironmentVariable( name, NULL, 0 );
121 DWORD error = GetLastError();
122 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
125 KMP_MSG( CantGetEnvVar, name ),
133 result = (
char *) KMP_INTERNAL_MALLOC( len );
134 if ( result == NULL ) {
135 KMP_FATAL( MemoryAllocFailed );
137 rc = GetEnvironmentVariable( name, result, len );
141 DWORD error = GetLastError();
142 if ( error != ERROR_SUCCESS ) {
147 KMP_MSG( CantGetEnvVar, name ),
151 KMP_INTERNAL_FREE( (
void *) result );
157 #error Unknown or unsupported OS. 168 __kmp_env_free(
char const * * value ) {
170 KMP_DEBUG_ASSERT( value != NULL );
171 KMP_INTERNAL_FREE( (
void *) * value );
179 __kmp_env_exists(
char const * name ) {
182 char const * value = getenv( name );
183 return ( ( value == NULL ) ? ( 0 ) : ( 1 ) );
186 rc = GetEnvironmentVariable( name, NULL, 0 );
188 DWORD error = GetLastError();
189 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
192 KMP_MSG( CantGetEnvVar, name ),
201 #error Unknown or unsupported OS. 209 __kmp_env_set(
char const * name,
char const * value,
int overwrite ) {
212 int rc = setenv( name, value, overwrite );
221 KMP_MSG( CantSetEnvVar, name ),
222 KMP_HNT( NotEnoughMemory ),
229 rc = GetEnvironmentVariable( name, NULL, 0 );
234 DWORD error = GetLastError();
235 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
238 KMP_MSG( CantGetEnvVar, name ),
244 rc = SetEnvironmentVariable( name, value );
246 DWORD error = GetLastError();
249 KMP_MSG( CantSetEnvVar, name ),
255 #error Unknown or unsupported OS. 263 __kmp_env_unset(
char const * name ) {
268 BOOL rc = SetEnvironmentVariable( name, NULL );
270 DWORD error = GetLastError();
273 KMP_MSG( CantSetEnvVar, name ),
279 #error Unknown or unsupported OS. 300 ___kmp_env_blk_parse_string(
301 kmp_env_blk_t * block,
305 char const chr_delimiter =
'|';
306 char const str_delimiter[] = { chr_delimiter, 0 };
309 kmp_env_var_t * vars = NULL;
314 bulk = __kmp_str_format(
"%s", env );
319 char const * ptr = bulk;
321 ptr = strchr( ptr, chr_delimiter );
331 vars = (kmp_env_var_t *) allocate( ( delimiters + 1 ) *
sizeof( kmp_env_var_t ) );
339 var = __kmp_str_token( bulk, str_delimiter, & buf );
340 while ( var != NULL ) {
342 __kmp_str_split( var,
'=', & name, & value );
343 KMP_DEBUG_ASSERT( count < delimiters + 1 );
344 vars[ count ].name = name;
345 vars[ count ].value = value;
348 var = __kmp_str_token( NULL, str_delimiter, & buf );
355 block->count = count;
374 ___kmp_env_blk_parse_windows(
375 kmp_env_blk_t * block,
380 kmp_env_var_t * vars = NULL;
395 len = KMP_STRLEN( var );
398 size = size + len + 1;
400 len = KMP_STRLEN( var );
406 bulk = (
char *) allocate( size );
407 KMP_MEMCPY_S( bulk, size, env, size );
409 vars = (kmp_env_var_t *) allocate( count *
sizeof( kmp_env_var_t ) );
417 len = KMP_STRLEN( var );
420 __kmp_str_split( var,
'=', & name, & value );
421 vars[ count ].name = name;
422 vars[ count ].value = value;
426 len = KMP_STRLEN( var );
435 block->count = count;
449 ___kmp_env_blk_parse_unix(
450 kmp_env_blk_t * block,
455 kmp_env_var_t * vars = NULL;
463 while ( env[ count ] != NULL ) {
464 size += KMP_STRLEN( env[ count ] ) + 1;
470 bulk = (
char *) allocate( size );
471 vars = (kmp_env_var_t *) allocate( count *
sizeof( kmp_env_var_t ) );
481 for ( i = 0; i < count; ++ i ) {
483 len = KMP_STRLEN( env[ i ] );
484 KMP_MEMCPY_S( var, size, env[ i ], len + 1 );
486 __kmp_str_split( var,
'=', & name, & value );
487 vars[ i ].name = name;
488 vars[ i ].value = value;
497 block->count = count;
505 kmp_env_blk_t * block,
509 if ( bulk != NULL ) {
510 ___kmp_env_blk_parse_string( block, bulk );
513 ___kmp_env_blk_parse_unix( block, environ );
516 char * mem = GetEnvironmentStrings();
518 DWORD error = GetLastError();
521 KMP_MSG( CantGetEnvironment ),
526 ___kmp_env_blk_parse_windows( block, mem );
527 FreeEnvironmentStrings( mem );
530 #error Unknown or unsupported OS. 541 kmp_env_var_t
const * lhs,
542 kmp_env_var_t
const * rhs
544 return strcmp( lhs->name, rhs->name );
549 kmp_env_blk_t * block
553 (
void *) block->vars,
555 sizeof( kmp_env_var_t ),
556 ( int ( * )(
void const *,
void const * ) ) & ___kmp_env_var_cmp
565 kmp_env_blk_t * block
568 KMP_INTERNAL_FREE( (
void *) block->vars );
569 KMP_INTERNAL_FREE( (
void *) block->bulk );
581 kmp_env_blk_t * block,
586 for ( i = 0; i < block->count; ++ i ) {
587 if ( strcmp( block->vars[ i ].name, name ) == 0 ) {
588 return block->vars[ i ].value;