/*
 * Copyright (c) 1996,1997
 * Silicon Graphics Computer Systems, Inc.
 *
 * Copyright (c) 1999
 * Boris Fomitchev
 *
 * This material is provided "as is", with absolutely no warranty expressed
 * or implied. Any use is at your own risk.
 *
 * Permission to use or copy this software for any purpose is hereby granted
 * without fee, provided the above notices are retained on all copies.
 * Permission to modify the code and to distribute modified code is granted,
 * provided the above notices are retained, and a notice that the code was
 * modified is included with the above copyright notice.
 *
 */

__Named_exception::__Named_exception(const string& __str) {
  size_t __size = strlen(_STLP_PRIV __get_c_string(__str)) + 1;
  if (__size > _S_bufsize) {
    _M_name = __STATIC_CAST(char*, malloc(__size * sizeof(char)));
    if (!_M_name) {
      __size = _S_bufsize;
      _M_name = _M_static_name;
    }
    else {
      *(__REINTERPRET_CAST(size_t*, &_M_static_name[0])) = __size * sizeof(char);
    }
  }
  else {
    _M_name = _M_static_name;
  }
#if !defined (_STLP_USE_SAFE_STRING_FUNCTIONS)
  strncpy(_M_name, _STLP_PRIV __get_c_string(__str), __size - 1);
  _M_name[__size - 1] = '\0';
#else
  strncpy_s(_M_name, __size, _STLP_PRIV __get_c_string(__str), __size - 1);
#endif
}

__Named_exception::__Named_exception(const __Named_exception& __x) {
  size_t __size = strlen(__x._M_name) + 1;
  if (__size > _S_bufsize) {
    _M_name = __STATIC_CAST(char*, malloc(__size * sizeof(char)));
    if (!_M_name) {
      __size = _S_bufsize;
      _M_name = _M_static_name;
    }
    else {
      *(__REINTERPRET_CAST(size_t*, &_M_static_name[0])) = __size * sizeof(char);
    }
  }
  else {
    _M_name = _M_static_name;
  }
#if !defined (_STLP_USE_SAFE_STRING_FUNCTIONS)
  strncpy(_M_name, __x._M_name, __size - 1);
  _M_name[__size - 1] = '\0';
#else
  strncpy_s(_M_name, __size, __x._M_name, __size - 1);
#endif
}

__Named_exception& __Named_exception::operator = (const __Named_exception& __x) {
  size_t __size = strlen(__x._M_name) + 1;
  size_t __buf_size = _M_name != _M_static_name ? *(__REINTERPRET_CAST(size_t*, &_M_static_name[0])) : static_cast<size_t>(_S_bufsize);
  if (__size > __buf_size) {
    // Being here necessarily mean that we need to allocate a buffer:
    if (_M_name != _M_static_name) free(_M_name);
    _M_name = __STATIC_CAST(char*, malloc(__size * sizeof(char)));
    if (!_M_name) {
      __size = _S_bufsize;
      _M_name = _M_static_name;
    }
    else {
      *(__REINTERPRET_CAST(size_t*, &_M_static_name[0])) = __size * sizeof(char);
    }
  }
#if !defined (_STLP_USE_SAFE_STRING_FUNCTIONS)
  strncpy(_M_name, __x._M_name, __size - 1);
  _M_name[__size - 1] = '\0';
#else
  strncpy_s(_M_name, __size, __x._M_name, __size - 1);
#endif
  return *this;
}

__Named_exception::~__Named_exception() _STLP_NOTHROW_INHERENTLY {
  if (_M_name != _M_static_name)
    free(_M_name);
}

const char* __Named_exception::what() const _STLP_NOTHROW_INHERENTLY
{ return _M_name; }
