added qse_dir_geterrnum()

This commit is contained in:
2012-12-25 14:10:02 +00:00
parent c133af0e55
commit b8c66b5b8d
16 changed files with 446 additions and 363 deletions

View File

@ -32,6 +32,7 @@ const qse_char_t* qse_awk_dflerrstr (const qse_awk_t* awk, qse_awk_errnum_t errn
QSE_T("insufficient memory"),
QSE_T("invalid parameter or data"),
QSE_T("access denied"),
QSE_T("not supported"),
QSE_T("operation not allowed"),
QSE_T("'${0}' not found"),

View File

@ -718,6 +718,10 @@ static int fnc_split (qse_awk_rtx_t* run, const qse_awk_fnc_info_t* fi)
t1 = qse_awk_rtx_makemapval (run);
if (t1 == QSE_NULL) goto oops;
/* use the following 3 lines intead of
* qse_awk_rtx_setrefval (run, a1, t1);
* just for less overhead.
*/
qse_awk_rtx_refdownval (run, *a1_ref);
*a1_ref = t1;
qse_awk_rtx_refupval (run, *a1_ref);

View File

@ -2155,7 +2155,6 @@ static qse_awk_nde_t* parse_while (qse_awk_t* awk, const qse_awk_loc_t* xloc)
oops:
if (body) qse_awk_clrpt (awk, body);
if (test) qse_awk_clrpt (awk, test);
QSE_ASSERT (nde == QSE_NULL);
return QSE_NULL;
}

View File

