aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard M. Stallman1998-05-25 16:28:02 +0000
committerRichard M. Stallman1998-05-25 16:28:02 +0000
commit1eab22b5debc7afd8d74dded20f69eb71a83cb81 (patch)
tree950a9c2746bcb5ce30ad8f50bd86234bfd4ba750
parentc99babf20d52137cf55413fda135e5664a2fa42d (diff)
downloademacs-1eab22b5debc7afd8d74dded20f69eb71a83cb81.tar.gz
emacs-1eab22b5debc7afd8d74dded20f69eb71a83cb81.zip
(print) <Lisp_Cons>: Detect circular list.
-rw-r--r--src/print.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/print.c b/src/print.c
index 2b1e046336d..879b48933c9 100644
--- a/src/print.c
+++ b/src/print.c
@@ -1418,14 +1418,20 @@ print (obj, printcharfun, escapeflag)
1418 { 1418 {
1419 register int i = 0; 1419 register int i = 0;
1420 register int print_length = 0; 1420 register int print_length = 0;
1421 Lisp_Object halftail = obj;
1421 1422
1422 if (INTEGERP (Vprint_length)) 1423 if (INTEGERP (Vprint_length))
1423 print_length = XINT (Vprint_length); 1424 print_length = XINT (Vprint_length);
1424 /* Could recognize circularities in cdrs here,
1425 but that would make printing of long lists quadratic.
1426 It's not worth doing. */
1427 while (CONSP (obj)) 1425 while (CONSP (obj))
1428 { 1426 {
1427 /* Detect circular list. */
1428 if (i != 0 && EQ (obj, halftail))
1429 {
1430 sprintf (buf, " . #%d", i / 2);
1431 strout (buf, -1, -1, printcharfun, 0);
1432 obj = Qnil;
1433 break;
1434 }
1429 if (i++) 1435 if (i++)
1430 PRINTCHAR (' '); 1436 PRINTCHAR (' ');
1431 if (print_length && i > print_length) 1437 if (print_length && i > print_length)
@@ -1435,6 +1441,8 @@ print (obj, printcharfun, escapeflag)
1435 } 1441 }
1436 print (XCAR (obj), printcharfun, escapeflag); 1442 print (XCAR (obj), printcharfun, escapeflag);
1437 obj = XCDR (obj); 1443 obj = XCDR (obj);
1444 if (!(i & 1))
1445 halftail = XCDR (halftail);
1438 } 1446 }
1439 } 1447 }
1440 if (!NILP (obj)) 1448 if (!NILP (obj))