Newer
Older
c-interpreter / modules / libkcpp / src / kcpp_throwable.cpp
  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Throwable
  4. //
  5.  
  6. #include <cstring>
  7. #include <cerrno>
  8.  
  9. #include <kcpp_throwable.hpp>
  10.  
  11. #ifndef MAXMSG
  12. #define MAXMSG (256)
  13. #endif
  14.  
  15. namespace kcpp
  16. {
  17.  
  18. /**
  19. * 最後に発生したエラーメッセージを持つ Throwable を構築します。
  20. * エラーメッセージを取得できない場合、空文字がメッセージに設定されます。
  21. */
  22. Throwable::Throwable() noexcept : message("")
  23. {
  24. #if (KCPP_IS_WINDOWS)
  25. // Window の場合
  26. int errnum = GetLastError();
  27. LPVOID lpMsgBuf;
  28. int ret = FormatMessage(
  29. FORMAT_MESSAGE_ALLOCATE_BUFFER // 動作フラグ
  30. | FORMAT_MESSAGE_FROM_SYSTEM
  31. | FORMAT_MESSAGE_IGNORE_TNSERTS,
  32. 0, // メッセージ定義位置
  33. errnum, // エラーコード
  34. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 言語ID
  35. (LPSTR) &lpMsgBuf, // バッファアドレス
  36. 0, // バッファサイズ
  37. 0); // 挿入句
  38. if (ret != 0)
  39. {
  40. message = static_cast<const char*>(lpMsgBuf);
  41. }
  42. localFree(lpMsgBuf);
  43. #elif ((_POSIX_C_SOURCE >= 200112L || __XOPEN_SOURCE >= 600) && ! _GNU_SOURCE)
  44. // XSI準拠 strerror_r が提供されている
  45. char buf[MAXMSG];
  46. int ret = stderror_r(errno, buf, sizeof(buf));
  47. if (ret == 0)
  48. {
  49. message = buf;
  50. }
  51. #else
  52. // ANSI 準拠 streror を利用
  53. char* errMsg = strerror(errno);
  54. message = errMsg;
  55. #endif
  56. }
  57.  
  58.  
  59. /**
  60. * コピーコンストラクタ。
  61. *
  62. * @param t コピー元
  63. */
  64. Throwable::Throwable(const Throwable& t) noexcept : message(t.message)
  65. {
  66. // NOP
  67. }
  68.  
  69.  
  70. /**
  71. * 指定されたメッセージを持つ Throwable を構築します。
  72. *
  73. * @param msg メッセージ
  74. */
  75. Throwable::Throwable(const std::string& msg) noexcept : message(msg)
  76. {
  77. // NOP
  78. }
  79.  
  80.  
  81. /**
  82. * デストラクタ。
  83. */
  84. Throwable::~Throwable() noexcept
  85. {
  86. // NOP
  87. }
  88.  
  89.  
  90. /**
  91. * エラーメッセージを返します。
  92. *
  93. * @return エラーメッセージ
  94. */
  95. const char* Throwable::what() const noexcept
  96. {
  97. return message.c_str();
  98. }
  99.  
  100. }
  101.