Mercurial > emacs
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))