57 #include "kmp_environment.h" 67 #if KMP_OS_LINUX || KMP_OS_FREEBSD 68 extern char * * environ;
70 #include <crt_externs.h> 71 #define environ (*_NSGetEnviron()) 73 #error Unknown or unsupported OS. 78 #error Unknown or unsupported OS. 89 void * ptr = KMP_INTERNAL_MALLOC( size );
91 KMP_FATAL( MemoryAllocFailed );
98 __kmp_env_get(
char const * name ) {
100 char * result = NULL;
103 char const * value = getenv( name );
104 if ( value != NULL ) {
105 size_t len = KMP_STRLEN( value ) + 1;
106 result = (
char *) KMP_INTERNAL_MALLOC( len );
107 if ( result == NULL ) {
108 KMP_FATAL( MemoryAllocFailed );
110 KMP_STRNCPY_S( result, len, value, len );
121 rc = GetEnvironmentVariable( name, NULL, 0 );
123 DWORD error = GetLastError();
124 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
127 KMP_MSG( CantGetEnvVar, name ),
135 result = (
char *) KMP_INTERNAL_MALLOC( len );
136 if ( result == NULL ) {
137 KMP_FATAL( MemoryAllocFailed );
139 rc = GetEnvironmentVariable( name, result, len );
143 DWORD error = GetLastError();
144 if ( error != ERROR_SUCCESS ) {
149 KMP_MSG( CantGetEnvVar, name ),
153 KMP_INTERNAL_FREE( (
void *) result );
159 #error Unknown or unsupported OS. 170 __kmp_env_free(
char const * * value ) {
172 KMP_DEBUG_ASSERT( value != NULL );
173 KMP_INTERNAL_FREE( (
void *) * value );
181 __kmp_env_exists(
char const * name ) {
184 char const * value = getenv( name );
185 return ( ( value == NULL ) ? ( 0 ) : ( 1 ) );
188 rc = GetEnvironmentVariable( name, NULL, 0 );
190 DWORD error = GetLastError();
191 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
194 KMP_MSG( CantGetEnvVar, name ),
203 #error Unknown or unsupported OS. 211 __kmp_env_set(
char const * name,
char const * value,
int overwrite ) {
214 int rc = setenv( name, value, overwrite );
223 KMP_MSG( CantSetEnvVar, name ),
224 KMP_HNT( NotEnoughMemory ),
231 rc = GetEnvironmentVariable( name, NULL, 0 );
236 DWORD error = GetLastError();
237 if ( error != ERROR_ENVVAR_NOT_FOUND ) {
240 KMP_MSG( CantGetEnvVar, name ),
246 rc = SetEnvironmentVariable( name, value );
248 DWORD error = GetLastError();
251 KMP_MSG( CantSetEnvVar, name ),
257 #error Unknown or unsupported OS. 265 __kmp_env_unset(
char const * name ) {
270 BOOL rc = SetEnvironmentVariable( name, NULL );
272 DWORD error = GetLastError();
275 KMP_MSG( CantSetEnvVar, name ),
281 #error Unknown or unsupported OS. 302 ___kmp_env_blk_parse_string(
303 kmp_env_blk_t * block,
307 char const chr_delimiter =
'|';
308 char const str_delimiter[] = { chr_delimiter, 0 };
311 kmp_env_var_t * vars = NULL;
316 bulk = __kmp_str_format(
"%s", env );
321 char const * ptr = bulk;
323 ptr = strchr( ptr, chr_delimiter );
333 vars = (kmp_env_var_t *) allocate( ( delimiters + 1 ) *
sizeof( kmp_env_var_t ) );
341 var = __kmp_str_token( bulk, str_delimiter, & buf );
342 while ( var != NULL ) {
344 __kmp_str_split( var,
'=', & name, & value );
345 KMP_DEBUG_ASSERT( count < delimiters + 1 );
346 vars[ count ].name = name;
347 vars[ count ].value = value;
350 var = __kmp_str_token( NULL, str_delimiter, & buf );
357 block->count = count;
376 ___kmp_env_blk_parse_windows(
377 kmp_env_blk_t * block,
382 kmp_env_var_t * vars = NULL;
397 len = KMP_STRLEN( var );
400 size = size + len + 1;
402 len = KMP_STRLEN( var );
408 bulk = (
char *) allocate( size );
409 KMP_MEMCPY_S( bulk, size, env, size );
411 vars = (kmp_env_var_t *) allocate( count *
sizeof( kmp_env_var_t ) );
419 len = KMP_STRLEN( var );
422 __kmp_str_split( var,
'=', & name, & value );
423 vars[ count ].name = name;
424 vars[ count ].value = value;
428 len = KMP_STRLEN( var );
437 block->count = count;
451 ___kmp_env_blk_parse_unix(
452 kmp_env_blk_t * block,
457 kmp_env_var_t * vars = NULL;
465 while ( env[ count ] != NULL ) {
466 size += KMP_STRLEN( env[ count ] ) + 1;
472 bulk = (
char *) allocate( size );
473 vars = (kmp_env_var_t *) allocate( count *
sizeof( kmp_env_var_t ) );
483 for ( i = 0; i < count; ++ i ) {
485 len = KMP_STRLEN( env[ i ] );
486 KMP_MEMCPY_S( var, size, env[ i ], len + 1 );
488 __kmp_str_split( var,
'=', & name, & value );
489 vars[ i ].name = name;
490 vars[ i ].value = value;
499 block->count = count;
507 kmp_env_blk_t * block,
511 if ( bulk != NULL ) {
512 ___kmp_env_blk_parse_string( block, bulk );
515 ___kmp_env_blk_parse_unix( block, environ );
518 char * mem = GetEnvironmentStrings();
520 DWORD error = GetLastError();
523 KMP_MSG( CantGetEnvironment ),
528 ___kmp_env_blk_parse_windows( block, mem );
529 FreeEnvironmentStrings( mem );
532 #error Unknown or unsupported OS. 543 kmp_env_var_t
const * lhs,
544 kmp_env_var_t
const * rhs
546 return strcmp( lhs->name, rhs->name );
551 kmp_env_blk_t * block
555 (
void *) block->vars,
557 sizeof( kmp_env_var_t ),
558 ( int ( * )(
void const *,
void const * ) ) & ___kmp_env_var_cmp
567 kmp_env_blk_t * block
570 KMP_INTERNAL_FREE( (
void *) block->vars );
571 KMP_INTERNAL_FREE( (
void *) block->bulk );
583 kmp_env_blk_t * block,
588 for ( i = 0; i < block->count; ++ i ) {
589 if ( strcmp( block->vars[ i ].name, name ) == 0 ) {
590 return block->vars[ i ].value;