changeset 603:1c880911c386

[xemacs-hg @ 2001-06-01 08:23:09 by martinb] Fix a bunch of 128-bit bugs
author martinb
date Fri, 01 Jun 2001 08:23:12 +0000
parents b9f1a2e84ead
children fa3b8eb89cb2
files src/ChangeLog src/data.c src/lisp.h src/print.c src/redisplay.c src/tooltalk.c
diffstat 6 files changed, 35 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Fri Jun 01 08:17:05 2001 +0000
+++ b/src/ChangeLog	Fri Jun 01 08:23:12 2001 +0000
@@ -1,3 +1,13 @@
+2001-06-01  Martin Buchholz  <martin@xemacs.org>
+
+	* lisp.h (DECIMAL_PRINT_SIZE): New.
+	* data.c (Fnumber_to_string): Use DECIMAL_PRINT_SIZE
+	* print.c (print_internal): Likewise.
+	* redisplay.c (window_line_number): Likewise.
+	* redisplay.c (decode_mode_spec): Likewise.
+	* tooltalk.c (tt_message_arg_ival_string): Likewise.
+	Fix a bunch of 128-bit bugs; make code more readable && efficient.
+
 2001-05-30  Ben Wing  <ben@xemacs.org>
 
 	* s\cygwin32.h:
--- a/src/data.c	Fri Jun 01 08:17:05 2001 +0000
+++ b/src/data.c	Fri Jun 01 08:23:12 2001 +0000
@@ -1013,8 +1013,6 @@
 */
        (number))
 {
-  char buffer[VALBITS];
-
   CHECK_INT_OR_FLOAT (number);
 
 #ifdef LISP_FLOAT_TYPE
@@ -1027,8 +1025,12 @@
     }
 #endif /* LISP_FLOAT_TYPE */
 
-  long_to_string (buffer, XINT (number));
-  return build_string (buffer);
+  {
+    char buffer[DECIMAL_PRINT_SIZE (long)];
+
+    long_to_string (buffer, XINT (number));
+    return build_string (buffer);
+  }
 }
 
 static int
--- a/src/lisp.h	Fri Jun 01 08:17:05 2001 +0000
+++ b/src/lisp.h	Fri Jun 01 08:23:12 2001 +0000
@@ -2839,7 +2839,15 @@
 void print_cons (Lisp_Object, Lisp_Object, int);
 void print_vector (Lisp_Object, Lisp_Object, int);
 void print_string (Lisp_Object, Lisp_Object, int);
+
+/* The number of bytes required to store the decimal printed
+   representation of an integral type.  Add a few bytes for truncation,
+   optional sign prefix, and null byte terminator.
+   2.40824 == log (256) / log (10).  */
+#define DECIMAL_PRINT_SIZE(integral_type) \
+((size_t) (2.40824 * sizeof (integral_type)) + 3)
 void long_to_string (char *, long);
+
 void print_internal (Lisp_Object, Lisp_Object, int);
 void print_symbol (Lisp_Object, Lisp_Object, int);
 void print_float (Lisp_Object, Lisp_Object, int);
--- a/src/print.c	Fri Jun 01 08:17:05 2001 +0000
+++ b/src/print.c	Fri Jun 01 08:23:12 2001 +0000
@@ -1288,7 +1288,7 @@
       for (i = 0; i < print_depth; i++)
 	if (EQ (obj, being_printed[i]))
 	  {
-	    char buf[32];
+	    char buf[DECIMAL_PRINT_SIZE (long) + 1];
 	    *buf = '#';
 	    long_to_string (buf + 1, i);
 	    write_c_string (buf, printcharfun);
@@ -1307,9 +1307,7 @@
     case Lisp_Type_Int_Even:
     case Lisp_Type_Int_Odd:
       {
-	/* ASCII Decimal representation uses 2.4 times as many bits as
-	   machine binary.  */
-	char buf[3 * sizeof (EMACS_INT) + 5];
+	char buf[DECIMAL_PRINT_SIZE (EMACS_INT)];
 	long_to_string (buf, XINT (obj));
 	write_c_string (buf, printcharfun);
 	break;
--- a/src/redisplay.c	Fri Jun 01 08:17:05 2001 +0000
+++ b/src/redisplay.c	Fri Jun 01 08:23:12 2001 +0000
@@ -6626,8 +6626,6 @@
 }
 
 
-static char window_line_number_buf[32];
-
 /* Efficiently determine the window line number, and return a pointer
    to its printed representation.  Do this regardless of whether
    line-number-mode is on.  The first line in the buffer is counted as
@@ -6652,9 +6650,13 @@
 
   line = buffer_line_number (b, pos, 1);
 
-  long_to_string (window_line_number_buf, line + 1);
-
-  return window_line_number_buf;
+  {
+    static char window_line_number_buf[DECIMAL_PRINT_SIZE (long)];
+
+    long_to_string (window_line_number_buf, line + 1);
+
+    return window_line_number_buf;
+  }
 }
 
 
@@ -6698,7 +6700,7 @@
                     ? BUF_PT (b)
                     : marker_position (w->pointm[type]);
 	int col = column_at_point (b, pt, 1) + !!column_number_start_at_one;
-	char buf[32];
+	char buf[DECIMAL_PRINT_SIZE (long)];
 
 	long_to_string (buf, col);
 
--- a/src/tooltalk.c	Fri Jun 01 08:17:05 2001 +0000
+++ b/src/tooltalk.c	Fri Jun 01 08:23:12 2001 +0000
@@ -520,7 +520,7 @@
 static Lisp_Object
 tt_message_arg_ival_string (Tt_message m, int n)
 {
-  char buf[32];
+  char buf[DECIMAL_PRINT_SIZE (long)];
   int value;
 
   check_status (tt_message_arg_ival (m, n, &value));