Mercurial > emacs
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 |