/* =============================================================================
 *  sc_errno.h
 *  Copyright (c) 2003 - 2013  Nomura Kei
 * =============================================================================
 */
#ifndef SC_ERRNO_H
#define SC_ERRNO_H

#include <stddef.h>

#ifndef SC_OS_H
#include <sc_os.h>
#endif

#ifndef SC_COMPILER_H
#include <sc_compiler.h>
#endif

#ifndef SC_STDBOOL_H
#include <sc_stdbool.h>
#endif


#if (isWindows)
typedef DWORD sc_errno_t;
#else
typedef int   sc_errno_t;
#endif


#ifdef __cplusplus
extern "C" {
#endif

sc_errno_t getError(void);
void setError(const sc_errno_t errnum);
bool getErrorMessage(const sc_errno_t errnum, char* const buf, const size_t buflen);


#ifdef __cplusplus
}	/* extern "C"	*/
#endif


#if (isWindows)
/* -----------------------------------------------------------------------------
 *  Windows
 * -----------------------------------------------------------------------------
 */
#define SC_E2BIG            TYPE_E_OUTOFBOUNDS                  /*< 引き数リストが長過ぎる.                     */
#define SC_EACCES           WSAEACCES                           /*< 許可がない.                                 */
#define SC_EADDRINUSE       WSAEADDRINUSE                       /*< アドレスがすでに使用されている.             */
#define SC_EADDRNOTAVAIL    WSAEADDRNOTAVAIL                    /*< アドレスが使用できない.                     */
#define SC_EAFNOSUPPORT     WSAEAFNOSUPPORT                     /*< アドレス・ファミリーがサポートされていない. */
#define SC_EAGAIN           WSATRY_AGAIN                        /*< リソースが一時的に利用不可.                 */
#define SC_EALREADY         WSAEALREADY                         /*< 接続が既に処理中である.                     */
#define SC_EBADF            WSAEBADF                            /*< ファイルディスクリプタが不正である.         */
#define SC_EBADMSG          ERROR_INVALID_MESSAGE               /*< メッセージが不正である.                     */
#define SC_EBUSY            ERROR_BUSY                          /*< リソースが使用中である.                     */
#define SC_ECANCELED        WSAECANCELLED                       /*< 操作がキャンセルされた.                     */
#define SC_ECONNABORTED     WSAECONNABORTED                     /*< 接続が中止された.                           */
#define SC_ECONNREFUSED     WSAECONNREFUSED                     /*< 接続が拒否された.                           */
#define SC_ECONNRESET       WSAECONNRESET                       /*< 接続がリセットされた.                       */
#define SC_EDEADLK          ERROR_POSSIBLE_DEADLOCK             /*< リソースのデッドロックを回避した.           */
#define SC_EDESTADDRREQ     WSAEDESTADDRREQ                     /*< 宛先アドレスが必要である.                   */
#define SC_EDOM             ERROR_BAD_ARGUMENTS                 /*< 数学関数で引き数が領域外である.             */
#define SC_EDQUOT           WSAEDQUOT                           /*< ディスク・クォータ (quota) を超過した.      */
#define SC_EEXIST           ERROR_FILE_EXISTS                   /*< ファイルが存在する.                         */
#define SC_EFAULT           WSAEFAULT                           /*< アドレスが不正である.                       */
#define SC_EFBIG            ERROR_CANNOT_MAKE                   /*< ファイルが大き過ぎる.                       */
#define SC_EHOSTDOWN        WSAEHOSTDOWN                        /*< ホストがダウンしている.                     */
#define SC_EHOSTUNREACH     WSAEHOSTUNREACH                     /*< ホストに到達不能である.                     */
#define SC_EIDRM            ERROR_INVALID_HANDLE                /*< 識別子が削除された.                         */
#define SC_EILSEQ           ERROR_INVALID_DATA                  /*< 不正なバイト列.                             */
#define SC_EINPROGRESS      WSAEINPROGRESS                      /*< 操作が実行中である.                         */
#define SC_EINTR            WSAEINTR                            /*< 関数呼び出しが割り込まれた.                 */
#define SC_EINVAL           WSAEINVAL                           /*< 引数が無効である.                           */
#define SC_EIO              ERROR_IO_DEVICE                     /*< 入出力エラー.                               */
#define SC_EISCONN          WSAEISCONN                          /*< ソケットが接続されている.                   */
#define SC_ELOOP            WSAELOOP                            /*< シンボリック・リンクの回数が多過ぎる.       */
#define SC_EMFILE           WSAEMFILE                           /*< オープンされたファイルが多すぎます.         */
#define SC_EMLINK           ERROR_TOO_MANY_LINKS                /*< リンクが多すぎます.                         */
#define SC_EMSGSIZE         WSAEMSGSIZE                         /*< メッセージが長過ぎる.                       */
#define SC_ENAMETOOLONG     WSAENAMETOOLONG                     /*< ファイル名が長過ぎる.                       */
#define SC_ENETDOWN         WSAENETDOWN                         /*< ネットワークが不通である.                   */
#define SC_ENETRESET        WSAENETRESET                        /*< 接続がネットワーク側から中止された.         */
#define SC_ENETUNREACH      WSAENETUNREACH                      /*< ネットワークが到達不能である.               */
#define SC_ENFILE           ERROR_EA_TABLE_FULL                 /*< ファイルテーブルがオーバフローしました.     */
#define SC_ENOBUFS          WSAENOBUFS                          /*< 使用可能なバッファ空間がない.               */
#define SC_ENODATA          WSANO_DATA                          /*< ストリームの読み出しキューの先頭に読み出し可能なメッセージがない. */
#define SC_ENODEV           ERROR_DEV_NOT_EXIST                 /*< デバイスが存在しません.                     */
#define SC_ENOENT           ERROR_FILE_NOT_FOUND                /*< ファイルまたはディレクトリが存在しません.   */
#define SC_ENOEXEC          ERROR_BAD_FORMAT                    /*< exec フォーマットエラー.                    */
#define SC_ENOMEM           ERROR_OUTOFMEMORY                   /*< 十分な空きメモリ領域が無い.                 */
#define SC_ENOPROTOOPT      WSAENOPROTOOPT                      /*< 指定されたプロトコルが利用できない.         */
#define SC_ENOSPC           ERROR_HANDLE_DISK_FULL              /*< デバイス上のスペースが足りません.           */
#define SC_ENOSYS           TYPE_E_DLLFUNCTIONNOTFOUND          /*< 関数が実装されていない.                     */
#define SC_ENOTCONN         WSAENOTCONN                         /*< ソケットが接続されていない.                 */
#define SC_ENOTEMPTY        WSAENOTEMPTY                        /*< ディレクトリが空ではない.                   */
#define SC_ENOTSOCK         WSAENOTSOCK                         /*< ソケットではない.                           */
#define SC_ENOTSUP          ERROR_NOT_SUPPORTED                 /*< 操作がサポートされていない.                 */
#define SC_ENOTTY           RROR_INVALID_CATEGORY               /*< デバイスへのioctl が正しくありません.       */
#define SC_ENXIO            ERROR_BAD_UNIT                      /*< デバイスまたはアドレスが存在しません.       */
#define SC_EOPNOTSUPP       WSAEOPNOTSUPP                       /*< ソケットでサポートしていない操作である.     */
#define SC_EPERM            WSAEACCES                           /*< スーパーユーザではありません.               */
#define SC_EPFNOSUPPORT     WSAEPFNOSUPPORT                     /*< サポートされていないプロトコルファミリーである.  */
#define SC_EPIPE            ERROR_BROKEN_PIPE                   /*< パイプが中断されました.                     */
#define SC_EPROTO           ERROR_DS_PROTOCOL_ERROR             /*< プロトコル・エラー.                         */
#define SC_EPROTONOSUPPORT  WSAEPROTONOSUPPORT                  /*< プロトコルがサポートされていない.           */
#define SC_EPROTOTYPE       WSAEPROTOTYPE                       /*< ソケットに指定できないプロトコル・タイプである.  */
#define SC_ERANGE           ERROR_DS_OBJECT_RESULTS_TOO_LARGE   /*< 数学関数結果が表示不可能です.               */
#define SC_EREMOTE          WSAEREMOTE                          /*< オブジェクトがリモートにある.               */
#define SC_EROFS            ERROR_FILE_READ_ONLY                /*< 読み取り専用のファイルシステムです.         */
#define SC_ESHUTDOWN        WSAESHUTDOWN                        /*< 通信相手がシャットダウンされて送信できない. */
#define SC_ESOCKTNOSUPPORT  WSAESOCKTNOSUPPORT                  /*< サポートされていないソケット種別である.     */
#define SC_ESPIPE           ERROR_BAD_PIPE                      /*< シークが正しくありません.                   */
#define SC_ESTALE           WSAESTALE                           /*< ファイルハンドルが古い状態になっている.     */
#define SC_ETIME            WSAETIMEDOUT                        /*< 時間が経過した.                             */
#define SC_ETIMEDOUT        WSAETIMEDOUT                        /*< 操作がタイムアウトした.                     */
#define SC_ETXTBSY          ERROR_BUSY                          /*< テキストファイルは使われています。(旧仕様). */
#define SC_EXDEV            ERROR_NOT_SAME_DEVICE               /*< デバイスにまたがるリンクになります.         */

