Newer
Older
libj / modules / j / base / src / errno.cpp
#include <cerrno>
#include <cstring>

#include <j/lang/errno.hpp>

namespace j
{
    namespace lang
    {
        namespace Errno
        {
#if (IS_WINDOWS)
            ////////////////////////////////////////////////////////////////////////////////
            //
            // For Windows
            //
            /**
             * エラー番号を設定します。
             *
             * @param errnum エラー番号
             */
            void set(int errnum)
            {
                SetLastError(errnum);
            }

            /**
             * エラー番号を取得します。
             *
             * @return エラー番号
             */
            int get()
            {
                return GetLastError();
            }

            /**
             * エラー番号に対応するエラーメッセージを取得します。
             *
             * @param errnum エラー番号
             * @return エラーメッセージ
             */
            String message(int errnum)
            {
                LPVOID lpMsgBuf;
                int ret = FormatMessage(
                    FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, // 動作フラグ
                    0,                                                                                           // メッセージ定義位置
                    errnum,                                                                                      // エラーコード
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),                                                   // 言語ID
                    (LPSTR)&lpMsgBuf,                                                                            // バッファアドレス
                    0,                                                                                           // バッファサイズ
                    0);                                                                                          // 挿入句

                if (ret != 0)
                {
                    String msg((char *)lpMsgBuf);
                    LocalFree(lpMsgBuf);
                    return msg;
                }
                else
                {
                    String msg();
                    return msg;
                }
            }
#else
            ////////////////////////////////////////////////////////////////////////////////
            //
            // For Windows 以外
            //

            /**
             * エラー番号を設定します。
             *
             * @param errnum エラー番号
             */
            void set(int errnum)
            {
                errno = errnum;
            }

            /**
             * エラー番号を取得します。
             *
             * @return エラー番号
             */
            int get()
            {
                return errno;
            }

            /**
             * エラー番号に対応するエラーメッセージを取得します。
             *
             * @param errnum エラー番号
             * @return エラーメッセージ
             */
            String message(int errnum)
            {
                String msg(strerror(errnum));
                return msg;
            }
#endif // IS_WINDOWS

        } // namespace Errno
    } // namespace lang
} // namespace j