*** empty log message ***
This commit is contained in:
parent
3343383a40
commit
dadcf0c0f1
384
ase/awk/run.c
384
ase/awk/run.c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.208 2006-09-28 04:39:42 bacon Exp $
|
* $Id: run.c,v 1.209 2006-09-28 06:41:25 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -2805,6 +2805,7 @@ static int __cmp_nil_str (
|
|||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||||
{
|
{
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __cmp_int_nil (
|
static int __cmp_int_nil (
|
||||||
@ -2839,6 +2840,7 @@ static int __cmp_int_str (
|
|||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||||
{
|
{
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __cmp_real_nil (
|
static int __cmp_real_nil (
|
||||||
@ -2873,6 +2875,7 @@ static int __cmp_real_str (
|
|||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||||
{
|
{
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __cmp_str_nil (
|
static int __cmp_str_nil (
|
||||||
@ -2942,398 +2945,43 @@ static int __cmp_val (
|
|||||||
static xp_awk_val_t* __eval_binop_eq (
|
static xp_awk_val_t* __eval_binop_eq (
|
||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||||
{
|
{
|
||||||
if (left->type == XP_AWK_VAL_NIL ||
|
return (__cmp_val (run, left, right) == 0)?
|
||||||
right->type == XP_AWK_VAL_NIL)
|
xp_awk_val_one: xp_awk_val_zero;
|
||||||
{
|
|
||||||
return xp_awk_val_one;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_STR &&
|
|
||||||
right->type == XP_AWK_VAL_STR)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
xp_awk_val_str_t* ls, * rs;
|
|
||||||
|
|
||||||
ls = (xp_awk_val_str_t*)left;
|
|
||||||
rs = (xp_awk_val_str_t*)right;
|
|
||||||
|
|
||||||
if (run->global.ignorecase)
|
|
||||||
{
|
|
||||||
n = xp_awk_strxncasecmp (run->awk,
|
|
||||||
ls->buf, ls->len, rs->buf, rs->len);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
n = xp_awk_strxncmp (
|
|
||||||
ls->buf, ls->len, rs->buf, rs->len);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (n == 0)? xp_awk_val_one: xp_awk_val_zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
xp_awk_val_int_t* li, * ri;
|
|
||||||
li = (xp_awk_val_int_t*)left;
|
|
||||||
ri = (xp_awk_val_int_t*)right;
|
|
||||||
return (li->val == ri->val)? xp_awk_val_one: xp_awk_val_zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
xp_awk_val_real_t* lr, * rr;
|
|
||||||
lr = (xp_awk_val_real_t*)left;
|
|
||||||
rr = (xp_awk_val_real_t*)right;
|
|
||||||
return (lr->val == rr->val)? xp_awk_val_one: xp_awk_val_zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
xp_awk_val_int_t* li;
|
|
||||||
xp_awk_val_real_t* rr;
|
|
||||||
li = (xp_awk_val_int_t*)left;
|
|
||||||
rr = (xp_awk_val_real_t*)right;
|
|
||||||
return (li->val == rr->val)? xp_awk_val_one: xp_awk_val_zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
xp_awk_val_real_t* lr;
|
|
||||||
xp_awk_val_int_t* ri;
|
|
||||||
lr = (xp_awk_val_real_t*)left;
|
|
||||||
ri = (xp_awk_val_int_t*)right;
|
|
||||||
return (lr->val == ri->val)? xp_awk_val_one: xp_awk_val_zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_STR)
|
|
||||||
{
|
|
||||||
return xp_awk_val_zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_STR)
|
|
||||||
{
|
|
||||||
return xp_awk_val_zero;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* not comparable */
|
|
||||||
return xp_awk_val_zero;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_binop_ne (
|
static xp_awk_val_t* __eval_binop_ne (
|
||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||||
{
|
{
|
||||||
xp_awk_val_t* res = XP_NULL;
|
return (__cmp_val (run, left, right) != 0)?
|
||||||
xp_long_t r = 0;
|
xp_awk_val_one: xp_awk_val_zero;
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_NIL ||
|
|
||||||
right->type == XP_AWK_VAL_NIL)
|
|
||||||
{
|
|
||||||
r = (left->type != right->type);
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val !=
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val !=
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val !=
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val !=
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_STR &&
|
|
||||||
right->type == XP_AWK_VAL_STR)
|
|
||||||
{
|
|
||||||
if (run->global.ignorecase)
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncasecmp (
|
|
||||||
run->awk,
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) != 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncmp (
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) != 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PANIC (run, XP_AWK_EOPERAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
res = xp_awk_makeintval (run, r);
|
|
||||||
if (res == XP_NULL) PANIC (run, XP_AWK_ENOMEM);
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_binop_gt (
|
static xp_awk_val_t* __eval_binop_gt (
|
||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||||
{
|
{
|
||||||
xp_awk_val_t* res = XP_NULL;
|
return (__cmp_val (run, left, right) > 0)?
|
||||||
xp_long_t r = 0;
|
xp_awk_val_one: xp_awk_val_zero;
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val >
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val >
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val >
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val >
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_STR &&
|
|
||||||
right->type == XP_AWK_VAL_STR)
|
|
||||||
{
|
|
||||||
if (run->global.ignorecase)
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncasecmp (
|
|
||||||
run->awk,
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) > 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncmp (
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) > 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PANIC (run, XP_AWK_EOPERAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
res = xp_awk_makeintval (run, r);
|
|
||||||
if (res == XP_NULL) PANIC (run, XP_AWK_ENOMEM);
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_binop_ge (
|
static xp_awk_val_t* __eval_binop_ge (
|
||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||||
{
|
{
|
||||||
xp_awk_val_t* res = XP_NULL;
|
return (__cmp_val (run, left, right) >= 0)?
|
||||||
xp_long_t r = 0;
|
xp_awk_val_one: xp_awk_val_zero;
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val >=
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val >=
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val >=
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val >=
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_STR &&
|
|
||||||
right->type == XP_AWK_VAL_STR)
|
|
||||||
{
|
|
||||||
if (run->global.ignorecase)
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncasecmp (
|
|
||||||
run->awk,
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) >= 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncmp (
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) >= 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PANIC (run, XP_AWK_EOPERAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
res = xp_awk_makeintval (run, r);
|
|
||||||
if (res == XP_NULL) PANIC (run, XP_AWK_ENOMEM);
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_binop_lt (
|
static xp_awk_val_t* __eval_binop_lt (
|
||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||||
{
|
{
|
||||||
xp_awk_val_t* res = XP_NULL;
|
return (__cmp_val (run, left, right) < 0)?
|
||||||
xp_long_t r = 0;
|
xp_awk_val_one: xp_awk_val_zero;
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val <
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val <
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val <
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val <
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_STR &&
|
|
||||||
right->type == XP_AWK_VAL_STR)
|
|
||||||
{
|
|
||||||
if (run->global.ignorecase)
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncasecmp (
|
|
||||||
run->awk,
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) < 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncmp (
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) < 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PANIC (run, XP_AWK_EOPERAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
res = xp_awk_makeintval (run, r);
|
|
||||||
if (res == XP_NULL) PANIC (run, XP_AWK_ENOMEM);
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_binop_le (
|
static xp_awk_val_t* __eval_binop_le (
|
||||||
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
|
||||||
{
|
{
|
||||||
xp_awk_val_t* res = XP_NULL;
|
return (__cmp_val (run, left, right) <= 0)?
|
||||||
xp_long_t r = 0;
|
xp_awk_val_one: xp_awk_val_zero;
|
||||||
|
|
||||||
if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val <=
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val <=
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_INT &&
|
|
||||||
right->type == XP_AWK_VAL_REAL)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_int_t*)left)->val <=
|
|
||||||
((xp_awk_val_real_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_REAL &&
|
|
||||||
right->type == XP_AWK_VAL_INT)
|
|
||||||
{
|
|
||||||
r = ((xp_awk_val_real_t*)left)->val <=
|
|
||||||
((xp_awk_val_int_t*)right)->val;
|
|
||||||
}
|
|
||||||
else if (left->type == XP_AWK_VAL_STR &&
|
|
||||||
right->type == XP_AWK_VAL_STR)
|
|
||||||
{
|
|
||||||
if (run->global.ignorecase)
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncasecmp (
|
|
||||||
run->awk,
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) <= 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r = xp_awk_strxncmp (
|
|
||||||
((xp_awk_val_str_t*)left)->buf,
|
|
||||||
((xp_awk_val_str_t*)left)->len,
|
|
||||||
((xp_awk_val_str_t*)right)->buf,
|
|
||||||
((xp_awk_val_str_t*)right)->len) <= 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PANIC (run, XP_AWK_EOPERAND);
|
|
||||||
}
|
|
||||||
|
|
||||||
res = xp_awk_makeintval (run, r);
|
|
||||||
if (res == XP_NULL) PANIC (run, XP_AWK_ENOMEM);
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_binop_lshift (
|
static xp_awk_val_t* __eval_binop_lshift (
|
||||||
|
Loading…
Reference in New Issue
Block a user