2005-09-20 23:26:39 +10:00
/** \file env.h
Prototypes for functions for setting and getting environment variables .
*/
2005-10-05 01:11:39 +10:00
# ifndef FISH_ENV_H
# define FISH_ENV_H
# include <wchar.h>
2011-12-26 19:18:46 -08:00
# include <map>
2005-10-05 01:11:39 +10:00
# include "util.h"
2011-12-26 19:18:46 -08:00
# include "common.h"
2005-10-05 01:11:39 +10:00
2005-09-20 23:26:39 +10:00
/**
Flag for local ( to the current block ) variable
*/
# define ENV_LOCAL 1
/**
Flag for exported ( to commands ) variable
*/
# define ENV_EXPORT 2
/**
Flag for unexported variable
*/
# define ENV_UNEXPORT 16
/**
Flag for global variable
*/
# define ENV_GLOBAL 4
/**
Flag for variable update request from the user . All variable
changes that are made directly by the user , such as those from the
' set ' builtin must have this flag set .
*/
# define ENV_USER 8
/**
Flag for universal variable
*/
# define ENV_UNIVERSAL 32
2006-04-11 01:36:26 +10:00
/**
Error code for trying to alter read - only variable
*/
2006-06-09 09:52:12 +10:00
enum {
ENV_PERM = 1 ,
ENV_INVALID
}
;
2006-04-11 01:36:26 +10:00
2005-09-20 23:26:39 +10:00
/**
Initialize environment variable data
*/
void env_init ( ) ;
/**
Destroy environment variable data
*/
void env_destroy ( ) ;
/**
2011-12-26 19:18:46 -08:00
Set the value of the environment variable whose name matches key to val .
2005-09-20 23:26:39 +10:00
Memory policy : All keys and values are copied , the parameters can and should be freed by the caller afterwards
\ param key The key
\ param val The value
\ param mode The type of the variable . Can be any combination of ENV_GLOBAL , ENV_LOCAL , ENV_EXPORT and ENV_USER . If mode is zero , the current variable space is searched and the current mode is used . If no current variable with the same name is found , ENV_LOCAL is assumed .
2006-04-11 01:36:26 +10:00
\ returns 0 on suicess or an error code on failiure .
The current error codes are :
* ENV_PERM , can only be returned when setting as a user , e . g . ENV_USER is set . This means that the user tried to change a read - only variable .
2006-06-09 09:52:12 +10:00
* ENV_INVALID , the variable name or mode was invalid
2005-09-20 23:26:39 +10:00
*/
2012-03-05 14:18:16 -08:00
int env_set ( const wchar_t * key , const wchar_t * val , int mode ) ;
2005-09-20 23:26:39 +10:00
/**
2005-10-14 21:40:33 +10:00
Return the value of the variable with the specified name . Returns 0
if the key does not exist . The returned string should not be
modified or freed . The returned string is only guaranteed to be
valid until the next call to env_get ( ) , env_set ( ) , env_push ( ) or
env_pop ( ) takes place .
2005-09-20 23:26:39 +10:00
*/
2012-02-25 18:54:49 -08:00
//const wchar_t *env_get( const wchar_t *key );
2005-09-20 23:26:39 +10:00
2012-01-14 01:06:47 -08:00
class env_var_t : public wcstring {
private :
bool is_missing ;
public :
static env_var_t missing_var ( void ) ;
2012-02-26 01:15:53 -08:00
env_var_t ( const env_var_t & x ) : wcstring ( x ) , is_missing ( x . is_missing ) { }
2012-01-14 01:06:47 -08:00
env_var_t ( const wcstring & x ) : wcstring ( x ) , is_missing ( false ) { }
env_var_t ( const wchar_t * x ) : wcstring ( x ) , is_missing ( false ) { }
env_var_t ( ) : wcstring ( L " " ) , is_missing ( false ) { }
bool missing ( void ) const { return is_missing ; }
bool missing_or_empty ( void ) const { return missing ( ) | | empty ( ) ; }
const wchar_t * c_str ( void ) const ;
2012-01-14 02:42:17 -08:00
env_var_t & operator = ( const env_var_t & s ) {
is_missing = s . is_missing ;
wcstring : : operator = ( s ) ;
return * this ;
}
2012-02-26 01:15:53 -08:00
bool operator = = ( const env_var_t & s ) const {
if ( is_missing & & s . is_missing )
return true ;
else if ( s . is_missing | | s . is_missing )
return false ;
else
return * static_cast < const wcstring * > ( this ) = = * static_cast < const wcstring * > ( & s ) ;
}
2012-01-14 02:42:17 -08:00
2012-01-14 01:06:47 -08:00
} ;
2011-12-26 19:18:46 -08:00
/**
Gets the variable with the specified name , or an empty string if it does not exist .
*/
2012-02-24 00:55:46 +05:30
env_var_t env_get_string ( const wcstring & key ) ;
2011-12-26 19:18:46 -08:00
2005-09-27 00:47:03 +10:00
/**
2006-10-26 20:22:53 +10:00
Returns 1 if the specified key exists . This can ' t be reliably done
2005-09-27 00:47:03 +10:00
using env_get , since env_get returns null for 0 - element arrays
2006-06-05 06:14:51 +10:00
\ param key The name of the variable to remove
\ param mode the scope to search in . All scopes are searched if unset
2005-09-27 00:47:03 +10:00
*/
2006-06-05 06:14:51 +10:00
int env_exist ( const wchar_t * key , int mode ) ;
2005-09-27 00:47:03 +10:00
2005-09-20 23:26:39 +10:00
/**
Remove environemnt variable
2011-12-26 19:18:46 -08:00
2005-09-20 23:26:39 +10:00
\ param key The name of the variable to remove
2006-06-05 06:14:51 +10:00
\ param mode should be ENV_USER if this is a remove request from the user , 0 otherwise . If this is a user request , read - only variables can not be removed . The mode may also specify the scope of the variable that should be erased .
\ return zero if the variable existed , and non - zero if the variable did not exist
2005-09-20 23:26:39 +10:00
*/
2012-03-05 14:18:16 -08:00
int env_remove ( const wcstring & key , int mode ) ;
2005-09-20 23:26:39 +10:00
/**
Push the variable stack . Used for implementing local variables for functions and for - loops .
*/
void env_push ( int new_scope ) ;
/**
Pop the variable stack . Used for implementing local variables for functions and for - loops .
*/
void env_pop ( ) ;
2012-02-28 15:11:46 -08:00
/** Returns an array containing all exported variables in a format suitable for execv. */
2005-09-23 06:16:52 +10:00
char * * env_export_arr ( int recalc ) ;
2012-02-28 15:11:46 -08:00
void env_export_arr ( bool recalc , null_terminated_array_t < char > & result ) ;
2005-09-20 23:26:39 +10:00
/**
2012-02-25 18:54:49 -08:00
Returns all variable names .
2005-09-20 23:26:39 +10:00
*/
2012-01-10 12:51:09 -08:00
wcstring_list_t env_get_names ( int flags ) ;
2005-10-05 01:11:39 +10:00
2008-01-17 08:07:38 +10:00
/**
Update the PWD variable
directory
*/
int env_set_pwd ( ) ;
2011-12-26 19:18:46 -08:00
class env_vars {
std : : map < wcstring , wcstring > vars ;
public :
env_vars ( const wchar_t * const * keys ) ;
env_vars ( void ) ;
const wchar_t * get ( const wchar_t * key ) const ;
// vars necessary for highlighting
static const wchar_t * const highlighting_keys [ ] ;
} ;
2012-03-06 15:51:48 -08:00
extern bool g_log_forks ;
2008-01-17 08:07:38 +10:00
2005-10-05 01:11:39 +10:00
# endif