implemented @pragma startup ...

This commit is contained in:
2020-01-11 05:24:07 +00:00
parent d5cb858e04
commit cf741c1525
7 changed files with 185 additions and 27 deletions

View File

@@ -1460,21 +1460,45 @@ static hawk_val_t* run_bpae_loop (hawk_rtx_t* rtx)
/* start the BEGIN-pattern block-END loop */
hawk_val_t* hawk_rtx_loop (hawk_rtx_t* rtx)
{
hawk_val_t* retv = HAWK_NULL;
rtx->exit_level = EXIT_NONE;
if (enter_stack_frame (rtx) == 0)
if (rtx->awk->parse.pragma.startup[0] != '\0')
{
retv = run_bpae_loop (rtx);
exit_stack_frame (rtx);
/* @pragma startup xxxx specified.
* divert hawk_rtx_loop() to call the specified function */
return hawk_rtx_callwithoocstrarr(rtx, rtx->awk->parse.pragma.startup, HAWK_NULL, 0); /* TODO: pass argument */
}
else
{
hawk_val_t* retv = HAWK_NULL;
/* reset the exit level */
rtx->exit_level = EXIT_NONE;
return retv;
rtx->exit_level = EXIT_NONE;
if (enter_stack_frame(rtx) == 0)
{
retv = run_bpae_loop(rtx);
exit_stack_frame (rtx);
}
/* reset the exit level */
rtx->exit_level = EXIT_NONE;
return retv;
}
}
hawk_val_t* hawk_rtx_execwithucstrarr (hawk_rtx_t* rtx, const hawk_uch_t* args[], hawk_oow_t nargs)
{
return (rtx->awk->parse.pragma.startup[0] != '\0')?
hawk_rtx_callwithooucstrarr(rtx, rtx->awk->parse.pragma.startup, args, nargs):
hawk_rtx_loop(rtx);
}
hawk_val_t* hawk_rtx_execwithbcstrarr (hawk_rtx_t* rtx, const hawk_bch_t* args[], hawk_oow_t nargs)
{
return (rtx->awk->parse.pragma.startup[0] != '\0')?
hawk_rtx_callwithoobcstrarr(rtx, rtx->awk->parse.pragma.startup, args, nargs):
hawk_rtx_loop(rtx);
}
/* find an AWK function by name */
static hawk_fun_t* find_fun (hawk_rtx_t* rtx, const hawk_ooch_t* name)
{
@@ -1548,7 +1572,7 @@ hawk_val_t* hawk_rtx_callfun (hawk_rtx_t* rtx, hawk_fun_t* fun, hawk_val_t* args
{
/* this function contains pass-by-reference parameters.
* i don't support the call here as it requires variables */
hawk_rtx_seterrfmt (rtx, HAWK_EPERM, HAWK_NULL, HAWK_T("not allowed to call '%.*js' with pass-by-reference parameters"), fun->name.len, fun->name.ptr);
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EPERM, HAWK_T("not allowed to call '%.*js' with pass-by-reference parameters"), fun->name.len, fun->name.ptr);
return HAWK_NULL;
}
#endif
@@ -1680,6 +1704,68 @@ oops:
return ret;
}
hawk_val_t* hawk_rtx_callwithooucstrarr (hawk_rtx_t* rtx, const hawk_ooch_t* name, const hawk_uch_t* args[], hawk_oow_t nargs)
{
hawk_oow_t i;
hawk_val_t** v, * ret;
v = hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*v) * nargs);
if (!v) return HAWK_NULL;
for (i = 0; i < nargs; i++)
{
v[i] = hawk_rtx_makestrvalwithucstr(rtx, args[i]);
if (!v[i])
{
ret = HAWK_NULL;
goto oops;
}
hawk_rtx_refupval (rtx, v[i]);
}
ret = hawk_rtx_callwithoocstr(rtx, name, v, nargs);
oops:
while (i > 0)
{
hawk_rtx_refdownval (rtx, v[--i]);
}
hawk_rtx_freemem (rtx, v);
return ret;
}
hawk_val_t* hawk_rtx_callwithoobcstrarr (hawk_rtx_t* rtx, const hawk_ooch_t* name, const hawk_bch_t* args[], hawk_oow_t nargs)
{
hawk_oow_t i;
hawk_val_t** v, * ret;
v = hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*v) * nargs);
if (!v) return HAWK_NULL;
for (i = 0; i < nargs; i++)
{
v[i] = hawk_rtx_makestrvalwithbcstr(rtx, args[i]);
if (!v[i])
{
ret = HAWK_NULL;
goto oops;
}
hawk_rtx_refupval (rtx, v[i]);
}
ret = hawk_rtx_callwithoocstr(rtx, name, v, nargs);
oops:
while (i > 0)
{
hawk_rtx_refdownval (rtx, v[--i]);
}
hawk_rtx_freemem (rtx, v);
return ret;
}
static int run_pblocks (hawk_rtx_t* rtx)
{
int n;