changeset 22231:35af9a276272

(print) <Lisp_Cons>: Detect circular list.
author Richard M. Stallman <rms@gnu.org>
date Mon, 25 May 1998 16:28:02 +0000
parents 32f2adf05397
children 96217e8a9b7f
files src/print.c
diffstat 1 files changed, 11 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/print.c	Mon May 25 16:03:58 1998 +0000
+++ b/src/print.c	Mon May 25 16:28:02 1998 +0000
@@ -1418,14 +1418,20 @@
 	  {
 	    register int i = 0;
 	    register int print_length = 0;
+	    Lisp_Object halftail = obj;
 
 	    if (INTEGERP (Vprint_length))
 	      print_length = XINT (Vprint_length);
-	    /* Could recognize circularities in cdrs here,
-	       but that would make printing of long lists quadratic.
-	       It's not worth doing.  */
 	    while (CONSP (obj))
 	      {
+		/* Detect circular list.  */
+		if (i != 0 && EQ (obj, halftail))
+		  {
+		    sprintf (buf, " . #%d", i / 2);
+		    strout (buf, -1, -1, printcharfun, 0);
+		    obj = Qnil;
+		    break;
+		  }
 		if (i++)
 		  PRINTCHAR (' ');
 		if (print_length && i > print_length)
@@ -1435,6 +1441,8 @@
 		  }
 		print (XCAR (obj), printcharfun, escapeflag);
 		obj = XCDR (obj);
+		if (!(i & 1))
+		  halftail = XCDR (halftail);
 	      }
 	  }
 	  if (!NILP (obj))