/*
 * kmp_environment.h -- Handle environment varoiables OS-independently.
 * $Revision: 42061 $
 * $Date: 2013-02-28 16:36:24 -0600 (Thu, 28 Feb 2013) $
 */


//===----------------------------------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.txt for details.
//
//===----------------------------------------------------------------------===//


#ifndef KMP_ENVIRONMENT_H
#define KMP_ENVIRONMENT_H

#ifdef __cplusplus
extern "C" {
#endif

// Return a copy of the value of environment variable or NULL if the variable does not exist.
// *Note*: Returned pointed *must* be freed after use with __kmp_env_free().
char * __kmp_env_get( char const * name );
void   __kmp_env_free( char const * * value );

// Return 1 if the environment variable exists or 0 if does not exist.
int __kmp_env_exists( char const * name );

// Set the environment variable.
void __kmp_env_set( char const * name, char const * value, int overwrite );

// Unset (remove) environment variable.
void __kmp_env_unset( char const * name );


// -------------------------------------------------------------------------------------------------
//  Working with environment blocks.
// -------------------------------------------------------------------------------------------------

/*
    kmp_env_blk_t is read-only collection of environment variables (or environment-like). Usage:

        kmp_env_blk_t block;
        __kmp_env_blk_init( & block, NULL ); // Initialize block from process environment.
        // or
        __kmp_env_blk_init( & block, "KMP_WARNING=1|KMP_AFFINITY=none" ); // from string.
        __kmp_env_blk_sort( & block ); // Optionally, sort list.
        for ( i = 0; i < block.count; ++ i ) {
            // Process block.vars[ i ].name and block.vars[ i ].value...
        }; // for i
        __kmp_env_block_free( & block );
*/

struct __kmp_env_var {
    char const * name;
    char const * value;
};
typedef struct __kmp_env_var kmp_env_var_t;

struct __kmp_env_blk {
    char const *          bulk;
    kmp_env_var_t const * vars;
    int                   count;
};
typedef struct __kmp_env_blk kmp_env_blk_t;

void         __kmp_env_blk_init( kmp_env_blk_t * block, char const * bulk );
void         __kmp_env_blk_free( kmp_env_blk_t * block );
void         __kmp_env_blk_sort( kmp_env_blk_t * block );
char const * __kmp_env_blk_var(  kmp_env_blk_t * block, char const * name );

#ifdef __cplusplus
}
#endif

#endif // KMP_ENVIRONMENT_H

// end of file //

