78 #include "kmp_environment.h"
88 #if KMP_OS_LINUX || KMP_OS_FREEBSD
89 extern char * * environ;
91 #include <crt_externs.h>
92 #define environ (*_NSGetEnviron())
94 #error Unknown or unsupported OS.
99 #error Unknown or unsupported OS.
110 void * ptr = KMP_INTERNAL_MALLOC( size );
112 KMP_FATAL( MemoryAllocFailed );
119 __kmp_env_get(
char const * name ) {
121 char * result = NULL;
124 char const * value = getenv( name );
125 if ( value != NULL ) {
126 size_t len = strlen( value ) + 1;
127 result = (
char *) KMP_INTERNAL_MALLOC( len );
128 if ( result == NULL ) {
129 KMP_FATAL( MemoryAllocFailed );
131 strncpy( result, value, len );
142 rc = GetEnvironmentVariable( name, NULL, 0 );
144 DWORD error = GetLastError();
145 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
148 KMP_MSG( CantGetEnvVar, name ),
156 result = (
char *) KMP_INTERNAL_MALLOC( len );
157 if ( result == NULL ) {
158 KMP_FATAL( MemoryAllocFailed );
160 rc = GetEnvironmentVariable( name, result, len );
164 DWORD error = GetLastError();
165 if ( error != ERROR_SUCCESS ) {
170 KMP_MSG( CantGetEnvVar, name ),
174 KMP_INTERNAL_FREE( (
void *) result );
180 #error Unknown or unsupported OS.
191 __kmp_env_free(
char const * * value ) {
193 KMP_DEBUG_ASSERT( value != NULL );
194 KMP_INTERNAL_FREE( (
void *) * value );
202 __kmp_env_exists(
char const * name ) {
205 char const * value = getenv( name );
206 return ( ( value == NULL ) ? ( 0 ) : ( 1 ) );
209 rc = GetEnvironmentVariable( name, NULL, 0 );
211 DWORD error = GetLastError();
212 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
215 KMP_MSG( CantGetEnvVar, name ),
224 #error Unknown or unsupported OS.
232 __kmp_env_set(
char const * name,
char const * value,
int overwrite ) {
235 int rc = setenv( name, value, overwrite );
244 KMP_MSG( CantSetEnvVar, name ),
245 KMP_HNT( NotEnoughMemory ),
252 rc = GetEnvironmentVariable( name, NULL, 0 );
257 DWORD error = GetLastError();
258 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
261 KMP_MSG( CantGetEnvVar, name ),
267 rc = SetEnvironmentVariable( name, value );
269 DWORD error = GetLastError();
272 KMP_MSG( CantSetEnvVar, name ),
278 #error Unknown or unsupported OS.
286 __kmp_env_unset(
char const * name ) {
291 BOOL rc = SetEnvironmentVariable( name, NULL );
293 DWORD error = GetLastError();
296 KMP_MSG( CantSetEnvVar, name ),
302 #error Unknown or unsupported OS.
323 ___kmp_env_blk_parse_string(
324 kmp_env_blk_t * block,
328 char const chr_delimiter =
'|';
329 char const str_delimiter[] = { chr_delimiter, 0 };
332 kmp_env_var_t * vars = NULL;
337 bulk = __kmp_str_format(
"%s", env );
342 char const * ptr = bulk;
344 ptr = strchr( ptr, chr_delimiter );
354 vars = (kmp_env_var_t *) allocate( ( delimiters + 1 ) *
sizeof( kmp_env_var_t ) );
362 var = __kmp_str_token( bulk, str_delimiter, & buf );
363 while ( var != NULL ) {
365 __kmp_str_split( var,
'=', & name, & value );
366 KMP_DEBUG_ASSERT( count < delimiters + 1 );
367 vars[ count ].name = name;
368 vars[ count ].value = value;
371 var = __kmp_str_token( NULL, str_delimiter, & buf );
378 block->count = count;
396 ___kmp_env_blk_parse_windows(
397 kmp_env_blk_t * block,
402 kmp_env_var_t * vars = NULL;
420 size = size + len + 1;
428 bulk = (
char *) allocate( size );
429 memcpy( bulk, env, size );
431 vars = (kmp_env_var_t *) allocate( count *
sizeof( kmp_env_var_t ) );
442 __kmp_str_split( var,
'=', & name, & value );
443 vars[ count ].name = name;
444 vars[ count ].value = value;
457 block->count = count;
471 ___kmp_env_blk_parse_unix(
472 kmp_env_blk_t * block,
477 kmp_env_var_t * vars = NULL;
485 while ( env[ count ] != NULL ) {
486 size += strlen( env[ count ] ) + 1;
492 bulk = (
char *) allocate( size );
493 vars = (kmp_env_var_t *) allocate( count *
sizeof( kmp_env_var_t ) );
503 for ( i = 0; i < count; ++ i ) {
505 len = strlen( env[ i ] );
506 memcpy( var, env[ i ], len + 1 );
508 __kmp_str_split( var,
'=', & name, & value );
509 vars[ i ].name = name;
510 vars[ i ].value = value;
519 block->count = count;
527 kmp_env_blk_t * block,
531 if ( bulk != NULL ) {
532 ___kmp_env_blk_parse_string( block, bulk );
535 ___kmp_env_blk_parse_unix( block, environ );
538 char * mem = GetEnvironmentStrings();
540 DWORD error = GetLastError();
543 KMP_MSG( CantGetEnvironment ),
548 ___kmp_env_blk_parse_windows( block, mem );
549 FreeEnvironmentStrings( mem );
552 #error Unknown or unsupported OS.
563 kmp_env_var_t
const * lhs,
564 kmp_env_var_t
const * rhs
566 return strcmp( lhs->name, rhs->name );
571 kmp_env_blk_t * block
575 (
void *) block->vars,
577 sizeof( kmp_env_var_t ),
578 ( int ( * )(
void const *,
void const * ) ) & ___kmp_env_var_cmp
587 kmp_env_blk_t * block
590 KMP_INTERNAL_FREE( (
void *) block->vars );
591 KMP_INTERNAL_FREE( (
void *) block->bulk );
603 kmp_env_blk_t * block,
608 for ( i = 0; i < block->count; ++ i ) {
609 if ( strcmp( block->vars[ i ].name, name ) == 0 ) {
610 return block->vars[ i ].value;