amended the reference handling in Awk.cpp.

added str::index() and str::rindex().
enhanded qse_awk_rtx_valtobool().
removed QSE_AWK_NCMPONSTR from QSE_AWK_CLASSIC.
added QSE_AWK_NCMPONSTR to QSE_AWK_MODERN.
This commit is contained in:
2013-04-16 15:30:37 +00:00
parent 23d316a659
commit 3d813a1bf1
6 changed files with 190 additions and 54 deletions

View File

@ -1392,30 +1392,42 @@ int Awk::dispatch_function (Run* run, const fnc_info_t* fi)
{
qse_awk_val_ref_t* ref = (qse_awk_val_ref_t*)v;
if (ref->id == qse_awk_val_ref_t::QSE_AWK_VAL_REF_POS)
switch (ref->id)
{
qse_size_t idx = (qse_size_t)ref->adr;
case qse_awk_val_ref_t::QSE_AWK_VAL_REF_POS:
{
qse_size_t idx = (qse_size_t)ref->adr;
if (idx == 0)
{
xx = args[i].setStr (run,
QSE_STR_PTR(&run->rtx->inrec.line),
QSE_STR_LEN(&run->rtx->inrec.line));
if (idx == 0)
{
xx = args[i].setStr (run,
QSE_STR_PTR(&run->rtx->inrec.line),
QSE_STR_LEN(&run->rtx->inrec.line));
}
else if (idx <= run->rtx->inrec.nflds)
{
xx = args[i].setStr (run,
run->rtx->inrec.flds[idx-1].ptr,
run->rtx->inrec.flds[idx-1].len);
}
else
{
xx = args[i].setStr (run, QSE_T(""), 0);
}
break;
}
else if (idx <= run->rtx->inrec.nflds)
case qse_awk_val_ref_t::QSE_AWK_VAL_REF_GBL:
{
xx = args[i].setStr (run,
run->rtx->inrec.flds[idx-1].ptr,
run->rtx->inrec.flds[idx-1].len);
qse_size_t idx = (qse_size_t)ref->adr;
qse_awk_val_t* val = (qse_awk_val_t*)RTX_STACK_GBL (run->rtx, idx);
xx = args[i].setVal (run, val);
break;
}
else
{
xx = args[i].setStr (run, QSE_T(""), 0);
}
}
else
{
xx = args[i].setVal (run, *(ref->adr));
default:
xx = args[i].setVal (run, *(ref->adr));
break;
}
has_ref_arg = true;
}