# HG changeset patch # User Richard M. Stallman # Date 1085847647 0 # Node ID 9e7829a684df0515135447a610e958b58de99875 # Parent ca648e6d2d7b21df18cfa97b1dffe971f7f97749 (truncate_undo_list): New arg LIMITSIZE. diff -r ca648e6d2d7b -r 9e7829a684df src/undo.c --- 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;