]> code.delx.au - gnu-emacs/blobdiff - src/floatfns.c
(Frename_file) [WINDOWSNT]: Remove conditional code.
[gnu-emacs] / src / floatfns.c
index 42d315d208a57899a5816573f857a2f7229aa4f5..bedd82bb759bce534c0a333f6c28bc5cbc1c470c 100644 (file)
@@ -15,7 +15,8 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 
 /* ANSI C requires only these float functions:
@@ -37,7 +38,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
    (What systems actually do this?  Please let us know.)
 
    Define FLOAT_CHECK_DOMAIN if the float library doesn't handle errors by
-   either setting errno, or signalling SIGFPE/SIGILL.  Otherwise, domain and
+   either setting errno, or signaling SIGFPE/SIGILL.  Otherwise, domain and
    range checking will happen before calling the float routines.  This has
    no effect if HAVE_MATHERR is defined (since matherr will be called when
    a domain error occurs.)
@@ -53,13 +54,6 @@ Lisp_Object Qarith_error;
 
 #ifdef LISP_FLOAT_TYPE
 
-#ifdef MSDOS
-/* These are redefined (correctly, but differently) in values.h.  */
-#undef INTBITS
-#undef LONGBITS
-#undef SHORTBITS
-#endif
-
 /* Work around a problem that happens because math.h on hpux 7
    defines two static variables--which, in Emacs, are not really static,
    because `static' is defined as nothing.  The problem is that they are
@@ -73,18 +67,16 @@ Lisp_Object Qarith_error;
 #include <math.h>
 
 /* This declaration is omitted on some systems, like Ultrix.  */
-#if !defined (HPUX) && defined (HAVE_LOGB)
+#if !defined (HPUX) && defined (HAVE_LOGB) && !defined (logb)
 extern double logb ();
-#endif /* not HPUX and HAVE_LOGB */
+#endif /* not HPUX and HAVE_LOGB and no logb macro */
 
-#ifndef MSDOS
 #if defined(DOMAIN) && defined(SING) && defined(OVERFLOW)
     /* If those are defined, then this is probably a `matherr' machine. */
 # ifndef HAVE_MATHERR
 #  define HAVE_MATHERR
 # endif
 #endif
-#endif
 
 #ifdef NO_MATHERR
 #undef HAVE_MATHERR
@@ -182,17 +174,19 @@ static char *float_error_fn_name;
 #define FLOAT_TO_INT(x, i, name, num)                                  \
   do                                                                   \
     {                                                                  \
-      if ((x) >= (1 << (VALBITS-1)) || (x) <= - (1 << (VALBITS-1)) - 1)        \
+      if ((x) >= (((EMACS_INT) 1) << (VALBITS-1)) ||                   \
+         (x) <= - (((EMACS_INT) 1) << (VALBITS-1)) - 1)                \
        range_error (name, num);                                        \
-      XSET (i, Lisp_Int,  (int)(x));                                   \
+      XSETINT (i,  (EMACS_INT)(x));                                    \
     }                                                                  \
   while (0)
 #define FLOAT_TO_INT2(x, i, name, num1, num2)                          \
   do                                                                   \
     {                                                                  \
-      if ((x) >= (1 << (VALBITS-1)) || (x) <= - (1 << (VALBITS-1)) - 1)        \
+      if ((x) >= (((EMACS_INT) 1) << (VALBITS-1)) ||                   \
+         (x) <= - (((EMACS_INT) 1) << (VALBITS-1)) - 1)                \
        range_error2 (name, num1, num2);                                \
-      XSET (i, Lisp_Int,  (int)(x));                                   \
+      XSETINT (i,  (EMACS_INT)(x));                                    \
     }                                                                  \
   while (0)
 
@@ -217,7 +211,7 @@ extract_float (num)
 {
   CHECK_NUMBER_OR_FLOAT (num, 0);
 
-  if (XTYPE (num) == Lisp_Float)
+  if (FLOATP (num))
     return XFLOAT (num)->data;
   return (double) XINT (num);
 }
