restructured runtime context functions to support more flexibility

- New functions include: 
    qse_awk_rtx_open ()
    qse_awk_rtx_close ()
    qse_awk_rtx_loop ()
    qse_awk_rtx_call ()
- deprecated qse_awk_run ()
This commit is contained in:
2009-02-12 04:46:24 +00:00
parent 0f4fcd737e
commit 44d4f890f4
14 changed files with 653 additions and 971 deletions

View File

@ -16,7 +16,6 @@
limitations under the License.
*/
#include <qse/awk/Awk.hpp>
#include <qse/cmn/str.h>
#include "../cmn/mem.h"
@ -74,14 +73,14 @@ void Awk::EIO::setHandle (void* handle)
Awk::EIO::operator Awk::Awk* () const
{
// it assumes that the Awk object is set to the data field.
// make sure that it happens in Awk::run () - runios.data = this;
// make sure that it happens in Awk::run () - rio.data = this;
return (Awk::Awk*)eio->data;
}
Awk::EIO::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 () - runios.data = this;
// make sure that it happens in Awk::run () - rio.data = this;
return (Awk::awk_t*)(Awk::Awk*)eio->data;
}
@ -1074,9 +1073,9 @@ Awk::Awk (): awk (QSE_NULL), functionMap (QSE_NULL),
ccls.to = transCase;
ccls.data = this;
prmfns.pow = pow;
prmfns.sprintf = sprintf;
prmfns.data = this;
prm.pow = pow;
prm.sprintf = sprintf;
prm.data = this;
}
Awk::~Awk ()
@ -1187,7 +1186,7 @@ int Awk::open ()
}
qse_awk_setccls (awk, &ccls);
qse_awk_setprmfns (awk, &prmfns);
qse_awk_setprm (awk, &prm);
//functionMap = qse_map_open (
@ -1317,44 +1316,44 @@ int Awk::parse ()
{
QSE_ASSERT (awk != QSE_NULL);
qse_awk_srcios_t srcios;
qse_awk_sio_t sio;
srcios.in = sourceReader;
srcios.out = sourceWriter;
srcios.data = this;
sio.in = sourceReader;
sio.out = sourceWriter;
sio.data = this;
int n = qse_awk_parse (awk, &srcios);
int n = qse_awk_parse (awk, &sio);
if (n == -1) retrieveError ();
return n;
}
int Awk::run (const char_t* main, const char_t** args, size_t nargs)
int Awk::run (const char_t** args, size_t nargs)
{
QSE_ASSERT (awk != QSE_NULL);
size_t i;
qse_awk_runios_t runios;
qse_awk_runcbs_t runcbs;
qse_awk_rio_t rio;
qse_awk_rcb_t rcb;
qse_xstr_t* runarg = QSE_NULL;
// make sure that the run field is set in Awk::onRunStart.
Run runctx (this);
runios.pipe = pipeHandler;
runios.file = fileHandler;
runios.console = consoleHandler;
runios.data = this;
rio.pipe = pipeHandler;
rio.file = fileHandler;
rio.console = consoleHandler;
rio.data = this;
QSE_MEMSET (&runcbs, 0, QSE_SIZEOF(runcbs));
runcbs.on_start = onRunStart;
QSE_MEMSET (&rcb, 0, QSE_SIZEOF(rcb));
rcb.on_start = onRunStart;
if (runCallback)
{
runcbs.on_end = onRunEnd;
runcbs.on_enter = onRunEnter;
runcbs.on_statement = onRunStatement;
runcbs.on_exit = onRunExit;
rcb.on_end = onRunEnd;
rcb.on_enter = onRunEnter;
rcb.on_statement = onRunStatement;
rcb.on_exit = onRunExit;
}
runcbs.data = &runctx;
rcb.data = &runctx;
if (nargs > 0)
{
@ -1385,7 +1384,7 @@ int Awk::run (const char_t* main, const char_t** args, size_t nargs)
}
int n = qse_awk_run (
awk, main, &runios, &runcbs,
awk, &rio, &rcb,
(qse_cstr_t*)runarg, &runctx
);
if (n == -1) retrieveError ();

View File

@ -72,7 +72,7 @@ int StdAwk::open ()
return 0;
}
int StdAwk::run (const char_t* main, const char_t** args, size_t nargs)
int StdAwk::run (const char_t** args, size_t nargs)
{
qse_ntime_t now;
@ -81,7 +81,7 @@ int StdAwk::run (const char_t* main, const char_t** args, size_t nargs)
::srand (this->seed);
return Awk::run (main, args, nargs);
return Awk::run (args, nargs);
}
int StdAwk::sin (Run& run, Return& ret, const Argument* args, size_t nargs,

View File

@ -342,17 +342,16 @@ void qse_awk_setccls (qse_awk_t* awk, qse_ccls_t* ccls)
awk->ccls = ccls;
}
qse_awk_prmfns_t* qse_awk_getprmfns (qse_awk_t* awk)
qse_awk_prm_t* qse_awk_getprm (qse_awk_t* awk)
{
return awk->prmfns;
return awk->prm;
}
void qse_awk_setprmfns (qse_awk_t* awk, qse_awk_prmfns_t* prmfns)
void qse_awk_setprm (qse_awk_t* awk, qse_awk_prm_t* prm)
{
QSE_ASSERT (prmfns->pow != QSE_NULL);
QSE_ASSERT (prmfns->sprintf != QSE_NULL);
awk->prmfns = prmfns;
QSE_ASSERT (prm->pow != QSE_NULL);
QSE_ASSERT (prm->sprintf != QSE_NULL);
awk->prm = prm;
}
int qse_awk_getoption (qse_awk_t* awk)

