Mercurial > hg > index.cgi
diff lwlib/lw_expr.c @ 249:1f1a28b797e1
Add trap for divide by zero in expression library
Added a trap for division by zero in the expression library and adjusted
lwasm to use it and report division by zero errors instead of crashing with
a cryptic "arithmetic exception" or even more mysterious "floating point
exception".
author | William Astle <lost@l-w.ca> |
---|---|
date | Fri, 25 Jan 2013 21:48:01 -0700 |
parents | 348e2816ce32 |
children | 644f8abf87dc |
line wrap: on
line diff
--- a/lwlib/lw_expr.c Thu Jan 24 21:24:32 2013 -0700 +++ b/lwlib/lw_expr.c Fri Jan 25 21:48:01 2013 -0700 @@ -38,6 +38,21 @@ static int level = 0; static int bailing = 0; +static void (*divzero)(void *priv) = NULL; + +void lw_expr_setdivzero(void (*fn)(void *priv)) +{ + divzero = fn; +} + +static void lw_expr_divzero(void *priv) +{ + if (divzero) + (*divzero)(priv); + else + fprintf(stderr, "Divide by zero in lw_expr!\n"); +} + int lw_expr_istype(lw_expr_t e, int t) { /* NULL expression is never of any type */ @@ -719,6 +734,12 @@ break; case lw_expr_oper_divide: + if (E -> operands -> next -> p -> value == 0) + { + tr = 0; + lw_expr_divzero(priv); + break; + } tr = E -> operands -> p -> value / E -> operands -> next -> p -> value; break; @@ -727,6 +748,12 @@ break; case lw_expr_oper_intdiv: + if (E -> operands -> next -> p -> value == 0) + { + tr = 0; + lw_expr_divzero(priv); + break; + } tr = E -> operands -> p -> value / E -> operands -> next -> p -> value; break;