- deleted unnecessary callback functions - on_loop_enter() & on_loop_exit()

- modified qse_awk_rtx_loop() and Awk::loop() to return the return value
- deprecated the callback totally from the Awk class: may readd it in the future.
- added POC code to pass arguments by reference for intrinsic functions. POC ok. more works needed for full support. not enabled.
This commit is contained in:
2009-07-17 02:27:53 +00:00
parent f0f2db5e8a
commit 6b31c85427
11 changed files with 181 additions and 218 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: awk01.c 195 2009-06-10 13:18:25Z hyunghwan.chung $
* $Id: awk01.c 236 2009-07-16 08:27:53Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -35,13 +35,14 @@ int main ()
{
qse_awk_t* awk = QSE_NULL;
qse_awk_rtx_t* rtx = QSE_NULL;
qse_awk_val_t* retv;
qse_awk_parsestd_in_t psin;
int ret;
awk = qse_awk_openstd (0);
if (awk == QSE_NULL)
{
qse_fprintf (QSE_STDERR, QSE_T("error: cannot open awk\n"));
qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n"));
goto oops;
}
@ -49,11 +50,11 @@ int main ()
psin.u.cp = src;
ret = qse_awk_parsestd (awk, &psin, QSE_NULL);
if (ret == -1)
if (ret <= -1)
{
qse_fprintf (QSE_STDERR, QSE_T("error: %s\n"),
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"),
qse_awk_geterrmsg(awk));
goto oops;
ret = -1; goto oops;
}
rtx = qse_awk_rtx_openstd (
@ -65,22 +66,25 @@ int main ()
);
if (rtx == QSE_NULL)
{
qse_fprintf (QSE_STDERR, QSE_T("error: %s\n"),
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"),
qse_awk_geterrmsg(awk));
goto oops;
ret = -1; goto oops;
}
ret = qse_awk_rtx_loop (rtx);
if (ret == -1)
retv = qse_awk_rtx_loop (rtx);
if (retv == QSE_NULL)
{
qse_fprintf (QSE_STDERR, QSE_T("error: %s\n"),
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"),
qse_awk_rtx_geterrmsg(rtx));
goto oops;
ret = -1; goto oops;
}
qse_awk_rtx_refdownval (rtx, retv);
ret = 0;
oops:
if (rtx != QSE_NULL) qse_awk_rtx_close (rtx);
if (awk != QSE_NULL) qse_awk_close (awk);
return -1;
return ret;
}

View File

@ -1,5 +1,5 @@
/*
* $Id: awk02.c 195 2009-06-10 13:18:25Z hyunghwan.chung $
* $Id: awk02.c 236 2009-07-16 08:27:53Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -38,6 +38,7 @@ int main ()
{
qse_awk_t* awk = QSE_NULL;
qse_awk_rtx_t* rtx = QSE_NULL;
qse_awk_val_t* retv;
qse_awk_parsestd_in_t psin;
qse_awk_parsestd_out_t psout;
@ -47,8 +48,8 @@ int main ()
awk = qse_awk_openstd (0);
if (awk == QSE_NULL)
{
qse_fprintf (QSE_STDERR, QSE_T("error: cannot open awk\n"));
goto oops;
qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot open awk\n"));
ret = -1; goto oops;
}
qse_memset (srcout, QSE_T(' '), QSE_COUNTOF(srcout)-1);
@ -60,11 +61,11 @@ int main ()
psout.u.cp = srcout;
ret = qse_awk_parsestd (awk, &psin, &psout);
if (ret == -1)
if (ret <= -1)
{
qse_fprintf (QSE_STDERR, QSE_T("error: %s\n"),
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"),
qse_awk_geterrmsg(awk));
goto oops;
ret = -1; goto oops;
}
qse_printf (QSE_T("DEPARSED SOURCE:\n%s\n"), srcout);
@ -80,19 +81,22 @@ int main ()
);
if (rtx == QSE_NULL)
{
qse_fprintf (QSE_STDERR, QSE_T("error: %s\n"),
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"),
qse_awk_geterrmsg(awk));
goto oops;
ret = -1; goto oops;
}
ret = qse_awk_rtx_loop (rtx);
if (ret == -1)
retv = qse_awk_rtx_loop (rtx);
if (retv == QSE_NULL)
{
qse_fprintf (QSE_STDERR, QSE_T("error: %s\n"),
qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"),
qse_awk_rtx_geterrmsg(rtx));
goto oops;
ret = -1; goto oops;
}
qse_awk_rtx_refdownval (rtx, retv);
ret = 0;
oops:
if (rtx != QSE_NULL) qse_awk_rtx_close (rtx);
if (awk != QSE_NULL) qse_awk_close (awk);

View File

@ -49,8 +49,9 @@ static int run_awk (QSE::StdAwk& awk)
// parse the script string and deparse it to awk05.out.
if (awk.parse (in, out) == QSE_NULL) return -1;
QSE::StdAwk::Value r;
// execute the BEGIN, pattern-action, END blocks.
return awk.loop ();
return awk.loop (&r);
}
static int awk_main (int argc, qse_char_t* argv[])

View File

@ -37,6 +37,7 @@ static int run_awk (QSE::StdAwk& awk)
"function add (a, b) { return a + b }\n"
"function mul (a, b) { return a * b }\n"
"function div (a, b) { return a / b }\n"
"function sine (a) { return sin(a) }\n"
);
QSE::StdAwk::SourceString in (script);
@ -52,16 +53,25 @@ static int run_awk (QSE::StdAwk& awk)
// ret = add (-20, 51)
QSE::StdAwk::Value ret;
if (awk.call (QSE_T("add"), &ret, arg, QSE_COUNTOF(arg)) <= -1) return -1;
if (awk.call (QSE_T("add"), &ret, arg, 2) <= -1) return -1;
// ret = mul (ret, 51);
arg[0] = ret;
if (awk.call (QSE_T("mul"), &ret, arg, QSE_COUNTOF(arg)) <= -1) return -1;
if (awk.call (QSE_T("mul"), &ret, arg, 2) <= -1) return -1;
// ret = div (ret, 2);
arg[0] = ret;
if (arg[1].setReal (run, 2) <= -1) return -1;
if (awk.call (QSE_T("div"), &ret, arg, QSE_COUNTOF(arg)) <= -1) return -1;
if (awk.call (QSE_T("div"), &ret, arg, 2) <= -1) return -1;
// output the result in various types
qse_printf (QSE_T("RESULT: (int) [%lld]\n"), (long long)ret.toInt());
qse_printf (QSE_T(" (real) [%Lf]\n"), (long double)ret.toReal());
qse_printf (QSE_T(" (str) [%s]\n"), ret.toStr(QSE_NULL));
// ret = sine (ret);
arg[0] = ret;
if (awk.call (QSE_T("sine"), &ret, arg, 1) <= -1) return -1;
// output the result in various types
qse_printf (QSE_T("RESULT: (int) [%lld]\n"), (long long)ret.toInt());