interim commit for qse_pio_t
- adding code to support QSE_PIO_TEXT. not compilable yet.
This commit is contained in:
parent
f6dda99f51
commit
b1897b3b4d
@ -21,6 +21,7 @@
|
||||
|
||||
#include <qse/types.h>
|
||||
#include <qse/macros.h>
|
||||
#include <qse/cmn/tio.h>
|
||||
|
||||
enum qse_pio_open_flag_t
|
||||
{
|
||||
@ -90,9 +91,11 @@ typedef struct qse_pio_t qse_pio_t;
|
||||
struct qse_pio_t
|
||||
{
|
||||
qse_mmgr_t* mmgr;
|
||||
qse_pio_pid_t child;
|
||||
qse_pio_hnd_t handle[3];
|
||||
qse_pio_err_t errnum;
|
||||
qse_pio_pid_t child;
|
||||
|
||||
qse_pio_hnd_t handle[3];
|
||||
qse_tio_t* tio[3];
|
||||
};
|
||||
|
||||
#define QSE_PIO_MMGR(pio) ((pio)->mmgr)
|
||||
@ -256,6 +259,11 @@ qse_ssize_t qse_pio_write (
|
||||
);
|
||||
/******/
|
||||
|
||||
void qse_pio_flush (
|
||||
qse_pio_t* pio,
|
||||
qse_pio_hid_t hid
|
||||
);
|
||||
|
||||
/****f* qse.cmn.pio/qse_pio_end
|
||||
* NAME
|
||||
* qse_pio_end
|
||||
|
@ -230,7 +230,6 @@ int qse_tio_detachout (
|
||||
qse_tio_t* tio
|
||||
);
|
||||
|
||||
|
||||
/*
|
||||
* FUNCTION: qse_tio_flush
|
||||
* Flushes the output buffer
|
||||
|
@ -32,6 +32,14 @@
|
||||
|
||||
#define CHILD_EXIT_CODE 128
|
||||
|
||||
static qse_ssize_t pio_read (
|
||||
qse_pio_t* pio, void* buf, qse_size_t size, qse_pio_hid_t hid);
|
||||
static qse_ssize_t pio_write (
|
||||
qse_pio_t* pio, const void* data, qse_size_t size, qse_pio_hid_t hid)a;
|
||||
|
||||
static qse_ssize_t pio_input (int cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t pio_output (int cmd, void* arg, void* buf, qse_size_t size);
|
||||
|
||||
qse_pio_t* qse_pio_open (
|
||||
qse_mmgr_t* mmgr, qse_size_t ext,
|
||||
const qse_char_t* path, int flags)
|
||||
@ -343,10 +351,33 @@ http://msdn.microsoft.com/en-us/library/ms682499(VS.85).aspx
|
||||
}
|
||||
|
||||
#endif
|
||||
if (flags & QSE_PIO_TEXT)
|
||||
{
|
||||
qse_tio_t* tio[3];
|
||||
|
||||
tio[0] = qse_tio_open (pio->mmgr, 0);
|
||||
tio[1] = qse_tio_open (pio->mmgr, 0);
|
||||
tio[2] = qse_tio_open (pio->mmgr, 0);
|
||||
|
||||
qse_tio_attachout (tio[0], pio_output, &handle[1]);
|
||||
qse_tio_attachin (tio[1], pio_input, &handle[2]);
|
||||
qse_tio_attachin (tio[2], pio_input, &handle[4]);
|
||||
}
|
||||
|
||||
/* store back references */
|
||||
pio->p[QSE_PIO_IN].self = pio;
|
||||
pio->p[QSE_PIO_OUT].self = pio;
|
||||
pio->p[QSE_PIO_ERR].self = pio;
|
||||
|
||||
/* store actual pipe handles */
|
||||
pio->p[QSE_PIO_IN].handle = handle[1];
|
||||
pio->p[QSE_PIO_OUT].handle = handle[2];
|
||||
pio->p[QSE_PIO_ERR].handle = handle[4];
|
||||
/*
|
||||
pio->handle[QSE_PIO_IN] = handle[1];
|
||||
pio->handle[QSE_PIO_OUT] = handle[2];
|
||||
pio->handle[QSE_PIO_ERR] = handle[4];
|
||||
*/
|
||||
|
||||
return pio;
|
||||
|
||||
@ -375,6 +406,24 @@ qse_pio_pid_t qse_pio_getchild (qse_pio_t* pio)
|
||||
|
||||
qse_ssize_t qse_pio_read (
|
||||
qse_pio_t* pio, void* buf, qse_size_t size, qse_pio_hid_t hid)
|
||||
{
|
||||
if (pio->p[hid].tio == QSE_NULL)
|
||||
return pio_read (pio, buf, size, hid);
|
||||
else
|
||||
return qse_tio_read (pio->p[hid].tio, buf, size);
|
||||
}
|
||||
|
||||
qse_ssize_t qse_pio_write (
|
||||
qse_pio_t* pio, const void* data, qse_size_t size, qse_pio_hid_t hid)
|
||||
{
|
||||
if (pio->p[hid].tio == QSE_NULL)
|
||||
return pio_write (pio, buf, size, hid);
|
||||
else
|
||||
return qse_tio_write (pio->p[hid].tio, buf, size);
|
||||
}
|
||||
|
||||
static qse_ssize_t pio_read (
|
||||
qse_pio_t* pio, void* buf, qse_size_t size, qse_pio_hid_t hid)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
DWORD count;
|
||||
@ -406,7 +455,7 @@ qse_ssize_t qse_pio_read (
|
||||
#endif
|
||||
}
|
||||
|
||||
qse_ssize_t qse_pio_write (
|
||||
static qse_ssize_t pio_write (
|
||||
qse_pio_t* pio, const void* data, qse_size_t size, qse_pio_hid_t hid)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
@ -577,3 +626,19 @@ int qse_pio_kill (qse_pio_t* pio)
|
||||
return n;
|
||||
#endif
|
||||
}
|
||||
|
||||
static qse_ssize_t pio_input (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
{
|
||||
qse_pio_t* pio = (qse_pio_t*)arg;
|
||||
QSE_ASSERT (pio != QSE_NULL);
|
||||
if (cmd == QSE_TIO_IO_DATA) return pio_read (pio, buf, size, hid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static qse_ssize_t pio_output (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
{
|
||||
qse_pio_t* pio = (qse_pio_t*)arg;
|
||||
QSE_ASSERT (pio != QSE_NULL);
|
||||
if (cmd == QSE_TIO_IO_DATA) return pio_write (pio, buf, size, hid);
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user