changed Source IO model in Awk
This commit is contained in:
@ -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 (
|
||||
|
@ -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)
|
||||
/////////////////////////////////
|
||||
|
Reference in New Issue
Block a user