00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00048 #ifndef WINSTL_INCL_WINSTL_SYSTEM_HPP_ENVIRONMENT_BLOCK
00049 #define WINSTL_INCL_WINSTL_SYSTEM_HPP_ENVIRONMENT_BLOCK
00050 
00051 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00052 # define WINSTL_VER_WINSTL_SYSTEM_HPP_ENVIRONMENT_BLOCK_MAJOR       4
00053 # define WINSTL_VER_WINSTL_SYSTEM_HPP_ENVIRONMENT_BLOCK_MINOR       0
00054 # define WINSTL_VER_WINSTL_SYSTEM_HPP_ENVIRONMENT_BLOCK_REVISION    2
00055 # define WINSTL_VER_WINSTL_SYSTEM_HPP_ENVIRONMENT_BLOCK_EDIT        54
00056 #endif 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 #ifndef WINSTL_INCL_WINSTL_H_WINSTL
00067 # include <winstl/winstl.h>
00068 #endif 
00069 #ifndef WINSTL_INCL_WINSTL_MEMORY_HPP_PROCESSHEAP_ALLOCATOR
00070 # include <winstl/memory/processheap_allocator.hpp>
00071 #endif 
00072 #ifndef STLSOFT_INCL_STLSOFT_MEMORY_HPP_AUTO_BUFFER
00073 # include <stlsoft/memory/auto_buffer.hpp>
00074 #endif 
00075 #ifndef STLSOFT_INCL_STLSOFT_STRING_HPP_CHAR_TRAITS
00076 # include <stlsoft/string/char_traits.hpp>
00077 #endif 
00078 #ifndef WINSTL_INCL_WINSTL_SHIMS_ACCESS_HPP_STRING
00079 # include <winstl/shims/access/string.hpp>
00080 #endif 
00081 
00082 
00083 
00084 
00085 
00086 #ifndef _WINSTL_NO_NAMESPACE
00087 # if defined(_STLSOFT_NO_NAMESPACE) || \
00088      defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00089 
00090 namespace winstl
00091 {
00092 # else
00093 
00094 
00095 namespace stlsoft
00096 {
00097 
00098 namespace winstl_project
00099 {
00100 
00101 # endif 
00102 #endif 
00103 
00104 
00105 
00106 
00107 
00133 template<   ss_typename_param_k C
00134 #ifdef STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00135         ,   ss_typename_param_k T = char_traits<C>
00136         ,   ss_typename_param_k A = processheap_allocator<C>
00137 #else 
00138         ,   ss_typename_param_k T 
00139         ,   ss_typename_param_k A 
00140 #endif 
00141         >
00142 class basic_environment_block
00143 {
00146 public:
00148     typedef C                                   value_type;
00150     typedef C                                   char_type;
00152     typedef T                                   traits_type;
00154     typedef A                                   allocator_type;
00156     typedef basic_environment_block<C, T, A>    class_type;
00158     typedef ws_size_t                           size_type;
00160 
00163 public:
00165     basic_environment_block()
00166         : m_buffer(2)
00167     {
00168         m_buffer[0] = '\0';
00169         m_buffer[1] = '\0';
00170     }
00172     basic_environment_block(class_type const& rhs)
00173         : m_buffer(rhs.m_buffer.size())
00174     {
00175         pod_copy_n(&m_buffer.data()[0], &rhs.m_buffer.data()[0], m_buffer.size());
00176     }
00177 
00184     class_type& operator =(class_type const& rhs)
00185     {
00186         if(m_buffer.resize(rhs.m_buffer.size()))
00187         {
00188             pod_copy_n(&m_buffer.data()[0], &rhs.m_buffer.data()[0], m_buffer.size());
00189         }
00190 
00191         return *this;
00192     }
00194 
00197 public:
00212     ws_bool_t push_back(char_type const* variable, ws_size_t cch)
00213     {
00214         WINSTL_ASSERT(NULL != variable);
00215         WINSTL_ASSERT(cch >= 3);
00216         WINSTL_ASSERT(NULL != traits_type::find(variable, cch, '='));
00217 
00218         size_type   oldSize = m_buffer.size();
00219 
00220         WINSTL_ASSERT(m_buffer.size() > 1);
00221         WINSTL_ASSERT('\0' == m_buffer[m_buffer.size() - 1]);
00222         WINSTL_ASSERT('\0' == m_buffer[m_buffer.size() - 2]);
00223 
00224         if(!m_buffer.resize(oldSize + cch + 1))
00225         {
00226             return false;
00227         }
00228         else
00229         {
00230             traits_type::copy(&m_buffer[oldSize - 1], variable, cch);
00231             m_buffer[m_buffer.size() - 2] = '\0';
00232             m_buffer[m_buffer.size() - 1] = '\0';
00233 
00234             WINSTL_ASSERT(m_buffer.size() > 1);
00235             WINSTL_ASSERT('\0' == m_buffer[m_buffer.size() - 1]);
00236             WINSTL_ASSERT('\0' == m_buffer[m_buffer.size() - 2]);
00237 
00238             return true;
00239         }
00240     }
00254     template <ss_typename_param_k S>
00255     ws_bool_t push_back(S const& variable)
00256     {
00257         return push_back(stlsoft_ns_qual(c_str_data)(variable), stlsoft_ns_qual(c_str_len)(variable));
00258     }
00273     ws_bool_t push_back(char_type const* name, ws_size_t cchName, char_type const* value, ws_size_t cchValue)
00274     {
00275         WINSTL_ASSERT(NULL != name);
00276         WINSTL_ASSERT(NULL != value);
00277         WINSTL_ASSERT(cchName > 1);
00278 
00279 
00280         size_type   oldSize = m_buffer.size();
00281 
00282         WINSTL_ASSERT(m_buffer.size() > 1);
00283         WINSTL_ASSERT('\0' == m_buffer[m_buffer.size() - 1]);
00284         WINSTL_ASSERT('\0' == m_buffer[m_buffer.size() - 2]);
00285 
00286         if(!m_buffer.resize(oldSize + cchName + 1 + cchValue + 1))
00287         {
00288             return false;
00289         }
00290         else
00291         {
00292             traits_type::copy(&m_buffer[oldSize - 2], name, cchName);
00293             m_buffer[oldSize - 2 + cchName] = '=';
00294             traits_type::copy(&m_buffer[oldSize - 2 + cchName + 1], value, cchValue);
00295             m_buffer[oldSize - 2 + cchName + 1 + cchValue] = '\0';
00296             m_buffer[m_buffer.size() - 2] = '\0';
00297             m_buffer[m_buffer.size() - 1] = '\0';
00298 
00299             WINSTL_ASSERT(m_buffer.size() > 1);
00300             WINSTL_ASSERT('\0' == m_buffer[m_buffer.size() - 1]);
00301             WINSTL_ASSERT('\0' == m_buffer[m_buffer.size() - 2]);
00302 
00303             return true;
00304         }
00305     }
00318     template<   ss_typename_param_k S1
00319             ,   ss_typename_param_k S2
00320             >
00321     ws_bool_t push_back(S1 const& name, S2 const& value)
00322     {
00323         return push_back(stlsoft_ns_qual(c_str_data)(name), stlsoft_ns_qual(c_str_len)(name), stlsoft_ns_qual(c_str_data)(value), stlsoft_ns_qual(c_str_len)(value));
00324     }
00325 
00327     void clear()
00328     {
00329         m_buffer.resize(2);
00330 
00331         m_buffer[0] = '\0';
00332         m_buffer[1] = '\0';
00333     }
00334 
00336     void swap(class_type& rhs) stlsoft_throw_0()
00337     {
00338         m_buffer.swap(rhs.m_buffer);
00339     }
00341 
00344 public:
00346     void const  *base() const
00347     {
00348         return m_buffer.data();
00349     }
00351     size_type size() const
00352     {
00353         return m_buffer.size();
00354     }
00358     size_type length() const
00359     {
00360         return size();
00361     }
00363 
00368 private:
00369     typedef stlsoft_ns_qual(auto_buffer_old)<   char_type
00370                                             ,   allocator_type
00371                                             ,   1024
00372                                             >       buffer_type_;
00373 
00374     buffer_type_    m_buffer;
00375 };
00376 
00377 
00378 
00379 
00380 
00381 #ifdef STLSOFT_CF_TEMPLATE_CLASS_DEFAULT_CLASS_ARGUMENT_SUPPORT
00382 
00384 typedef basic_environment_block<ws_char_a_t>    environment_block_a;
00389 typedef basic_environment_block<ws_char_w_t>    environment_block_w;
00394 typedef basic_environment_block<TCHAR>          environment_block;
00395 
00396 #endif 
00397 
00398 
00399 
00400 
00401 
00402 #ifdef STLSOFT_UNITTEST
00403 # include "./unittest/environment_block_unittest_.h"
00404 #endif 
00405 
00406 
00407 
00408 
00409 
00410 
00411 
00412 #ifndef _WINSTL_NO_NAMESPACE
00413 # if defined(_STLSOFT_NO_NAMESPACE) || \
00414      defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00415 } 
00416 # else
00417 } 
00418 } 
00419 # endif 
00420 #endif 
00421 
00422 
00423 
00424 #endif 
00425 
00426