touched up code for warp 4

This commit is contained in:
2012-12-18 08:12:15 +00:00
parent 14648534b3
commit 1595a9a4f3
27 changed files with 772 additions and 514 deletions

View File

@ -112,7 +112,7 @@ if ENABLE_BUNDLED_UNICODE
libqsecmn_la_SOURCES += uni.c
endif
if INCLUDE_MORE_CMGRS
if ENABLE_XCMGRS
libqsecmn_la_SOURCES += cp949.c cp950.c
endif

View File

@ -36,7 +36,7 @@ POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
@ENABLE_BUNDLED_UNICODE_TRUE@am__append_1 = uni.c
@INCLUDE_MORE_CMGRS_TRUE@am__append_2 = cp949.c cp950.c
@ENABLE_XCMGRS_TRUE@am__append_2 = cp949.c cp950.c
@ENABLE_CXX_TRUE@am__append_3 = libqsecmnxx.la
subdir = lib/cmn
DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
@ -100,7 +100,7 @@ am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \
tre-match-backtrack.c tre-match-parallel.c tre-parse.c \
tre-stack.c uri.c utf8.c xma.c uni.c cp949.c cp950.c
@ENABLE_BUNDLED_UNICODE_TRUE@am__objects_1 = uni.lo
@INCLUDE_MORE_CMGRS_TRUE@am__objects_2 = cp949.lo cp950.lo
@ENABLE_XCMGRS_TRUE@am__objects_2 = cp949.lo cp950.lo
am_libqsecmn_la_OBJECTS = alg-base64.lo alg-rand.lo alg-search.lo \
alg-sort.lo assert.lo chr.lo dir.lo dll.lo env.lo gdl.lo \
htb.lo fio.lo fma.lo fmt.lo fs.lo fs-err.lo fs-move.lo glob.lo \

View File

