1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1996,1997 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc. 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk. 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies. 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted, 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice. 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__Named_exception::__Named_exception(const string& __str) { 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t __size = strlen(_STLP_PRIV __get_c_string(__str)) + 1; 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__size > _S_bufsize) { 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name = __STATIC_CAST(char*, malloc(__size * sizeof(char))); 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!_M_name) { 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __size = _S_bufsize; 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name = _M_static_name; 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *(__REINTERPRET_CAST(size_t*, &_M_static_name[0])) = __size * sizeof(char); 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name = _M_static_name; 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_SAFE_STRING_FUNCTIONS) 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strncpy(_M_name, _STLP_PRIV __get_c_string(__str), __size - 1); 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name[__size - 1] = '\0'; 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strncpy_s(_M_name, __size, _STLP_PRIV __get_c_string(__str), __size - 1); 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__Named_exception::__Named_exception(const __Named_exception& __x) { 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t __size = strlen(__x._M_name) + 1; 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__size > _S_bufsize) { 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name = __STATIC_CAST(char*, malloc(__size * sizeof(char))); 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!_M_name) { 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __size = _S_bufsize; 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name = _M_static_name; 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *(__REINTERPRET_CAST(size_t*, &_M_static_name[0])) = __size * sizeof(char); 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name = _M_static_name; 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_SAFE_STRING_FUNCTIONS) 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strncpy(_M_name, __x._M_name, __size - 1); 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name[__size - 1] = '\0'; 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strncpy_s(_M_name, __size, __x._M_name, __size - 1); 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__Named_exception& __Named_exception::operator = (const __Named_exception& __x) { 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott size_t __size = strlen(__x._M_name) + 1; 670e7a705cd6f755153c1f2cceb09af1e515ca9f1dMark Salyzyn size_t __buf_size = _M_name != _M_static_name ? *(__REINTERPRET_CAST(size_t*, &_M_static_name[0])) : __STATIC_CAST(size_t,_S_bufsize); 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (__size > __buf_size) { 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // Being here necessarily mean that we need to allocate a buffer: 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_M_name != _M_static_name) free(_M_name); 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name = __STATIC_CAST(char*, malloc(__size * sizeof(char))); 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (!_M_name) { 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott __size = _S_bufsize; 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name = _M_static_name; 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott else { 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *(__REINTERPRET_CAST(size_t*, &_M_static_name[0])) = __size * sizeof(char); 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott } 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_SAFE_STRING_FUNCTIONS) 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strncpy(_M_name, __x._M_name, __size - 1); 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _M_name[__size - 1] = '\0'; 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott strncpy_s(_M_name, __size, __x._M_name, __size - 1); 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott return *this; 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__Named_exception::~__Named_exception() _STLP_NOTHROW_INHERENTLY { 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott if (_M_name != _M_static_name) 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott free(_M_name); 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott} 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottconst char* __Named_exception::what() const _STLP_NOTHROW_INHERENTLY 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ return _M_name; } 96