@ -40,6 +40,7 @@
struct qse_dir_t
{
qse_mmgr_t* mmgr;
qse_dir_errnum_t errnum;
int flags;
qse_str_t tbuf;
@ -72,7 +73,12 @@ void qse_dir_fini (qse_dir_t* dir);
static int reset_to_path (qse_dir_t* dir, const qse_char_t* path);
qse_dir_t* qse_dir_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, const qse_char_t* path, int flags)
#include "syserr.h"
IMPLEMENT_SYSERR_TO_ERRNUM (dir, DIR)
qse_dir_t* qse_dir_open (
qse_mmgr_t* mmgr, qse_size_t xtnsize,
const qse_char_t* path, int flags, qse_dir_errnum_t* errnum)
{
qse_dir_t* dir;
@ -81,11 +87,16 @@ qse_dir_t* qse_dir_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, const qse_char_t*
{
if (qse_dir_init (dir, mmgr, path, flags) <= -1)
{
if (errnum) *errnum = qse_dir_geterrnum (dir);
QSE_MMGR_FREE (mmgr, dir);
dir = QSE_NULL;
}
else QSE_MEMSET (dir + 1, 0, xtnsize);
}
else
{
if (errnum) *errnum = QSE_DIR_ENOMEM;
}
return dir;
}
@ -106,6 +117,11 @@ void* qse_dir_getxtn (qse_dir_t* dir)
return QSE_XTN (dir);
}
qse_dir_errnum_t qse_dir_geterrnum (qse_dir_t* dir)
{
return dir->errnum;
}
int qse_dir_init (qse_dir_t* dir, qse_mmgr_t* mmgr, const qse_char_t* path, int flags)
{
int n;
@ -177,8 +193,17 @@ static qse_mchar_t* wcs_to_mbuf (qse_dir_t* dir, const qse_wchar_t* wcs, qse_mbs
{
qse_size_t ml, wl;
if (qse_wcstombs (wcs, &wl, QSE_NULL, &ml) <= -1 ||
qse_mbs_setlen (mbs, ml) == (qse_size_t)-1) return QSE_NULL;
if (qse_wcstombs (wcs, &wl, QSE_NULL, &ml) <= -1)
{
dir->errnum = QSE_DIR_EINVAL;
return QSE_NULL;
}
if (qse_mbs_setlen (mbs, ml) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return QSE_NULL;
}
qse_wcstombs (wcs, &wl, QSE_MBS_PTR(mbs), &ml);
return QSE_MBS_PTR(mbs);
@ -188,8 +213,16 @@ static qse_wchar_t* mbs_to_wbuf (qse_dir_t* dir, const qse_mchar_t* mbs, qse_wcs
{
qse_size_t ml, wl;
if (qse_mbstowcs (mbs, &ml, QSE_NULL, &wl) <= -1 ||
qse_wcs_setlen (wcs, wl) == (qse_size_t)-1) return QSE_NULL;
if (qse_mbstowcs (mbs, &ml, QSE_NULL, &wl) <= -1)
{
dir->errnum = QSE_DIR_EINVAL;
return QSE_NULL;
}
if (qse_wcs_setlen (wcs, wl) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return QSE_NULL;
}
qse_mbstowcs (mbs, &ml, QSE_WCS_PTR(wcs), &wl);
return QSE_WCS_PTR(wcs);
@ -199,7 +232,11 @@ static qse_mchar_t* make_mbsdos_path (qse_dir_t* dir, const qse_mchar_t* mpath)
{
if (mpath[0] == QSE_MT('\0'))
{
if (qse_mbs_cpy (&dir->mbuf, QSE_MT("*.*")) == (qse_size_t)-1) return QSE_NULL;
if (qse_mbs_cpy (&dir->mbuf, QSE_MT("*.*")) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return QSE_NULL;
}
}
else
{
@ -210,6 +247,7 @@ static qse_mchar_t* make_mbsdos_path (qse_dir_t* dir, const qse_mchar_t* mpath)
qse_mbs_ccat (&dir->mbuf, QSE_MT('\\')) == (qse_size_t)-1) ||
qse_mbs_cat (&dir->mbuf, QSE_MT("*.*")) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return QSE_NULL;
}
}
@ -221,7 +259,11 @@ static qse_char_t* make_dos_path (qse_dir_t* dir, const qse_char_t* path)
{
if (path[0] == QSE_T('\0'))
{
if (qse_str_cpy (&dir->tbuf, QSE_T("*.*")) == (qse_size_t)-1) return QSE_NULL;
if (qse_str_cpy (&dir->tbuf, QSE_T("*.*")) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return QSE_NULL;
}
}
else
{
@ -232,6 +274,7 @@ static qse_char_t* make_dos_path (qse_dir_t* dir, const qse_char_t* path)
qse_str_ccat (&dir->tbuf, QSE_T('\\')) == (qse_size_t)-1) ||
qse_str_cat (&dir->tbuf, QSE_T("*.*")) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return QSE_NULL;
}
}
@ -293,7 +336,11 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
if (tptr == QSE_NULL) return -1;
dir->h = FindFirstFile (tptr, &dir->wfd);
if (dir->h == INVALID_HANDLE_VALUE) return -1;
if (dir->h == INVALID_HANDLE_VALUE)
{
dir->errnum = syserr_to_errnum (GetLastError());
return -1;
}
return 0;
/* ------------------------------------------------------------------- */
@ -337,7 +384,11 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
#endif
);
if (rc != NO_ERROR) return -1;
if (rc != NO_ERROR)
{
dir->errnum = syserr_to_errnum (rc);
return -1;
}
dir->opened = 1;
return 0;
@ -368,7 +419,11 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
if (mptr == QSE_NULL) return -1;
rc = _dos_findfirst (mptr, _A_NORMAL | _A_SUBDIR, &dir->f);
if (rc != 0) return -1;
if (rc != 0)
{
dir->errnum = syserr_to_errnum (errno);
return -1;
}
dir->opened = 1;
return 0;
@ -402,7 +457,11 @@ static int reset_to_path (qse_dir_t* dir, const qse_char_t* path)
}
}
#endif
if (dp == QSE_NULL) return -1;
if (dp == QSE_NULL)
{
dir->errnum = syserr_to_errnum (errno);
return -1;
}
dir->dp = dp;
return 0;
@ -423,7 +482,11 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
if (dir->done) return (dir->done > 0)? 0: -1;
#if defined(QSE_CHAR_IS_MCHAR)
if (qse_str_cpy (&dir->tbuf, dir->wfd.cFileName) == (qse_size_t)-1) return -1;
if (qse_str_cpy (&dir->tbuf, dir->wfd.cFileName) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return -1;
}
*name = QSE_STR_PTR(&dir->tbuf);
#else
if (dir->flags & QSE_DIR_MBSPATH)
@ -433,13 +496,25 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
}
else
{
if (qse_str_cpy (&dir->tbuf, dir->wfd.cFileName) == (qse_size_t)-1) return -1;
if (qse_str_cpy (&dir->tbuf, dir->wfd.cFileName) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return -1;
}
*name = QSE_STR_PTR(&dir->tbuf);
}
#endif
if (FindNextFile (dir->h, &dir->wfd) == FALSE)
dir->done = (GetLastError() == ERROR_NO_MORE_FILES)? 1: -1;
{
DWORD x = GetLastError();
if (x == ERROR_NO_MORE_FILES) dir->done = 1;
else
{
dir->errnum = syserr_to_errnum (x);
dir->done = -1;
}
}
return 1;
/* ------------------------------------------------------------------- */
@ -452,12 +527,20 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
if (dir->count <= 0) return 0;
#if defined(QSE_CHAR_IS_MCHAR)
if (qse_str_cpy (&dir->tbuf, dir->ffb.achName) == (qse_size_t)-1) return -1;
if (qse_str_cpy (&dir->tbuf, dir->ffb.achName) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return -1;
}
*name = QSE_STR_PTR(&dir->tbuf);
#else
if (dir->flags & QSE_DIR_MBSPATH)
{
if (qse_mbs_cpy (&dir->mbuf, dir->ffb.achName) == (qse_size_t)-1) return -1;
if (qse_mbs_cpy (&dir->mbuf, dir->ffb.achName) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return -1;
}
*name = QSE_MBS_PTR(&dir->mbuf);
}
else
@ -469,7 +552,11 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
rc = DosFindNext (dir->h, &dir->ffb, QSE_SIZEOF(dir->ffb), &dir->count);
if (rc == ERROR_NO_MORE_FILES) dir->count = 0;
else if (rc != NO_ERROR) return -1;
else if (rc != NO_ERROR)
{
dir->errnum = syserr_to_errnum (rc);
return -1;
}
return 1;
/* ------------------------------------------------------------------- */
@ -477,17 +564,24 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
#elif defined(__DOS__)
/* ------------------------------------------------------------------- */
unsigned int rc;
if (dir->done) return (dir->done > 0)? 0: -1;
#if defined(QSE_CHAR_IS_MCHAR)
if (qse_str_cpy (&dir->tbuf, dir->f.name) == (qse_size_t)-1) return -1;
if (qse_str_cpy (&dir->tbuf, dir->f.name) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return -1;
}
*name = QSE_STR_PTR(&dir->tbuf);
#else
if (dir->flags & QSE_DIR_MBSPATH)
{
if (qse_mbs_cpy (&dir->mbuf, dir->f.name) == (qse_size_t)-1) return -1;
if (qse_mbs_cpy (&dir->mbuf, dir->f.name) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return -1;
}
*name = QSE_MBS_PTR(&dir->mbuf);
}
else
@ -497,8 +591,15 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
}
#endif
rc = _dos_findnext (&dir->f);
if (rc != 0) dir->done = (errno == ENOENT)? 1: -1;
if (_dos_findnext (&dir->f) != 0)
{
if (errno == ENOENT) dir->done = 1;
else
{
dir->errnum = syserr_to_errnum (errno);
dir->done = -1;
}
}
return 1;
/* ------------------------------------------------------------------- */
@ -510,15 +611,29 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name)
errno = 0;
de = QSE_READDIR (dir->dp);
if (de == NULL) return (errno == 0)? 0: -1;
if (de == NULL)
{
if (errno == 0) return 0;
dir->errnum = syserr_to_errnum (errno);
return -1;
}
#if defined(QSE_CHAR_IS_MCHAR)
if (qse_str_cpy (&dir->tbuf, de->d_name) == (qse_size_t)-1) return -1;
if (qse_str_cpy (&dir->tbuf, de->d_name) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return -1;
}
*name = QSE_STR_PTR(&dir->tbuf);
#else
if (dir->flags & QSE_DIR_MBSPATH)
{
if (qse_mbs_cpy (&dir->mbuf, de->d_name) == (qse_size_t)-1) return -1;
if (qse_mbs_cpy (&dir->mbuf, de->d_name) == (qse_size_t)-1)
{
dir->errnum = QSE_DIR_ENOMEM;
return -1;
}
*name = QSE_MBS_PTR(&dir->mbuf);
}
else