@@ -322,13 +316,13 @@ DEFUN ("bessel-j1", Fbessel_j1, Sbessel_j1, 1, 1, 0,
 DEFUN ("bessel-jn", Fbessel_jn, Sbessel_jn, 2, 2, 0,
   "Return the order N bessel function output jn of ARG.\n\
 The first arg (the order) is truncated to an integer.")
-  (arg1, arg2)
-     register Lisp_Object arg1, arg2;
+  (n, arg)
+     register Lisp_Object n, arg;
 {
-  int i1 = extract_float (arg1);
-  double f2 = extract_float (arg2);
+  int i1 = extract_float (n);
+  double f2 = extract_float (arg);
 
-  IN_FLOAT (f2 = jn (i1, f2), "bessel-jn", arg1);
+  IN_FLOAT (f2 = jn (i1, f2), "bessel-jn", n);
   return make_float (f2);
 }
 
@@ -355,13 +349,13 @@ DEFUN ("bessel-y1", Fbessel_y1, Sbessel_y1, 1, 1, 0,
 DEFUN ("bessel-yn", Fbessel_yn, Sbessel_yn, 2, 2, 0,
   "Return the order N bessel function output yn of ARG.\n\
 The first arg (the order) is truncated to an integer.")
-  (arg1, arg2)
-     register Lisp_Object arg1, arg2;
+  (n, arg)
+     register Lisp_Object n, arg;
 {
-  int i1 = extract_float (arg1);
-  double f2 = extract_float (arg2);
+  int i1 = extract_float (n);
+  double f2 = extract_float (arg);
 
-  IN_FLOAT (f2 = yn (i1, f2), "bessel-yn", arg1);
+  IN_FLOAT (f2 = yn (i1, f2), "bessel-yn", n);
   return make_float (f2);
 }
 
@@ -436,7 +430,7 @@ DEFUN ("exp", Fexp, Sexp, 1, 1, 0,
 }
 
 DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0,
-  "Return the exponential X ** Y.")
+  "Return the exponential ARG1 ** ARG2.")
   (arg1, arg2)
      register Lisp_Object arg1, arg2;
 {
@@ -444,10 +438,10 @@ DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0,
 
   CHECK_NUMBER_OR_FLOAT (arg1, 0);
   CHECK_NUMBER_OR_FLOAT (arg2, 0);
-  if (XTYPE (arg1) == Lisp_Int     /* common lisp spec */
-      && XTYPE (arg2) == Lisp_Int) /* don't promote, if both are ints */
+  if (INTEGERP (arg1)     /* common lisp spec */
+      && INTEGERP (arg2)) /* don't promote, if both are ints */
     {                          /* this can be improved by pre-calculating */
-      int acc, x, y;           /* some binary powers of x then accumulating */
+      EMACS_INT acc, x, y;     /* some binary powers of x then accumulating */
       Lisp_Object val;
 
       x = XINT (arg1);
@@ -473,11 +467,11 @@ DEFUN ("expt", Fexpt, Sexpt, 2, 2, 0,
              y = (unsigned)y >> 1;
            }
        }
-      XSET (val, Lisp_Int, acc);
+      XSETINT (val, acc);
       return val;
     }
-  f1 = (XTYPE (arg1) == Lisp_Float) ? XFLOAT (arg1)->data : XINT (arg1);
-  f2 = (XTYPE (arg2) == Lisp_Float) ? XFLOAT (arg2)->data : XINT (arg2);
+  f1 = FLOATP (arg1) ? XFLOAT (arg1)->data : XINT (arg1);
+  f2 = FLOATP (arg2) ? XFLOAT (arg2)->data : XINT (arg2);
   /* Really should check for overflow, too */
   if (f1 == 0.0 && f2 == 0.0)
     f1 = 1.0;