#else
/* -----------------------------------------------------------------------------
 *  Windows 以外
 * -----------------------------------------------------------------------------
 */
#include <errno.h>

#define SC_E2BIG            E2BIG                               /*< 引き数リストが長過ぎる.                     */
#define SC_EACCES           EACCES                              /*< 許可がない.                                 */
#define SC_EADDRINUSE       EADDRINUSE                          /*< アドレスがすでに使用されている.             */
#define SC_EADDRNOTAVAIL    EADDRNOTAVAIL                       /*< アドレスが使用できない.                     */
#define SC_EAFNOSUPPORT     EAFNOSUPPORT                        /*< アドレス・ファミリーがサポートされていない. */
#define SC_EAGAIN           EAGAIN                              /*< リソースが一時的に利用不可.                 */
#define SC_EALREADY         EALREADY                            /*< 接続が既に処理中である.                     */
#define SC_EBADF            EBADF                               /*< ファイルディスクリプタが不正である.         */
#define SC_EBADMSG          EBADMSG                             /*< メッセージが不正である.                     */
#define SC_EBUSY            EBUSY                               /*< リソースが使用中である.                     */
#define SC_ECANCELED        ECANCELED                           /*< 操作がキャンセルされた.                     */
#define SC_ECONNABORTED     ECONNABORTED                        /*< 接続が中止された.                           */
#define SC_ECONNREFUSED     ECONNREFUSED                        /*< 接続が拒否された.                           */
#define SC_ECONNRESET       ECONNRESET                          /*< 接続がリセットされた.                       */
#define SC_EDEADLK          EDEADLK                             /*< リソースのデッドロックを回避した.           */
#define SC_EDESTADDRREQ     EDESTADDRREQ                        /*< 宛先アドレスが必要である.                   */
#define SC_EDOM             EDOM                                /*< 数学関数で引き数が領域外である.             */
#define SC_EDQUOT           EDQUOT                              /*< ディスク・クォータ (quota) を超過した.      */
#define SC_EEXIST           EEXIST                              /*< ファイルが存在する.                         */
#define SC_EFAULT           EFAULT                              /*< アドレスが不正である.                       */
#define SC_EFBIG            EFBIG                               /*< ファイルが大き過ぎる.                       */
#define SC_EHOSTDOWN        EHOSTDOWN                           /*< ホストがダウンしている.                     */
#define SC_EHOSTUNREACH     EHOSTUNREACH                        /*< ホストに到達不能である.                     */
#define SC_EIDRM            EIDRM                               /*< 識別子が削除された.                         */
#define SC_EILSEQ           EILSEQ                              /*< 不正なバイト列.                             */
#define SC_EINPROGRESS      EINPROGRESS                         /*< 操作が実行中である.                         */
#define SC_EINTR            EINTR                               /*< 関数呼び出しが割り込まれた.                 */
#define SC_EINVAL           EINVAL                              /*< 引数が無効である.                           */
#define SC_EIO              EIO                                 /*< 入出力エラー.                               */
#define SC_EISCONN          EISCONN                             /*< ソケットが接続されている.                   */
#define SC_ELOOP            ELOOP                               /*< シンボリック・リンクの回数が多過ぎる.       */
#define SC_EMFILE           EMFILE                              /*< オープンされたファイルが多すぎます.         */
#define SC_EMLINK           EMLINK                              /*< リンクが多すぎます.                         */
#define SC_EMSGSIZE         EMSGSIZE                            /*< メッセージが長過ぎる.                       */
#define SC_ENAMETOOLONG     ENAMETOOLONG                        /*< ファイル名が長過ぎる.                       */
#define SC_ENETDOWN         ENETDOWN                            /*< ネットワークが不通である.                   */
#define SC_ENETRESET        ENETRESET                           /*< 接続がネットワーク側から中止された.         */
#define SC_ENETUNREACH      ENETUNREACH                         /*< ネットワークが到達不能である.               */
#define SC_ENFILE           ENFILE                              /*< ファイルテーブルがオーバフローしました.     */
#define SC_ENOBUFS          ENOBUFS                             /*< 使用可能なバッファ空間がない.               */
#define SC_ENODATA          ENODATA                             /*< ストリームの読み出しキューの先頭に読み出し可能なメッセージがない. */
#define SC_ENODEV           ENODEV                              /*< デバイスが存在しません.                     */
#define SC_ENOENT           ENOENT                              /*< ファイルまたはディレクトリが存在しません.   */
#define SC_ENOEXEC          ENOEXEC                             /*< exec フォーマットエラー.                    */
#define SC_ENOMEM           ENOMEM                              /*< 十分な空きメモリ領域が無い.                 */
#define SC_ENOPROTOOPT      ENOPROTOOPT                         /*< 指定されたプロトコルが利用できない.         */
#define SC_ENOSPC           ENOSPC                              /*< デバイス上のスペースが足りません.           */
#define SC_ENOSYS           ENOSYS                              /*< 関数が実装されていない.                     */
#define SC_ENOTCONN         ENOTCONN                            /*< ソケットが接続されていない.                 */
#define SC_ENOTEMPTY        ENOTEMPTY                           /*< ディレクトリが空ではない.                   */
#define SC_ENOTSOCK         ENOTSOCK                            /*< ソケットではない.                           */
#define SC_ENOTSUP          ENOTSUP                             /*< 操作がサポートされていない.                 */
#define SC_ENOTTY           ENOTTY                              /*< デバイスへのioctl が正しくありません.       */
#define SC_ENXIO            ENXIO                               /*< デバイスまたはアドレスが存在しません.       */
#define SC_EOPNOTSUPP       EOPNOTSUPP                          /*< ソケットでサポートしていない操作である.     */
#define SC_EPERM            EPERM                               /*< スーパーユーザではありません.               */
#define SC_EPFNOSUPPORT     EPFNOSUPPORT                        /*< サポートされていないプロトコルファミリーである.  */
#define SC_EPIPE            EPIPE                               /*< パイプが中断されました.                     */
#define SC_EPROTO           EPROTO                              /*< プロトコル・エラー.                         */
#define SC_EPROTONOSUPPORT  EPROTONOSUPPORT                     /*< プロトコルがサポートされていない.           */
#define SC_EPROTOTYPE       EPROTOTYPE                          /*< ソケットに指定できないプロトコル・タイプである.  */
#define SC_ERANGE           ERANGE                              /*< 数学関数結果が表示不可能です.               */
#define SC_EREMOTE          EREMOTE                             /*< オブジェクトがリモートにある.               */
#define SC_EROFS            EROFS                               /*< 読み取り専用のファイルシステムです.         */
#define SC_ESHUTDOWN        ESHUTDOWN                           /*< 通信相手がシャットダウンされて送信できない. */
#define SC_ESOCKTNOSUPPORT  ESOCKTNOSUPPORT                     /*< サポートされていないソケット種別である.     */
#define SC_ESPIPE           ESPIPE                              /*< シークが正しくありません.                   */
#define SC_ESTALE           ESTALE                              /*< ファイルハンドルが古い状態になっている.     */
#define SC_ETIME            ETIME                               /*< 時間が経過した.                             */
#define SC_ETIMEDOUT        ETIMEDOUT                           /*< 操作がタイムアウトした.                     */
#define SC_ETXTBSY          ETXTBSY                             /*< テキストファイルは使われています。(旧仕様). */
#define SC_EXDEV            EXDEV                               /*< デバイスにまたがるリンクになります.         */

#endif /* isWindows  */


#endif /* SC_ERRNO_H */