View File

@ -55,130 +55,8 @@ enum
STATUS_NOCLOSE = (1 << 1)
};
#if defined(_WIN32)
static qse_fio_errnum_t syserr_to_errnum (DWORD e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
return QSE_FIO_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
return QSE_FIO_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_FIO_EACCES;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_FIO_ENOENT;
case ERROR_ALREADY_EXISTS:
case ERROR_FILE_EXISTS:
return QSE_FIO_EEXIST;
default:
return QSE_FIO_ESYSERR;
}
}
#elif defined(__OS2__)
static qse_fio_errnum_t syserr_to_errnum (APIRET e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
return QSE_FIO_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
return QSE_FIO_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_FIO_EACCES;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_FIO_ENOENT;
case ERROR_ALREADY_EXISTS:
return QSE_FIO_EEXIST;
default:
return QSE_FIO_ESYSERR;
}
}
#elif defined(__DOS__)
static qse_fio_errnum_t syserr_to_errnum (int e)
{
switch (e)
{
case ENOMEM:
return QSE_FIO_ENOMEM;
case EINVAL:
return QSE_FIO_EINVAL;
case EACCES:
return QSE_FIO_EACCES;
case ENOENT:
return QSE_FIO_ENOENT;
case EEXIST:
return QSE_FIO_EEXIST;
default:
return QSE_FIO_ESYSERR;
}
}
#elif defined(vms) || defined(__vms)
static qse_fio_errnum_t syserr_to_errnum (unsigned long e)
{
switch (e)
{
case RMS$_NORMAL:
return QSE_FIO_ENOERR;
/* TODO: add more */
default:
return QSE_FIO_ESYSERR;
}
}
#else
static qse_fio_errnum_t syserr_to_errnum (int e)
{
switch (e)
{
case ENOMEM:
return QSE_FIO_ENOMEM;
case EINVAL:
return QSE_FIO_EINVAL;
case ENOENT:
return QSE_FIO_ENOENT;
case EACCES:
return QSE_FIO_EACCES;
case EEXIST:
return QSE_FIO_EEXIST;
case EINTR:
return QSE_FIO_EINTR;
default:
return QSE_FIO_ESYSERR;
}
}
#endif
#include "syserr.h"
IMPLEMENT_SYSERR_TO_ERRNUM (fio, FIO)
#if defined(__OS2__)

