aboutsummaryrefslogtreecommitdiffstats
path: root/src/undo.c
diff options
context:
space:
mode:
authorJoakim Verona2011-06-16 00:22:07 +0200
committerJoakim Verona2011-06-16 00:22:07 +0200
commita7513ade3bc0fe79430d5541d88c9dcda0932bec (patch)
tree4383951ba698a11e9f8933a9d8c72e00aa872a10 /src/undo.c
parent4bd51ad5c3445b644dfb017d5b57b10a90aa325f (diff)
parent4bba86e6210a74326e843a8fdc8409127105e1fe (diff)
downloademacs-a7513ade3bc0fe79430d5541d88c9dcda0932bec.tar.gz
emacs-a7513ade3bc0fe79430d5541d88c9dcda0932bec.zip
merge from upstream
Diffstat (limited to 'src/undo.c')
-rw-r--r--src/undo.c84
1 files changed, 39 insertions, 45 deletions
diff --git a/src/undo.c b/src/undo.c
index 933982ec30c..e7e9ae5632e 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -26,11 +26,11 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
26 26
27/* Last buffer for which undo information was recorded. */ 27/* Last buffer for which undo information was recorded. */
28/* BEWARE: This is not traced by the GC, so never dereference it! */ 28/* BEWARE: This is not traced by the GC, so never dereference it! */
29struct buffer *last_undo_buffer; 29static struct buffer *last_undo_buffer;
30 30
31/* Position of point last time we inserted a boundary. */ 31/* Position of point last time we inserted a boundary. */
32struct buffer *last_boundary_buffer; 32static struct buffer *last_boundary_buffer;
33EMACS_INT last_boundary_position; 33static EMACS_INT last_boundary_position;
34 34
35Lisp_Object Qinhibit_read_only; 35Lisp_Object Qinhibit_read_only;
36 36
@@ -43,7 +43,7 @@ Lisp_Object Qapply;
43 which will be added to the list at the end of the command. 43 which will be added to the list at the end of the command.
44 This ensures we can't run out of space while trying to make 44 This ensures we can't run out of space while trying to make
45 an undo-boundary. */ 45 an undo-boundary. */
46Lisp_Object pending_boundary; 46static Lisp_Object pending_boundary;
47 47
48/* Record point as it was at beginning of this command (if necessary) 48/* Record point as it was at beginning of this command (if necessary)
49 and prepare the undo info for recording a change. 49 and prepare the undo info for recording a change.
@@ -73,12 +73,12 @@ record_point (EMACS_INT pt)
73 Fundo_boundary (); 73 Fundo_boundary ();
74 last_undo_buffer = current_buffer; 74 last_undo_buffer = current_buffer;
75 75
76 if (CONSP (current_buffer->undo_list)) 76 if (CONSP (BVAR (current_buffer, undo_list)))
77 { 77 {
78 /* Set AT_BOUNDARY to 1 only when we have nothing other than 78 /* Set AT_BOUNDARY to 1 only when we have nothing other than
79 marker adjustment before undo boundary. */ 79 marker adjustment before undo boundary. */
80 80
81 Lisp_Object tail = current_buffer->undo_list, elt; 81 Lisp_Object tail = BVAR (current_buffer, undo_list), elt;
82 82
83 while (1) 83 while (1)
84 { 84 {
@@ -103,8 +103,8 @@ record_point (EMACS_INT pt)
103 if (at_boundary 103 if (at_boundary
104 && current_buffer == last_boundary_buffer 104 && current_buffer == last_boundary_buffer
105 && last_boundary_position != pt) 105 && last_boundary_position != pt)
106 current_buffer->undo_list 106 BVAR (current_buffer, undo_list)
107 = Fcons (make_number (last_boundary_position), current_buffer->undo_list); 107 = Fcons (make_number (last_boundary_position), BVAR (current_buffer, undo_list));
108} 108}
109 109
110/* Record an insertion that just happened or is about to happen, 110/* Record an insertion that just happened or is about to happen,
@@ -117,17 +117,17 @@ record_insert (EMACS_INT beg, EMACS_INT length)
117{ 117{
118 Lisp_Object lbeg, lend; 118 Lisp_Object lbeg, lend;
119 119
120 if (EQ (current_buffer->undo_list, Qt)) 120 if (EQ (BVAR (current_buffer, undo_list), Qt))
121 return; 121 return;
122 122
123 record_point (beg); 123 record_point (beg);
124 124
125 /* If this is following another insertion and consecutive with it 125 /* If this is following another insertion and consecutive with it
126 in the buffer, combine the two. */ 126 in the buffer, combine the two. */
127 if (CONSP (current_buffer->undo_list)) 127 if (CONSP (BVAR (current_buffer, undo_list)))
128 { 128 {
129 Lisp_Object elt; 129 Lisp_Object elt;
130 elt = XCAR (current_buffer->undo_list); 130 elt = XCAR (BVAR (current_buffer, undo_list));
131 if (CONSP (elt) 131 if (CONSP (elt)
132 && INTEGERP (XCAR (elt)) 132 && INTEGERP (XCAR (elt))
133 && INTEGERP (XCDR (elt)) 133 && INTEGERP (XCDR (elt))
@@ -140,8 +140,8 @@ record_insert (EMACS_INT beg, EMACS_INT length)
140 140
141 XSETFASTINT (lbeg, beg); 141 XSETFASTINT (lbeg, beg);
142 XSETINT (lend, beg + length); 142 XSETINT (lend, beg + length);
143 current_buffer->undo_list = Fcons (Fcons (lbeg, lend), 143 BVAR (current_buffer, undo_list) = Fcons (Fcons (lbeg, lend),
144 current_buffer->undo_list); 144 BVAR (current_buffer, undo_list));
145} 145}
146 146
147/* Record that a deletion is about to take place, 147/* Record that a deletion is about to take place,
@@ -152,7 +152,7 @@ record_delete (EMACS_INT beg, Lisp_Object string)
152{ 152{
153 Lisp_Object sbeg; 153 Lisp_Object sbeg;
154 154
155 if (EQ (current_buffer->undo_list, Qt)) 155 if (EQ (BVAR (current_buffer, undo_list), Qt))
156 return; 156 return;
157 157
158 if (PT == beg + SCHARS (string)) 158 if (PT == beg + SCHARS (string))
@@ -166,8 +166,8 @@ record_delete (EMACS_INT beg, Lisp_Object string)
166 record_point (beg); 166 record_point (beg);
167 } 167 }
168 168
169 current_buffer->undo_list 169 BVAR (current_buffer, undo_list)
170 = Fcons (Fcons (string, sbeg), current_buffer->undo_list); 170 = Fcons (Fcons (string, sbeg), BVAR (current_buffer, undo_list));
171} 171}
172 172
173/* Record the fact that MARKER is about to be adjusted by ADJUSTMENT. 173/* Record the fact that MARKER is about to be adjusted by ADJUSTMENT.
@@ -178,7 +178,7 @@ record_delete (EMACS_INT beg, Lisp_Object string)
178void 178void
179record_marker_adjustment (Lisp_Object marker, EMACS_INT adjustment) 179record_marker_adjustment (Lisp_Object marker, EMACS_INT adjustment)
180{ 180{
181 if (EQ (current_buffer->undo_list, Qt)) 181 if (EQ (BVAR (current_buffer, undo_list), Qt))
182 return; 182 return;
183 183
184 /* Allocate a cons cell to be the undo boundary after this command. */ 184 /* Allocate a cons cell to be the undo boundary after this command. */
@@ -189,9 +189,9 @@ record_marker_adjustment (Lisp_Object marker, EMACS_INT adjustment)
189 Fundo_boundary (); 189 Fundo_boundary ();
190 last_undo_buffer = current_buffer; 190 last_undo_buffer = current_buffer;
191 191
192 current_buffer->undo_list 192 BVAR (current_buffer, undo_list)
193 = Fcons (Fcons (marker, make_number (adjustment)), 193 = Fcons (Fcons (marker, make_number (adjustment)),
194 current_buffer->undo_list); 194 BVAR (current_buffer, undo_list));
195} 195}
196 196
197/* Record that a replacement is about to take place, 197/* Record that a replacement is about to take place,
@@ -212,10 +212,9 @@ record_change (EMACS_INT beg, EMACS_INT length)
212void 212void
213record_first_change (void) 213record_first_change (void)
214{ 214{
215 Lisp_Object high, low;
216 struct buffer *base_buffer = current_buffer; 215 struct buffer *base_buffer = current_buffer;
217 216
218 if (EQ (current_buffer->undo_list, Qt)) 217 if (EQ (BVAR (current_buffer, undo_list), Qt))
219 return; 218 return;
220 219
221 if (current_buffer != last_undo_buffer) 220 if (current_buffer != last_undo_buffer)
@@ -225,9 +224,9 @@ record_first_change (void)
225 if (base_buffer->base_buffer) 224 if (base_buffer->base_buffer)
226 base_buffer = base_buffer->base_buffer; 225 base_buffer = base_buffer->base_buffer;
227 226
228 XSETFASTINT (high, (base_buffer->modtime >> 16) & 0xffff); 227 BVAR (current_buffer, undo_list) =
229 XSETFASTINT (low, base_buffer->modtime & 0xffff); 228 Fcons (Fcons (Qt, INTEGER_TO_CONS (base_buffer->modtime)),
230 current_buffer->undo_list = Fcons (Fcons (Qt, Fcons (high, low)), current_buffer->undo_list); 229 BVAR (current_buffer, undo_list));
231} 230}
232 231
233/* Record a change in property PROP (whose old value was VAL) 232/* Record a change in property PROP (whose old value was VAL)
@@ -242,7 +241,7 @@ record_property_change (EMACS_INT beg, EMACS_INT length,
242 struct buffer *obuf = current_buffer, *buf = XBUFFER (buffer); 241 struct buffer *obuf = current_buffer, *buf = XBUFFER (buffer);
243 int boundary = 0; 242 int boundary = 0;
244 243
245 if (EQ (buf->undo_list, Qt)) 244 if (EQ (BVAR (buf, undo_list), Qt))
246 return; 245 return;
247 246
248 /* Allocate a cons cell to be the undo boundary after this command. */ 247 /* Allocate a cons cell to be the undo boundary after this command. */
@@ -265,7 +264,7 @@ record_property_change (EMACS_INT beg, EMACS_INT length,
265 XSETINT (lbeg, beg); 264 XSETINT (lbeg, beg);
266 XSETINT (lend, beg + length); 265 XSETINT (lend, beg + length);
267 entry = Fcons (Qnil, Fcons (prop, Fcons (value, Fcons (lbeg, lend)))); 266 entry = Fcons (Qnil, Fcons (prop, Fcons (value, Fcons (lbeg, lend))));
268 current_buffer->undo_list = Fcons (entry, current_buffer->undo_list); 267 BVAR (current_buffer, undo_list) = Fcons (entry, BVAR (current_buffer, undo_list));
269 268
270 current_buffer = obuf; 269 current_buffer = obuf;
271} 270}
@@ -277,9 +276,9 @@ but another undo command will undo to the previous boundary. */)
277 (void) 276 (void)
278{ 277{
279 Lisp_Object tem; 278 Lisp_Object tem;
280 if (EQ (current_buffer->undo_list, Qt)) 279 if (EQ (BVAR (current_buffer, undo_list), Qt))
281 return Qnil; 280 return Qnil;
282 tem = Fcar (current_buffer->undo_list); 281 tem = Fcar (BVAR (current_buffer, undo_list));
283 if (!NILP (tem)) 282 if (!NILP (tem))
284 { 283 {
285 /* One way or another, cons nil onto the front of the undo list. */ 284 /* One way or another, cons nil onto the front of the undo list. */
@@ -287,12 +286,12 @@ but another undo command will undo to the previous boundary. */)
287 { 286 {
288 /* If we have preallocated the cons cell to use here, 287 /* If we have preallocated the cons cell to use here,
289 use that one. */ 288 use that one. */
290 XSETCDR (pending_boundary, current_buffer->undo_list); 289 XSETCDR (pending_boundary, BVAR (current_buffer, undo_list));
291 current_buffer->undo_list = pending_boundary; 290 BVAR (current_buffer, undo_list) = pending_boundary;
292 pending_boundary = Qnil; 291 pending_boundary = Qnil;
293 } 292 }
294 else 293 else
295 current_buffer->undo_list = Fcons (Qnil, current_buffer->undo_list); 294 BVAR (current_buffer, undo_list) = Fcons (Qnil, BVAR (current_buffer, undo_list));
296 } 295 }
297 last_boundary_position = PT; 296 last_boundary_position = PT;
298 last_boundary_buffer = current_buffer; 297 last_boundary_buffer = current_buffer;
@@ -321,7 +320,7 @@ truncate_undo_list (struct buffer *b)
321 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ()); 320 record_unwind_protect (set_buffer_if_live, Fcurrent_buffer ());
322 set_buffer_internal (b); 321 set_buffer_internal (b);
323 322
324 list = b->undo_list; 323 list = BVAR (b, undo_list);
325 324
326 prev = Qnil; 325 prev = Qnil;
327 next = list; 326 next = list;
@@ -433,7 +432,7 @@ truncate_undo_list (struct buffer *b)
433 XSETCDR (last_boundary, Qnil); 432 XSETCDR (last_boundary, Qnil);
434 /* There's nothing we decided to keep, so clear it out. */ 433 /* There's nothing we decided to keep, so clear it out. */
435 else 434 else
436 b->undo_list = Qnil; 435 BVAR (b, undo_list) = Qnil;
437 436
438 unbind_to (count, Qnil); 437 unbind_to (count, Qnil);
439} 438}
@@ -470,13 +469,13 @@ Return what remains of the list. */)
470 469
471 /* In a writable buffer, enable undoing read-only text that is so 470 /* In a writable buffer, enable undoing read-only text that is so
472 because of text properties. */ 471 because of text properties. */
473 if (NILP (current_buffer->read_only)) 472 if (NILP (BVAR (current_buffer, read_only)))
474 specbind (Qinhibit_read_only, Qt); 473 specbind (Qinhibit_read_only, Qt);
475 474
476 /* Don't let `intangible' properties interfere with undo. */ 475 /* Don't let `intangible' properties interfere with undo. */
477 specbind (Qinhibit_point_motion_hooks, Qt); 476 specbind (Qinhibit_point_motion_hooks, Qt);
478 477
479 oldlist = current_buffer->undo_list; 478 oldlist = BVAR (current_buffer, undo_list);
480 479
481 while (arg > 0) 480 while (arg > 0)
482 { 481 {
@@ -499,13 +498,9 @@ Return what remains of the list. */)
499 if (EQ (car, Qt)) 498 if (EQ (car, Qt))
500 { 499 {
501 /* Element (t high . low) records previous modtime. */ 500 /* Element (t high . low) records previous modtime. */
502 Lisp_Object high, low;
503 int mod_time;
504 struct buffer *base_buffer = current_buffer; 501 struct buffer *base_buffer = current_buffer;
505 502 time_t mod_time;
506 high = Fcar (cdr); 503 CONS_TO_INTEGER (cdr, time_t, mod_time);
507 low = Fcdr (cdr);
508 mod_time = (XFASTINT (high) << 16) + XFASTINT (low);
509 504
510 if (current_buffer->base_buffer) 505 if (current_buffer->base_buffer)
511 base_buffer = current_buffer->base_buffer; 506 base_buffer = current_buffer->base_buffer;
@@ -631,9 +626,9 @@ Return what remains of the list. */)
631 so the test in `undo' for continuing an undo series 626 so the test in `undo' for continuing an undo series
632 will work right. */ 627 will work right. */
633 if (did_apply 628 if (did_apply
634 && EQ (oldlist, current_buffer->undo_list)) 629 && EQ (oldlist, BVAR (current_buffer, undo_list)))
635 current_buffer->undo_list 630 BVAR (current_buffer, undo_list)
636 = Fcons (list3 (Qapply, Qcdr, Qnil), current_buffer->undo_list); 631 = Fcons (list3 (Qapply, Qcdr, Qnil), BVAR (current_buffer, undo_list));
637 632
638 UNGCPRO; 633 UNGCPRO;
639 return unbind_to (count, list); 634 return unbind_to (count, list);
@@ -711,4 +706,3 @@ so it must make sure not to do a lot of consing. */);
711 doc: /* Non-nil means do not record `point' in `buffer-undo-list'. */); 706 doc: /* Non-nil means do not record `point' in `buffer-undo-list'. */);
712 undo_inhibit_record_point = 0; 707 undo_inhibit_record_point = 0;
713} 708}
714