interim commit for qse_pio_t

- adding code to support QSE_PIO_TEXT. not compilable yet.
This commit is contained in:
hyung-hwan 2009-01-14 08:16:43 +00:00
parent f6dda99f51
commit b1897b3b4d
3 changed files with 76 additions and 4 deletions

View File

@ -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

View File

@ -230,7 +230,6 @@ int qse_tio_detachout (
qse_tio_t* tio
);
/*
* FUNCTION: qse_tio_flush
* Flushes the output buffer

View File

@ -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;
}