comparison src/data.c @ 3338:30b946dd8c66

(float_arith_driver): Detect division by zero in advance. (arith_driver, Frem): Likewise.
author Richard M. Stallman <rms@gnu.org>
date Mon, 31 May 1993 03:39:07 +0000
parents e94a593c3952
children cb9eb3e46e2c
comparison
equal deleted inserted replaced
3337:f5f76ebe6286 3338:30b946dd8c66
1548 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin }; 1548 { Aadd, Asub, Amult, Adiv, Alogand, Alogior, Alogxor, Amax, Amin };
1549 1549
1550 extern Lisp_Object float_arith_driver (); 1550 extern Lisp_Object float_arith_driver ();
1551 1551
1552 Lisp_Object 1552 Lisp_Object
1553 arith_driver 1553 arith_driver (code, nargs, args)
1554 (code, nargs, args)
1555 enum arithop code; 1554 enum arithop code;
1556 int nargs; 1555 int nargs;
1557 register Lisp_Object *args; 1556 register Lisp_Object *args;
1558 { 1557 {
1559 register Lisp_Object val; 1558 register Lisp_Object val;
1605 accum -= next; 1604 accum -= next;
1606 break; 1605 break;
1607 case Amult: accum *= next; break; 1606 case Amult: accum *= next; break;
1608 case Adiv: 1607 case Adiv:
1609 if (!argnum) accum = next; 1608 if (!argnum) accum = next;
1610 else accum /= next; 1609 else
1610 {
1611 if (next == 0)
1612 Fsignal (Qarith_error, Qnil);
1613 accum /= next;
1614 }
1611 break; 1615 break;
1612 case Alogand: accum &= next; break; 1616 case Alogand: accum &= next; break;
1613 case Alogior: accum |= next; break; 1617 case Alogior: accum |= next; break;
1614 case Alogxor: accum ^= next; break; 1618 case Alogxor: accum ^= next; break;
1615 case Amax: if (!argnum || next > accum) accum = next; break; 1619 case Amax: if (!argnum || next > accum) accum = next; break;
1666 break; 1670 break;
1667 case Adiv: 1671 case Adiv:
1668 if (!argnum) 1672 if (!argnum)
1669 accum = next; 1673 accum = next;
1670 else 1674 else
1671 accum /= next; 1675 {
1676 if (next == 0)
1677 Fsignal (Qarith_error, Qnil);
1678 accum /= next;
1679 }
1672 break; 1680 break;
1673 case Alogand: 1681 case Alogand:
1674 case Alogior: 1682 case Alogior:
1675 case Alogxor: 1683 case Alogxor:
1676 return wrong_type_argument (Qinteger_or_marker_p, val); 1684 return wrong_type_argument (Qinteger_or_marker_p, val);
1744 { 1752 {
1745 double f1, f2; 1753 double f1, f2;
1746 1754
1747 f1 = XTYPE (num1) == Lisp_Float ? XFLOAT (num1)->data : XINT (num1); 1755 f1 = XTYPE (num1) == Lisp_Float ? XFLOAT (num1)->data : XINT (num1);
1748 f2 = XTYPE (num2) == Lisp_Float ? XFLOAT (num2)->data : XINT (num2); 1756 f2 = XTYPE (num2) == Lisp_Float ? XFLOAT (num2)->data : XINT (num2);
1757 if (f2 == 0)
1758 Fsignal (Qarith_error, Qnil);
1759
1749 #if defined (USG) || defined (sun) || defined (ultrix) || defined (hpux) 1760 #if defined (USG) || defined (sun) || defined (ultrix) || defined (hpux)
1750 f1 = fmod (f1, f2); 1761 f1 = fmod (f1, f2);
1751 #else 1762 #else
1752 f1 = drem (f1, f2); 1763 f1 = drem (f1, f2);
1753 #endif 1764 #endif
1757 } 1768 }
1758 #else /* not LISP_FLOAT_TYPE */ 1769 #else /* not LISP_FLOAT_TYPE */
1759 CHECK_NUMBER_COERCE_MARKER (num1, 0); 1770 CHECK_NUMBER_COERCE_MARKER (num1, 0);
1760 CHECK_NUMBER_COERCE_MARKER (num2, 1); 1771 CHECK_NUMBER_COERCE_MARKER (num2, 1);
1761 #endif /* not LISP_FLOAT_TYPE */ 1772 #endif /* not LISP_FLOAT_TYPE */
1773
1774 if (XFASTINT (num2) == 0)
1775 Fsignal (Qarith_error, Qnil);
1762 1776
1763 XSET (val, Lisp_Int, XINT (num1) % XINT (num2)); 1777 XSET (val, Lisp_Int, XINT (num1) % XINT (num2));
1764 return val; 1778 return val;
1765 } 1779 }
1766 1780