Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : implements model of program environment Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_RT_ENV_ENVIRONMENT_IPP_062904GER Chris@16: #define BOOST_RT_ENV_ENVIRONMENT_IPP_062904GER Chris@16: Chris@16: // Boost.Runtime.Parameter Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: #include Chris@16: Chris@16: // STL Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace BOOST_RT_PARAM_NAMESPACE { Chris@16: Chris@16: namespace environment { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::environment ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace rt_env_detail { Chris@16: Chris@16: typedef std::map registry; Chris@16: typedef std::list keys; Chris@16: Chris@16: BOOST_RT_PARAM_INLINE registry& s_registry() { static registry instance; return instance; } Chris@16: BOOST_RT_PARAM_INLINE keys& s_keys() { static keys instance; return instance; } Chris@16: Chris@16: BOOST_RT_PARAM_INLINE variable_data& Chris@16: new_var_record( cstring var_name ) Chris@16: { Chris@16: // save the name in list of keys Chris@16: s_keys().push_back( dstring() ); Chris@16: dstring& key = s_keys().back(); Chris@16: assign_op( key, var_name, 0 ); Chris@16: Chris@16: // create and return new record Chris@16: variable_data& new_var_data = s_registry()[key]; Chris@16: Chris@16: new_var_data.m_var_name = key; Chris@16: Chris@16: return new_var_data; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: BOOST_RT_PARAM_INLINE variable_data* Chris@16: find_var_record( cstring var_name ) Chris@16: { Chris@16: registry::iterator it = s_registry().find( var_name ); Chris@16: Chris@16: return it == s_registry().end() ? 0 : &(it->second); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(push) Chris@16: #pragma warning(disable:4996) // getenv Chris@16: #endif Chris@16: Chris@16: BOOST_RT_PARAM_INLINE cstring Chris@16: sys_read_var( cstring var_name ) Chris@16: { Chris@16: using namespace std; Chris@16: return BOOST_RT_PARAM_GETENV( var_name.begin() ); Chris@16: } Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: BOOST_RT_PARAM_INLINE void Chris@16: sys_write_var( cstring var_name, format_stream& var_value ) Chris@16: { Chris@16: BOOST_RT_PARAM_PUTENV( var_name, cstring( var_value.str() ) ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace rt_env_detail Chris@16: Chris@16: BOOST_RT_PARAM_INLINE variable_base Chris@16: var( cstring var_name ) Chris@16: { Chris@16: rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name ); Chris@16: Chris@16: BOOST_RT_PARAM_VALIDATE_LOGIC( !!vd, Chris@16: BOOST_RT_PARAM_LITERAL( "First access to the environment variable " ) Chris@16: << var_name << BOOST_RT_PARAM_LITERAL( " should be typed" ) ); Chris@16: Chris@16: return variable_base( *vd ); Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace environment Chris@16: Chris@16: } // namespace BOOST_RT_PARAM_NAMESPACE Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_RT_ENV_ENVIRONMENT_IPP_062904GER