enhanced pio for WIN32
This commit is contained in:
parent
704e1c2ac7
commit
9fabea2cd2
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: pio.h 241 2009-07-22 12:47:13Z hyunghwan.chung $
|
* $Id: pio.h 242 2009-07-23 13:01:52Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -36,15 +36,15 @@ enum qse_pio_open_flag_t
|
|||||||
QSE_PIO_TEXT = (1 << 0),
|
QSE_PIO_TEXT = (1 << 0),
|
||||||
|
|
||||||
/* invoke the command through a system shell
|
/* invoke the command through a system shell
|
||||||
* (/bin/sh on *nix, command.com on windows) */
|
* (/bin/sh on *nix, cmd.exe on windows) */
|
||||||
QSE_PIO_SHELL = (1 << 1),
|
QSE_PIO_SHELL = (1 << 1),
|
||||||
|
|
||||||
QSE_PIO_WRITEIN = (1 << 8),
|
QSE_PIO_WRITEIN = (1 << 8),
|
||||||
QSE_PIO_READOUT = (1 << 9),
|
QSE_PIO_READOUT = (1 << 9),
|
||||||
QSE_PIO_READERR = (1 << 10),
|
QSE_PIO_READERR = (1 << 10),
|
||||||
|
|
||||||
QSE_PIO_ERRTOOUT = (1 << 11),
|
QSE_PIO_ERRTOOUT = (1 << 11), /* require QSE_PIO_READOUT */
|
||||||
QSE_PIO_OUTTOERR = (1 << 12),
|
QSE_PIO_OUTTOERR = (1 << 12), /* require QSE_PIO_READERR */
|
||||||
|
|
||||||
QSE_PIO_INTONUL = (1 << 13),
|
QSE_PIO_INTONUL = (1 << 13),
|
||||||
QSE_PIO_ERRTONUL = (1 << 14),
|
QSE_PIO_ERRTONUL = (1 << 14),
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fio.c 204 2009-06-18 12:08:06Z hyunghwan.chung $
|
* $Id: fio.c 242 2009-07-23 13:01:52Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -392,7 +392,6 @@ qse_ssize_t qse_fio_flush (qse_fio_t* fio)
|
|||||||
static int get_devname_from_handle (
|
static int get_devname_from_handle (
|
||||||
HANDLE handle, qse_char_t* buf, qse_size_t len)
|
HANDLE handle, qse_char_t* buf, qse_size_t len)
|
||||||
{
|
{
|
||||||
BOOL bSuccess = FALSE;
|
|
||||||
HANDLE map = NULL;
|
HANDLE map = NULL;
|
||||||
void* mem = NULL;
|
void* mem = NULL;
|
||||||
DWORD olen;
|
DWORD olen;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: pio.c 241 2009-07-22 12:47:13Z hyunghwan.chung $
|
* $Id: pio.c 242 2009-07-23 13:01:52Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -71,7 +71,6 @@ void qse_pio_close (qse_pio_t* pio)
|
|||||||
qse_pio_t* qse_pio_init (
|
qse_pio_t* qse_pio_init (
|
||||||
qse_pio_t* pio, qse_mmgr_t* mmgr, const qse_char_t* cmd, int flags)
|
qse_pio_t* pio, qse_mmgr_t* mmgr, const qse_char_t* cmd, int flags)
|
||||||
{
|
{
|
||||||
qse_pio_pid_t pid;
|
|
||||||
|
|
||||||
qse_pio_hnd_t handle[6] =
|
qse_pio_hnd_t handle[6] =
|
||||||
{
|
{
|
||||||
@ -97,7 +96,10 @@ qse_pio_t* qse_pio_init (
|
|||||||
PROCESS_INFORMATION procinfo;
|
PROCESS_INFORMATION procinfo;
|
||||||
STARTUPINFO startup;
|
STARTUPINFO startup;
|
||||||
qse_char_t* dup = QSE_NULL;
|
qse_char_t* dup = QSE_NULL;
|
||||||
|
HANDLE windevnul = INVALID_HANDLE_VALUE;
|
||||||
BOOL x;
|
BOOL x;
|
||||||
|
#else
|
||||||
|
qse_pio_pid_t pid;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QSE_MEMSET (pio, 0, QSE_SIZEOF(*pio));
|
QSE_MEMSET (pio, 0, QSE_SIZEOF(*pio));
|
||||||
@ -108,7 +110,7 @@ qse_pio_t* qse_pio_init (
|
|||||||
|
|
||||||
secattr.nLength = QSE_SIZEOF(secattr);
|
secattr.nLength = QSE_SIZEOF(secattr);
|
||||||
secattr.bInheritHandle = TRUE;
|
secattr.bInheritHandle = TRUE;
|
||||||
secattr.lpSecurityDescriptor = NULL;
|
secattr.lpSecurityDescriptor = QSE_NULL;
|
||||||
|
|
||||||
if (flags & QSE_PIO_WRITEIN)
|
if (flags & QSE_PIO_WRITEIN)
|
||||||
{
|
{
|
||||||
@ -154,32 +156,68 @@ qse_pio_t* qse_pio_init (
|
|||||||
maxidx = 5;
|
maxidx = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: handle QSE_PIO_DROPXXX , QSE_PIO_XXXTONUL
|
if ((flags & QSE_PIO_INTONUL) ||
|
||||||
if (flags & QSE_PIO_INTONUL) ...
|
(flags & QSE_PIO_OUTTONUL) ||
|
||||||
if (flags & QSE_PIO_OUTTONUL) ...
|
(flags & QSE_PIO_ERRTONUL))
|
||||||
if (flags & QSE_PIO_ERRTONUL) ...
|
{
|
||||||
if (flags & QSE_PIO_DROPIN) ...
|
windevnul = CreateFile(
|
||||||
if (flags & QSE_PIO_DROPOUT) ...
|
QSE_T("NUL"), GENERIC_READ | GENERIC_WRITE,
|
||||||
if (flags & QSE_PIO_DROPERR) ...
|
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
*/
|
&secattr, OPEN_EXISTING, 0, NULL
|
||||||
|
);
|
||||||
|
if (windevnul == INVALID_HANDLE_VALUE) goto oops;
|
||||||
|
}
|
||||||
|
|
||||||
QSE_MEMSET (&procinfo, 0, QSE_SIZEOF(procinfo));
|
QSE_MEMSET (&procinfo, 0, QSE_SIZEOF(procinfo));
|
||||||
QSE_MEMSET (&startup, 0, QSE_SIZEOF(startup));
|
QSE_MEMSET (&startup, 0, QSE_SIZEOF(startup));
|
||||||
|
|
||||||
startup.cb = QSE_SIZEOF(startup);
|
startup.cb = QSE_SIZEOF(startup);
|
||||||
startup.hStdInput =
|
|
||||||
(flags & QSE_PIO_WRITEIN)? handle[0]: INVALID_HANDLE_VALUE;
|
startup.hStdInput = INVALID_HANDLE_VALUE;
|
||||||
startup.hStdOutput =
|
startup.hStdOutput = INVALID_HANDLE_VALUE;
|
||||||
(flags & QSE_PIO_READOUT)? handle[3]: INVALID_HANDLE_VALUE;
|
startup.hStdOutput = INVALID_HANDLE_VALUE;
|
||||||
startup.hStdError =
|
|
||||||
(flags & QSE_PIO_READERR)? handle[5]: INVALID_HANDLE_VALUE;
|
if (flags & QSE_PIO_WRITEIN) startup.hStdInput = handle[0];
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_READOUT)
|
||||||
|
{
|
||||||
|
startup.hStdOutput = handle[3];
|
||||||
|
if (flags & QSE_PIO_ERRTOOUT) startup.hStdError = handle[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_READERR)
|
||||||
|
{
|
||||||
|
startup.hStdError = handle[5];
|
||||||
|
if (flags & QSE_PIO_OUTTOERR) startup.hStdOutput = handle[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_INTONUL) startup.hStdOutput = windevnul;
|
||||||
|
if (flags & QSE_PIO_OUTTONUL) startup.hStdOutput = windevnul;
|
||||||
|
if (flags & QSE_PIO_ERRTONUL) startup.hStdError = windevnul;
|
||||||
|
|
||||||
|
if (flags & QSE_PIO_DROPIN) startup.hStdInput = INVALID_HANDLE_VALUE;
|
||||||
|
if (flags & QSE_PIO_DROPOUT) startup.hStdOutput = INVALID_HANDLE_VALUE;
|
||||||
|
if (flags & QSE_PIO_DROPERR) startup.hStdError = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
startup.dwFlags |= STARTF_USESTDHANDLES;
|
startup.dwFlags |= STARTF_USESTDHANDLES;
|
||||||
|
|
||||||
/* there is nothing to do for QSE_PIO_SHELL as CreateProcess
|
/* there is nothing to do for QSE_PIO_SHELL as CreateProcess
|
||||||
* takes the entire command line */
|
* takes the entire command line */
|
||||||
|
|
||||||
dup = qse_strdup (cmd, mmgr);
|
if (flags & QSE_PIO_SHELL)
|
||||||
if (dup == QSE_NULL) goto oops;
|
{
|
||||||
|
dup = QSE_MMGR_ALLOC (
|
||||||
|
mmgr, (11+qse_strlen(cmd)+1 )*QSE_SIZEOF(qse_char_t));
|
||||||
|
if (dup == QSE_NULL) goto oops;
|
||||||
|
|
||||||
|
qse_strcpy (dup, QSE_T("cmd.exe /c "));
|
||||||
|
qse_strcpy (&dup[11], cmd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dup = qse_strdup (cmd, mmgr);
|
||||||
|
if (dup == QSE_NULL) goto oops;
|
||||||
|
}
|
||||||
|
|
||||||
x = CreateProcess (
|
x = CreateProcess (
|
||||||
NULL, /* LPCTSTR lpApplicationName */
|
NULL, /* LPCTSTR lpApplicationName */
|
||||||
@ -194,6 +232,9 @@ qse_pio_t* qse_pio_init (
|
|||||||
&procinfo /* LPPROCESS_INFORMATION lpProcessInformation */
|
&procinfo /* LPPROCESS_INFORMATION lpProcessInformation */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
QSE_MMGR_FREE (mmgr, dup); dup = QSE_NULL;
|
||||||
|
CloseHandle (windevnul); windevnul = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
if (x == FALSE) goto oops;
|
if (x == FALSE) goto oops;
|
||||||
|
|
||||||
if (flags & QSE_PIO_WRITEIN)
|
if (flags & QSE_PIO_WRITEIN)
|
||||||
@ -213,7 +254,7 @@ qse_pio_t* qse_pio_init (
|
|||||||
}
|
}
|
||||||
|
|
||||||
CloseHandle (procinfo.hThread);
|
CloseHandle (procinfo.hThread);
|
||||||
pid = procinfo.hProcess;
|
pio->child = procinfo.hProcess;
|
||||||
#else
|
#else
|
||||||
|
|
||||||
if (flags & QSE_PIO_WRITEIN)
|
if (flags & QSE_PIO_WRITEIN)
|
||||||
@ -333,7 +374,7 @@ qse_pio_t* qse_pio_init (
|
|||||||
#else
|
#else
|
||||||
devnull = QSE_OPEN ("/dev/null", O_RDWR, 0);
|
devnull = QSE_OPEN ("/dev/null", O_RDWR, 0);
|
||||||
#endif
|
#endif
|
||||||
if (devnull == -1) goto oops;
|
if (devnull == -1) goto child_oops;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((flags & QSE_PIO_INTONUL) &&
|
if ((flags & QSE_PIO_INTONUL) &&
|
||||||
@ -536,6 +577,7 @@ qse_pio_t* qse_pio_init (
|
|||||||
|
|
||||||
oops:
|
oops:
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
if (windevnul != INVALID_HANDLE_VALUE) CloseHandle (windevnul);
|
||||||
if (dup != QSE_NULL) QSE_MMGR_FREE (mmgr, dup);
|
if (dup != QSE_NULL) QSE_MMGR_FREE (mmgr, dup);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -635,8 +677,10 @@ static qse_ssize_t pio_read (
|
|||||||
if (size > QSE_TYPE_MAX(DWORD)) size = QSE_TYPE_MAX(DWORD);
|
if (size > QSE_TYPE_MAX(DWORD)) size = QSE_TYPE_MAX(DWORD);
|
||||||
if (ReadFile(hnd, buf, size, &count, QSE_NULL) == FALSE)
|
if (ReadFile(hnd, buf, size, &count, QSE_NULL) == FALSE)
|
||||||
{
|
{
|
||||||
pio->errnum = (GetLastError() == ERROR_BROKEN_PIPE)?
|
/* ReadFile receives ERROR_BROKEN_PIPE when the write end
|
||||||
QSE_PIO_EPIPE: QSE_PIO_ESUBSYS;
|
* is closed in the child process */
|
||||||
|
if (GetLastError() == ERROR_BROKEN_PIPE) return 0;
|
||||||
|
pio->errnum = QSE_PIO_ESUBSYS;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return (qse_ssize_t)count;
|
return (qse_ssize_t)count;
|
||||||
|
@ -34,27 +34,32 @@ static int pio1 (const qse_char_t* cmd, int oflags, qse_pio_hid_t rhid)
|
|||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
qse_byte_t buf[128];
|
qse_byte_t buf[128];
|
||||||
|
qse_ssize_t i;
|
||||||
|
|
||||||
/*qse_pio_canread (pio, QSE_PIO_ERR, 1000)*/
|
/*qse_pio_canread (pio, QSE_PIO_ERR, 1000)*/
|
||||||
qse_ssize_t n = qse_pio_read (pio, buf, sizeof(buf), rhid);
|
qse_ssize_t n = qse_pio_read (pio, buf, sizeof(buf), rhid);
|
||||||
if (n == 0) break;
|
if (n == 0) break;
|
||||||
if (n < 0)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
qse_printf (QSE_T("qse_pio_read() returned error - %s\n"), qse_pio_geterrmsg(pio));
|
qse_printf (QSE_T("qse_pio_read() returned error - %s\n"), qse_pio_geterrmsg(pio));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_printf (QSE_T("N===> %d\n"), (int)n);
|
qse_printf (QSE_T("N===> %d buf => ["), (int)n);
|
||||||
|
for (i = 0; i < n; i++)
|
||||||
|
{
|
||||||
#ifdef QSE_CHAR_IS_MCHAR
|
#ifdef QSE_CHAR_IS_MCHAR
|
||||||
qse_printf (QSE_T("buf => [%.*s]\n"), (int)n, buf);
|
qse_printf (QSE_T("%c"), buf[i]);
|
||||||
#else
|
#else
|
||||||
qse_printf (QSE_T("buf => [%.*S]\n"), (int)n, buf);
|
qse_printf (QSE_T("%C"), buf[i]);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
qse_printf (QSE_T("]\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
x = qse_pio_wait (pio);
|
x = qse_pio_wait (pio);
|
||||||
qse_printf (QSE_T("qse_pio_wait returns %d\n"), x);
|
qse_printf (QSE_T("qse_pio_wait returns %d\n"), x);
|
||||||
if (x == -1)
|
if (x <= -1)
|
||||||
{
|
{
|
||||||
qse_printf (QSE_T("error code : %d, error string: %s\n"), (int)qse_pio_geterrnum(pio), qse_pio_geterrmsg(pio));
|
qse_printf (QSE_T("error code : %d, error string: %s\n"), (int)qse_pio_geterrnum(pio), qse_pio_geterrmsg(pio));
|
||||||
}
|
}
|
||||||
@ -84,6 +89,7 @@ static int pio2 (const qse_char_t* cmd, int oflags, qse_pio_hid_t rhid)
|
|||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
qse_char_t buf[128];
|
qse_char_t buf[128];
|
||||||
|
qse_ssize_t i;
|
||||||
|
|
||||||
qse_ssize_t n = qse_pio_read (pio, buf, QSE_COUNTOF(buf), rhid);
|
qse_ssize_t n = qse_pio_read (pio, buf, QSE_COUNTOF(buf), rhid);
|
||||||
if (n == 0) break;
|
if (n == 0) break;
|
||||||
@ -93,13 +99,17 @@ static int pio2 (const qse_char_t* cmd, int oflags, qse_pio_hid_t rhid)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_printf (QSE_T("N===> %d\n"), (int)n);
|
qse_printf (QSE_T("N===> %d buf => ["), (int)n);
|
||||||
qse_printf (QSE_T("buf => [%.*s]\n"), (int)n, buf);
|
for (i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
qse_printf (QSE_T("%c"), buf[i]);
|
||||||
|
}
|
||||||
|
qse_printf (QSE_T("]\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
x = qse_pio_wait (pio);
|
x = qse_pio_wait (pio);
|
||||||
qse_printf (QSE_T("qse_pio_wait returns %d\n"), x);
|
qse_printf (QSE_T("qse_pio_wait returns %d\n"), x);
|
||||||
if (x == -1)
|
if (x <= -1)
|
||||||
{
|
{
|
||||||
qse_printf (QSE_T("error code : %d, error string: %s\n"), (int)qse_pio_geterrnum(pio), qse_pio_geterrmsg(pio));
|
qse_printf (QSE_T("error code : %d, error string: %s\n"), (int)qse_pio_geterrnum(pio), qse_pio_geterrmsg(pio));
|
||||||
}
|
}
|
||||||
@ -115,7 +125,7 @@ static int test1 (void)
|
|||||||
|
|
||||||
return pio1 (
|
return pio1 (
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
QSE_T("lda.exe"),
|
QSE_T("sll.exe"),
|
||||||
#else
|
#else
|
||||||
QSE_T("ls -laF"),
|
QSE_T("ls -laF"),
|
||||||
#endif
|
#endif
|
||||||
@ -128,7 +138,7 @@ static int test2 (void)
|
|||||||
{
|
{
|
||||||
return pio1 (
|
return pio1 (
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
QSE_T("lda.exe"),
|
QSE_T("sll.exe"),
|
||||||
#else
|
#else
|
||||||
QSE_T("ls -laF"),
|
QSE_T("ls -laF"),
|
||||||
#endif
|
#endif
|
||||||
@ -139,67 +149,84 @@ static int test2 (void)
|
|||||||
|
|
||||||
static int test3 (void)
|
static int test3 (void)
|
||||||
{
|
{
|
||||||
return pio1 (QSE_T("/bin/ls -laF"), QSE_PIO_READERR|QSE_PIO_OUTTOERR|QSE_PIO_WRITEIN, QSE_PIO_ERR);
|
return pio1 (
|
||||||
|
#ifdef _WIN32
|
||||||
|
QSE_T(".\\sll.exe"),
|
||||||
|
#else
|
||||||
|
QSE_T("/bin/ls -laF"),
|
||||||
|
#endif
|
||||||
|
QSE_PIO_READERR|QSE_PIO_OUTTOERR|QSE_PIO_WRITEIN,
|
||||||
|
QSE_PIO_ERR
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test4 (void)
|
static int test4 (void)
|
||||||
{
|
{
|
||||||
return pio2 (QSE_T("ls -laF"), QSE_PIO_READOUT|QSE_PIO_WRITEIN|QSE_PIO_SHELL, QSE_PIO_OUT);
|
return pio2 (
|
||||||
|
#ifdef _WIN32
|
||||||
|
QSE_T("sll.exe"),
|
||||||
|
#else
|
||||||
|
QSE_T("ls -laF"),
|
||||||
|
#endif
|
||||||
|
QSE_PIO_READOUT|QSE_PIO_WRITEIN|QSE_PIO_SHELL,
|
||||||
|
QSE_PIO_OUT
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test5 (void)
|
static int test5 (void)
|
||||||
{
|
{
|
||||||
return pio2 (QSE_T("ls -laF"), QSE_PIO_READERR|QSE_PIO_OUTTOERR|QSE_PIO_WRITEIN|QSE_PIO_SHELL, QSE_PIO_ERR);
|
return pio2 (
|
||||||
|
#ifdef _WIN32
|
||||||
|
QSE_T("sll.exe"),
|
||||||
|
#else
|
||||||
|
QSE_T("ls -laF"),
|
||||||
|
#endif
|
||||||
|
QSE_PIO_READERR|QSE_PIO_OUTTOERR|QSE_PIO_WRITEIN|QSE_PIO_SHELL,
|
||||||
|
QSE_PIO_ERR
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test6 (void)
|
static int test6 (void)
|
||||||
{
|
{
|
||||||
return pio2 (QSE_T("/bin/ls -laF"), QSE_PIO_READERR|QSE_PIO_OUTTOERR|QSE_PIO_WRITEIN, QSE_PIO_ERR);
|
return pio2 (
|
||||||
|
#ifdef _WIN32
|
||||||
|
QSE_T(".\\sll.exe"),
|
||||||
|
#else
|
||||||
|
QSE_T("/bin/ls -laF"),
|
||||||
|
#endif
|
||||||
|
QSE_PIO_READERR|QSE_PIO_OUTTOERR|QSE_PIO_WRITEIN,
|
||||||
|
QSE_PIO_ERR
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test7 (void)
|
static int test7 (void)
|
||||||
{
|
{
|
||||||
qse_pio_t* pio;
|
return pio1 (
|
||||||
int x;
|
#ifdef _WIN32
|
||||||
|
QSE_T(".\\sll.exe"),
|
||||||
pio = qse_pio_open (
|
#else
|
||||||
QSE_NULL,
|
QSE_T("/bin/ls -laF"),
|
||||||
0,
|
#endif
|
||||||
QSE_T("/bin/ls -laF"),
|
QSE_PIO_READOUT|QSE_PIO_ERRTOOUT|QSE_PIO_WRITEIN,
|
||||||
QSE_PIO_READOUT|QSE_PIO_ERRTOOUT|QSE_PIO_WRITEIN
|
QSE_PIO_OUT
|
||||||
);
|
);
|
||||||
if (pio == QSE_NULL)
|
|
||||||
{
|
|
||||||
qse_printf (QSE_T("cannot open program through pipe\n"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
qse_byte_t buf[128];
|
|
||||||
|
|
||||||
/*qse_pio_canread (pio, QSE_PIO_ERR, 1000)*/
|
|
||||||
qse_ssize_t n = qse_pio_read (pio, buf, sizeof(buf), QSE_PIO_OUT);
|
|
||||||
if (n == 0) break;
|
|
||||||
if (n < 0)
|
|
||||||
{
|
|
||||||
qse_printf (QSE_T("qse_pio_read() returned error - %s\n"), qse_pio_geterrmsg(pio));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
x = qse_pio_wait (pio);
|
|
||||||
qse_printf (QSE_T("qse_pio_wait returns %d\n"), x);
|
|
||||||
if (x == -1)
|
|
||||||
{
|
|
||||||
qse_printf (QSE_T("error code : %d, error string: %s\n"), (int)QSE_PIO_ERRNUM(pio), qse_pio_geterrmsg(pio));
|
|
||||||
}
|
|
||||||
|
|
||||||
qse_pio_close (pio);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int test8 (void)
|
static int test8 (void)
|
||||||
|
{
|
||||||
|
return pio1 (
|
||||||
|
#ifdef _WIN32
|
||||||
|
QSE_T("sll.exe"),
|
||||||
|
#else
|
||||||
|
QSE_T("ls -laF"),
|
||||||
|
#endif
|
||||||
|
QSE_PIO_READOUT|QSE_PIO_WRITEIN|
|
||||||
|
QSE_PIO_OUTTONUL|QSE_PIO_ERRTONUL|QSE_PIO_INTONUL,
|
||||||
|
QSE_PIO_OUT
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test9 (void)
|
||||||
{
|
{
|
||||||
qse_pio_t* pio;
|
qse_pio_t* pio;
|
||||||
int x;
|
int x;
|
||||||
@ -207,7 +234,11 @@ static int test8 (void)
|
|||||||
pio = qse_pio_open (
|
pio = qse_pio_open (
|
||||||
QSE_NULL,
|
QSE_NULL,
|
||||||
0,
|
0,
|
||||||
|
#ifdef _WIN32
|
||||||
|
QSE_T(".\\sll.exe"),
|
||||||
|
#else
|
||||||
QSE_T("/bin/ls -laF"),
|
QSE_T("/bin/ls -laF"),
|
||||||
|
#endif
|
||||||
QSE_PIO_READOUT|QSE_PIO_READERR|QSE_PIO_WRITEIN
|
QSE_PIO_READOUT|QSE_PIO_READERR|QSE_PIO_WRITEIN
|
||||||
);
|
);
|
||||||
if (pio == QSE_NULL)
|
if (pio == QSE_NULL)
|
||||||
@ -263,6 +294,7 @@ int main ()
|
|||||||
R (test6);
|
R (test6);
|
||||||
R (test7);
|
R (test7);
|
||||||
R (test8);
|
R (test8);
|
||||||
|
R (test9);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ static int test2 (void)
|
|||||||
qse_ssize_t n;
|
qse_ssize_t n;
|
||||||
qse_char_t buf[20];
|
qse_char_t buf[20];
|
||||||
|
|
||||||
qse_sio_puts (qse_sio_out, QSE_T("type somthing...\n"));
|
qse_sio_puts (qse_sio_out, QSE_T("type something...\n"));
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
n = qse_sio_gets (qse_sio_in, buf, QSE_COUNTOF(buf));
|
n = qse_sio_gets (qse_sio_in, buf, QSE_COUNTOF(buf));
|
||||||
|
@ -14,7 +14,11 @@
|
|||||||
|
|
||||||
void print_time (qse_ntime_t nt, const qse_btime_t* bt)
|
void print_time (qse_ntime_t nt, const qse_btime_t* bt)
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
qse_printf (QSE_T("TIME: %I64d\n"), (__int64)nt);
|
||||||
|
#else
|
||||||
qse_printf (QSE_T("TIME: %lld\n"), (long long)nt);
|
qse_printf (QSE_T("TIME: %lld\n"), (long long)nt);
|
||||||
|
#endif
|
||||||
qse_printf (QSE_T("year: %d\n"), bt->year + QSE_BTIME_YEAR_BASE);
|
qse_printf (QSE_T("year: %d\n"), bt->year + QSE_BTIME_YEAR_BASE);
|
||||||
qse_printf (QSE_T("mon: %d\n"), bt->mon + 1);
|
qse_printf (QSE_T("mon: %d\n"), bt->mon + 1);
|
||||||
qse_printf (QSE_T("mday: %d\n"), bt->mday);
|
qse_printf (QSE_T("mday: %d\n"), bt->mday);
|
||||||
@ -48,7 +52,11 @@ static int test1 (void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
qse_printf (QSE_T("back to ntime: %I64d\n"), (__int64)nt);
|
||||||
|
#else
|
||||||
qse_printf (QSE_T("back to ntime: %lld\n"), (long long)nt);
|
qse_printf (QSE_T("back to ntime: %lld\n"), (long long)nt);
|
||||||
|
#endif
|
||||||
qse_gmtime (nt, &bt);
|
qse_gmtime (nt, &bt);
|
||||||
print_time (nt, &bt);
|
print_time (nt, &bt);
|
||||||
qse_printf (QSE_T("-------------------------------\n"));
|
qse_printf (QSE_T("-------------------------------\n"));
|
||||||
@ -63,19 +71,32 @@ static int test1 (void)
|
|||||||
for (nt = (qse_ntime_t)QSE_TYPE_MIN(int);
|
for (nt = (qse_ntime_t)QSE_TYPE_MIN(int);
|
||||||
nt <= (qse_ntime_t)QSE_TYPE_MAX(int); nt += QSE_SECS_PER_DAY)
|
nt <= (qse_ntime_t)QSE_TYPE_MAX(int); nt += QSE_SECS_PER_DAY)
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
__time64_t t = (__time64_t)nt;
|
||||||
|
#else
|
||||||
time_t t = (time_t)nt;
|
time_t t = (time_t)nt;
|
||||||
|
#endif
|
||||||
qse_ntime_t qnt = nt * 1000;
|
qse_ntime_t qnt = nt * 1000;
|
||||||
struct tm* tm;
|
struct tm* tm;
|
||||||
|
|
||||||
if (qnt >= 0) qnt += rand() % 1000;
|
if (qnt >= 0) qnt += rand() % 1000;
|
||||||
else qnt -= rand() % 1000;
|
else qnt -= rand() % 1000;
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
tm = _gmtime64 (&t);
|
||||||
|
#else
|
||||||
tm = gmtime (&t);
|
tm = gmtime (&t);
|
||||||
|
#endif
|
||||||
qse_gmtime (qnt, &bt);
|
qse_gmtime (qnt, &bt);
|
||||||
qse_printf (QSE_T(">>> time %lld: "), (long long)qnt);
|
|
||||||
|
|
||||||
if (tm->tm_year != bt.year ||
|
#ifdef _WIN32
|
||||||
|
qse_printf (QSE_T(">>> time %I64d: "), (__int64)qnt);
|
||||||
|
#else
|
||||||
|
qse_printf (QSE_T(">>> time %lld: "), (long long)qnt);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (tm == QSE_NULL ||
|
||||||
|
tm->tm_year != bt.year ||
|
||||||
tm->tm_mon != bt.mon ||
|
tm->tm_mon != bt.mon ||
|
||||||
tm->tm_mday != bt.mday ||
|
tm->tm_mday != bt.mday ||
|
||||||
tm->tm_wday != bt.wday ||
|
tm->tm_wday != bt.wday ||
|
||||||
@ -83,14 +104,18 @@ static int test1 (void)
|
|||||||
tm->tm_min != bt.min ||
|
tm->tm_min != bt.min ||
|
||||||
tm->tm_sec != bt.sec)
|
tm->tm_sec != bt.sec)
|
||||||
{
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
qse_printf (QSE_T("[GMTIME ERROR %I64d]\n"), (__int64)t);
|
||||||
|
#else
|
||||||
qse_printf (QSE_T("[GMTIME ERROR %lld]\n"), (long long)t);
|
qse_printf (QSE_T("[GMTIME ERROR %lld]\n"), (long long)t);
|
||||||
|
#endif
|
||||||
|
if (tm == QSE_NULL) qse_printf (QSE_T(">> GMTIME RETURNED NULL\n"));
|
||||||
print_time (qnt, &bt);
|
print_time (qnt, &bt);
|
||||||
qse_printf (QSE_T("-------------------------------\n"));
|
qse_printf (QSE_T("-------------------------------\n"));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qse_ntime_t xx;
|
qse_ntime_t xx;
|
||||||
|
|
||||||
qse_printf (QSE_T("[GMTIME OK]"));
|
qse_printf (QSE_T("[GMTIME OK]"));
|
||||||
|
|
||||||
if (qse_timegm (&bt, &xx) == -1)
|
if (qse_timegm (&bt, &xx) == -1)
|
||||||
@ -100,8 +125,17 @@ static int test1 (void)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (xx == qnt)
|
if (xx == qnt)
|
||||||
|
{
|
||||||
qse_printf (QSE_T("[TIMEGM OK %d/%d/%d %d:%d:%d]\n"), bt.year + QSE_BTIME_YEAR_BASE, bt.mon + 1, bt.mday, bt.hour, bt.min, bt.sec);
|
qse_printf (QSE_T("[TIMEGM OK %d/%d/%d %d:%d:%d]\n"), bt.year + QSE_BTIME_YEAR_BASE, bt.mon + 1, bt.mday, bt.hour, bt.min, bt.sec);
|
||||||
else qse_printf (QSE_T("[TIMEGM ERROR %lld, %d/%d/%d %d:%d:%d]\n"), (long long)xx, bt.year + QSE_BTIME_YEAR_BASE, bt.mon + 1, bt.mday, bt.hour, bt.min, bt.sec);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef _WIN32
|
||||||
|
qse_printf (QSE_T("[TIMEGM ERROR %I64d, %d/%d/%d %d:%d:%d]\n"), (__int64)xx, bt.year + QSE_BTIME_YEAR_BASE, bt.mon + 1, bt.mday, bt.hour, bt.min, bt.sec);
|
||||||
|
#else
|
||||||
|
qse_printf (QSE_T("[TIMEGM ERROR %lld, %d/%d/%d %d:%d:%d]\n"), (long long)xx, bt.year + QSE_BTIME_YEAR_BASE, bt.mon + 1, bt.mday, bt.hour, bt.min, bt.sec);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user