Newer
Older
libj / j / lang / src / errno.cpp
  1. #include <cerrno>
  2. #include <cstring>
  3.  
  4. #include <j/lang/errno.hpp>
  5.  
  6. namespace j
  7. {
  8. namespace lang
  9. {
  10. namespace Errno
  11. {
  12. #if (IS_WINDOWS)
  13. ////////////////////////////////////////////////////////////////////////////////
  14. //
  15. // For Windows
  16. //
  17. /**
  18. * エラー番号を設定します。
  19. *
  20. * @param errnum エラー番号
  21. */
  22. void set(int errnum)
  23. {
  24. SetLastError(errnum);
  25. }
  26.  
  27. /**
  28. * エラー番号を取得します。
  29. *
  30. * @return エラー番号
  31. */
  32. int get()
  33. {
  34. return GetLastError();
  35. }
  36.  
  37. /**
  38. * エラー番号に対応するエラーメッセージを取得します。
  39. *
  40. * @param errnum エラー番号
  41. * @return エラーメッセージ
  42. */
  43. String message(int errnum)
  44. {
  45. LPVOID lpMsgBuf;
  46. int ret = FormatMessage(
  47. FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, // 動作フラグ
  48. 0, // メッセージ定義位置
  49. errnum, // エラーコード
  50. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 言語ID
  51. (LPSTR)&lpMsgBuf, // バッファアドレス
  52. 0, // バッファサイズ
  53. 0); // 挿入句
  54.  
  55. if (ret != 0)
  56. {
  57. String msg((char *)lpMsgBuf);
  58. LocalFree(lpMsgBuf);
  59. return msg;
  60. }
  61. else
  62. {
  63. String msg();
  64. return msg;
  65. }
  66. }
  67. #else
  68. ////////////////////////////////////////////////////////////////////////////////
  69. //
  70. // For Windows 以外
  71. //
  72.  
  73. /**
  74. * エラー番号を設定します。
  75. *
  76. * @param errnum エラー番号
  77. */
  78. void set(int errnum)
  79. {
  80. errno = errnum;
  81. }
  82.  
  83. /**
  84. * エラー番号を取得します。
  85. *
  86. * @return エラー番号
  87. */
  88. int get()
  89. {
  90. return errno;
  91. }
  92.  
  93. /**
  94. * エラー番号に対応するエラーメッセージを取得します。
  95. *
  96. * @param errnum エラー番号
  97. * @return エラーメッセージ
  98. */
  99. String message(int errnum)
  100. {
  101. String msg(strerror(errnum));
  102. return msg;
  103. }
  104. #endif // IS_WINDOWS
  105.  
  106. } // namespace Errno
  107. } // namespace lang
  108. } // namespace j