View File

@ -85,9 +85,9 @@ struct qse_awk_tree_t
struct qse_awk_t
{
qse_mmgr_t* mmgr;
qse_ccls_t* ccls;
qse_awk_prmfns_t* prmfns;
qse_mmgr_t* mmgr;
qse_ccls_t* ccls;
qse_awk_prm_t* prm;
void* assoc_data;
@ -157,7 +157,7 @@ struct qse_awk_t
/* source code management */
struct
{
qse_awk_srcios_t ios;
qse_awk_sio_t ios;
struct
{
@ -376,7 +376,7 @@ struct qse_awk_rtx_t
void* data;
qse_awk_t* awk;
qse_awk_runcbs_t* cbs;
qse_awk_rcb_t* cbs;
};

View File

@ -261,8 +261,8 @@ void qse_awk_seterror (
switch (argcnt)
{
case 0:
awk->prmfns->sprintf (
awk->prmfns->data,
awk->prm->sprintf (
awk->prm->data,
awk->errmsg,
QSE_COUNTOF(awk->errmsg),
errfmt);
@ -289,8 +289,8 @@ void qse_awk_seterror (
qse_strxncpy (tmp, QSE_COUNTOF(tmp), errarg[0].ptr, len);
}
awk->prmfns->sprintf (
awk->prmfns->data,
awk->prm->sprintf (
awk->prm->data,
awk->errmsg,
QSE_COUNTOF(awk->errmsg),
errfmt, (int)len, tmp);
@ -298,8 +298,8 @@ void qse_awk_seterror (
}
case 2:
awk->prmfns->sprintf (
awk->prmfns->data,
awk->prm->sprintf (
awk->prm->data,
awk->errmsg,
QSE_COUNTOF(awk->errmsg),
errfmt,
@ -308,8 +308,8 @@ void qse_awk_seterror (
return;
case 3:
awk->prmfns->sprintf (
awk->prmfns->data,
awk->prm->sprintf (
awk->prm->data,
awk->errmsg,
QSE_COUNTOF(awk->errmsg),
errfmt,
@ -319,8 +319,8 @@ void qse_awk_seterror (
return;
case 4:
awk->prmfns->sprintf (
awk->prmfns->data,
awk->prm->sprintf (
awk->prm->data,
awk->errmsg,
QSE_COUNTOF(awk->errmsg),
errfmt,
@ -331,8 +331,8 @@ void qse_awk_seterror (
return;
case 5:
awk->prmfns->sprintf (
awk->prmfns->data,
awk->prm->sprintf (
awk->prm->data,
awk->errmsg,
QSE_COUNTOF(awk->errmsg),
errfmt,
@ -413,8 +413,8 @@ void qse_awk_rtx_seterror (
case 0:
/* TODO: convert % to %% if the original % is not
* the first % of the %% sequence */
run->awk->prmfns->sprintf (
run->awk->prmfns->data,
run->awk->prm->sprintf (
run->awk->prm->data,
run->errmsg,
QSE_COUNTOF(run->errmsg),
errfmt);
@ -444,8 +444,8 @@ void qse_awk_rtx_seterror (
qse_strxncpy (tmp, QSE_COUNTOF(tmp), errarg[0].ptr, len);
}
run->awk->prmfns->sprintf (
run->awk->prmfns->data,
run->awk->prm->sprintf (
run->awk->prm->data,
run->errmsg,
QSE_COUNTOF(run->errmsg),
errfmt, len, tmp);
@ -453,8 +453,8 @@ void qse_awk_rtx_seterror (
}
case 2:
run->awk->prmfns->sprintf (
run->awk->prmfns->data,
run->awk->prm->sprintf (
run->awk->prm->data,
run->errmsg,
QSE_COUNTOF(run->errmsg),
errfmt,
@ -463,8 +463,8 @@ void qse_awk_rtx_seterror (
return;
case 3:
run->awk->prmfns->sprintf (
run->awk->prmfns->data,
run->awk->prm->sprintf (
run->awk->prm->data,
run->errmsg,
QSE_COUNTOF(run->errmsg),
errfmt,
@ -474,8 +474,8 @@ void qse_awk_rtx_seterror (
return;
case 4:
run->awk->prmfns->sprintf (
run->awk->prmfns->data,
run->awk->prm->sprintf (
run->awk->prm->data,
run->errmsg,
QSE_COUNTOF(run->errmsg),
errfmt,
@ -486,8 +486,8 @@ void qse_awk_rtx_seterror (
return;
case 5:
run->awk->prmfns->sprintf (
run->awk->prmfns->data,
run->awk->prm->sprintf (
run->awk->prm->data,
run->errmsg,
QSE_COUNTOF(run->errmsg),
errfmt,

View File

@ -465,21 +465,21 @@ qse_cstr_t* qse_awk_getkw (qse_awk_t* awk, int id, qse_cstr_t* s)
return s;
}
int qse_awk_parse (qse_awk_t* awk, qse_awk_srcios_t* srcios)
int qse_awk_parse (qse_awk_t* awk, qse_awk_sio_t* sio)
{
int n;
QSE_ASSERTX (awk->ccls != QSE_NULL, "Call qse_setccls() first");
QSE_ASSERTX (awk->prmfns != QSE_NULL, "Call qse_setprmfns() first");
QSE_ASSERTX (awk->prm != QSE_NULL, "Call qse_setprm() first");
QSE_ASSERTX (
srcios != QSE_NULL && srcios->in != QSE_NULL,
sio != QSE_NULL && sio->in != QSE_NULL,
"the source code input stream must be provided at least");
QSE_ASSERT (awk->parse.depth.cur.loop == 0);
QSE_ASSERT (awk->parse.depth.cur.expr == 0);
qse_awk_clear (awk);
QSE_MEMCPY (&awk->src.ios, srcios, QSE_SIZEOF(awk->src.ios));
QSE_MEMCPY (&awk->src.ios, sio, QSE_SIZEOF(awk->src.ios));
n = parse (awk);

File diff suppressed because it is too large Load Diff

View File

@ -29,7 +29,7 @@
typedef struct xtn_t
{
qse_awk_prmfns_t prmfns;
qse_awk_prm_t prm;
} xtn_t;
typedef struct rxtn_t
@ -76,10 +76,10 @@ qse_awk_t* qse_awk_opensimple (qse_size_t xtnsize)
xtn = (xtn_t*)((qse_byte_t*)qse_awk_getxtn(awk) + xtnsize);
xtn->prmfns.pow = custom_awk_pow;
xtn->prmfns.sprintf = custom_awk_sprintf;
xtn->prmfns.data = QSE_NULL;
qse_awk_setprmfns (awk, &xtn->prmfns);
xtn->prm.pow = custom_awk_pow;
xtn->prm.sprintf = custom_awk_sprintf;
xtn->prm.data = QSE_NULL;
qse_awk_setprm (awk, &xtn->prm);
qse_awk_setoption (awk,
QSE_AWK_IMPLICIT | QSE_AWK_EIO | QSE_AWK_NEWLINE |
@ -288,7 +288,7 @@ int qse_awk_parsesimple (
qse_awk_t* awk, const void* isp, int ist, const qse_char_t* osf)
{
sf_t sf;
qse_awk_srcios_t sio;
qse_awk_sio_t sio;
if (isp == QSE_NULL)
{
@ -738,12 +738,14 @@ static qse_ssize_t awk_eio_console (
return -1;
}
int qse_awk_runsimple (qse_awk_t* awk, qse_char_t** icf, qse_awk_runcbs_t* cbs)
int qse_awk_runsimple (qse_awk_t* awk, qse_char_t** icf, qse_awk_rcb_t* rcb)
{
qse_awk_runios_t ios;
qse_awk_rtx_t* rtx;
qse_awk_rio_t ios;
runio_data_t rd;
rxtn_t rxtn;
qse_ntime_t now;
int n;
rd.ic.files = icf;
rd.ic.index = 0;
@ -757,14 +759,62 @@ int qse_awk_runsimple (qse_awk_t* awk, qse_char_t** icf, qse_awk_runcbs_t* cbs)
else rxtn.seed = (unsigned int)now;
srand (rxtn.seed);
return qse_awk_run (
rtx = qse_awk_rtx_open (
awk,
QSE_NULL/*mfn*/,
&ios,
cbs,
rcb,
QSE_NULL/*runarg*/,
&rxtn/*QSE_NULL*/
);
if (rtx == QSE_NULL) return -1;
/* execute the start callback if it exists */
if (rcb != QSE_NULL && rcb->on_start != QSE_NULL)
{
n = rcb->on_start (rtx, rcb->data);
if (n <= -1) n = -1; // TODO: something doesn't make send here...
}
n = qse_awk_rtx_loop (rtx);
if (n == -1)
{
/* if no callback is specified, awk's error number
* is updated with the run's error number */
if (rcb == QSE_NULL)
{
awk->errnum = rtx->errnum;
awk->errlin = rtx->errlin;
qse_strxcpy (
awk->errmsg, QSE_COUNTOF(awk->errmsg),
rtx->errmsg);
}
else
{
qse_awk_seterrnum (awk, QSE_AWK_ERUNTIME);
}
}
/* the run loop ended. execute the end callback if it exists */
if (rcb != QSE_NULL && rcb->on_end != QSE_NULL)
{
if (n == 0)
{
/* clear error if run is successful just in case */
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR);
}
rcb->on_end (rtx,
((n == -1)? rtx->errnum: QSE_AWK_ENOERR),
rcb->data);
/* when using callbacks, this function always returns 0
* after the start callbacks has been triggered */
n = 0;
}
qse_awk_rtx_close (rtx);
return n;
}

View File

@ -277,13 +277,13 @@ static int print_expression (qse_awk_t* awk, qse_awk_nde_t* nde)
if (((qse_awk_nde_real_t*)nde)->str == QSE_NULL)
{
#if (QSE_SIZEOF_LONG_DOUBLE != 0) && !defined(__MINGW32__)
awk->prmfns->sprintf (
awk->prmfns->data,
awk->prm->sprintf (
awk->prm->data,
awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt), QSE_T("%Lf"),
(long double)((qse_awk_nde_real_t*)nde)->val);
#elif (QSE_SIZEOF_DOUBLE != 0)
awk->prmfns->sprintf (
awk->prmfns->data,
awk->prm->sprintf (
awk->prm->data,
awk->tmp.fmt, QSE_COUNTOF(awk->tmp.fmt), QSE_T("%f"),
(double)((qse_awk_nde_real_t*)nde)->val);
#else