/*
 * kmp_environment.h -- Handle environment varoiables OS-independently.
 */


//===----------------------------------------------------------------------===//
//
//                     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 //
