X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/efc00ab16e2890b75d7224434ac43fe944ade4dd..7555c33f15ef5ae98508daf9b17b03aea379c78f:/src/print.c
diff --git a/src/print.c b/src/print.c
index 2158d06dbc..e12313688f 100644
--- a/src/print.c
+++ b/src/print.c
@@ -23,8 +23,8 @@ along with GNU Emacs. If not, see . */
#include
#include
#include "lisp.h"
-#include "buffer.h"
#include "character.h"
+#include "buffer.h"
#include "charset.h"
#include "keyboard.h"
#include "frame.h"
@@ -912,7 +912,7 @@ print_error_message (Lisp_Object data, Lisp_Object stream, const char *context,
for (; CONSP (tail); tail = XCDR (tail), sep = ", ")
{
Lisp_Object obj;
-
+
if (sep)
write_string_1 (sep, 2, stream);
obj = XCAR (tail);
@@ -944,43 +944,49 @@ print_error_message (Lisp_Object data, Lisp_Object stream, const char *context,
* Given the above, the buffer must be least FLOAT_TO_STRING_BUFSIZE bytes.
*/
-void
+int
float_to_string (char *buf, double data)
{
char *cp;
int width;
+ int len;
/* Check for plus infinity in a way that won't lose
if there is no plus infinity. */
if (data == data / 2 && data > 1.0)
{
- strcpy (buf, "1.0e+INF");
- return;
+ static char const infinity_string[] = "1.0e+INF";
+ strcpy (buf, infinity_string);
+ return sizeof infinity_string - 1;
}
/* Likewise for minus infinity. */
if (data == data / 2 && data < -1.0)
{
- strcpy (buf, "-1.0e+INF");
- return;
+ static char const minus_infinity_string[] = "-1.0e+INF";
+ strcpy (buf, minus_infinity_string);
+ return sizeof minus_infinity_string - 1;
}
/* Check for NaN in a way that won't fail if there are no NaNs. */
if (! (data * 0.0 >= 0.0))
{
/* Prepend "-" if the NaN's sign bit is negative.
The sign bit of a double is the bit that is 1 in -0.0. */
+ static char const NaN_string[] = "0.0e+NaN";
int i;
union { double d; char c[sizeof (double)]; } u_data, u_minus_zero;
+ int negative = 0;
u_data.d = data;
u_minus_zero.d = - 0.0;
for (i = 0; i < sizeof (double); i++)
if (u_data.c[i] & u_minus_zero.c[i])
{
- *buf++ = '-';
+ *buf = '-';
+ negative = 1;
break;
}
- strcpy (buf, "0.0e+NaN");
- return;
+ strcpy (buf + negative, NaN_string);
+ return negative + sizeof NaN_string - 1;
}
if (NILP (Vfloat_output_format)
@@ -989,7 +995,7 @@ float_to_string (char *buf, double data)
{
/* Generate the fewest number of digits that represent the
floating point value without losing information. */
- dtoastr (buf, FLOAT_TO_STRING_BUFSIZE - 2, 0, 0, data);
+ len = dtoastr (buf, FLOAT_TO_STRING_BUFSIZE - 2, 0, 0, data);
/* The decimal point must be printed, or the byte compiler can
get confused (Bug#8033). */
width = 1;
@@ -1032,7 +1038,7 @@ float_to_string (char *buf, double data)
if (cp[1] != 0)
goto lose;
- sprintf (buf, SSDATA (Vfloat_output_format), data);
+ len = sprintf (buf, SSDATA (Vfloat_output_format), data);
}
/* Make sure there is a decimal point with digit after, or an
@@ -1049,14 +1055,18 @@ float_to_string (char *buf, double data)
{
cp[1] = '0';
cp[2] = 0;
+ len++;
}
else if (*cp == 0)
{
*cp++ = '.';
*cp++ = '0';
*cp++ = 0;
+ len += 2;
}
}
+
+ return len;
}
@@ -1208,7 +1218,7 @@ print_preprocess (Lisp_Object obj)
if (size & PSEUDOVECTOR_FLAG)
size &= PSEUDOVECTOR_SIZE_MASK;
for (i = 0; i < size; i++)
- print_preprocess (XVECTOR (obj)->contents[i]);
+ print_preprocess (AREF (obj, i));
if (HASH_TABLE_P (obj))
{ /* For hash tables, the key_and_value slot is past
`size' because it needs to be marked specially in case
@@ -1332,8 +1342,8 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
for (i = 0; i < print_depth; i++)
if (EQ (obj, being_printed[i]))
{
- sprintf (buf, "#%d", i);
- strout (buf, -1, -1, printcharfun);
+ int len = sprintf (buf, "#%d", i);
+ strout (buf, len, len, printcharfun);
return;
}
being_printed[print_depth] = obj;
@@ -1348,16 +1358,16 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
if (n < 0)
{ /* Add a prefix #n= if OBJ has not yet been printed;
that is, its status field is nil. */
- sprintf (buf, "#%"pI"d=", -n);
- strout (buf, -1, -1, printcharfun);
+ int len = sprintf (buf, "#%"pI"d=", -n);
+ strout (buf, len, len, printcharfun);
/* OBJ is going to be printed. Remember that fact. */
Fputhash (obj, make_number (- n), Vprint_number_table);
}
else
{
/* Just print #n# if OBJ has already been printed. */
- sprintf (buf, "#%"pI"d#", n);
- strout (buf, -1, -1, printcharfun);
+ int len = sprintf (buf, "#%"pI"d#", n);
+ strout (buf, len, len, printcharfun);
return;
}
}
@@ -1368,16 +1378,17 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
switch (XTYPE (obj))
{
case_Lisp_Int:
- sprintf (buf, "%"pI"d", XINT (obj));
- strout (buf, -1, -1, printcharfun);
+ {
+ int len = sprintf (buf, "%"pI"d", XINT (obj));
+ strout (buf, len, len, printcharfun);
+ }
break;
case Lisp_Float:
{
char pigbuf[FLOAT_TO_STRING_BUFSIZE];
-
- float_to_string (pigbuf, XFLOAT_DATA (obj));
- strout (pigbuf, -1, -1, printcharfun);
+ int len = float_to_string (pigbuf, XFLOAT_DATA (obj));
+ strout (pigbuf, len, len, printcharfun);
}
break;
@@ -1447,15 +1458,16 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
when found in a multibyte string, always use a hex escape
so it reads back as multibyte. */
char outbuf[50];
+ int len;
if (CHAR_BYTE8_P (c))
- sprintf (outbuf, "\\%03o", CHAR_TO_BYTE8 (c));
+ len = sprintf (outbuf, "\\%03o", CHAR_TO_BYTE8 (c));
else
{
- sprintf (outbuf, "\\x%04x", c);
+ len = sprintf (outbuf, "\\x%04x", c);
need_nonhex = 1;
}
- strout (outbuf, -1, -1, printcharfun);
+ strout (outbuf, len, len, printcharfun);
}
else if (! multibyte
&& SINGLE_BYTE_CHAR_P (c) && ! ASCII_BYTE_P (c)
@@ -1466,8 +1478,8 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
print single-byte non-ASCII string chars
using octal escapes. */
char outbuf[5];
- sprintf (outbuf, "\\%03o", c);
- strout (outbuf, -1, -1, printcharfun);
+ int len = sprintf (outbuf, "\\%03o", c);
+ strout (outbuf, len, len, printcharfun);
}
else
{
@@ -1632,8 +1644,8 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
/* Simple but incomplete way. */
if (i != 0 && EQ (obj, halftail))
{
- sprintf (buf, " . #%"pMd, i / 2);
- strout (buf, -1, -1, printcharfun);
+ int len = sprintf (buf, " . #%"pMd, i / 2);
+ strout (buf, len, len, printcharfun);
goto end_of_list;
}
}
@@ -1697,7 +1709,8 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
else if (BOOL_VECTOR_P (obj))
{
ptrdiff_t i;
- register unsigned char c;
+ int len;
+ unsigned char c;
struct gcpro gcpro1;
ptrdiff_t size_in_chars
= ((XBOOL_VECTOR (obj)->size + BOOL_VECTOR_BITS_PER_CHAR - 1)
@@ -1707,8 +1720,8 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
PRINTCHAR ('#');
PRINTCHAR ('&');
- sprintf (buf, "%"pI"d", XBOOL_VECTOR (obj)->size);
- strout (buf, -1, -1, printcharfun);
+ len = sprintf (buf, "%"pI"d", XBOOL_VECTOR (obj)->size);
+ strout (buf, len, len, printcharfun);
PRINTCHAR ('\"');
/* Don't print more characters than the specified maximum.
@@ -1759,9 +1772,10 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
}
else if (WINDOWP (obj))
{
+ int len;
strout ("#sequence_number));
- strout (buf, -1, -1, printcharfun);
+ len = sprintf (buf, "%d", XWINDOW (obj)->sequence_number);
+ strout (buf, len, len, printcharfun);
if (!NILP (XWINDOW (obj)->buffer))
{
strout (" on ", -1, -1, printcharfun);
@@ -1771,10 +1785,11 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
}
else if (TERMINALP (obj))
{
+ int len;
struct terminal *t = XTERMINAL (obj);
strout ("#id);
- strout (buf, -1, -1, printcharfun);
+ len = sprintf (buf, "%d", t->id);
+ strout (buf, len, len, printcharfun);
if (t->name)
{
strout (" on ", -1, -1, printcharfun);
@@ -1787,6 +1802,7 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
struct Lisp_Hash_Table *h = XHASH_TABLE (obj);
ptrdiff_t i;
ptrdiff_t real_size, size;
+ int len;
#if 0
strout ("#test))
@@ -1797,18 +1813,18 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
PRINTCHAR (' ');
strout (SDATA (SYMBOL_NAME (h->weak)), -1, -1, printcharfun);
PRINTCHAR (' ');
- sprintf (buf, "%"pD"d/%"pD"d", h->count, ASIZE (h->next));
- strout (buf, -1, -1, printcharfun);
+ len = sprintf (buf, "%"pD"d/%"pD"d", h->count, ASIZE (h->next));
+ strout (buf, len, len, printcharfun);
}
- sprintf (buf, " %p", h);
- strout (buf, -1, -1, printcharfun);
+ len = sprintf (buf, " %p", h);
+ strout (buf, len, len, printcharfun);
PRINTCHAR ('>');
#endif
/* Implement a readable output, e.g.:
#s(hash-table size 2 test equal data (k1 v1 k2 v2)) */
/* Always print the size. */
- sprintf (buf, "#s(hash-table size %"pD"d", ASIZE (h->next));
- strout (buf, -1, -1, printcharfun);
+ len = sprintf (buf, "#s(hash-table size %"pD"d", ASIZE (h->next));
+ strout (buf, len, len, printcharfun);
if (!NILP (h->test))
{
@@ -1881,12 +1897,13 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
}
else if (FRAMEP (obj))
{
+ int len;
strout ((FRAME_LIVE_P (XFRAME (obj))
? "#name, printcharfun);
- sprintf (buf, " %p", XFRAME (obj));
- strout (buf, -1, -1, printcharfun);
+ len = sprintf (buf, " %p", XFRAME (obj));
+ strout (buf, len, len, printcharfun);
PRINTCHAR ('>');
}
else if (FONTP (obj))
@@ -1960,7 +1977,7 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
for (i = 0; i < size; i++)
{
if (i) PRINTCHAR (' ');
- tem = XVECTOR (obj)->contents[i];
+ tem = AREF (obj, i);
print_object (tem, printcharfun, escapeflag);
}
if (size < real_size)
@@ -1982,8 +1999,8 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
strout ("in no buffer", -1, -1, printcharfun);
else
{
- sprintf (buf, "at %"pD"d", marker_position (obj));
- strout (buf, -1, -1, printcharfun);
+ int len = sprintf (buf, "at %"pD"d", marker_position (obj));
+ strout (buf, len, len, printcharfun);
strout (" in ", -1, -1, printcharfun);
print_string (BVAR (XMARKER (obj)->buffer, name), printcharfun);
}
@@ -1996,10 +2013,10 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
strout ("in no buffer", -1, -1, printcharfun);
else
{
- sprintf (buf, "from %"pD"d to %"pD"d in ",
- marker_position (OVERLAY_START (obj)),
- marker_position (OVERLAY_END (obj)));
- strout (buf, -1, -1, printcharfun);
+ int len = sprintf (buf, "from %"pD"d to %"pD"d in ",
+ marker_position (OVERLAY_START (obj)),
+ marker_position (OVERLAY_END (obj)));
+ strout (buf, len, len, printcharfun);
print_string (BVAR (XMARKER (OVERLAY_START (obj))->buffer, name),
printcharfun);
}
@@ -2014,10 +2031,12 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
case Lisp_Misc_Save_Value:
strout ("#pointer,
- XSAVE_VALUE (obj)->integer);
- strout (buf, -1, -1, printcharfun);
+ {
+ int len = sprintf (buf, "ptr=%p int=%"pD"d",
+ XSAVE_VALUE (obj)->pointer,
+ XSAVE_VALUE (obj)->integer);
+ strout (buf, len, len, printcharfun);
+ }
PRINTCHAR ('>');
break;
@@ -2029,16 +2048,17 @@ print_object (Lisp_Object obj, register Lisp_Object printcharfun, int escapeflag
default:
badtype:
{
+ int len;
/* We're in trouble if this happens!
Probably should just abort () */
strout ("#",
-1, -1, printcharfun);
}