fixed an error handling bug in cmd/awk/awk.c

This commit is contained in:
hyung-hwan 2020-03-04 14:14:02 +00:00
parent 5438c8129c
commit e10a9e0cbb

View File

@ -218,18 +218,28 @@ static qse_htb_walk_t print_awk_value (qse_htb_t* map, qse_htb_pair_t* pair, voi
return QSE_HTB_WALK_FORWARD;
}
struct set_global_ctx_t
{
qse_awk_rtx_t* rtx;
int fail;
};
static qse_htb_walk_t set_global (qse_htb_t* map, qse_htb_pair_t* pair, void* arg)
{
qse_awk_val_t* v;
qse_awk_rtx_t* rtx = (qse_awk_rtx_t*)arg;
struct set_global_ctx_t* ctx = (struct set_global_ctx_t*)arg;
struct gvmv_t* gvmv = (struct gvmv_t*)QSE_HTB_VPTR(pair);
v = qse_awk_rtx_makenstrvalwithcstr(rtx, &gvmv->str);
if (v == QSE_NULL) return QSE_HTB_WALK_STOP;
v = qse_awk_rtx_makenstrvalwithcstr(ctx->rtx, &gvmv->str);
if (v == QSE_NULL)
{
ctx->fail = 1;
return QSE_HTB_WALK_STOP;
}
qse_awk_rtx_refupval (rtx, v);
qse_awk_rtx_setgbl (rtx, gvmv->idx, v);
qse_awk_rtx_refdownval (rtx, v);
qse_awk_rtx_refupval (ctx->rtx, v);
qse_awk_rtx_setgbl (ctx->rtx, gvmv->idx, v);
qse_awk_rtx_refdownval (ctx->rtx, v);
return QSE_HTB_WALK_FORWARD;
}
@ -254,9 +264,11 @@ static int apply_fs_and_gvm (qse_awk_rtx_t* rtx, struct arg_t* arg)
{
/* set the value of user-defined global variables
* to a runtime context */
qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL);
qse_htb_walk (arg->gvm, set_global, rtx);
if (qse_awk_rtx_geterrnum(rtx) != QSE_AWK_ENOERR) return -1;
struct set_global_ctx_t ctx;
ctx.fail = 0;
ctx.rtx = rtx;
qse_htb_walk (arg->gvm, set_global, &ctx);
if (ctx.fail) return -1;
}
return 0;