View File

@ -408,7 +408,7 @@ entry:
if (seg->wild)
{
dp = qse_dir_open (g->mmgr, 0, QSE_STR_PTR(&g->path), 0);
dp = qse_dir_open (g->mmgr, 0, QSE_STR_PTR(&g->path), 0, QSE_NULL);
if (dp)
{
tmp = QSE_STR_LEN(&g->path);

View File

@ -45,125 +45,8 @@ static qse_ssize_t pio_input (
static qse_ssize_t pio_output (
qse_tio_t* tio, qse_tio_cmd_t cmd, void* buf, qse_size_t size);
#if defined(_WIN32)
static qse_pio_errnum_t syserr_to_errnum (DWORD e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
case ERROR_OUTOFMEMORY:
return QSE_PIO_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
return QSE_PIO_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_PIO_EACCES;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_PIO_ENOENT;
case ERROR_ALREADY_EXISTS:
case ERROR_FILE_EXISTS:
return QSE_PIO_EEXIST;
case ERROR_BROKEN_PIPE:
return QSE_PIO_EPIPE;
default:
return QSE_PIO_ESYSERR;
}
}
#elif defined(__OS2__)
static qse_pio_errnum_t syserr_to_errnum (APIRET e)
{
switch (e)
{
case ERROR_NOT_ENOUGH_MEMORY:
return QSE_PIO_ENOMEM;
case ERROR_INVALID_PARAMETER:
case ERROR_INVALID_HANDLE:
case ERROR_INVALID_NAME:
return QSE_PIO_EINVAL;
case ERROR_ACCESS_DENIED:
case ERROR_SHARING_VIOLATION:
return QSE_PIO_EACCES;
case ERROR_FILE_NOT_FOUND:
case ERROR_PATH_NOT_FOUND:
return QSE_PIO_ENOENT;
case ERROR_ALREADY_EXISTS:
return QSE_PIO_EEXIST;
case ERROR_BROKEN_PIPE:
return QSE_PIO_EPIPE;
default:
return QSE_PIO_ESYSERR;
}
}
#elif defined(__DOS__)
static qse_pio_errnum_t syserr_to_errnum (int e)
{
switch (e)
{
case ENOMEM:
return QSE_PIO_ENOMEM;
case EINVAL:
return QSE_PIO_EINVAL;
case EACCES:
return QSE_PIO_EACCES;
case ENOENT:
return QSE_PIO_ENOENT;
case EEXIST:
return QSE_PIO_EEXIST;
default:
return QSE_PIO_ESYSERR;
}
}
#else
static qse_pio_errnum_t syserr_to_errnum (int e)
{
switch (e)
{
case ENOMEM:
return QSE_PIO_ENOMEM;
case EINVAL:
return QSE_PIO_EINVAL;
case EACCES:
return QSE_PIO_EACCES;
case ENOENT:
return QSE_PIO_ENOENT;
case EEXIST:
return QSE_PIO_EEXIST;
case EINTR:
return QSE_PIO_EINTR;
case EPIPE:
return QSE_PIO_EPIPE;
default:
return QSE_PIO_ESYSERR;
}
}
#endif
#include "syserr.h"
IMPLEMENT_SYSERR_TO_ERRNUM (pio, PIO)
static qse_pio_errnum_t tio_errnum_to_pio_errnum (qse_tio_t* tio)
{

139
qse/lib/cmn/syserr.h Normal file
View File

@ -0,0 +1,139 @@
/*
* $Id$
*
Copyright 2006-2012 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
/*
* this file is intended for internal use only.
* you can include this file and use IMPLEMENT_SYSERR_TO_ERRNUM.
*
* #include "syserr.h"
* IMPLEMENT_SYSERR_TO_ERRNUM (pio, PIO)
*
* header files defining system error codes must be included
* before this file.
*/
#define __SYSERRTYPE__(obj) qse_ ## obj ## _errnum_t
#define __SYSERRNUM__(obj,num) (QSE_ ## obj ## _ ## num)
#if defined(_WIN32)
#define IMPLEMENT_SYSERR_TO_ERRNUM(obj1,obj2) \
static __SYSERRTYPE__(obj1) syserr_to_errnum (DWORD e) \
{ \
switch (e) \
{ \
case ERROR_NOT_ENOUGH_MEMORY: \
case ERROR_OUTOFMEMORY: \
return __SYSERRNUM__ (obj2, ENOMEM); \
case ERROR_INVALID_PARAMETER: \
case ERROR_INVALID_HANDLE: \
case ERROR_INVALID_NAME: \
return __SYSERRNUM__ (obj2, EINVAL); \
case ERROR_ACCESS_DENIED: \
case ERROR_SHARING_VIOLATION: \
return __SYSERRNUM__ (obj2, EACCES); \
case ERROR_FILE_NOT_FOUND: \
case ERROR_PATH_NOT_FOUND: \
return __SYSERRNUM__ (obj2, ENOENT); \
case ERROR_ALREADY_EXISTS: \
case ERROR_FILE_EXISTS: \
return __SYSERRNUM__ (obj2, EEXIST); \
case ERROR_BROKEN_PIPE: \
return __SYSERRNUM__ (obj2, EPIPE); \
default: \
return __SYSERRNUM__ (obj2, ESYSERR); \
} \
}
#elif defined(__OS2__)
#define IMPLEMENT_SYSERR_TO_ERRNUM(obj1,obj2) \
static __SYSERRTYPE__(obj1) syserr_to_errnum (APIRET e) \
{ \
switch (e) \
{ \
case ERROR_NOT_ENOUGH_MEMORY: \
return __SYSERRNUM__ (obj2, ENOMEM); \
case ERROR_INVALID_PARAMETER: \
case ERROR_INVALID_HANDLE: \
case ERROR_INVALID_NAME: \
return __SYSERRNUM__ (obj2, EINVAL); \
case ERROR_ACCESS_DENIED: \
case ERROR_SHARING_VIOLATION: \
return __SYSERRNUM__ (obj2, EACCES); \
case ERROR_FILE_NOT_FOUND: \
case ERROR_PATH_NOT_FOUND: \
return __SYSERRNUM__ (obj2, ENOENT); \
case ERROR_ALREADY_EXISTS: \
return __SYSERRNUM__ (obj2, EEXIST); \
case ERROR_BROKEN_PIPE: \
return __SYSERRNUM__ (obj2, EPIPE); \
default: \
return __SYSERRNUM__ (obj2, ESYSERR); \
} \
}
#elif defined(__DOS__)
#define IMPLEMENT_SYSERR_TO_ERRNUM(obj1,obj2) \
static __SYSERRTYPE__(obj1) syserr_to_errnum (int e) \
{ \
switch (e) \
{ \
case ENOMEM: return __SYSERRNUM__ (syserrobj, ENOMEM); \
case EINVAL: return __SYSERRNUM__ (syserrobj, EINVAL); \
case EACCES: return __SYSERRNUM__ (syserrobj, EACCES); \
case ENOENT: return __SYSERRNUM__ (syserrobj, ENOENT); \
case EEXIST: return __SYSERRNUM__ (syserrobj, EEXIST); \
default: return __SYSERRNUM__ (syserrobj, ESYSERR); \
} \
}
#elif defined(vms) || defined(__vms)
#define IMPLEMENT_SYSERR_TO_ERRNUM(obj1,obj2) \
static __SYSERRTYPE__(obj1) syserr_to_errnum (unsigned long e) \
{ \
switch (e) \
{ \
case RMS$_NORMAL: return __SYSERRNUM__ (obj2, ENOERR); \
default: return __SYSERRNUM__ (obj2, ESYSERR); \
} \
}
#else
#define IMPLEMENT_SYSERR_TO_ERRNUM(obj1,obj2) \
static __SYSERRTYPE__(obj1) syserr_to_errnum (int e) \
{ \
switch (e) \
{ \
case ENOMEM: return __SYSERRNUM__ (obj2, ENOMEM); \
case EINVAL: return __SYSERRNUM__ (obj2, EINVAL); \
case EACCES: return __SYSERRNUM__ (obj2, EACCES); \
case ENOENT: return __SYSERRNUM__ (obj2, ENOENT); \
case EEXIST: return __SYSERRNUM__ (obj2, EEXIST); \
case EINTR: return __SYSERRNUM__ (obj2, EINTR); \
case EPIPE: return __SYSERRNUM__ (obj2, EPIPE); \
default: return __SYSERRNUM__ (obj2, ESYSERR); \
} \
}
#endif