added win32 nwio
This commit is contained in:
@ -29,7 +29,6 @@
|
||||
#include <qse/cmn/main.h>
|
||||
#include <qse/cmn/mbwc.h>
|
||||
#include <qse/cmn/xma.h>
|
||||
#include <qse/cmn/nwio.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
@ -56,10 +55,6 @@
|
||||
# include <errno.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#include <sys/socket.h>
|
||||
|
||||
static qse_awk_rtx_t* app_rtx = QSE_NULL;
|
||||
static int app_debug = 0;
|
||||
|
||||
@ -98,11 +93,6 @@ struct gvmv_t
|
||||
qse_size_t len;
|
||||
};
|
||||
|
||||
struct rtx_xtn_t
|
||||
{
|
||||
qse_awk_rio_fun_t old_pipe_handler;
|
||||
};
|
||||
|
||||
static void dprint (const qse_char_t* fmt, ...)
|
||||
{
|
||||
if (app_debug)
|
||||
@ -894,143 +884,6 @@ static qse_mmgr_t debug_mmgr =
|
||||
};
|
||||
#endif
|
||||
|
||||
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)
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case QSE_AWK_RIO_OPEN:
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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:
|
||||
{
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
qse_awk_rtx_seterrnum (rtx, QSE_AWK_EINTERN, QSE_NULL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int parse_pipe_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 new_pipe_handler (
|
||||
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)
|
||||
{
|
||||
struct rtx_xtn_t* xtn;
|
||||
int flags;
|
||||
qse_nwad_t nwad;
|
||||
|
||||
xtn = qse_awk_rtx_getxtnstd (rtx);
|
||||
|
||||
if (cmd == QSE_AWK_RIO_OPEN && parse_pipe_uri (riod->name, &flags, &nwad) >= 0)
|
||||
return nwio_handler_open (rtx, riod, flags, &nwad);
|
||||
else if (riod->handle2)
|
||||
return nwio_handler_rest (rtx, cmd, riod, data, size);
|
||||
else
|
||||
return xtn->old_pipe_handler (rtx, cmd, riod, data, size);
|
||||
}
|
||||
|
||||
static void extend_pipe_handler (qse_awk_rtx_t* rtx)
|
||||
{
|
||||
struct rtx_xtn_t* xtn;
|
||||
qse_awk_rio_t rio;
|
||||
|
||||
xtn = qse_awk_rtx_getxtnstd (rtx);
|
||||
|
||||
/* get the previous handler functions */
|
||||
qse_awk_rtx_getrio (rtx, &rio);
|
||||
|
||||
/* remember the old pipe handler function */
|
||||
xtn->old_pipe_handler = rio.pipe;
|
||||
|
||||
/* change the pipe handler to a new one */
|
||||
rio.pipe = new_pipe_handler;
|
||||
|
||||
/* changes the handlers with a new set */
|
||||
qse_awk_rtx_setrio (rtx, &rio);
|
||||
}
|
||||
|
||||
static int awk_main (int argc, qse_char_t* argv[])
|
||||
{
|
||||
qse_awk_t* awk = QSE_NULL;
|
||||
@ -1146,7 +999,7 @@ static int awk_main (int argc, qse_char_t* argv[])
|
||||
#endif
|
||||
|
||||
rtx = qse_awk_rtx_openstd (
|
||||
awk, QSE_SIZEOF(struct rtx_xtn_t), QSE_T("qseawk"),
|
||||
awk, 0, QSE_T("qseawk"),
|
||||
(const qse_char_t*const*)arg.icf, QSE_NULL, arg.console_cmgr);
|
||||
if (rtx == QSE_NULL)
|
||||
{
|
||||
@ -1160,8 +1013,6 @@ static int awk_main (int argc, qse_char_t* argv[])
|
||||
goto oops;
|
||||
}
|
||||
|
||||
extend_pipe_handler (rtx);
|
||||
|
||||
app_rtx = rtx;
|
||||
#ifdef ENABLE_CALLBACK
|
||||
qse_awk_rtx_pushrcb (rtx, &rcb);
|
||||
@ -1213,9 +1064,14 @@ oops:
|
||||
|
||||
int qse_main (int argc, qse_achar_t* argv[])
|
||||
{
|
||||
int ret;
|
||||
|
||||
#if defined(_WIN32)
|
||||
char locale[100];
|
||||
UINT codepage = GetConsoleOutputCP();
|
||||
UINT codepage;
|
||||
WSADATA wsadata;
|
||||
|
||||
codepage = GetConsoleOutputCP();
|
||||
if (codepage == CP_UTF8)
|
||||
{
|
||||
/*SetConsoleOUtputCP (CP_UTF8);*/
|
||||
@ -1227,10 +1083,24 @@ int qse_main (int argc, qse_achar_t* argv[])
|
||||
setlocale (LC_ALL, locale);
|
||||
qse_setdflcmgr (qse_slmbcmgr);
|
||||
}
|
||||
|
||||
if (WSAStartup (MAKEWORD(2,0), &wsadata) != 0)
|
||||
{
|
||||
print_error (QSE_T("Failed to start up winsock\n"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
#else
|
||||
setlocale (LC_ALL, "");
|
||||
qse_setdflcmgr (qse_slmbcmgr);
|
||||
#endif
|
||||
return qse_runmain (argc, argv, awk_main);
|
||||
|
||||
ret = qse_runmain (argc, argv, awk_main);
|
||||
|
||||
#if defined(_WIN32)
|
||||
WSACleanup ();
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user