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 PLATFORMSTL_INCL_PLATFORMSTL_SYSTEM_HPP_ENVIRONMENT_TRAITS
00049 #define PLATFORMSTL_INCL_PLATFORMSTL_SYSTEM_HPP_ENVIRONMENT_TRAITS
00050
00051
00052 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00053 # define PLATFORMSTL_VER_PLATFORMSTL_SYSTEM_HPP_ENVIRONMENT_TRAITS_MAJOR 2
00054 # define PLATFORMSTL_VER_PLATFORMSTL_SYSTEM_HPP_ENVIRONMENT_TRAITS_MINOR 2
00055 # define PLATFORMSTL_VER_PLATFORMSTL_SYSTEM_HPP_ENVIRONMENT_TRAITS_REVISION 2
00056 # define PLATFORMSTL_VER_PLATFORMSTL_SYSTEM_HPP_ENVIRONMENT_TRAITS_EDIT 22
00057 #endif
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 #ifndef PLATFORMSTL_INCL_PLATFORMSTL_HPP_PLATFORMSTL
00072 # include <platformstl/platformstl.hpp>
00073 #endif
00074
00075 #if defined(PLATFORMSTL_OS_IS_UNIX)
00076 #elif defined(PLATFORMSTL_OS_IS_WINDOWS)
00077 #else
00078 # error Operating system not discriminated
00079 #endif
00080
00081 #ifndef STLSOFT_INCL_STLSOFT_MEMORY_HPP_AUTO_BUFFER
00082 # include <stlsoft/memory/auto_buffer.hpp>
00083 #endif
00084 #ifndef STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_HPP_STRING
00085 # include <stlsoft/shims/access/string.hpp>
00086 #endif
00087
00088 #ifndef STLSOFT_INCL_H_ERRNO
00089 # define STLSOFT_INCL_H_ERRNO
00090 # include <errno.h>
00091 #endif
00092 #ifndef STLSOFT_INCL_H_STDLIB
00093 # define STLSOFT_INCL_H_STDLIB
00094 # include <stdlib.h>
00095 #endif
00096 #if defined(STLSOFT_COMPILER_IS_MWERKS)
00097 # include <crtl.h>
00098 #endif
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 #ifdef PLATFORMSTL_ENVVAR_SET_BY_PUTENV
00117 # undef PLATFORMSTL_ENVVAR_SET_BY_PUTENV
00118 #endif
00119
00120 #ifdef PLATFORMSTL_ENVVAR_SET_BY_SETENV
00121 # undef PLATFORMSTL_ENVVAR_SET_BY_SETENV
00122 #endif
00123
00124 #ifdef PLATFORMSTL_ENVVAR_SET_SUPPORTED
00125 # undef PLATFORMSTL_ENVVAR_SET_SUPPORTED
00126 #endif
00127
00128
00129
00130
00131 #ifdef PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV
00132 # undef PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV
00133 #endif
00134
00135 #ifdef PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV_EQUALS
00136 # undef PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV_EQUALS
00137 #endif
00138
00139 #ifdef PLATFORMSTL_ENVVAR_ERASE_BY_UNSETENV
00140 # undef PLATFORMSTL_ENVVAR_ERASE_BY_UNSETENV
00141 #endif
00142
00143 #ifdef PLATFORMSTL_ENVVAR_ERASE_SUPPORTED
00144 # undef PLATFORMSTL_ENVVAR_ERASE_SUPPORTED
00145 #endif
00146
00147
00148
00149
00150 #ifdef PLATFORMSTL_ENVVAR_HAS_ENVIRON
00151 # undef PLATFORMSTL_ENVVAR_HAS_ENVIRON
00152 #endif
00153
00154 #ifdef PLATFORMSTL_ENVVAR_ENVIRON_HAS_UNDERSCORE
00155 # undef PLATFORMSTL_ENVVAR_ENVIRON_HAS_UNDERSCORE
00156 #endif
00157
00158
00159
00160
00161 #ifdef PLATFORMSTL_ENVVAR_PUTENV_HAS_UNDERSCORE
00162 # undef PLATFORMSTL_ENVVAR_PUTENV_HAS_UNDERSCORE
00163 #endif
00164
00165
00166 #if defined(PLATFORMSTL_ENVVAR_STDC_ONLY)
00167
00168 #elif defined(PLATFORMSTL_OS_IS_UNIX)
00169
00170 extern char **environ;
00171
00172 # if defined(UNIXSTL_OS_IS_LINUX)
00173 # define PLATFORMSTL_ENVVAR_HAS_ENVIRON
00174 # define PLATFORMSTL_ENVVAR_SET_BY_SETENV
00175 # define PLATFORMSTL_ENVVAR_ERASE_BY_UNSETENV
00176 # elif defined(UNIXSTL_OS_IS_MACOSX)
00177 # define PLATFORMSTL_ENVVAR_HAS_ENVIRON
00178 # define PLATFORMSTL_ENVVAR_SET_BY_SETENV
00179 # define PLATFORMSTL_ENVVAR_ERASE_BY_UNSETENV
00180 # elif defined(UNIXSTL_OSFAMILY_IS_BSD)
00181 # define PLATFORMSTL_ENVVAR_HAS_ENVIRON
00182 # define PLATFORMSTL_ENVVAR_SET_BY_SETENV
00183 # define PLATFORMSTL_ENVVAR_ERASE_BY_UNSETENV
00184 # elif defined(UNIXSTL_OSFAMILY_IS_SVR4)
00185 # define PLATFORMSTL_ENVVAR_HAS_ENVIRON
00186 # define PLATFORMSTL_ENVVAR_SET_BY_PUTENV
00187 # define PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV
00188 # elif defined(_WIN32)
00189 # define PLATFORMSTL_ENVVAR_SET_BY_PUTENV
00190 # define PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV_EQUALS
00191 # define PLATFORMSTL_ENVVAR_HAS_ENVIRON
00192 # define PLATFORMSTL_ENVVAR_ENVIRON_HAS_UNDERSCORE
00193 # if defined(STLSOFT_COMPILER_IS_BORLAND)
00194
00195 # elif defined(STLSOFT_COMPILER_IS_DMC) || \
00196 defined(STLSOFT_COMPILER_IS_GCC) || \
00197 defined(STLSOFT_COMPILER_IS_INTEL) || \
00198 defined(STLSOFT_COMPILER_IS_MSVC) || \
00199 defined(STLSOFT_COMPILER_IS_MWERKS)
00200 # define PLATFORMSTL_ENVVAR_PUTENV_HAS_UNDERSCORE
00201 # else
00202 # endif
00203 # else
00204 # error UNIX family flavours other than BSD and SVR4 are not currently supported.
00205 # endif
00206 #elif defined(PLATFORMSTL_OS_IS_WINDOWS)
00207 # define PLATFORMSTL_ENVVAR_SET_BY_PUTENV
00208 # define PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV_EQUALS
00209 # define PLATFORMSTL_ENVVAR_HAS_ENVIRON
00210 # define PLATFORMSTL_ENVVAR_ENVIRON_HAS_UNDERSCORE
00211 # if defined(STLSOFT_COMPILER_IS_BORLAND)
00212
00213 # elif defined(STLSOFT_COMPILER_IS_DMC) || \
00214 defined(STLSOFT_COMPILER_IS_GCC) || \
00215 defined(STLSOFT_COMPILER_IS_INTEL) || \
00216 defined(STLSOFT_COMPILER_IS_MSVC) || \
00217 defined(STLSOFT_COMPILER_IS_MWERKS)
00218 # define PLATFORMSTL_ENVVAR_PUTENV_HAS_UNDERSCORE
00219 # else
00220 # endif
00221 #else
00222 # error Operating systems other than UNIX and Win32 are not currently supported.
00223 #endif
00224
00225
00226 #if defined(PLATFORMSTL_ENVVAR_SET_BY_PUTENV) || \
00227 defined(PLATFORMSTL_ENVVAR_SET_BY_SETENV)
00228 # define PLATFORMSTL_ENVVAR_SET_SUPPORTED
00229 #endif
00230
00231 #if defined(PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV) || \
00232 defined(PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV_EQUALS) || \
00233 defined(PLATFORMSTL_ENVVAR_ERASE_BY_UNSETENV)
00234 # define PLATFORMSTL_ENVVAR_ERASE_SUPPORTED
00235 #endif
00236
00237
00238
00239
00240
00241 #if defined(_STLSOFT_NO_NAMESPACE) || \
00242 defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00243
00244 namespace platformstl
00245 {
00246 #else
00247
00248
00249 namespace stlsoft
00250 {
00251
00252 namespace platformstl_project
00253 {
00254 #endif
00255
00256
00257
00258
00259
00265 struct environment_variable_traits
00266 {
00269 public:
00271 typedef char char_type;
00273
00276 public:
00277 #ifdef PLATFORMSTL_ENVVAR_HAS_ENVIRON
00281 static char_type const** get_environ();
00285 static void release_environ(char_type const** env) throw();
00286
00287 #endif
00288
00293 static char_type const* get_variable(char_type const* name) throw();
00294
00295 #ifdef PLATFORMSTL_ENVVAR_SET_SUPPORTED
00304 static int set_variable(char_type const* name, char_type const* value) throw();
00305 #endif
00306 #ifdef PLATFORMSTL_ENVVAR_ERASE_SUPPORTED
00316 static int erase_variable(char_type const* name) throw();
00317 #endif
00319
00322 private:
00323 #if defined(PLATFORMSTL_ENVVAR_SET_BY_PUTENV) || \
00324 defined(PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV)
00325 static int call_putenv_(char_type const* str) throw();
00326 static int call_putenv_(char_type const* name, char_type const* value) throw();
00327 #endif
00329 };
00330
00331
00332
00333
00334
00335 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00336
00337 #ifdef PLATFORMSTL_ENVVAR_HAS_ENVIRON
00338 inline environment_variable_traits::char_type const** environment_variable_traits::get_environ()
00339 {
00340 # ifdef PLATFORMSTL_ENVVAR_ENVIRON_HAS_UNDERSCORE
00341 return const_cast<char_type const**>(_environ);
00342 # else
00343 return const_cast<char_type const**>(environ);
00344 # endif
00345 }
00346
00347 inline void environment_variable_traits::release_environ(environment_variable_traits::char_type const**) throw()
00348 {}
00349 #endif
00350
00351 inline environment_variable_traits::char_type const* environment_variable_traits::get_variable(environment_variable_traits::char_type const* name) throw()
00352 {
00353 STLSOFT_ASSERT(NULL != name);
00354 STLSOFT_MESSAGE_ASSERT("Name may not contain '='", NULL == ::strchr(name, '='));
00355
00356 return const_cast<char_type const*>(::getenv(name));
00357 }
00358
00359 #ifdef PLATFORMSTL_ENVVAR_SET_SUPPORTED
00360 inline int environment_variable_traits::set_variable(environment_variable_traits::char_type const* name, environment_variable_traits::char_type const* value) throw()
00361 {
00362 STLSOFT_ASSERT(NULL != name);
00363 STLSOFT_ASSERT(NULL != value);
00364 STLSOFT_MESSAGE_ASSERT("Name may not contain '='", NULL == ::strchr(name, '='));
00365
00366 #if defined(PLATFORMSTL_ENVVAR_SET_BY_PUTENV)
00367 return call_putenv_(name, value);
00368 #elif defined(PLATFORMSTL_ENVVAR_SET_BY_SETENV)
00369 return ::setenv(name, value, 1);
00370 #endif
00371 }
00372 #endif
00373
00374 #ifdef PLATFORMSTL_ENVVAR_ERASE_SUPPORTED
00375 inline int environment_variable_traits::erase_variable(environment_variable_traits::char_type const* name) throw()
00376 {
00377 STLSOFT_ASSERT(NULL != name);
00378 STLSOFT_MESSAGE_ASSERT("Name may not contain '='", NULL == ::strchr(name, '='));
00379
00380 #if defined(PLATFORMSTL_ENVVAR_ERASE_BY_UNSETENV)
00381 static_cast<void>(::unsetenv(name));
00382
00383 return 0;
00384 #else
00385 return call_putenv_(name, NULL);
00386 #endif
00387 }
00388 #endif
00389
00390 #if defined(PLATFORMSTL_ENVVAR_SET_BY_PUTENV) || \
00391 defined(PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV)
00392
00393 inline int environment_variable_traits::call_putenv_(environment_variable_traits::char_type const* str) throw()
00394 {
00395 #ifdef PLATFORMSTL_ENVVAR_PUTENV_HAS_UNDERSCORE
00396 return ::_putenv(str);
00397 #else
00398 return ::putenv(str);
00399 #endif
00400 }
00401
00402 inline int environment_variable_traits::call_putenv_(environment_variable_traits::char_type const* name, environment_variable_traits::char_type const* value) throw()
00403 {
00404 STLSOFT_ASSERT(NULL != name);
00405 STLSOFT_ASSERT(NULL == ::strchr(name, '='));
00406
00407 #ifndef PLATFORMSTL_ENVVAR_ERASE_BY_PUTENV_EQUALS
00408 if(NULL == value)
00409 {
00410 return call_putenv_(name);
00411 }
00412 else
00413 #endif
00414 {
00415 #ifdef STLSOFT_CF_THROW_BAD_ALLOC
00416 try
00417 #endif
00418 {
00419 const ss_size_t cchName = ::strlen(name);
00420 const ss_size_t cchValue = stlsoft::c_str_len(value);
00421 stlsoft::auto_buffer<char_type> buff(cchName + 1 + cchValue + 1);
00422
00423 #ifdef STLSOFT_CF_THROW_BAD_ALLOC
00424 STLSOFT_ASSERT(!buff.empty());
00425 #else
00426 if(buff.empty())
00427 {
00428 errno = ENOMEM;
00429 return -1;
00430 }
00431 else
00432 #endif
00433 {
00434 ::strncpy(&buff[0], name, cchName);
00435 buff[cchName] = '=';
00436 ::strncpy(&buff[cchName + 1], value, cchValue);
00437 buff[cchName + 1 + cchValue] = '\0';
00438 STLSOFT_ASSERT(::strlen(buff.data()) == buff.size() - 1);
00439
00440 return call_putenv_(buff.data());
00441 }
00442 }
00443 #ifdef STLSOFT_CF_THROW_BAD_ALLOC
00444 catch(std::bad_alloc &)
00445 {
00446 errno = ENOMEM;
00447 return -1;
00448 }
00449 #endif
00450 }
00451 }
00452 #endif
00453
00454 #endif
00455
00456
00457
00458 #if defined(_STLSOFT_NO_NAMESPACE) || \
00459 defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00460 }
00461 #else
00462 }
00463 }
00464 #endif
00465
00466
00467
00468 #endif
00469
00470