redefined runtime io handlers

This commit is contained in:
2009-02-16 08:31:34 +00:00
parent 3ab84046b7
commit 66b21c8eab
16 changed files with 638 additions and 620 deletions

View File

@ -34,6 +34,11 @@ struct xtn_t
Awk* awk;
};
struct rxtn_t
{
Awk::Run* run;
};
Awk::Source::Source (Mode mode): mode (mode), handle (QSE_NULL)
{
}
@ -54,83 +59,81 @@ void Awk::Source::setHandle (void* handle)
}
//////////////////////////////////////////////////////////////////
// Awk::EIO
// Awk::RIO
//////////////////////////////////////////////////////////////////
Awk::EIO::EIO (eio_t* eio): eio (eio)
Awk::RIO::RIO (rtx_t* rtx, riod_t* riod): rtx (rtx), riod (riod)
{
}
const Awk::char_t* Awk::EIO::getName () const
const Awk::char_t* Awk::RIO::getName () const
{
return eio->name;
return this->riod->name;
}
const void* Awk::EIO::getHandle () const
const void* Awk::RIO::getHandle () const
{
return eio->handle;
return this->riod->handle;
}
void Awk::EIO::setHandle (void* handle)
void Awk::RIO::setHandle (void* handle)
{
eio->handle = handle;
this->riod->handle = handle;
}
Awk::EIO::operator Awk::Awk* () const
Awk::RIO::operator Awk::Awk* () const
{
// it assumes that the Awk object is set to the data field.
// make sure that it happens in Awk::run () - rio.data = this;
return (Awk::Awk*)eio->data;
rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (this->rtx);
return rxtn->run->awk;
}
Awk::EIO::operator Awk::awk_t* () const
Awk::RIO::operator Awk::awk_t* () const
{
// it assumes that the Awk object is set to the data field.
// make sure that it happens in Awk::run () - rio.data = this;
return (Awk::awk_t*)(Awk::Awk*)eio->data;
return qse_awk_rtx_getawk (this->rtx);
}
Awk::EIO::operator Awk::eio_t* () const
Awk::RIO::operator Awk::riod_t* () const
{
return eio;
return this->riod;
}
Awk::EIO::operator Awk::run_t* () const
Awk::RIO::operator Awk::rtx_t* () const
{
return eio->rtx;
return this->rtx;
}
//////////////////////////////////////////////////////////////////
// Awk::Pipe
//////////////////////////////////////////////////////////////////
Awk::Pipe::Pipe (eio_t* eio): EIO(eio)
Awk::Pipe::Pipe (rtx_t* rtx, riod_t* riod): RIO (rtx, riod)
{
}
Awk::Pipe::Mode Awk::Pipe::getMode () const
{
return (Mode)eio->mode;
return (Mode)riod->mode;
}
//////////////////////////////////////////////////////////////////
// Awk::File
//////////////////////////////////////////////////////////////////
Awk::File::File (eio_t* eio): EIO(eio)
Awk::File::File (rtx_t* rtx, riod_t* riod): RIO (rtx, riod)
{
}
Awk::File::Mode Awk::File::getMode () const
{
return (Mode)eio->mode;
return (Mode)riod->mode;
}
//////////////////////////////////////////////////////////////////
// Awk::Console
//////////////////////////////////////////////////////////////////
Awk::Console::Console (eio_t* eio): EIO(eio), filename(QSE_NULL)
Awk::Console::Console (rtx_t* rtx, riod_t* riod):
RIO (rtx, riod), filename(QSE_NULL)
{
}
@ -144,15 +147,15 @@ Awk::Console::~Console ()
int Awk::Console::setFileName (const char_t* name)
{
if (eio->mode == READ)
if (riod->mode == READ)
{
return qse_awk_rtx_setfilename (
eio->rtx, name, qse_strlen(name));
this->rtx, name, qse_strlen(name));
}
else
{
return qse_awk_rtx_setofilename (
eio->rtx, name, qse_strlen(name));
this->rtx, name, qse_strlen(name));
}
}
@ -161,19 +164,19 @@ int Awk::Console::setFNR (long_t fnr)
qse_awk_val_t* tmp;
int n;
tmp = qse_awk_rtx_makeintval (eio->rtx, fnr);
tmp = qse_awk_rtx_makeintval (this->rtx, fnr);
if (tmp == QSE_NULL) return -1;
qse_awk_rtx_refupval (eio->rtx, tmp);
n = qse_awk_rtx_setgbl (eio->rtx, QSE_AWK_GBL_FNR, tmp);
qse_awk_rtx_refdownval (eio->rtx, tmp);
qse_awk_rtx_refupval (this->rtx, tmp);
n = qse_awk_rtx_setgbl (this->rtx, QSE_AWK_GBL_FNR, tmp);
qse_awk_rtx_refdownval (this->rtx, tmp);
return n;
}
Awk::Console::Mode Awk::Console::getMode () const
{
return (Mode)eio->mode;
return (Mode)riod->mode;
}
//////////////////////////////////////////////////////////////////
@ -911,7 +914,7 @@ Awk::Run::Run (Awk* awk):
{
}
Awk::Run::Run (Awk* awk, run_t* run):
Awk::Run::Run (Awk* awk, rtx_t* run):
awk (awk), run (run), callbackFailed (false), data (QSE_NULL)
{
QSE_ASSERT (this->run != QSE_NULL);
@ -926,7 +929,7 @@ Awk::Run::operator Awk* () const
return this->awk;
}
Awk::Run::operator Awk::run_t* () const
Awk::Run::operator Awk::rtx_t* () const
{
return this->run;
}
@ -1193,7 +1196,7 @@ int Awk::open ()
{
QSE_ASSERT (awk == QSE_NULL && functionMap == QSE_NULL);
awk = qse_awk_open (&mmgr, QSE_SIZEOF(xtn_t));
awk = qse_awk_open (&mmgr, QSE_SIZEOF(xtn_t), &ccls);
if (awk == QSE_NULL)
{
setError (ERR_NOMEM);
@ -1204,7 +1207,6 @@ int Awk::open ()
xtn_t* xtn = (xtn_t*)qse_awk_getxtn (awk);
xtn->awk = this;
qse_awk_setccls (awk, &ccls);
qse_awk_setprm (awk, &prm);
//functionMap = qse_map_open (
@ -1228,7 +1230,7 @@ int Awk::open ()
int opt =
OPT_IMPLICIT |
OPT_EIO |
OPT_RIO |
OPT_NEWLINE |
OPT_BASEONE |
OPT_PABLOCK;
@ -1338,7 +1340,6 @@ int Awk::parse ()
sio.in = sourceReader;
sio.out = sourceWriter;
sio.data = this;
int n = qse_awk_parse (awk, &sio);
if (n == -1) retrieveError ();
@ -1361,18 +1362,17 @@ int Awk::run (const char_t** args, size_t nargs)
rio.pipe = pipeHandler;
rio.file = fileHandler;
rio.console = consoleHandler;
rio.data = this;
if (runCallback)
{
QSE_MEMSET (&rcb, 0, QSE_SIZEOF(rcb));
// TODO: deprecate onRunStart and onRunEnd
//rcb.on_start = onRunStart;
//rcb.on_end = onRunEnd;
//rcb.on_end = onRunEnd;
rcb.on_enter = onRunEnter;
rcb.on_statement = onRunStatement;
rcb.on_exit = onRunExit;
rcb.data = &runctx;
rcb.data = &runctx;
}
if (nargs > 0)
@ -1405,9 +1405,7 @@ int Awk::run (const char_t** args, size_t nargs)
int n = 0;
rtx_t* rtx = qse_awk_rtx_open (
awk, QSE_SIZEOF(Run*), &rio,
(qse_cstr_t*)runarg
);
awk, QSE_SIZEOF(rxtn_t), &rio, (qse_cstr_t*)runarg);
if (rtx == QSE_NULL)
{
retrieveError();
@ -1416,7 +1414,9 @@ int Awk::run (const char_t** args, size_t nargs)
else
{
runctx.run = rtx;
*((Run**)qse_awk_rtx_getxtn(rtx)) = &runctx;
rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx);
rxtn->run = &runctx;
if (runCallback) qse_awk_rtx_setrcb (rtx, &rcb);
n = qse_awk_rtx_loop (rtx);
@ -1604,50 +1604,50 @@ void Awk::onRunStatement (Run& run, size_t line)
}
Awk::ssize_t Awk::sourceReader (
int cmd, void* arg, char_t* data, size_t count)
awk_t* awk, int cmd, char_t* data, size_t count)
{
Awk* awk = (Awk*)arg;
xtn_t* xtn = (xtn_t*) qse_awk_getxtn (awk);
switch (cmd)
{
case QSE_AWK_IO_OPEN:
return awk->openSource (awk->sourceIn);
return xtn->awk->openSource (xtn->awk->sourceIn);
case QSE_AWK_IO_CLOSE:
return awk->closeSource (awk->sourceIn);
return xtn->awk->closeSource (xtn->awk->sourceIn);
case QSE_AWK_IO_READ:
return awk->readSource (awk->sourceIn, data, count);
return xtn->awk->readSource (xtn->awk->sourceIn, data, count);
}
return -1;
}
Awk::ssize_t Awk::sourceWriter (
int cmd, void* arg, char_t* data, size_t count)
awk_t* awk, int cmd, char_t* data, size_t count)
{
Awk* awk = (Awk*)arg;
xtn_t* xtn = (xtn_t*) qse_awk_getxtn (awk);
switch (cmd)
{
case QSE_AWK_IO_OPEN:
return awk->openSource (awk->sourceOut);
return xtn->awk->openSource (xtn->awk->sourceOut);
case QSE_AWK_IO_CLOSE:
return awk->closeSource (awk->sourceOut);
return xtn->awk->closeSource (xtn->awk->sourceOut);
case QSE_AWK_IO_WRITE:
return awk->writeSource (awk->sourceOut, data, count);
return xtn->awk->writeSource (xtn->awk->sourceOut, data, count);
}
return -1;
}
Awk::ssize_t Awk::pipeHandler (
int cmd, void* arg, char_t* data, size_t count)
rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count)
{
eio_t* eio = (eio_t*)arg;
Awk* awk = (Awk*)eio->data;
rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx);
Awk* awk = rxtn->run->awk;
QSE_ASSERT ((eio->type & 0xFF) == QSE_AWK_EIO_PIPE);
QSE_ASSERT ((riod->type & 0xFF) == QSE_AWK_RIO_PIPE);
Pipe pipe (eio);
Pipe pipe (rtx, riod);
switch (cmd)
{
@ -1672,14 +1672,14 @@ Awk::ssize_t Awk::pipeHandler (
}
Awk::ssize_t Awk::fileHandler (
int cmd, void* arg, char_t* data, size_t count)
rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count)
{
eio_t* eio = (eio_t*)arg;
Awk* awk = (Awk*)eio->data;
rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx);
Awk* awk = rxtn->run->awk;
QSE_ASSERT ((eio->type & 0xFF) == QSE_AWK_EIO_FILE);
QSE_ASSERT ((riod->type & 0xFF) == QSE_AWK_RIO_FILE);
File file (eio);
File file (rtx, riod);
switch (cmd)
{
@ -1704,14 +1704,14 @@ Awk::ssize_t Awk::fileHandler (
}
Awk::ssize_t Awk::consoleHandler (
int cmd, void* arg, char_t* data, size_t count)
rtx_t* rtx, int cmd, riod_t* riod, char_t* data, size_t count)
{
eio_t* eio = (eio_t*)arg;
Awk* awk = (Awk*)eio->data;
rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx);
Awk* awk = rxtn->run->awk;
QSE_ASSERT ((eio->type & 0xFF) == QSE_AWK_EIO_CONSOLE);
QSE_ASSERT ((riod->type & 0xFF) == QSE_AWK_RIO_CONSOLE);
Console console (eio);
Console console (rtx, riod);
switch (cmd)
{
@ -1734,12 +1734,10 @@ Awk::ssize_t Awk::consoleHandler (
return -1;
}
int Awk::functionHandler (
run_t* run, const char_t* name, size_t len)
int Awk::functionHandler (rtx_t* rtx, const char_t* name, size_t len)
{
Run* ctx = *(Run**)qse_awk_rtx_getxtn (run);
Awk* awk = ctx->awk;
return awk->dispatchFunction (ctx, name, len);
rxtn_t* rxtn = (rxtn_t*) qse_awk_rtx_getxtn (rtx);
return rxtn->run->awk->dispatchFunction (rxtn->run, name, len);
}
void Awk::freeFunctionMapValue (map_t* map, void* dptr, size_t dlen)
@ -1749,14 +1747,14 @@ void Awk::freeFunctionMapValue (map_t* map, void* dptr, size_t dlen)
qse_awk_free (awk->awk, dptr);
}
int Awk::onRunStart (run_t* run, void* data)
int Awk::onRunStart (rtx_t* run, void* data)
{
Run* r = (Run*)data;
r->callbackFailed = false;
return r->awk->onRunStart(*r)? 0: -1;
}
void Awk::onRunEnd (run_t* run, int errnum, void* data)
void Awk::onRunEnd (rtx_t* run, int errnum, void* data)
{
Run* r = (Run*)data;
@ -1768,14 +1766,14 @@ void Awk::onRunEnd (run_t* run, int errnum, void* data)
r->awk->onRunEnd (*r);
}
int Awk::onRunEnter (run_t* run, void* data)
int Awk::onRunEnter (rtx_t* run, void* data)
{
Run* r = (Run*)data;
if (r->callbackFailed) return false;
return r->awk->onRunEnter(*r)? 0: -1;
}
void Awk::onRunExit (run_t* run, val_t* ret, void* data)
void Awk::onRunExit (rtx_t* run, val_t* ret, void* data)
{
Run* r = (Run*)data;
if (r->callbackFailed) return;
@ -1785,7 +1783,7 @@ void Awk::onRunExit (run_t* run, val_t* ret, void* data)
else r->awk->onRunExit (*r, x);
}
void Awk::onRunStatement (run_t* run, size_t line, void* data)
void Awk::onRunStatement (rtx_t* run, size_t line, void* data)
{
Run* r = (Run*)data;
if (r->callbackFailed) return;