diff options
| author | Richard M. Stallman | 1998-05-25 16:28:02 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 1998-05-25 16:28:02 +0000 |
| commit | 1eab22b5debc7afd8d74dded20f69eb71a83cb81 (patch) | |
| tree | 950a9c2746bcb5ce30ad8f50bd86234bfd4ba750 | |
| parent | c99babf20d52137cf55413fda135e5664a2fa42d (diff) | |
| download | emacs-1eab22b5debc7afd8d74dded20f69eb71a83cb81.tar.gz emacs-1eab22b5debc7afd8d74dded20f69eb71a83cb81.zip | |
(print) <Lisp_Cons>: Detect circular list.
| -rw-r--r-- | src/print.c | 14 |
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)) |