*** empty log message ***
This commit is contained in:
parent
aa8d89434f
commit
ced6010a72
311
ase/awk/run.c
311
ase/awk/run.c
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: run.c,v 1.313 2006-12-31 14:33:01 bacon Exp $
|
||||
* $Id: run.c,v 1.314 2007-01-01 15:06:52 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <ase/awk/awk_i.h>
|
||||
@ -161,7 +161,8 @@ static ase_awk_val_t* __eval_binop_ma (
|
||||
static ase_awk_val_t* __eval_binop_nm (
|
||||
ase_awk_run_t* run, ase_awk_nde_t* left, ase_awk_nde_t* right);
|
||||
static ase_awk_val_t* __eval_binop_match0 (
|
||||
ase_awk_run_t* run, ase_awk_val_t* left, ase_awk_val_t* right, int ret);
|
||||
ase_awk_run_t* run, ase_awk_val_t* left, ase_awk_val_t* right,
|
||||
ase_size_t lline, ase_size_t rline, int ret);
|
||||
|
||||
static ase_awk_val_t* __eval_unary (ase_awk_run_t* run, ase_awk_nde_t* nde);
|
||||
static ase_awk_val_t* __eval_incpre (ase_awk_run_t* run, ase_awk_nde_t* nde);
|
||||
@ -1738,8 +1739,11 @@ static int __run_block0 (ase_awk_run_t* run, ase_awk_nde_blk_t* nde)
|
||||
ase_awk_refdownval (run, run->inrec.d0);
|
||||
|
||||
if (run->errnum == ASE_AWK_EIOHANDLER)
|
||||
PANIC_I (run, ASE_AWK_ECOUTDT);
|
||||
else return -1;
|
||||
{
|
||||
ase_awk_setrunerror (
|
||||
run, ASE_AWK_ECOUTDT, nde->line, ASE_NULL);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
n = ase_awk_writeextio_str (
|
||||
@ -1750,8 +1754,11 @@ static int __run_block0 (ase_awk_run_t* run, ase_awk_nde_blk_t* nde)
|
||||
ase_awk_refdownval (run, run->inrec.d0);
|
||||
|
||||
if (run->errnum == ASE_AWK_EIOHANDLER)
|
||||
PANIC_I (run, ASE_AWK_ECOUTDT);
|
||||
else return -1;
|
||||
{
|
||||
ase_awk_setrunerror (
|
||||
run, ASE_AWK_ECOUTDT, nde->line, ASE_NULL);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
ase_awk_refdownval (run, run->inrec.d0);
|
||||
@ -2937,14 +2944,20 @@ static ase_awk_val_t* __eval_expression (ase_awk_run_t* run, ase_awk_nde_t* nde)
|
||||
if (n == -1)
|
||||
{
|
||||
ase_awk_refdownval (run, v);
|
||||
PANIC (run, errnum);
|
||||
|
||||
ase_Awk_setrunerror (run, errnum, nde->line, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
ase_awk_refdownval (run, v);
|
||||
|
||||
v = ase_awk_makeintval (run, (n != 0));
|
||||
if (v == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (v == ASE_NULL)
|
||||
{
|
||||
ase_Awk_setrunerror (run, ASE_AWK_ENOMEM, nde->line, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return v;
|
||||
@ -3302,7 +3315,8 @@ static ase_awk_val_t* __do_assignment_map (
|
||||
if (n < 0)
|
||||
{
|
||||
ASE_AWK_FREE (run->awk, str);
|
||||
PANIC (run, ASE_AWK_ENOMEM);
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, var->line, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
ASE_AWK_FREE (run->awk, str);
|
||||
@ -3327,9 +3341,18 @@ static ase_awk_val_t* __do_assignment_pos (
|
||||
n = ase_awk_valtonum (run, v, &lv, &rv);
|
||||
ase_awk_refdownval (run, v);
|
||||
|
||||
if (n == -1) PANIC (run, ASE_AWK_EPOSIDX);
|
||||
if (n == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EPOSIDX, pos->line, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
if (n == 1) lv = (ase_long_t)rv;
|
||||
if (!IS_VALID_POSIDX(lv)) PANIC (run, ASE_AWK_EPOSIDX);
|
||||
if (!IS_VALID_POSIDX(lv))
|
||||
{
|
||||
ase_awk_setrunerror (
|
||||
run, ASE_AWK_EPOSIDX, pos->line, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
if (val->type == ASE_AWK_VAL_STR)
|
||||
{
|
||||
@ -3338,7 +3361,8 @@ static ase_awk_val_t* __do_assignment_pos (
|
||||
}
|
||||
else
|
||||
{
|
||||
str = ase_awk_valtostr (run, val, ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, &len);
|
||||
str = ase_awk_valtostr (
|
||||
run, val, ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, &len);
|
||||
if (str == ASE_NULL) return ASE_NULL;
|
||||
}
|
||||
|
||||
@ -3437,6 +3461,10 @@ static ase_awk_val_t* __eval_binary (ase_awk_run_t* run, ase_awk_nde_t* nde)
|
||||
ASE_AWK_ASSERT (run->awk, __binop_func[exp->opcode] != ASE_NULL);
|
||||
|
||||
res = __binop_func[exp->opcode] (run, left, right);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, run->errnum, nde->line, ASE_NULL);
|
||||
}
|
||||
|
||||
ase_awk_refdownval (run, left);
|
||||
ase_awk_refdownval (run, right);
|
||||
@ -3453,7 +3481,11 @@ static ase_awk_val_t* __eval_binop_lor (
|
||||
|
||||
res = ase_awk_makeintval (run,
|
||||
ase_awk_valtobool(run left) || ase_awk_valtobool(run,right));
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, left->line, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
return res;
|
||||
*/
|
||||
@ -3468,7 +3500,6 @@ static ase_awk_val_t* __eval_binop_lor (
|
||||
ase_awk_refupval (run, lv);
|
||||
if (ase_awk_valtobool (run, lv))
|
||||
{
|
||||
/*res = ase_awk_makeintval (run, 1);*/
|
||||
res = ase_awk_val_one;
|
||||
}
|
||||
else
|
||||
@ -3482,14 +3513,12 @@ static ase_awk_val_t* __eval_binop_lor (
|
||||
}
|
||||
ase_awk_refupval (run, rv);
|
||||
|
||||
/*res = ase_awk_makeintval (run, (ase_awk_valtobool(run,rv)? 1: 0));*/
|
||||
res = ase_awk_valtobool(run,rv)? ase_awk_val_one: ase_awk_val_zero;
|
||||
ase_awk_refdownval (run, rv);
|
||||
}
|
||||
|
||||
ase_awk_refdownval (run, lv);
|
||||
|
||||
/*if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);*/
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -3501,7 +3530,11 @@ static ase_awk_val_t* __eval_binop_land (
|
||||
|
||||
res = ase_awk_makeintval (run,
|
||||
ase_awk_valtobool(run,left) && ase_awk_valtobool(run,right));
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, left->line, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
return res;
|
||||
*/
|
||||
@ -3516,7 +3549,6 @@ static ase_awk_val_t* __eval_binop_land (
|
||||
ase_awk_refupval (run, lv);
|
||||
if (!ase_awk_valtobool (run, lv))
|
||||
{
|
||||
/*res = ase_awk_makeintval (run, 0);*/
|
||||
res = ase_awk_val_zero;
|
||||
}
|
||||
else
|
||||
@ -3530,14 +3562,12 @@ static ase_awk_val_t* __eval_binop_land (
|
||||
}
|
||||
ase_awk_refupval (run, rv);
|
||||
|
||||
/*res = ase_awk_makeintval (run, (ase_awk_valtobool(run,rv)? 1: 0));*/
|
||||
res = ase_awk_valtobool(run,rv)? ase_awk_val_one: ase_awk_val_zero;
|
||||
ase_awk_refdownval (run, rv);
|
||||
}
|
||||
|
||||
ase_awk_refdownval (run, lv);
|
||||
|
||||
/*if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);*/
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -3556,7 +3586,8 @@ static ase_awk_val_t* __eval_binop_in (
|
||||
/* the compiler should have handled this case */
|
||||
ASE_AWK_ASSERT (run->awk,
|
||||
!"should never happen - in needs a plain variable");
|
||||
PANIC (run, ASE_AWK_EINTERN);
|
||||
|
||||
ase_awk_setrunerror (run, ASE_AWK_EINTERN, right->line, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
@ -3596,7 +3627,9 @@ static ase_awk_val_t* __eval_binop_in (
|
||||
{
|
||||
ASE_AWK_FREE (run->awk, str);
|
||||
ase_awk_refdownval (run, rv);
|
||||
PANIC (run, ASE_AWK_ENOMEM);
|
||||
ase_awk_setrunerror (
|
||||
run, ASE_AWK_ENOMEM, right->line, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}*/
|
||||
res = (ase_awk_map_get (map, str, len) == ASE_NULL)?
|
||||
ase_awk_val_zero: ase_awk_val_one;
|
||||
@ -3627,7 +3660,11 @@ static ase_awk_val_t* __eval_binop_bor (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
ASE_AWK_ASSERT (run->awk, n3 >= 0 && n3 <= 3);
|
||||
@ -3636,7 +3673,11 @@ static ase_awk_val_t* __eval_binop_bor (
|
||||
(n3 == 2)? ase_awk_makeintval(run,(ase_long_t)l1|(ase_long_t)r2):
|
||||
ase_awk_makeintval(run,(ase_long_t)r1|(ase_long_t)r2);
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -3651,7 +3692,11 @@ static ase_awk_val_t* __eval_binop_bxor (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
ASE_AWK_ASSERT (run->awk, n3 >= 0 && n3 <= 3);
|
||||
@ -3660,7 +3705,11 @@ static ase_awk_val_t* __eval_binop_bxor (
|
||||
(n3 == 2)? ase_awk_makeintval(run,(ase_long_t)l1^(ase_long_t)r2):
|
||||
ase_awk_makeintval(run,(ase_long_t)r1^(ase_long_t)r2);
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -3675,7 +3724,11 @@ static ase_awk_val_t* __eval_binop_band (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
ASE_AWK_ASSERT (run->awk, n3 >= 0 && n3 <= 3);
|
||||
@ -3684,7 +3737,11 @@ static ase_awk_val_t* __eval_binop_band (
|
||||
(n3 == 2)? ase_awk_makeintval(run,(ase_long_t)l1&(ase_long_t)r2):
|
||||
ase_awk_makeintval(run,(ase_long_t)r1&(ase_long_t)r2);
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -3782,7 +3839,7 @@ static int __cmp_int_str (
|
||||
str = ase_awk_valtostr (run, left, ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, &len);
|
||||
if (str == ASE_NULL)
|
||||
{
|
||||
run->errnum = ASE_AWK_ENOMEM;
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return CMP_ERROR;
|
||||
}
|
||||
|
||||
@ -3856,7 +3913,7 @@ static int __cmp_real_str (
|
||||
str = ase_awk_valtostr (run, left, ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, &len);
|
||||
if (str == ASE_NULL)
|
||||
{
|
||||
run->errnum = ASE_AWK_ENOMEM;
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return CMP_ERROR;
|
||||
}
|
||||
|
||||
@ -3938,7 +3995,7 @@ static int __cmp_val (
|
||||
if (left->type == ASE_AWK_VAL_MAP || right->type == ASE_AWK_VAL_MAP)
|
||||
{
|
||||
/* a map can't be compared againt other values */
|
||||
run->errnum = ASE_AWK_EOPERAND;
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return CMP_ERROR;
|
||||
}
|
||||
|
||||
@ -4011,7 +4068,11 @@ static ase_awk_val_t* __eval_binop_lshift (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
if (n3 == 0)
|
||||
@ -4019,9 +4080,17 @@ static ase_awk_val_t* __eval_binop_lshift (
|
||||
res = ase_awk_makeintval (
|
||||
run, (ase_long_t)l1<<(ase_long_t)l2);
|
||||
}
|
||||
else PANIC (run, ASE_AWK_EOPERAND);
|
||||
else
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -4036,7 +4105,11 @@ static ase_awk_val_t* __eval_binop_rshift (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
if (n3 == 0)
|
||||
@ -4044,9 +4117,17 @@ static ase_awk_val_t* __eval_binop_rshift (
|
||||
res = ase_awk_makeintval (
|
||||
run, (ase_long_t)l1>>(ase_long_t)l2);
|
||||
}
|
||||
else PANIC (run, ASE_AWK_EOPERAND);
|
||||
else
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -4061,7 +4142,11 @@ static ase_awk_val_t* __eval_binop_plus (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
/*
|
||||
n1 n2 n3
|
||||
0 0 = 0
|
||||
@ -4076,7 +4161,11 @@ static ase_awk_val_t* __eval_binop_plus (
|
||||
(n3 == 2)? ase_awk_makerealval(run,(ase_real_t)l1+(ase_real_t)r2):
|
||||
ase_awk_makerealval(run,(ase_real_t)r1+(ase_real_t)r2);
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -4091,7 +4180,11 @@ static ase_awk_val_t* __eval_binop_minus (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
ASE_AWK_ASSERT (run->awk, n3 >= 0 && n3 <= 3);
|
||||
@ -4100,7 +4193,11 @@ static ase_awk_val_t* __eval_binop_minus (
|
||||
(n3 == 2)? ase_awk_makerealval(run,(ase_real_t)l1-(ase_real_t)r2):
|
||||
ase_awk_makerealval(run,(ase_real_t)r1-(ase_real_t)r2);
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -4115,7 +4212,11 @@ static ase_awk_val_t* __eval_binop_mul (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
ASE_AWK_ASSERT (run->awk, n3 >= 0 && n3 <= 3);
|
||||
@ -4124,7 +4225,11 @@ static ase_awk_val_t* __eval_binop_mul (
|
||||
(n3 == 2)? ase_awk_makerealval(run,(ase_real_t)l1*(ase_real_t)r2):
|
||||
ase_awk_makerealval(run,(ase_real_t)r1*(ase_real_t)r2);
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -4139,12 +4244,20 @@ static ase_awk_val_t* __eval_binop_div (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
if (n3 == 0)
|
||||
{
|
||||
if (l2 == 0) PANIC (run, ASE_AWK_EDIVBYZERO);
|
||||
if (l2 == 0)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EDIVBY0, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
if (((ase_long_t)l1 % (ase_long_t)l2) == 0)
|
||||
{
|
||||
@ -4174,7 +4287,11 @@ static ase_awk_val_t* __eval_binop_div (
|
||||
run, (ase_real_t)r1 / (ase_real_t)r2);
|
||||
}
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -4189,12 +4306,20 @@ static ase_awk_val_t* __eval_binop_idiv (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
if (n3 == 0)
|
||||
{
|
||||
if (l2 == 0) PANIC (run, ASE_AWK_EDIVBYZERO);
|
||||
if (l2 == 0)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EDIVBY0, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
res = ase_awk_makeintval (
|
||||
run, (ase_long_t)l1 / (ase_long_t)l2);
|
||||
}
|
||||
@ -4216,7 +4341,11 @@ static ase_awk_val_t* __eval_binop_idiv (
|
||||
res = ase_awk_makeintval (run, (ase_long_t)quo);
|
||||
}
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -4231,18 +4360,34 @@ static ase_awk_val_t* __eval_binop_mod (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
if (n3 == 0)
|
||||
{
|
||||
if (l2 == 0) PANIC (run, ASE_AWK_EDIVBYZERO);
|
||||
if (l2 == 0)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EDIVBY0, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
res = ase_awk_makeintval (
|
||||
run, (ase_long_t)l1 % (ase_long_t)l2);
|
||||
}
|
||||
else PANIC (run, ASE_AWK_EOPERAND);
|
||||
else
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -4260,7 +4405,11 @@ static ase_awk_val_t* __eval_binop_exp (
|
||||
n1 = ase_awk_valtonum (run, left, &l1, &r1);
|
||||
n2 = ase_awk_valtonum (run, right, &l2, &r2);
|
||||
|
||||
if (n1 == -1 || n2 == -1) PANIC (run, ASE_AWK_EOPERAND);
|
||||
if (n1 == -1 || n2 == -1)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_EOPERAND, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
n3 = n1 + (n2 << 1);
|
||||
if (n3 == 0)
|
||||
@ -4274,7 +4423,8 @@ static ase_awk_val_t* __eval_binop_exp (
|
||||
}
|
||||
else if (l1 == 0)
|
||||
{
|
||||
PANIC (run, ASE_AWK_EDIVBYZERO);
|
||||
ase_awk_setrunerror (run, ASE_AWK_EDIVBY0, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4295,7 +4445,8 @@ static ase_awk_val_t* __eval_binop_exp (
|
||||
}
|
||||
else if (r1 == 0.0)
|
||||
{
|
||||
PANIC (run, ASE_AWK_EDIVBYZERO);
|
||||
ase_awk_setrunerror (run, ASE_AWK_EDIVBY0, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4319,7 +4470,12 @@ static ase_awk_val_t* __eval_binop_exp (
|
||||
run->awk->sysfns.pow((ase_real_t)r1,(ase_real_t)r2));
|
||||
}
|
||||
|
||||
if (res == ASE_NULL) PANIC (run, ASE_AWK_ENOMEM);
|
||||
if (res == ASE_NULL)
|
||||
{
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
@ -4347,7 +4503,9 @@ static ase_awk_val_t* __eval_binop_concat (
|
||||
{
|
||||
ASE_AWK_FREE (run->awk, strl);
|
||||
ASE_AWK_FREE (run->awk, strr);
|
||||
PANIC (run, ASE_AWK_ENOMEM);
|
||||
|
||||
ase_awk_setrunerror (run, ASE_AWK_ENOMEM, 0, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
ASE_AWK_FREE (run->awk, strl);
|
||||
@ -4381,7 +4539,8 @@ static ase_awk_val_t* __eval_binop_ma (
|
||||
|
||||
ase_awk_refupval (run, rv);
|
||||
|
||||
res = __eval_binop_match0 (run, lv, rv, 1);
|
||||
res = __eval_binop_match0 (
|
||||
run, lv, rv, left->line, right->line, 1);
|
||||
|
||||
ase_awk_refdownval (run, lv);
|
||||
ase_awk_refdownval (run, rv);
|
||||
@ -4411,7 +4570,8 @@ static ase_awk_val_t* __eval_binop_nm (
|
||||
|
||||
ase_awk_refupval (run, rv);
|
||||
|
||||
res = __eval_binop_match0 (run, lv, rv, 0);
|
||||
res = __eval_binop_match0 (
|
||||
run, lv, rv, left->line, right->line, 0);
|
||||
|
||||
ase_awk_refdownval (run, lv);
|
||||
ase_awk_refdownval (run, rv);
|
||||
@ -4420,7 +4580,8 @@ static ase_awk_val_t* __eval_binop_nm (
|
||||
}
|
||||
|
||||
static ase_awk_val_t* __eval_binop_match0 (
|
||||
ase_awk_run_t* run, ase_awk_val_t* left, ase_awk_val_t* right, int ret)
|
||||
ase_awk_run_t* run, ase_awk_val_t* left, ase_awk_val_t* right,
|
||||
ase_size_t lline, ase_size_t rline, int ret)
|
||||
{
|
||||
ase_awk_val_t* res;
|
||||
int n, errnum;
|
||||
@ -4439,7 +4600,10 @@ static ase_awk_val_t* __eval_binop_match0 (
|
||||
((ase_awk_val_str_t*)right)->buf,
|
||||
((ase_awk_val_str_t*)right)->len, &errnum);
|
||||
if (rex_code == ASE_NULL)
|
||||
PANIC (run, errnum);
|
||||
{
|
||||
ase_awk_setrunerror (run, errnum, rline, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -4451,7 +4615,9 @@ static ase_awk_val_t* __eval_binop_match0 (
|
||||
if (rex_code == ASE_NULL)
|
||||
{
|
||||
ASE_AWK_FREE (run->awk, str);
|
||||
PANIC (run, errnum);
|
||||
|
||||
ase_awk_setrunerror (run, errnum, rline, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
ASE_AWK_FREE (run->awk, str);
|
||||
@ -4469,7 +4635,9 @@ static ase_awk_val_t* __eval_binop_match0 (
|
||||
{
|
||||
if (right->type != ASE_AWK_VAL_REX)
|
||||
ASE_AWK_FREE (run->awk, rex_code);
|
||||
PANIC (run, errnum);
|
||||
|
||||
ase_awk_setrunerror (run, errnum, lline, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
res = ase_awk_makeintval (run, (n == ret));
|
||||
@ -4477,7 +4645,10 @@ static ase_awk_val_t* __eval_binop_match0 (
|
||||
{
|
||||
if (right->type != ASE_AWK_VAL_REX)
|
||||
ASE_AWK_FREE (run->awk, rex_code);
|
||||
PANIC (run, ASE_AWK_ENOMEM);
|
||||
|
||||
ase_awk_setrunerror (
|
||||
run, ASE_AWK_ENOMEM, lline, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -4500,7 +4671,10 @@ static ase_awk_val_t* __eval_binop_match0 (
|
||||
ASE_AWK_FREE (run->awk, str);
|
||||
if (right->type != ASE_AWK_VAL_REX)
|
||||
ASE_AWK_FREE (run->awk, rex_code);
|
||||
PANIC (run, errnum);
|
||||
|
||||
ase_awk_setrunerror (
|
||||
run, errnum, lline, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
res = ase_awk_makeintval (run, (n == ret));
|
||||
@ -4509,7 +4683,10 @@ static ase_awk_val_t* __eval_binop_match0 (
|
||||
ASE_AWK_FREE (run->awk, str);
|
||||
if (right->type != ASE_AWK_VAL_REX)
|
||||
ASE_AWK_FREE (run->awk, rex_code);
|
||||
PANIC (run, ASE_AWK_ENOMEM);
|
||||
|
||||
ase_awk_setrunerror (
|
||||
run, ASE_AWK_ENOMEM, lline, ASE_NULL);
|
||||
return ASE_NULL;
|
||||
}
|
||||
|
||||
ASE_AWK_FREE (run->awk, str);
|
||||
|
Loading…
Reference in New Issue
Block a user