aboutsummaryrefslogtreecommitdiffstats
path: root/ast_expr.y
diff options
context:
space:
mode:
Diffstat (limited to 'ast_expr.y')
-rwxr-xr-xast_expr.y68
1 files changed, 40 insertions, 28 deletions
diff --git a/ast_expr.y b/ast_expr.y
index 97b2b021c..df08f6829 100755
--- a/ast_expr.y
+++ b/ast_expr.y
@@ -215,6 +215,7 @@ struct val *vp;
}
if (vp->type == string || vp->type == numeric_string)
free (vp->u.s);
+ free (vp);
}
@@ -650,19 +651,24 @@ struct val *a, *b;
{
struct val *r;
- if (!to_integer (a) || !to_integer (b)) {
+ if (!to_integer (a)) {
ast_log(LOG_WARNING,"non-numeric argument\n");
- free_value(a);
+ if (!to_integer (b)) {
+ free_value(a);
+ free_value(b);
+ return make_integer(0);
+ } else {
+ free_value(a);
+ return (b);
+ }
+ } else if (!to_integer(b)) {
free_value(b);
- return(NULL);
+ return (a);
}
r = make_integer (/*(quad_t)*/(a->u.i + b->u.i));
if (chk_plus (a->u.i, b->u.i, r->u.i)) {
ast_log(LOG_WARNING,"overflow\n");
- free_value(a);
- free_value(b);
- return(NULL);
}
free_value (a);
free_value (b);
@@ -690,19 +696,27 @@ struct val *a, *b;
{
struct val *r;
- if (!to_integer (a) || !to_integer (b)) {
- free_value(a);
- free_value(b);
+ if (!to_integer (a)) {
ast_log(LOG_WARNING, "non-numeric argument\n");
- return(NULL);
+ if (!to_integer (b)) {
+ free_value(a);
+ free_value(b);
+ return make_integer(0);
+ } else {
+ r = make_integer(0 - b->u.i);
+ free_value(a);
+ free_value(b);
+ return (r);
+ }
+ } else if (!to_integer(b)) {
+ ast_log(LOG_WARNING, "non-numeric argument\n");
+ free_value(b);
+ return (a);
}
r = make_integer (/*(quad_t)*/(a->u.i - b->u.i));
if (chk_minus (a->u.i, b->u.i, r->u.i)) {
- free_value(a);
- free_value(b);
- ast_log(LOG_WARNING, "overload\n");
- return(NULL);
+ ast_log(LOG_WARNING, "overflow\n");
}
free_value (a);
free_value (b);
@@ -732,15 +746,12 @@ struct val *a, *b;
free_value(a);
free_value(b);
ast_log(LOG_WARNING, "non-numeric argument\n");
- return(NULL);
+ return(make_integer(0));
}
r = make_integer (/*(quad_t)*/(a->u.i * b->u.i));
if (chk_times (a->u.i, b->u.i, r->u.i)) {
ast_log(LOG_WARNING, "overflow\n");
- free_value(a);
- free_value(b);
- return(NULL);
}
free_value (a);
free_value (b);
@@ -765,26 +776,28 @@ struct val *a, *b;
{
struct val *r;
- if (!to_integer (a) || !to_integer (b)) {
+ if (!to_integer (a)) {
free_value(a);
free_value(b);
ast_log(LOG_WARNING, "non-numeric argument\n");
- return(NULL);
+ return make_integer(0);
+ } else if (!to_integer (b)) {
+ free_value(a);
+ free_value(b);
+ ast_log(LOG_WARNING, "non-numeric argument\n");
+ return make_integer(INT_MAX);
}
if (b->u.i == 0) {
ast_log(LOG_WARNING, "division by zero\n");
free_value(a);
free_value(b);
- return(NULL);
+ return make_integer(INT_MAX);
}
r = make_integer (/*(quad_t)*/(a->u.i / b->u.i));
if (chk_div (a->u.i, b->u.i)) {
ast_log(LOG_WARNING, "overflow\n");
- free_value(a);
- free_value(b);
- return(NULL);
}
free_value (a);
free_value (b);
@@ -801,14 +814,13 @@ struct val *a, *b;
ast_log(LOG_WARNING, "non-numeric argument\n");
free_value(a);
free_value(b);
- return(NULL);
+ return make_integer(0);
}
if (b->u.i == 0) {
ast_log(LOG_WARNING, "div by zero\n");
free_value(a);
- free_value(b);
- return(NULL);
+ return (b);
}
r = make_integer (/*(quad_t)*/(a->u.i % b->u.i));
@@ -838,7 +850,7 @@ struct val *a, *b;
ast_log(LOG_WARNING,"regcomp() error : %s",errbuf);
free_value(a);
free_value(b);
- return(NULL);
+ return make_str("");
}
/* compare string against pattern */