added win32 nwio
This commit is contained in:
@ -22,6 +22,7 @@
|
||||
#include <qse/awk/std.h>
|
||||
#include <qse/cmn/sio.h>
|
||||
#include <qse/cmn/pio.h>
|
||||
#include <qse/cmn/nwio.h>
|
||||
#include <qse/cmn/str.h>
|
||||
#include <qse/cmn/mbwc.h>
|
||||
#include <qse/cmn/time.h>
|
||||
@ -734,6 +735,10 @@ static qse_ssize_t sf_out (
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
/* other code must not trigger this function */
|
||||
break;
|
||||
}
|
||||
|
||||
qse_awk_seterrnum (awk, QSE_AWK_EINTERN, QSE_NULL);
|
||||
@ -793,7 +798,30 @@ int qse_awk_parsestd (
|
||||
|
||||
/*** RTX_OPENSTD ***/
|
||||
|
||||
static qse_ssize_t awk_rio_pipe (
|
||||
static qse_ssize_t nwio_handler_open (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod, int flags, qse_nwad_t* nwad)
|
||||
{
|
||||
qse_nwio_t* handle;
|
||||
|
||||
handle = qse_nwio_open (
|
||||
qse_awk_rtx_getmmgr(rtx), 0, nwad,
|
||||
flags | QSE_NWIO_TEXT | QSE_NWIO_IGNOREMBWCERR |
|
||||
QSE_NWIO_READNORETRY | QSE_NWIO_WRITENORETRY
|
||||
);
|
||||
if (handle == QSE_NULL) return -1;
|
||||
|
||||
#if defined(QSE_CHAR_IS_WCHAR)
|
||||
{
|
||||
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgrstd (rtx, riod->name);
|
||||
if (cmgr) qse_nwio_setcmgr (handle, cmgr);
|
||||
}
|
||||
#endif
|
||||
|
||||
riod->handle2 = (void*)handle;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static qse_ssize_t nwio_handler_rest (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_rio_arg_t* riod,
|
||||
qse_char_t* data, qse_size_t size)
|
||||
{
|
||||
@ -801,55 +829,135 @@ static qse_ssize_t awk_rio_pipe (
|
||||
{
|
||||
case QSE_AWK_RIO_OPEN:
|
||||
{
|
||||
qse_pio_t* handle;
|
||||
int flags;
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (riod->mode == QSE_AWK_RIO_PIPE_READ)
|
||||
{
|
||||
/* TODO: should ERRTOOUT be unset? */
|
||||
flags = QSE_PIO_READOUT |
|
||||
QSE_PIO_ERRTOOUT;
|
||||
}
|
||||
else if (riod->mode == QSE_AWK_RIO_PIPE_WRITE)
|
||||
{
|
||||
flags = QSE_PIO_WRITEIN;
|
||||
}
|
||||
else if (riod->mode == QSE_AWK_RIO_PIPE_RW)
|
||||
{
|
||||
flags = QSE_PIO_READOUT |
|
||||
QSE_PIO_ERRTOOUT |
|
||||
QSE_PIO_WRITEIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* this must not happen */
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
case QSE_AWK_RIO_CLOSE:
|
||||
{
|
||||
qse_nwio_close ((qse_nwio_t*)riod->handle2);
|
||||
riod->handle2 = QSE_NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
handle = qse_pio_open (
|
||||
rtx->awk->mmgr,
|
||||
0,
|
||||
riod->name,
|
||||
QSE_NULL,
|
||||
flags|QSE_PIO_SHELL|QSE_PIO_TEXT|QSE_PIO_IGNOREMBWCERR
|
||||
);
|
||||
if (handle == QSE_NULL) return -1;
|
||||
case QSE_AWK_RIO_READ:
|
||||
{
|
||||
return qse_nwio_read ((qse_nwio_t*)riod->handle2, data, size);
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_WRITE:
|
||||
{
|
||||
return qse_nwio_write ((qse_nwio_t*)riod->handle2, data, size);
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_FLUSH:
|
||||
{
|
||||
/*if (riod->mode == QSE_AWK_RIO_PIPE_READ) return -1;*/
|
||||
return qse_nwio_flush ((qse_nwio_t*)riod->handle2);
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_NEXT:
|
||||
break;
|
||||
}
|
||||
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int parse_rwpipe_uri (const qse_char_t* uri, int* flags, qse_nwad_t* nwad)
|
||||
{
|
||||
static struct
|
||||
{
|
||||
qse_char_t* prefix;
|
||||
qse_size_t len;
|
||||
int flags;
|
||||
} x[] =
|
||||
{
|
||||
{ QSE_T("tcp://"), 6, QSE_NWIO_TCP },
|
||||
{ QSE_T("udp://"), 6, QSE_NWIO_UDP },
|
||||
{ QSE_T("tcpd://"), 7, QSE_NWIO_TCP | QSE_NWIO_PASSIVE },
|
||||
{ QSE_T("udpd://"), 7, QSE_NWIO_UDP | QSE_NWIO_PASSIVE }
|
||||
};
|
||||
int i;
|
||||
|
||||
|
||||
for (i = 0; i < QSE_COUNTOF(x); i++)
|
||||
{
|
||||
if (qse_strzcmp (uri, x[i].prefix, x[i].len) == 0)
|
||||
{
|
||||
if (qse_strtonwad (uri + x[i].len, nwad) <= -1) return -1;
|
||||
*flags = x[i].flags;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static qse_ssize_t pio_handler_open (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod)
|
||||
{
|
||||
qse_pio_t* handle;
|
||||
int flags;
|
||||
|
||||
if (riod->mode == QSE_AWK_RIO_PIPE_READ)
|
||||
{
|
||||
/* TODO: should ERRTOOUT be unset? */
|
||||
flags = QSE_PIO_READOUT |
|
||||
QSE_PIO_ERRTOOUT;
|
||||
}
|
||||
else if (riod->mode == QSE_AWK_RIO_PIPE_WRITE)
|
||||
{
|
||||
flags = QSE_PIO_WRITEIN;
|
||||
}
|
||||
else if (riod->mode == QSE_AWK_RIO_PIPE_RW)
|
||||
{
|
||||
flags = QSE_PIO_READOUT |
|
||||
QSE_PIO_ERRTOOUT |
|
||||
QSE_PIO_WRITEIN;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* this must not happen */
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
handle = qse_pio_open (
|
||||
rtx->awk->mmgr,
|
||||
0,
|
||||
riod->name,
|
||||
QSE_NULL,
|
||||
flags|QSE_PIO_SHELL|QSE_PIO_TEXT|QSE_PIO_IGNOREMBWCERR
|
||||
);
|
||||
if (handle == QSE_NULL) return -1;
|
||||
|
||||
#if defined(QSE_CHAR_IS_WCHAR)
|
||||
{
|
||||
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgrstd (rtx, riod->name);
|
||||
if (cmgr)
|
||||
{
|
||||
qse_pio_setcmgr (handle, QSE_PIO_IN, cmgr);
|
||||
qse_pio_setcmgr (handle, QSE_PIO_OUT, cmgr);
|
||||
qse_pio_setcmgr (handle, QSE_PIO_ERR, cmgr);
|
||||
}
|
||||
}
|
||||
{
|
||||
qse_cmgr_t* cmgr = qse_awk_rtx_getcmgrstd (rtx, riod->name);
|
||||
if (cmgr)
|
||||
{
|
||||
qse_pio_setcmgr (handle, QSE_PIO_IN, cmgr);
|
||||
qse_pio_setcmgr (handle, QSE_PIO_OUT, cmgr);
|
||||
qse_pio_setcmgr (handle, QSE_PIO_ERR, cmgr);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
riod->handle = (void*)handle;
|
||||
return 1;
|
||||
riod->handle = (void*)handle;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static qse_ssize_t pio_handler_rest (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_rio_arg_t* riod,
|
||||
qse_char_t* data, qse_size_t size)
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case QSE_AWK_RIO_OPEN:
|
||||
{
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_CLOSE:
|
||||
@ -900,14 +1008,34 @@ static qse_ssize_t awk_rio_pipe (
|
||||
}
|
||||
|
||||
case QSE_AWK_RIO_NEXT:
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static qse_ssize_t awk_rio_pipe (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_rio_arg_t* riod,
|
||||
qse_char_t* data, qse_size_t size)
|
||||
{
|
||||
if (cmd == QSE_AWK_RIO_OPEN)
|
||||
{
|
||||
int flags;
|
||||
qse_nwad_t nwad;
|
||||
|
||||
if (riod->mode != QSE_AWK_RIO_PIPE_RW ||
|
||||
parse_rwpipe_uri (riod->name, &flags, &nwad) <= -1)
|
||||
return pio_handler_open (rtx, riod);
|
||||
else
|
||||
return nwio_handler_open (rtx, riod, flags, &nwad);
|
||||
}
|
||||
else if (riod->handle2)
|
||||
return nwio_handler_rest (rtx, cmd, riod, data, size);
|
||||
else
|
||||
return pio_handler_rest (rtx, cmd, riod, data, size);
|
||||
}
|
||||
|
||||
static qse_ssize_t awk_rio_file (
|
||||
qse_awk_rtx_t* rtx, qse_awk_rio_cmd_t cmd, qse_awk_rio_arg_t* riod,
|
||||
qse_char_t* data, qse_size_t size)
|
||||
|
Reference in New Issue
Block a user