- /* vim: ts=4 sw=4 sts=4 ff=unix fenc=utf-8 :
- * =====================================================================
- * sc_error.c
- * Copyright (c) 2003 - 2011 sys0tem
- * LICENSE :
- * LGPL (GNU Lesser General Public License - Version 3,29 June 2007)
- * http://www.gnu.org/copyleft/lesser.html
- * or
- * EPL (Eclipse Public License - v1.0)
- * http://www.eclipse.org/legal/epl-v10.html
- * =====================================================================
- */
- #include <string.h>
- #include <sc_error.h>
-
-
- /**
- * エラー番号を取得します.
- *
- * @param エラー番号
- */
- int SC_getError(void)
- {
- #if (SC_isWindows)
- return GetLastError();
- #else
- return errno;
- #endif
- }
-
-
- /**
- * エラー番号を設定します.
- *
- * @param errnum エラー番号
- */
- void SC_setError(errnum)
- {
- #if (SC_isWindows)
- SetLastError(errnum);
- #else
- errno = errnum;
- #endif
- }
-
-
- /**
- * 指定された errnum に対応するエラーメッセージを buf に格納します.
- * メッセージの獲得に成功した場合、true を返します.
- *
- * @param errnum エラー番号
- * @param buf メッセージ格納用バッファ
- * @param buflen バッファサイズ
- * @return true/false (成功/失敗)
- */
- bool SC_getErrorMessage(int errnum, char* buf, size_t buflen)
- {
- #if (SC_isWindows)
- int ret = FormatMessage(
- FORMAT_MESSAGE_FROM_SYSTEM, /* 動作フラグ */
- NULL, /* メッセージ定義位置 */
- errnum, /* エラーコード */
- 0, /* 言語ID */
- buf, /* バッファアドレス */
- buflen, /* バッファサイズ */
- NULL /* 挿入句 */
- );
- if (ret == 0)
- { /* メッセージ取得失敗 */
- return false;
- }
- return true;
-
- #elif ((_POSIX_C_SOURCE >= 200112L || __XOPEN_SOURCE >= 600) && ! _GNU_SOURCE)
- /* XSI準拠 strerror_r が提供されている場合 */
- int ret = strerror_r(errnum, buf, buflen);
- if (ret == 0)
- { /* メッセージ取得成功 */
- return true;
- }
- return false;
-
- #else
- /* 上記以外の場合, ANSI 準拠 strerror(errnum) を使用する */
- char* tmpMsg = strerror(errnum);
- size_t size = strlen(tmpMsg) + 1;
- if (size > buflen)
- { /* バッファサイズが足りない */
- SC_setError(SC_ERANGE);
- return false;
- }
- strncpy(buf, tmpMsg, size);
- return true;
- #endif /* SC_isWindows */
- }
-
-