Newer
Older
snipet / libsc / trunk / src / sc_error.c
  1. /* vim: ts=4 sw=4 sts=4 ff=unix fenc=utf-8 :
  2. * =====================================================================
  3. * sc_error.c
  4. * Copyright (c) 2003 - 2011 sys0tem
  5. * LICENSE :
  6. * LGPL (GNU Lesser General Public License - Version 3,29 June 2007)
  7. * http://www.gnu.org/copyleft/lesser.html
  8. * or
  9. * EPL (Eclipse Public License - v1.0)
  10. * http://www.eclipse.org/legal/epl-v10.html
  11. * =====================================================================
  12. */
  13. #include <string.h>
  14. #include <sc_error.h>
  15.  
  16.  
  17. /**
  18. * エラー番号を取得します.
  19. *
  20. * @param エラー番号
  21. */
  22. int SC_getError(void)
  23. {
  24. #if (SC_isWindows)
  25. return GetLastError();
  26. #else
  27. return errno;
  28. #endif
  29. }
  30.  
  31.  
  32. /**
  33. * エラー番号を設定します.
  34. *
  35. * @param errnum エラー番号
  36. */
  37. void SC_setError(errnum)
  38. {
  39. #if (SC_isWindows)
  40. SetLastError(errnum);
  41. #else
  42. errno = errnum;
  43. #endif
  44. }
  45.  
  46.  
  47. /**
  48. * 指定された errnum に対応するエラーメッセージを buf に格納します.
  49. * メッセージの獲得に成功した場合、true を返します.
  50. *
  51. * @param errnum エラー番号
  52. * @param buf メッセージ格納用バッファ
  53. * @param buflen バッファサイズ
  54. * @return true/false (成功/失敗)
  55. */
  56. bool SC_getErrorMessage(int errnum, char* buf, size_t buflen)
  57. {
  58. #if (SC_isWindows)
  59. int ret = FormatMessage(
  60. FORMAT_MESSAGE_FROM_SYSTEM, /* 動作フラグ */
  61. NULL, /* メッセージ定義位置 */
  62. errnum, /* エラーコード */
  63. 0, /* 言語ID */
  64. buf, /* バッファアドレス */
  65. buflen, /* バッファサイズ */
  66. NULL /* 挿入句 */
  67. );
  68. if (ret == 0)
  69. { /* メッセージ取得失敗 */
  70. return false;
  71. }
  72. return true;
  73.  
  74. #elif ((_POSIX_C_SOURCE >= 200112L || __XOPEN_SOURCE >= 600) && ! _GNU_SOURCE)
  75. /* XSI準拠 strerror_r が提供されている場合 */
  76. int ret = strerror_r(errnum, buf, buflen);
  77. if (ret == 0)
  78. { /* メッセージ取得成功 */
  79. return true;
  80. }
  81. return false;
  82.  
  83. #else
  84. /* 上記以外の場合, ANSI 準拠 strerror(errnum) を使用する */
  85. char* tmpMsg = strerror(errnum);
  86. size_t size = strlen(tmpMsg) + 1;
  87. if (size > buflen)
  88. { /* バッファサイズが足りない */
  89. SC_setError(SC_ERANGE);
  90. return false;
  91. }
  92. strncpy(buf, tmpMsg, size);
  93. return true;
  94. #endif /* SC_isWindows */
  95. }
  96.  
  97.