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