@@ -645,10 +639,10 @@ DEFUN ("abs", Fabs, Sabs, 1, 1, 0,
 {
   CHECK_NUMBER_OR_FLOAT (arg, 0);
 
-  if (XTYPE (arg) == Lisp_Float)
+  if (FLOATP (arg))
     IN_FLOAT (arg = make_float (fabs (XFLOAT (arg)->data)), "abs", arg);
   else if (XINT (arg) < 0)
-    XSETINT (arg, - XFASTINT (arg));
+    XSETINT (arg, - XINT (arg));
 
   return arg;
 }
@@ -660,7 +654,7 @@ DEFUN ("float", Ffloat, Sfloat, 1, 1, 0,
 {
   CHECK_NUMBER_OR_FLOAT (arg, 0);
 
-  if (XTYPE (arg) == Lisp_Int)
+  if (INTEGERP (arg))
     return make_float ((double) XINT (arg));
   else                         /* give 'em the same float back */
     return arg;
@@ -673,7 +667,7 @@ This is the same as the exponent of a float.")
      Lisp_Object arg;
 {
   Lisp_Object val;
-  int value;
+  EMACS_INT value;
   double f = extract_float (arg);
 
   if (f == 0.0)
@@ -684,8 +678,9 @@ This is the same as the exponent of a float.")
       IN_FLOAT (value = logb (f), "logb", arg);
 #else
 #ifdef HAVE_FREXP
-      IN_FLOAT (frexp (f, &value), "logb", arg);
-      value--;
+      int ivalue;
+      IN_FLOAT (frexp (f, &ivalue), "logb", arg);
+      value = ivalue - 1;
 #else
       int i;
       double d;
@@ -709,7 +704,7 @@ This is the same as the exponent of a float.")
 #endif
 #endif
     }
-  XSET (val, Lisp_Int, value);
+  XSETINT (val, value);
   return val;
 }
 
@@ -722,7 +717,7 @@ DEFUN ("ceiling", Fceiling, Sceiling, 1, 1, 0,
 {
   CHECK_NUMBER_OR_FLOAT (arg, 0);
 
-  if (XTYPE (arg) == Lisp_Float)
+  if (FLOATP (arg))
     {
       double d;
 
@@ -746,18 +741,17 @@ With optional DIVISOR, return the largest integer no greater than ARG/DIVISOR.")
 
   if (! NILP (divisor))
     {
-      int i1, i2;
+      EMACS_INT i1, i2;
 
       CHECK_NUMBER_OR_FLOAT (divisor, 1);
 
 #ifdef LISP_FLOAT_TYPE
-      if (XTYPE (arg) == Lisp_Float || XTYPE (divisor) == Lisp_Float)
+      if (FLOATP (arg) || FLOATP (divisor))
        {
          double f1, f2;
 
-         f1 = XTYPE (arg) == Lisp_Float ? XFLOAT (arg)->data : XINT (arg);
-         f2 = (XTYPE (divisor) == Lisp_Float
-               ? XFLOAT (divisor)->data : XINT (divisor));
+         f1 = FLOATP (arg) ? XFLOAT (arg)->data : XINT (arg);
+         f2 = (FLOATP (divisor) ? XFLOAT (divisor)->data : XINT (divisor));
          if (f2 == 0)
            Fsignal (Qarith_error, Qnil);
 
@@ -779,12 +773,12 @@ With optional DIVISOR, return the largest integer no greater than ARG/DIVISOR.")
            ? (i1 <= 0  ?  -i1 / -i2  :  -1 - ((i1 - 1) / -i2))
            : (i1 < 0  ?  -1 - ((-1 - i1) / i2)  :  i1 / i2));
 
-      XSET (arg, Lisp_Int, i1);
+      XSETINT (arg, i1);
       return arg;
     }
 
 #ifdef LISP_FLOAT_TYPE
-  if (XTYPE (arg) == Lisp_Float)
+  if (FLOATP (arg))
     {
       double d;
       IN_FLOAT (d = floor (XFLOAT (arg)->data), "floor", arg);
@@ -804,7 +798,7 @@ DEFUN ("round", Fround, Sround, 1, 1, 0,
 {
   CHECK_NUMBER_OR_FLOAT (arg, 0);
 
-  if (XTYPE (arg) == Lisp_Float)
+  if (FLOATP (arg))
     {
       double d;
 
@@ -824,7 +818,7 @@ Rounds the value toward zero.")
 {
   CHECK_NUMBER_OR_FLOAT (arg, 0);
 
-  if (XTYPE (arg) == Lisp_Float)
+  if (FLOATP (arg))
     {
       double d;