enhanced Awk classes

This commit is contained in:
2009-07-09 07:01:45 +00:00
parent b682392d5f
commit 1d88a17c7c
4 changed files with 166 additions and 92 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.cpp 224 2009-07-07 13:05:10Z hyunghwan.chung $
* $Id: Awk.cpp 225 2009-07-08 13:01:45Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -226,8 +226,8 @@ void Awk::Argument::clear ()
{
/* case 1. not initialized.
* case 2. initialized with the second init.
* none of the cases creates a new string so the sttring
* that str.ptr is pointing at doesn't have to be freed */
* none of the cases. create a new string so the sttring
* that str.ptr is pointing to doesn't have to be freed */
this->str.ptr = QSE_NULL;
this->str.len = 0;
}
@ -918,7 +918,7 @@ Awk::Run::Run (Awk* awk): awk (awk), rtx (QSE_NULL)
{
}
Awk::Run::Run (Awk* awk, rtx_t* rtx): awk (awk), rtx (rtx), data (QSE_NULL)
Awk::Run::Run (Awk* awk, rtx_t* rtx): awk (awk), rtx (rtx)
{
QSE_ASSERT (this->rtx != QSE_NULL);
}
@ -1062,23 +1062,14 @@ int Awk::Run::getGlobal (int id, Argument& gbl) const
return gbl.init (qse_awk_rtx_getgbl (this->rtx, id));
}
void Awk::Run::setData (void* data)
{
this->data = data;
}
void* Awk::Run::getData () const
{
return this->data;
}
//////////////////////////////////////////////////////////////////
// Awk
//////////////////////////////////////////////////////////////////
Awk::Awk () throw (): awk (QSE_NULL), functionMap (QSE_NULL),
sourceIn (Source::READ), sourceOut (Source::WRITE),
errnum (ERR_NOERR), errlin (0), runCallback (false)
errnum (ERR_NOERR), errlin (0), runCallback (false),
runctx (this)
{
this->errmsg[0] = QSE_T('\0');
@ -1238,6 +1229,7 @@ int Awk::open ()
void Awk::close ()
{
fini_runctx ();
clearArguments ();
if (functionMap != QSE_NULL)
@ -1337,31 +1329,34 @@ int Awk::unsetAllWords ()
return qse_awk_setword (awk, QSE_NULL, 0, QSE_NULL, 0);
}
int Awk::parse ()
Awk::Run* Awk::parse ()
{
QSE_ASSERT (awk != QSE_NULL);
qse_awk_sio_t sio;
fini_runctx ();
qse_awk_sio_t sio;
sio.in = sourceReader;
sio.out = sourceWriter;
int n = qse_awk_parse (awk, &sio);
if (n == -1) retrieveError ();
return n;
if (n <= -1)
{
retrieveError ();
return QSE_NULL;
}
if (init_runctx () <= -1) return QSE_NULL;
return &runctx;
}
int Awk::loop ()
int Awk::init_runctx ()
{
QSE_ASSERT (awk != QSE_NULL);
if (runctx.rtx != QSE_NULL) return 0;
qse_awk_rio_t rio;
qse_awk_rcb_t rcb;
// note that the run field is set below after qse_awk_rtx_open() is
// executed.
Run runctx (this);
rio.pipe = pipeHandler;
rio.file = fileHandler;
rio.console = consoleHandler;
@ -1374,29 +1369,75 @@ int Awk::loop ()
rcb.on_statement = onStatement;
rcb.udd = &runctx;
}
int n = 0;
rtx_t* rtx = qse_awk_rtx_open (
awk, QSE_SIZEOF(rxtn_t), &rio, (qse_cstr_t*)runarg.ptr);
if (rtx == QSE_NULL)
{
retrieveError();
n = -1;
return -1;
}
else
runctx.rtx = rtx;
rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx);
rxtn->run = &runctx;
if (runCallback) qse_awk_rtx_setrcb (rtx, &rcb);
return 0;
}
void Awk::fini_runctx ()
{
if (runctx.rtx != QSE_NULL)
{
runctx.rtx = rtx;
qse_awk_rtx_close (runctx.rtx);
runctx.rtx = QSE_NULL;
}
}
rxtn_t* rxtn = (rxtn_t*) QSE_XTN (rtx);
rxtn->run = &runctx;
int Awk::loop ()
{
QSE_ASSERT (awk != QSE_NULL);
QSE_ASSERT (runctx.rtx != QSE_NULL);
if (runCallback) qse_awk_rtx_setrcb (rtx, &rcb);
n = qse_awk_rtx_loop (rtx);
if (n == -1) retrieveError (rtx);
qse_awk_rtx_close (rtx);
int n = qse_awk_rtx_loop (runctx.rtx);
if (n <= -1) retrieveError (runctx.rtx);
return n;
}
int Awk::call (const char_t* name, const Return* args, size_t nargs)
{
QSE_ASSERT (awk != QSE_NULL);
QSE_ASSERT (runctx.rtx != QSE_NULL);
val_t** ptr = QSE_NULL;
if (args != QSE_NULL)
{
ptr = (val_t**) qse_awk_alloc (awk, QSE_SIZEOF(val_t*) * nargs);
if (ptr == QSE_NULL)
{
runctx.setError (ERR_NOMEM);
return -1;
}
for (size_t i = 0; i < nargs; i++) ptr[i] = args[i].val;
}
return n;
val_t* ret = qse_awk_rtx_call (runctx.rtx, name, ptr, nargs);
if (ptr != QSE_NULL) qse_awk_free (awk, ptr);
if (ret == QSE_NULL)
{
retrieveError (runctx.rtx);
return -1;
}
// TODO: how can i store it???
qse_awk_rtx_refdownval (runctx.rtx, ret);
return 0;
}
void Awk::stop ()
@ -1410,8 +1451,6 @@ int Awk::dispatchFunction (Run* run, const char_t* name, size_t len)
pair_t* pair;
awk_t* awk = run->awk->awk;
//awk = qse_awk_rtx_getawk (run);
pair = qse_map_search (functionMap, name, len);
if (pair == QSE_NULL)
{
@ -1495,9 +1534,11 @@ void Awk::xstrs_t::clear (awk_t* awk)
{
if (this->ptr != QSE_NULL)
{
while (this->len > 0)
qse_awk_free (awk, this->ptr[--this->len].ptr);
qse_awk_free (awk, this->ptr);
this->ptr = QSE_NULL;
this->len = 0;
this->capa = 0;
}
}

View File

@ -1,5 +1,5 @@
/*
* $Id: StdAwk.cpp 224 2009-07-07 13:05:10Z hyunghwan.chung $
* $Id: StdAwk.cpp 225 2009-07-08 13:01:45Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -480,8 +480,10 @@ int StdAwk::open_console_in (Console& io)
map = ((qse_awk_val_map_t*)argv)->map;
QSE_ASSERT (map != QSE_NULL);
// ok to find ARGV[runarg_index] as ARGV[0]
// has been skipped.
ibuflen = qse_awk_longtostr (
rtx->awk, runarg_index + 1,
rtx->awk, runarg_index,
10, QSE_NULL,
ibuf, QSE_COUNTOF(ibuf)
);
@ -622,6 +624,11 @@ int StdAwk::openConsole (Console& io)
{
runarg_count = 0;
runarg_index = 0;
if (runarg.len > 0)
{
// skip ARGV[0]
runarg_index++;
}
return open_console_in (io);
}
else