changed Source IO model in Awk

This commit is contained in:
2009-07-10 06:46:14 +00:00
parent 1d88a17c7c
commit 852a51ae75
9 changed files with 1049 additions and 876 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.cpp 225 2009-07-08 13:01:45Z hyunghwan.chung $
* $Id: Awk.cpp 226 2009-07-09 12:46:14Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -39,25 +39,6 @@ struct rxtn_t
Awk::Run* run;
};
Awk::Source::Source (Mode mode): mode (mode), handle (QSE_NULL)
{
}
Awk::Source::Mode Awk::Source::getMode () const
{
return this->mode;
}
const void* Awk::Source::getHandle () const
{
return this->handle;
}
void Awk::Source::setHandle (void* handle)
{
this->handle = handle;
}
//////////////////////////////////////////////////////////////////
// Awk::RIO
//////////////////////////////////////////////////////////////////
@ -1067,7 +1048,7 @@ int Awk::Run::getGlobal (int id, Argument& gbl) const
//////////////////////////////////////////////////////////////////
Awk::Awk () throw (): awk (QSE_NULL), functionMap (QSE_NULL),
sourceIn (Source::READ), sourceOut (Source::WRITE),
sourceIn (this, Source::READ), sourceOut (this, Source::WRITE),
errnum (ERR_NOERR), errlin (0), runCallback (false),
runctx (this)
@ -1329,15 +1310,18 @@ int Awk::unsetAllWords ()
return qse_awk_setword (awk, QSE_NULL, 0, QSE_NULL, 0);
}
Awk::Run* Awk::parse ()
Awk::Run* Awk::parse (Source* in, Source* out)
{
QSE_ASSERT (awk != QSE_NULL);
fini_runctx ();
sourceReader = in;
sourceWriter = out;
qse_awk_sio_t sio;
sio.in = sourceReader;
sio.out = sourceWriter;
sio.in = readSource;
sio.out = (sourceWriter == QSE_NULL)? QSE_NULL: writeSource;
int n = qse_awk_parse (awk, &sio);
if (n <= -1)
@ -1657,7 +1641,7 @@ void Awk::onStatement (Run& run, size_t line)
{
}
Awk::ssize_t Awk::sourceReader (
Awk::ssize_t Awk::readSource (
awk_t* awk, qse_awk_sio_cmd_t cmd, char_t* data, size_t count)
{
xtn_t* xtn = (xtn_t*) QSE_XTN (awk);
@ -1665,19 +1649,17 @@ Awk::ssize_t Awk::sourceReader (
switch (cmd)
{
case QSE_AWK_SIO_OPEN:
return xtn->awk->openSource (xtn->awk->sourceIn);
return xtn->awk->sourceReader->open (xtn->awk->sourceIn);
case QSE_AWK_SIO_CLOSE:
return xtn->awk->closeSource (xtn->awk->sourceIn);
return xtn->awk->sourceReader->close (xtn->awk->sourceIn);
case QSE_AWK_SIO_READ:
return xtn->awk->readSource (xtn->awk->sourceIn, data, count);
case QSE_AWK_SIO_WRITE:
return xtn->awk->sourceReader->read (xtn->awk->sourceIn, data, count);
default:
return -1;
}
return -1;
}
Awk::ssize_t Awk::sourceWriter (
Awk::ssize_t Awk::writeSource (
awk_t* awk, qse_awk_sio_cmd_t cmd, char_t* data, size_t count)
{
xtn_t* xtn = (xtn_t*) QSE_XTN (awk);
@ -1685,16 +1667,14 @@ Awk::ssize_t Awk::sourceWriter (
switch (cmd)
{
case QSE_AWK_SIO_OPEN:
return xtn->awk->openSource (xtn->awk->sourceOut);
return xtn->awk->sourceWriter->open (xtn->awk->sourceOut);
case QSE_AWK_SIO_CLOSE:
return xtn->awk->closeSource (xtn->awk->sourceOut);
return xtn->awk->sourceWriter->close (xtn->awk->sourceOut);
case QSE_AWK_SIO_WRITE:
return xtn->awk->writeSource (xtn->awk->sourceOut, data, count);
case QSE_AWK_SIO_READ:
return xtn->awk->sourceWriter->write (xtn->awk->sourceOut, data, count);
default:
return -1;
}
return -1;
}
Awk::ssize_t Awk::pipeHandler (

View File

@ -1,5 +1,5 @@
/*
* $Id: StdAwk.cpp 225 2009-07-08 13:01:45Z hyunghwan.chung $
* $Id: StdAwk.cpp 226 2009-07-09 12:46:14Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -81,24 +81,6 @@ void StdAwk::close ()
Awk::close ();
}
int StdAwk::addConsoleOutput (const char_t* arg, size_t len)
{
QSE_ASSERT (awk != QSE_NULL);
int n = ofile.add (awk, arg, len);
if (n <= -1) setError (ERR_NOMEM);
return n;
}
int StdAwk::addConsoleOutput (const char_t* arg)
{
return addConsoleOutput (arg, qse_strlen(arg));
}
void StdAwk::clearConsoleOutputs ()
{
ofile.clear (awk);
}
int StdAwk::sin (Run& run, Return& ret, const Argument* args, size_t nargs,
const char_t* name, size_t len)
{
@ -300,22 +282,22 @@ int StdAwk::openPipe (Pipe& io)
{
Awk::Pipe::Mode mode = io.getMode();
qse_pio_t* pio = QSE_NULL;
int flags;
int flags = QSE_PIO_TEXT | QSE_PIO_SHELL;
switch (mode)
{
case Awk::Pipe::READ:
/* TODO: should we specify ERRTOOUT? */
flags = QSE_PIO_READOUT |
QSE_PIO_ERRTOOUT;
flags |= QSE_PIO_READOUT |
QSE_PIO_ERRTOOUT;
break;
case Awk::Pipe::WRITE:
flags = QSE_PIO_WRITEIN;
flags |= QSE_PIO_WRITEIN;
break;
case Awk::Pipe::RW:
flags = QSE_PIO_READOUT |
QSE_PIO_ERRTOOUT |
QSE_PIO_WRITEIN;
flags |= QSE_PIO_READOUT |
QSE_PIO_ERRTOOUT |
QSE_PIO_WRITEIN;
break;
}
@ -323,7 +305,7 @@ int StdAwk::openPipe (Pipe& io)
((Awk*)io)->getMmgr(),
0,
io.getName(),
flags|QSE_PIO_TEXT|QSE_PIO_SHELL
flags
);
if (pio == QSE_NULL) return -1;
@ -352,26 +334,25 @@ int StdAwk::flushPipe (Pipe& io)
return qse_pio_flush ((qse_pio_t*)io.getHandle(), QSE_PIO_IN);
}
// file io handlers
int StdAwk::openFile (File& io)
{
Awk::File::Mode mode = io.getMode();
qse_fio_t* fio = QSE_NULL;
int flags;
int flags = QSE_FIO_TEXT;
switch (mode)
{
case Awk::File::READ:
flags = QSE_FIO_READ;
flags |= QSE_FIO_READ;
break;
case Awk::File::WRITE:
flags = QSE_FIO_WRITE |
QSE_FIO_CREATE |
QSE_FIO_TRUNCATE;
flags |= QSE_FIO_WRITE |
QSE_FIO_CREATE |
QSE_FIO_TRUNCATE;
break;
case Awk::File::APPEND:
flags = QSE_FIO_APPEND |
QSE_FIO_CREATE;
flags |= QSE_FIO_APPEND |
QSE_FIO_CREATE;
break;
}
@ -379,7 +360,7 @@ int StdAwk::openFile (File& io)
((Awk*)io)->getMmgr(),
0,
io.getName(),
flags | QSE_FIO_TEXT,
flags,
QSE_FIO_RUSR | QSE_FIO_WUSR |
QSE_FIO_RGRP | QSE_FIO_ROTH
);
@ -410,7 +391,24 @@ int StdAwk::flushFile (File& io)
return qse_fio_flush ((qse_fio_t*)io.getHandle());
}
// console io handlers
int StdAwk::addConsoleOutput (const char_t* arg, size_t len)
{
QSE_ASSERT (awk != QSE_NULL);
int n = ofile.add (awk, arg, len);
if (n <= -1) setError (ERR_NOMEM);
return n;
}
int StdAwk::addConsoleOutput (const char_t* arg)
{
return addConsoleOutput (arg, qse_strlen(arg));
}
void StdAwk::clearConsoleOutputs ()
{
ofile.clear (awk);
}
int StdAwk::open_console_in (Console& io)
{
qse_awk_rtx_t* rtx = (rtx_t*)io;
@ -754,6 +752,81 @@ int StdAwk::vsprintf (
return qse_vsprintf (buf, size, fmt, arg);
}
int StdAwk::SourceFile::open (Data& io)
{
qse_sio_t* sio;
if (name[0] == QSE_T('-') &&
name[1] == QSE_T('\0'))
{
sio = (io.getMode() == READ)? qse_sio_in: qse_sio_out;
}
else
{
sio = qse_sio_open (
((awk_t*)io)->mmgr,
0,
name,
(io.getMode() == READ?
QSE_SIO_READ:
(QSE_SIO_WRITE|QSE_SIO_CREATE|QSE_SIO_TRUNCATE))
);
if (sio == QSE_NULL) return -1;
}
io.setHandle (sio);
return 1;
}
int StdAwk::SourceFile::close (Data& io)
{
qse_sio_t* sio = (qse_sio_t*)io.getHandle();
qse_sio_flush (sio);
if (sio != qse_sio_in && sio != qse_sio_out && sio != qse_sio_err)
{
qse_sio_close (sio);
}
return 0;
}
StdAwk::ssize_t StdAwk::SourceFile::read (Data& io, char_t* buf, size_t len)
{
return qse_sio_getsn ((qse_sio_t*)io.getHandle(), buf, len);
}
StdAwk::ssize_t StdAwk::SourceFile::write (Data& io, char_t* buf, size_t len)
{
return qse_sio_putsn ((qse_sio_t*)io.getHandle(), buf, len);
}
int StdAwk::SourceString::open (Data& io)
{
/* SourceString does not support writing */
if (io.getMode() == WRITE) return -1;
ptr = str;
return 1;
}
int StdAwk::SourceString::close (Data& io)
{
return 0;
}
StdAwk::ssize_t StdAwk::SourceString::read (Data& io, char_t* buf, size_t len)
{
qse_size_t n = 0;
while (*ptr != QSE_T('\0') && n < len) buf[n++] = *ptr++;
return n;
}
StdAwk::ssize_t StdAwk::SourceString::write (Data& io, char_t* buf, size_t len)
{
return -1;
}
/////////////////////////////////
QSE_END_NAMESPACE(QSE)
/////////////////////////////////