added Awk::Pipe::Handler, Awk::File::Handler, Awk::Console::Handler

enhanced how to invoke I/O handler functions and objects
This commit is contained in:
2012-06-06 14:41:21 +00:00
parent c64efd8ae7
commit 4223736c14
10 changed files with 631 additions and 86 deletions

View File

@ -960,7 +960,10 @@ int Awk::Run::getGlobal (int id, Value& g) const
//////////////////////////////////////////////////////////////////
Awk::Awk (Mmgr* mmgr):
Mmged (mmgr), awk (QSE_NULL), functionMap (QSE_NULL), runctx (this)
Mmged (mmgr), awk (QSE_NULL), functionMap (QSE_NULL),
source_reader (QSE_NULL), source_writer (QSE_NULL),
pipe_handler (QSE_NULL), file_handler (QSE_NULL),
console_handler (QSE_NULL), runctx (this)
{
QSE_MEMSET (&errinf, 0, QSE_SIZEOF(errinf));
@ -1162,12 +1165,12 @@ Awk::Run* Awk::parse (Source& in, Source& out)
fini_runctx ();
sourceReader = ∈
sourceWriter = (&out == &Source::NONE)? QSE_NULL: &out;
source_reader = ∈
source_writer = (&out == &Source::NONE)? QSE_NULL: &out;
qse_awk_sio_t sio;
sio.in = readSource;
sio.out = (sourceWriter == QSE_NULL)? QSE_NULL: writeSource;
sio.out = (source_writer == QSE_NULL)? QSE_NULL: writeSource;
int n = qse_awk_parse (awk, &sio);
if (n <= -1)
@ -1592,11 +1595,11 @@ Awk::ssize_t Awk::readSource (
switch (cmd)
{
case QSE_AWK_SIO_OPEN:
return xtn->awk->sourceReader->open (sdat);
return xtn->awk->source_reader->open (sdat);
case QSE_AWK_SIO_CLOSE:
return xtn->awk->sourceReader->close (sdat);
return xtn->awk->source_reader->close (sdat);
case QSE_AWK_SIO_READ:
return xtn->awk->sourceReader->read (sdat, data, count);
return xtn->awk->source_reader->read (sdat, data, count);
default:
return -1;
}
@ -1612,11 +1615,11 @@ Awk::ssize_t Awk::writeSource (
switch (cmd)
{
case QSE_AWK_SIO_OPEN:
return xtn->awk->sourceWriter->open (sdat);
return xtn->awk->source_writer->open (sdat);
case QSE_AWK_SIO_CLOSE:
return xtn->awk->sourceWriter->close (sdat);
return xtn->awk->source_writer->close (sdat);
case QSE_AWK_SIO_WRITE:
return xtn->awk->sourceWriter->write (sdat, data, count);
return xtn->awk->source_writer->write (sdat, data, count);
default:
return -1;
}
@ -1635,23 +1638,47 @@ Awk::ssize_t Awk::pipeHandler (
try
{
switch (cmd)
if (awk->pipe_handler)
{
case QSE_AWK_RIO_OPEN:
return awk->openPipe (pipe);
case QSE_AWK_RIO_CLOSE:
return awk->closePipe (pipe);
case QSE_AWK_RIO_READ:
return awk->readPipe (pipe, data, count);
case QSE_AWK_RIO_WRITE:
return awk->writePipe (pipe, data, count);
case QSE_AWK_RIO_FLUSH:
return awk->flushPipe (pipe);
default:
return -1;
switch (cmd)
{
case QSE_AWK_RIO_OPEN:
return awk->pipe_handler->open (pipe);
case QSE_AWK_RIO_CLOSE:
return awk->pipe_handler->close (pipe);
case QSE_AWK_RIO_READ:
return awk->pipe_handler->read (pipe, data, count);
case QSE_AWK_RIO_WRITE:
return awk->pipe_handler->write (pipe, data, count);
case QSE_AWK_RIO_FLUSH:
return awk->pipe_handler->flush (pipe);
default:
return -1;
}
}
else
{
switch (cmd)
{
case QSE_AWK_RIO_OPEN:
return awk->openPipe (pipe);
case QSE_AWK_RIO_CLOSE:
return awk->closePipe (pipe);
case QSE_AWK_RIO_READ:
return awk->readPipe (pipe, data, count);
case QSE_AWK_RIO_WRITE:
return awk->writePipe (pipe, data, count);
case QSE_AWK_RIO_FLUSH:
return awk->flushPipe (pipe);
default:
return -1;
}
}
}
catch (...)
@ -1673,23 +1700,47 @@ Awk::ssize_t Awk::fileHandler (
try
{
switch (cmd)
if (awk->file_handler)
{
case QSE_AWK_RIO_OPEN:
return awk->openFile (file);
case QSE_AWK_RIO_CLOSE:
return awk->closeFile (file);
switch (cmd)
{
case QSE_AWK_RIO_OPEN:
return awk->file_handler->open (file);
case QSE_AWK_RIO_CLOSE:
return awk->file_handler->close (file);
case QSE_AWK_RIO_READ:
return awk->file_handler->read (file, data, count);
case QSE_AWK_RIO_WRITE:
return awk->file_handler->write (file, data, count);
case QSE_AWK_RIO_FLUSH:
return awk->file_handler->flush (file);
default:
return -1;
}
}
else
{
switch (cmd)
{
case QSE_AWK_RIO_OPEN:
return awk->openFile (file);
case QSE_AWK_RIO_CLOSE:
return awk->closeFile (file);
case QSE_AWK_RIO_READ:
return awk->readFile (file, data, count);
case QSE_AWK_RIO_WRITE:
return awk->writeFile (file, data, count);
case QSE_AWK_RIO_READ:
return awk->readFile (file, data, count);
case QSE_AWK_RIO_WRITE:
return awk->writeFile (file, data, count);
case QSE_AWK_RIO_FLUSH:
return awk->flushFile (file);
case QSE_AWK_RIO_FLUSH:
return awk->flushFile (file);
default:
return -1;
default:
return -1;
}
}
}
catch (...)
@ -1711,25 +1762,51 @@ Awk::ssize_t Awk::consoleHandler (
try
{
switch (cmd)
if (awk->console_handler)
{
case QSE_AWK_RIO_OPEN:
return awk->openConsole (console);
case QSE_AWK_RIO_CLOSE:
return awk->closeConsole (console);
switch (cmd)
{
case QSE_AWK_RIO_OPEN:
return awk->console_handler->open (console);
case QSE_AWK_RIO_CLOSE:
return awk->console_handler->close (console);
case QSE_AWK_RIO_READ:
return awk->readConsole (console, data, count);
case QSE_AWK_RIO_WRITE:
return awk->writeConsole (console, data, count);
case QSE_AWK_RIO_READ:
return awk->console_handler->read (console, data, count);
case QSE_AWK_RIO_WRITE:
return awk->console_handler->write (console, data, count);
case QSE_AWK_RIO_FLUSH:
return awk->flushConsole (console);
case QSE_AWK_RIO_NEXT:
return awk->nextConsole (console);
case QSE_AWK_RIO_FLUSH:
return awk->console_handler->flush (console);
case QSE_AWK_RIO_NEXT:
return awk->console_handler->next (console);
default:
return -1;
default:
return -1;
}
}
else
{
switch (cmd)
{
case QSE_AWK_RIO_OPEN:
return awk->openConsole (console);
case QSE_AWK_RIO_CLOSE:
return awk->closeConsole (console);
case QSE_AWK_RIO_READ:
return awk->readConsole (console, data, count);
case QSE_AWK_RIO_WRITE:
return awk->writeConsole (console, data, count);
case QSE_AWK_RIO_FLUSH:
return awk->flushConsole (console);
case QSE_AWK_RIO_NEXT:
return awk->nextConsole (console);
default:
return -1;
}
}
}
catch (...)
@ -1738,6 +1815,102 @@ Awk::ssize_t Awk::consoleHandler (
}
}
int Awk::openPipe (Pipe& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::closePipe (Pipe& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
Awk::ssize_t Awk::readPipe (Pipe& io, char_t* buf, size_t len)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
Awk::ssize_t Awk::writePipe (Pipe& io, const char_t* buf, size_t len)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::flushPipe (Pipe& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::openFile (File& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::closeFile (File& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
Awk::ssize_t Awk::readFile (File& io, char_t* buf, size_t len)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
Awk::ssize_t Awk::writeFile (File& io, const char_t* buf, size_t len)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::flushFile (File& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::openConsole (Console& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::closeConsole (Console& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
Awk::ssize_t Awk::readConsole (Console& io, char_t* buf, size_t len)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
Awk::ssize_t Awk::writeConsole (Console& io, const char_t* buf, size_t len)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::flushConsole (Console& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::nextConsole (Console& io)
{
((Run*)io)->setError (QSE_AWK_ENOIMPL);
return -1;
}
int Awk::functionHandler (rtx_t* rtx, const cstr_t* name)
{
rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx);

View File

@ -26,6 +26,7 @@ const qse_char_t* qse_awk_dflerrstr (qse_awk_t* awk, qse_awk_errnum_t errnum)
{
QSE_T("no error"),
QSE_T("internal error that should never have happened"),
QSE_T("not implemented"),
QSE_T("insufficient memory"),
QSE_T("invalid parameter or data"),