@ -32,6 +32,8 @@
# include <tchar.h>
#elif defined(__OS2__)
# define INCL_DOSFILEMGR
# define INCL_DOSMODULEMGR
# define INCL_DOSPROCESS
# define INCL_DOSERRORS
# include <os2.h>
#elif defined(__DOS__)
@ -178,6 +180,34 @@ static qse_fio_errnum_t syserr_to_errnum (int e)
}
#endif
#if defined(__OS2__)
typedef APIRET (*DosOpenLType) (
PSZ pszFileName, PHFILE pHf, PULONG pulAction,
LONGLONG cbFile, ULONG ulAttribute,
ULONG fsOpenFlags, ULONG fsOpenMode,
PEAOP2 peaop2
);
typedef APIRET (*DosSetFilePtrLType) (
HFILE hFile,
LONGLONG ib,
ULONG method,
PLONGLONG ibActual
);
typedef APIRET (*DosSetFileSizeLType) (
HFILE hFile,
LONGLONG cbSize
);
static int dos_set = 0;
static DosOpenLType dos_open_l = QSE_NULL;
static DosSetFilePtrLType dos_set_file_ptr_l = QSE_NULL;
static DosSetFileSizeLType dos_set_file_size_l = QSE_NULL;
#endif
qse_fio_t* qse_fio_open (
qse_mmgr_t* mmgr, qse_size_t ext,
const qse_char_t* path, int flags, int mode)
@ -216,6 +246,27 @@ int qse_fio_init (
int fellback = 0;
#endif
#if defined(__OS2__)
if (!dos_set)
{
DosEnterCritSec ();
if (!dos_set)
{
HMODULE mod;
if (DosLoadModule(NULL, 0, "DOSCALL1", &mod) == NO_ERROR)
{
/* look up routines by ordinal */
DosQueryProcAddr (mod, 981, NULL, (PFN*)&dos_open_l);
DosQueryProcAddr (mod, 988, NULL, (PFN*)&dos_set_file_ptr_l);
DosQueryProcAddr (mod, 989, NULL, (PFN*)&dos_set_file_size_l);
}
dos_set = 1;
}
DosExitCritSec ();
}
#endif
QSE_MEMSET (fio, 0, QSE_SIZEOF(*fio));
fio->mmgr = mmgr;
@ -456,11 +507,6 @@ int qse_fio_init (
APIRET ret;
ULONG action_taken = 0;
ULONG open_action, open_mode, open_attr;
#if defined(FIL_STANDARDL)
LONGLONG zero;
#else
ULONG zero;
#endif
#if defined(QSE_CHAR_IS_MCHAR)
const qse_mchar_t* path_mb = path;
@ -498,13 +544,6 @@ int qse_fio_init (
}
#endif
#if defined(FIL_STANDARDL)
zero.ulLo = 0;
zero.ulHi = 0;
#else
zero = 0;
#endif
if (flags & QSE_FIO_APPEND)
fio->status |= STATUS_APPEND;
@ -559,19 +598,39 @@ int qse_fio_init (
open_attr = (mode & QSE_FIO_WUSR)? FILE_NORMAL: FILE_READONLY;
#if defined(FIL_STANDARDL)
ret = DosOpenL (
#else
ret = DosOpen (
if (dos_open_l)
{
LONGLONG zero;
zero.ulLo = 0;
zero.ulHi = 0;
ret = dos_open_l (
path_mb, /* file name */
&handle, /* file handle */
&action_taken, /* store action taken */
zero, /* size */
open_attr, /* attribute */
open_action, /* action if it exists */
open_mode, /* open mode */
0L
);
}
else
{
#endif
ret = DosOpen (
path_mb, /* file name */
&handle, /* file handle */
&action_taken, /* store action taken */
0, /* size */
open_attr, /* attribute */
open_action, /* action if it exists */
open_mode, /* open mode */
0L
);
#if defined(FIL_STANDARDL)
}
#endif
path_mb, /* file name */
&handle, /* file handle */
&action_taken, /* store action taken */
zero, /* size */
open_attr, /* attribute */
open_action, /* action if it exists */
open_mode, /* open mode */
0L
);
#if defined(QSE_CHAR_IS_MCHAR)
/* nothing to do */
@ -1033,36 +1092,41 @@ qse_fio_off_t qse_fio_seek (
};
#if defined(FIL_STANDARDL)
LONGLONG pos, newpos;
APIRET ret;
QSE_ASSERT (QSE_SIZEOF(offset) >= QSE_SIZEOF(pos));
pos.ulLo = (ULONG)(offset&0xFFFFFFFFlu);
pos.ulHi = (ULONG)(offset>>32);
ret = DosSetFilePtrL (fio->handle, pos, seek_map[origin], &newpos);
if (ret != NO_ERROR)
if (dos_set_file_ptr_l)
{
fio->errnum = syserr_to_errnum (ret);
return (qse_fio_off_t)-1;
LONGLONG pos, newpos;
APIRET ret;
QSE_ASSERT (QSE_SIZEOF(offset) >= QSE_SIZEOF(pos));
pos.ulLo = (ULONG)(offset&0xFFFFFFFFlu);
pos.ulHi = (ULONG)(offset>>32);
ret = dos_set_file_ptr_l (fio->handle, pos, seek_map[origin], &newpos);
if (ret != NO_ERROR)
{
fio->errnum = syserr_to_errnum (ret);
return (qse_fio_off_t)-1;
}
return ((qse_fio_off_t)newpos.ulHi << 32) | newpos.ulLo;
}
return ((qse_fio_off_t)newpos.ulHi << 32) | newpos.ulLo;
#else
ULONG newpos;
APIRET ret;
ret = DosSetFilePtr (fio->handle, offset, seek_map[origin], &newpos);
if (ret != NO_ERROR)
else
{
fio->errnum = syserr_to_errnum (ret);
return (qse_fio_off_t)-1;
}
#endif
ULONG newpos;
APIRET ret;
return newpos;
ret = DosSetFilePtr (fio->handle, offset, seek_map[origin], &newpos);
if (ret != NO_ERROR)
{
fio->errnum = syserr_to_errnum (ret);
return (qse_fio_off_t)-1;
}
return newpos;
#if defined(FIL_STANDARDL)
}
#endif
#elif defined(__DOS__)
@ -1123,15 +1187,22 @@ int qse_fio_truncate (qse_fio_t* fio, qse_fio_off_t size)
APIRET ret;
#if defined(FIL_STANDARDL)
LONGLONG sz;
/* the file must have the write access for it to succeed */
if (dos_set_file_size_l)
{
LONGLONG sz;
/* the file must have the write access for it to succeed */
sz.ulLo = (ULONG)(size&0xFFFFFFFFlu);
sz.ulHi = (ULONG)(size>>32);
sz.ulLo = (ULONG)(size&0xFFFFFFFFlu);
sz.ulHi = (ULONG)(size>>32);
ret = DosSetFileSizeL (fio->handle, sz);
#else
ret = DosSetFileSize (fio->handle, size);
ret = DosSetFileSizeL (fio->handle, sz);
}
else
{
#endif
ret = DosSetFileSize (fio->handle, size);
#if defined(FIL_STANDARDL)
}
#endif
if (ret != NO_ERROR)
@ -1274,13 +1345,20 @@ qse_ssize_t qse_fio_write (qse_fio_t* fio, const void* data, qse_size_t size)
{
/* i do this on a best-effort basis */
#if defined(FIL_STANDARDL)
LONGLONG pos, newpos;
pos.ulLo = (ULONG)0;
pos.ulHi = (ULONG)0;
DosSetFilePtrL (fio->handle, pos, FILE_END, &newpos);
#else
ULONG newpos;
DosSetFilePtr (fio->handle, 0, FILE_END, &newpos);
if (dos_set_file_ptr_l)
{
LONGLONG pos, newpos;
pos.ulLo = (ULONG)0;
pos.ulHi = (ULONG)0;
dos_set_file_ptr_l (fio->handle, pos, FILE_END, &newpos);
}
else
{
#endif
ULONG newpos;
DosSetFilePtr (fio->handle, 0, FILE_END, &newpos);
#if defined(FIL_STANDARDL)
}
#endif
}

View File

@ -39,7 +39,7 @@ static qse_cmgr_t builtin_cmgr[] =
qse_slwctoslmb
},
#if defined(QSE_INCLUDE_MORE_CMGRS)
#if defined(QSE_ENABLE_XCMGRS)
{
qse_cp949touc,
qse_uctocp949
@ -91,7 +91,7 @@ qse_cmgr_t* qse_findcmgr (const qse_char_t* name)
} tab[] =
{
{ QSE_T("utf8"), QSE_CMGR_UTF8 },
#if defined(QSE_INCLUDE_MORE_CMGRS)
#if defined(QSE_ENABLE_XCMGRS)
{ QSE_T("cp949"), QSE_CMGR_CP949 },
{ QSE_T("cp950"), QSE_CMGR_CP950 },
#endif

View File

@ -30,12 +30,17 @@
# include <types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <tcpustd.h>
# include <sys/ioctl.h>
# include <nerrno.h>
# if defined(TCPV40HDRS)
# define USE_SELECT
# define BSD_SELECT
# include <sys/select.h>
# else
# include <unistd.h>
# endif
# define INCL_DOSERRORS
# include <os2.h>
# pragma library("tcpip32.lib")
#elif defined(__DOS__)
# include <errno.h>
@ -64,15 +69,7 @@ struct qse_mux_t
qse_mux_errnum_t errnum;
qse_mux_evtfun_t evtfun;
#if defined(__OS2__)
int* fdarr;
int size;
struct
{
qse_mux_evt_t** ptr;
int ubound;
} me;
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
fd_set rset;
fd_set wset;
fd_set tmprset;
@ -98,6 +95,14 @@ struct qse_mux_t
qse_mux_evt_t** ptr;
int ubound;
} me;
#elif defined(__OS2__)
int* fdarr;
int size;
struct
{
qse_mux_evt_t** ptr;
int ubound;
} me;
#endif
};
@ -140,8 +145,10 @@ static qse_mux_errnum_t syserr_to_errnum (int e)
{
switch (e)
{
#if defined(SOCENOMEM)
case SOCENOMEM:
return QSE_MUX_ENOMEM;
#endif
case SOCEINVAL:
return QSE_MUX_EINVAL;
@ -149,11 +156,15 @@ static qse_mux_errnum_t syserr_to_errnum (int e)
case SOCEACCES:
return QSE_MUX_EACCES;
#if defined(SOCENOENT)
case SOCENOENT:
return QSE_MUX_ENOENT;
#endif
#if defined(SOCEEXIST)
case SOCEEXIST:
return QSE_MUX_EEXIST;
#endif
case SOCEINTR:
return QSE_MUX_EINTR;
@ -252,10 +263,7 @@ int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse
* event buffers */
if (capahint <= 0) capahint = 1;
#if defined(__OS2__)
/* nothing special to do */
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
FD_ZERO (&mux->rset);
FD_ZERO (&mux->wset);
mux->maxhnd = -1;
@ -281,6 +289,9 @@ int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse
}
#endif
#elif defined(__OS2__)
/* nothing special to do */
#else
/* TODO: */
mux->errnum = QSE_MUX_ENOIMPL;
@ -292,24 +303,8 @@ int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse
void qse_mux_fini (qse_mux_t* mux)
{
#if defined(__OS2__)
if (mux->me.ptr)
{
int i;
for (i = 0; i < mux->me.ubound; i++)
{
if (mux->me.ptr[i])
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr[i]);
}
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr);
mux->me.ubound = 0;
}
if (mux->fdarr) QSE_MMGR_FREE (mux->mmgr, mux->fdarr);
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
FD_ZERO (&mux->rset);
FD_ZERO (&mux->wset);
@ -351,6 +346,23 @@ void qse_mux_fini (qse_mux_t* mux)
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr);
mux->me.ubound = 0;
}
#elif defined(__OS2__)
if (mux->me.ptr)
{
int i;
for (i = 0; i < mux->me.ubound; i++)
{
if (mux->me.ptr[i])
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr[i]);
}
QSE_MMGR_FREE (mux->mmgr, mux->me.ptr);
mux->me.ubound = 0;
}
if (mux->fdarr) QSE_MMGR_FREE (mux->mmgr, mux->fdarr);
#endif
}
@ -373,54 +385,7 @@ qse_mux_errnum_t qse_mux_geterrnum (qse_mux_t* mux)
int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
{
#if defined(__OS2__)
if (evt->hnd >= mux->me.ubound)
{
qse_mux_evt_t** tmp;
int* fatmp;
int ubound;
ubound = evt->hnd + 1;
ubound = ALIGN_TO (ubound, 128);
tmp = QSE_MMGR_REALLOC (mux->mmgr, mux->me.ptr, QSE_SIZEOF(*mux->me.ptr) * ubound);
if (tmp == QSE_NULL)
{
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
/* maintain this array double the size of the highest handle + 1 */
fatmp = QSE_MMGR_REALLOC (mux->mmgr, mux->fdarr, QSE_SIZEOF(*mux->fdarr) * (ubound * 2));
if (fatmp == QSE_NULL)
{
QSE_MMGR_FREE (mux->mmgr, tmp);
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
QSE_MEMSET (&tmp[mux->me.ubound], 0, QSE_SIZEOF(*mux->me.ptr) * (ubound - mux->me.ubound));
mux->me.ptr = tmp;
mux->me.ubound = ubound;
mux->fdarr = fatmp;
}
if (!mux->me.ptr[evt->hnd])
{
mux->me.ptr[evt->hnd] = QSE_MMGR_ALLOC (mux->mmgr, QSE_SIZEOF(*evt));
if (!mux->me.ptr[evt->hnd])
{
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
}
*mux->me.ptr[evt->hnd] = *evt;
mux->size++;
return 0;
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
/* TODO: windows seems to return a pretty high file descriptors
* using an array to store information may not be so effcient.
@ -540,6 +505,54 @@ int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
mux->ee.len++;
return 0;
#elif defined(__OS2__)
if (evt->hnd >= mux->me.ubound)
{
qse_mux_evt_t** tmp;
int* fatmp;
int ubound;
ubound = evt->hnd + 1;
ubound = ALIGN_TO (ubound, 128);
tmp = QSE_MMGR_REALLOC (mux->mmgr, mux->me.ptr, QSE_SIZEOF(*mux->me.ptr) * ubound);
if (tmp == QSE_NULL)
{
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
/* maintain this array double the size of the highest handle + 1 */
fatmp = QSE_MMGR_REALLOC (mux->mmgr, mux->fdarr, QSE_SIZEOF(*mux->fdarr) * (ubound * 2));
if (fatmp == QSE_NULL)
{
QSE_MMGR_FREE (mux->mmgr, tmp);
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
QSE_MEMSET (&tmp[mux->me.ubound], 0, QSE_SIZEOF(*mux->me.ptr) * (ubound - mux->me.ubound));
mux->me.ptr = tmp;
mux->me.ubound = ubound;
mux->fdarr = fatmp;
}
if (!mux->me.ptr[evt->hnd])
{
mux->me.ptr[evt->hnd] = QSE_MMGR_ALLOC (mux->mmgr, QSE_SIZEOF(*evt));
if (!mux->me.ptr[evt->hnd])
{
mux->errnum = QSE_MUX_ENOMEM;
return -1;
}
}
*mux->me.ptr[evt->hnd] = *evt;
mux->size++;
return 0;
#else
/* TODO: */
mux->errnum = QSE_MUX_ENOIMPL;
@ -549,30 +562,7 @@ int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt)
int qse_mux_delete (qse_mux_t* mux, const qse_mux_evt_t* evt)
{
#if defined(__OS2__)
qse_mux_evt_t* mevt;
if (mux->size <= 0 || evt->hnd < 0 || evt->hnd >= mux->me.ubound)
{
mux->errnum = QSE_MUX_EINVAL;
return -1;
}
mevt = mux->me.ptr[evt->hnd];
if (mevt->hnd != evt->hnd)
{
/* already deleted??? */
mux->errnum = QSE_MUX_EINVAL;
return -1;
}
mevt->hnd = -1;
mevt->mask = 0;
mux->size--;
return 0;
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
qse_mux_evt_t* mevt;
if (mux->size <= 0 || evt->hnd < 0 || evt->hnd >= mux->me.ubound)
@ -632,6 +622,30 @@ done:
mux->ee.len--;
return 0;
#elif defined(__OS2__)
qse_mux_evt_t* mevt;
if (mux->size <= 0 || evt->hnd < 0 || evt->hnd >= mux->me.ubound)
{
mux->errnum = QSE_MUX_EINVAL;
return -1;
}
mevt = mux->me.ptr[evt->hnd];
if (mevt->hnd != evt->hnd)
{
/* already deleted??? */
mux->errnum = QSE_MUX_EINVAL;
return -1;
}
mevt->hnd = -1;
mevt->mask = 0;
mux->size--;
return 0;
#else
/* TODO */
@ -642,63 +656,7 @@ done:
int qse_mux_poll (qse_mux_t* mux, const qse_ntime_t* tmout)
{
#if defined(__OS2__)
qse_mux_evt_t* evt;
long tv;
int n, i, count, rcount, wcount;
tv = QSE_SEC_TO_MSEC(tmout->sec) + QSE_NSEC_TO_MSEC (tmout->nsec);
/*
* be aware that reconstructing this array every time is pretty
* inefficient.
*/
count = 0;
for (i = 0; i < mux->me.ubound; i++)
{
evt = mux->me.ptr[i];
if (evt && (evt->mask & QSE_MUX_IN)) mux->fdarr[count++] = evt->hnd;
}
rcount = count;
for (i = 0; i < mux->me.ubound; i++)
{
evt = mux->me.ptr[i];
if (evt && (evt->mask & QSE_MUX_OUT)) mux->fdarr[count++] = evt->hnd;
}
wcount = count - rcount;
n = os2_select (mux->fdarr, rcount, wcount, 0, tv);
if (n <= -1)
{
mux->errnum = syserr_to_errnum(sock_errno());
return -1;
}
if (n >= 1)
{
qse_mux_evt_t xevt;
for (i = 0; i < count; i++)
{
if (mux->fdarr[i] == -1) continue;
evt = mux->me.ptr[mux->fdarr[i]];
if (!evt || evt->hnd != mux->fdarr[i]) continue;
xevt = *evt;
/* due to the way i check 'fdarr' , it can't have
* both IN and OUT at the same time. they are
* triggered separately */
xevt.mask = (i < rcount)? QSE_MUX_IN: QSE_MUX_OUT;
mux->evtfun (mux, &xevt);
}
}
return n;
#elif defined(USE_SELECT)
#if defined(USE_SELECT)
struct timeval tv;
int n;
@ -782,6 +740,63 @@ int qse_mux_poll (qse_mux_t* mux, const qse_ntime_t* tmout)
return nfds;
#elif defined(__OS2__)
qse_mux_evt_t* evt;
long tv;
int n, i, count, rcount, wcount;
tv = QSE_SEC_TO_MSEC(tmout->sec) + QSE_NSEC_TO_MSEC (tmout->nsec);
/*
* be aware that reconstructing this array every time is pretty
* inefficient.
*/
count = 0;
for (i = 0; i < mux->me.ubound; i++)
{
evt = mux->me.ptr[i];
if (evt && (evt->mask & QSE_MUX_IN)) mux->fdarr[count++] = evt->hnd;
}
rcount = count;
for (i = 0; i < mux->me.ubound; i++)
{
evt = mux->me.ptr[i];
if (evt && (evt->mask & QSE_MUX_OUT)) mux->fdarr[count++] = evt->hnd;
}
wcount = count - rcount;
n = os2_select (mux->fdarr, rcount, wcount, 0, tv);
if (n <= -1)
{
mux->errnum = syserr_to_errnum(sock_errno());
return -1;
}
if (n >= 1)
{
qse_mux_evt_t xevt;
for (i = 0; i < count; i++)
{
if (mux->fdarr[i] == -1) continue;
evt = mux->me.ptr[mux->fdarr[i]];
if (!evt || evt->hnd != mux->fdarr[i]) continue;
xevt = *evt;
/* due to the way i check 'fdarr' , it can't have
* both IN and OUT at the same time. they are
* triggered separately */
xevt.mask = (i < rcount)? QSE_MUX_IN: QSE_MUX_OUT;
mux->evtfun (mux, &xevt);
}
}
return n;
#else
/* TODO */
mux->errnum = QSE_MUX_ENOIMPL;

View File

@ -31,10 +31,13 @@
# include <types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <tcpustd.h>
# include <sys/ioctl.h>
# include <nerrno.h>
# pragma library("tcpip32.lib")
# if defined(TCPV40HDRS)
# include <sys/select.h>
# else
# include <unistd.h>
# endif
#elif defined(__DOS__)
/* TODO: */
#else

View File

@ -26,16 +26,19 @@
# include <winsock2.h>
# include <ws2tcpip.h> /* sockaddr_in6 */
# include <windows.h>
# pragma library("ws2_32.lib") /* watcom */
# pragma comment(lib,"ws2_32.lib") /* msvc and borland */
# define USE_SELECT
#elif defined(__OS2__)
# include <types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <tcpustd.h>
# include <sys/ioctl.h>
# include <nerrno.h>
# pragma library("tcpip32.lib")
# if defined(TCPV40HDRS)
# define USE_SELECT
# include <sys/select.h>
# else
# include <unistd.h>
# endif
#elif defined(__DOS__)
/* TODO: consider watt-32 */
#else
@ -43,6 +46,7 @@
# include <sys/socket.h>
# include <netinet/in.h>
# include <sys/time.h>
# define USE_SELECT
#endif
enum
@ -92,8 +96,10 @@ static qse_nwio_errnum_t syserr_to_errnum (int e)
{
switch (e)
{
#if defined(SOCENOMEM)
case SOCENOMEM:
return QSE_NWIO_ENOMEM;
#endif
case SOCEINVAL:
return QSE_NWIO_EINVAL;
@ -101,11 +107,15 @@ static qse_nwio_errnum_t syserr_to_errnum (int e)
case SOCEACCES:
return QSE_NWIO_EACCES;
#if defined(SOCENOENT)
case SOCENOENT:
return QSE_NWIO_ENOENT;
#endif
#if defined(SOCEXIST)
case SOCEEXIST:
return QSE_NWIO_EEXIST;
#endif
case SOCEINTR:
return QSE_NWIO_EINTR;
@ -205,7 +215,7 @@ static int wait_for_data (qse_nwio_t* nwio, const qse_ntime_t* tmout, int what)
{
int xret;
#if defined(_WIN32)
#if defined(USE_SELECT)
fd_set fds[2];
struct timeval tv;
@ -218,9 +228,19 @@ static int wait_for_data (qse_nwio_t* nwio, const qse_ntime_t* tmout, int what)
tv.tv_usec = QSE_NSEC_TO_USEC (tmout->nsec);
xret = select (nwio->handle + 1, &fds[0], &fds[1], QSE_NULL, &tv);
#if defined(_WIN32)
if (xret == SOCKET_ERROR)
#else
if (xret <= -1)
#endif
{
#if defined(_WIN32)
nwio->errnum = syserr_to_errnum (WSAGetLastError());
#elif defined(__OS2__)
nwio->errnum = syserr_to_errnum (sock_errno());
#else
nwio->errnum = syserr_to_errnum (errno);
#endif
return -1;
}
else if (xret == 0)
@ -228,6 +248,8 @@ static int wait_for_data (qse_nwio_t* nwio, const qse_ntime_t* tmout, int what)
nwio->errnum = QSE_NWIO_ETMOUT;
return -1;
}
return 0;
#elif defined(__OS2__)
int count[2] = { 0, 0 };
long tmout_msecs;
@ -246,37 +268,13 @@ static int wait_for_data (qse_nwio_t* nwio, const qse_ntime_t* tmout, int what)
nwio->errnum = QSE_NWIO_ETMOUT;
return -1;
}
#elif defined(__DOS__)
nwio->errnum = QSE_NWIO_ENOIMPL;
return -1;
return 0;
#else
fd_set fds[2];
struct timeval tv;
tv.tv_sec = tmout->sec;
tv.tv_usec = QSE_NSEC_TO_USEC (tmout->nsec);
FD_ZERO (&fds[0]);
FD_ZERO (&fds[1]);
FD_SET (nwio->handle, &fds[what]);
xret = select (nwio->handle + 1, &fds[0], &fds[1], QSE_NULL, &tv);
if (xret <= -1)
{
nwio->errnum = syserr_to_errnum (errno);
return -1;
}
else if (xret == 0)
{
nwio->errnum = QSE_NWIO_ETMOUT;
return -1;
}
nwio->errnum = QSE_NWIO_ENOIMPL;
return -1;
#endif
return 0;
}
qse_nwio_t* qse_nwio_open (
@ -591,7 +589,7 @@ int qse_nwio_init (
{
int noblk = 1;
if (ioctl (nwio->handle, FIONBIO, &noblk, QSE_SIZEOF(noblk)) <= -1)
if (ioctl (nwio->handle, FIONBIO, (void*)&noblk, QSE_SIZEOF(noblk)) <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
goto oops;
@ -605,7 +603,7 @@ int qse_nwio_init (
int noblk = 0;
if ((xret <= -1 && sock_errno() != SOCEINPROGRESS) ||
ioctl (nwio->handle, FIONBIO, &noblk, QSE_SIZEOF(noblk)) <= -1)
ioctl (nwio->handle, FIONBIO, (void*)&noblk, QSE_SIZEOF(noblk)) <= -1)
{
nwio->errnum = syserr_to_errnum (sock_errno());
goto oops;

View File

@ -954,6 +954,7 @@ create_process:
zero.ulLo = 0;
zero.ulHi = 0;
/* TODO: selective between DosOpenL and DosOpen */
rc = DosOpenL (
QSE_MT("NUL"),
&os2devnul,

View File

@ -377,7 +377,7 @@ qse_mchar_t* qse_fmthttptime (
/* TODO: avoid using snprintf () */
#if defined(_WIN32) && defined(_MSC_VER)
#if defined(_MSC_VER) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
_snprintf (buf, bufsz,
#else
snprintf (buf, bufsz,

View File

@ -36,24 +36,25 @@
# include <winsock2.h>
# include <ws2tcpip.h> /* sockaddr_in6 */
# include <windows.h>
# pragma library("ws2_32.lib") /* watcom */
# pragma comment(lib,"ws2_32.lib") /* msvc and borland */
# define EPOCH_DIFF_YEARS (QSE_EPOCH_YEAR-QSE_EPOCH_YEAR_WIN)
# define EPOCH_DIFF_DAYS ((qse_long_t)EPOCH_DIFF_YEARS*365+EPOCH_DIFF_YEARS/4-3)
# define EPOCH_DIFF_SECS ((qse_long_t)EPOCH_DIFF_DAYS*24*60*60)
#elif defined(__OS2__)
# define INCL_DOSERRORS
# define INCL_DOSFILEMGR
# include <os2.h>
# include <types.h>
# include <sys/socket.h>
# include <netinet/in.h>
# include <tcpustd.h>
# include <sys/ioctl.h>
# include <nerrno.h>
# pragma library("tcpip32.lib")
# if defined(TCPV40HDRS)
# include <sys/select.h>
# else
# include <unistd.h>
# endif
# define INCL_DOSERRORS
# define INCL_DOSFILEMGR
# include <os2.h>
#elif defined(__DOS__)
/* TODO */
@ -1013,7 +1014,7 @@ static int mux_poll (qse_httpd_t* httpd, void* vmux, const qse_ntime_t* tmout)
static int mux_readable (qse_httpd_t* httpd, qse_ubi_t handle, const qse_ntime_t* tmout)
{
#if defined(__OS2__)
#if defined(__OS2__) && !defined(TCPV40HDRS)
long tv;
tv = tmout? QSE_SECNSEC_TO_MSEC (tmout->sec, tmout->nsec): -1;
@ -1039,7 +1040,7 @@ static int mux_readable (qse_httpd_t* httpd, qse_ubi_t handle, const qse_ntime_t
static int mux_writable (qse_httpd_t* httpd, qse_ubi_t handle, const qse_ntime_t* tmout)
{
#if defined(__OS2__)
#if defined(__OS2__) && !defined(TCPV40HDRS)
long tv;
tv = tmout? QSE_SECNSEC_TO_MSEC (tmout->sec, tmout->nsec): -1;
return os2_select (&handle.i, 0, 1, 0, tv);

View File

@ -87,7 +87,7 @@ struct qse_httpd_t
#define CLIENT_TASK_TRIGGER_IN_MUX(i) (1 << ((i) + 8))
#if defined(_WIN32) && defined(_MSC_VER)
#if defined(_MSC_VER) || (defined(__WATCOMC__) && (__WATCOMC__ < 1200))
# define snprintf _snprintf
# define vsnprintf _vsnprintf
#endif