Exception.cpp.svn-base
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:2k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /*
  2.  *  OpenKore C++ Standard Library
  3.  *  Copyright (C) 2006  VCL
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Lesser General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2.1 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Lesser General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Lesser General Public
  16.  *  License along with this library; if not, write to the Free Software
  17.  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  18.  *  MA  02110-1301  USA
  19.  */
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <typeinfo>
  24. #include "Exception.h"
  25. #if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
  26. #include <cxxabi.h>
  27. #define GNUC31
  28. #endif
  29. // Exception
  30. namespace OSL {
  31. Exception::Exception(const char *message, int code) {
  32. if (message != NULL) {
  33. m_message = strdup(message);
  34. } else {
  35. m_message = NULL;
  36. }
  37. m_code = code;
  38. }
  39. Exception::~Exception() throw() {
  40. if (m_message != NULL) {
  41. free(m_message);
  42. }
  43. }
  44. const char *
  45. Exception::getMessage() const throw() {
  46. mutex.lock();
  47. if (m_message == NULL) {
  48. #ifdef GNUC31
  49. char *name;
  50. int status;
  51. name = abi::__cxa_demangle(typeid(*this).name(), 0, 0, &status);
  52. #else
  53. const char *name = typeid(*this).name();
  54. #endif
  55. int len = strlen(name) + 8;
  56. m_message = (char *) malloc(len);
  57. snprintf(m_message, len, "%s thrown", name);
  58. m_message[len - 1] = '';
  59. #ifdef GNUC31
  60. free (name);
  61. #endif
  62. }
  63. mutex.unlock();
  64. return m_message;
  65. }
  66. int
  67. Exception::getCode() const throw() {
  68. return m_code;
  69. }
  70. const char *
  71. Exception::what() const throw() {
  72. return getMessage();
  73. }
  74. }