]> git.eshelyaron.com Git - emacs.git/commitdiff
(print) <Lisp_Cons>: Detect circular list.
authorRichard M. Stallman <rms@gnu.org>
Mon, 25 May 1998 16:28:02 +0000 (16:28 +0000)
committerRichard M. Stallman <rms@gnu.org>
Mon, 25 May 1998 16:28:02 +0000 (16:28 +0000)
src/print.c

index 2b1e046336d3f804c94dae1fa8d084af4d072b25..879b48933c906f386562d2a08b5e94e1fd26d719 100644 (file)
@@ -1418,14 +1418,20 @@ print (obj, printcharfun, escapeflag)
          {
            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 (obj, printcharfun, escapeflag)
                  }
                print (XCAR (obj), printcharfun, escapeflag);
                obj = XCDR (obj);
+               if (!(i & 1))
+                 halftail = XCDR (halftail);
              }
          }
          if (!NILP (obj))