Mercurial > emacs
changeset 55839:9e7829a684df
(truncate_undo_list): New arg LIMITSIZE.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sat, 29 May 2004 16:20:47 +0000 |
parents | ca648e6d2d7b |
children | e2775bcb9a2e |
files | src/undo.c |
diffstat | 1 files changed, 16 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/undo.c Sat May 29 16:19:41 2004 +0000 +++ b/src/undo.c Sat May 29 16:20:47 2004 +0000 @@ -292,14 +292,15 @@ /* At garbage collection time, make an undo list shorter at the end, returning the truncated list. - MINSIZE and MAXSIZE are the limits on size allowed, as described below. - In practice, these are the values of undo-limit and - undo-strong-limit. */ + MINSIZE, MAXSIZE and LIMITSIZE are the limits on size allowed, + as described below. + In practice, these are the values of undo-limit, + undo-strong-limit, and undo-outer-limit. */ Lisp_Object -truncate_undo_list (list, minsize, maxsize) +truncate_undo_list (list, minsize, maxsize, limitsize) Lisp_Object list; - int minsize, maxsize; + int minsize, maxsize, limitsize; { Lisp_Object prev, next, last_boundary; int size_so_far = 0; @@ -308,7 +309,8 @@ next = list; last_boundary = Qnil; - /* Always preserve at least the most recent undo record. + /* Always preserve at least the most recent undo record + unless it is really horribly big. If the first element is an undo boundary, skip past it. Skip, skip, skip the undo, skip, skip, skip the undo, @@ -323,6 +325,7 @@ prev = next; next = XCDR (next); } + while (CONSP (next) && ! NILP (XCAR (next))) { Lisp_Object elt; @@ -338,13 +341,20 @@ + SCHARS (XCAR (elt))); } + /* If we reach LIMITSIZE before the first boundary, + we're heading for memory full, so truncate the list to nothing. */ + if (size_so_far > limitsize) + return Qnil; + /* Advance to next element. */ prev = next; next = XCDR (next); } + if (CONSP (next)) last_boundary = prev; + /* Keep more if it fits. */ while (CONSP (next)) { Lisp_Object elt;