X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/0c94c8d603031f6b665ae7f3136ca77fb573fd7e..9539d46584868ff54a5acf1bdbe2446f9a84974a:/src/textprop.c diff --git a/src/textprop.c b/src/textprop.c index 20d98b0e6f..c1f6e59bf2 100644 --- a/src/textprop.c +++ b/src/textprop.c @@ -1,5 +1,6 @@ /* Interface code for dealing with text properties. - Copyright (C) 1993-1995, 1997, 1999-2012 Free Software Foundation, Inc. + Copyright (C) 1993-1995, 1997, 1999-2013 Free Software Foundation, + Inc. This file is part of GNU Emacs. @@ -17,7 +18,7 @@ You should have received a copy of the GNU General Public License along with GNU Emacs. If not, see . */ #include -#include + #include "lisp.h" #include "intervals.h" #include "character.h" @@ -85,8 +86,18 @@ text_read_only (Lisp_Object propval) xsignal0 (Qtext_read_only); } +/* Prepare to modify the region of BUFFER from START to END. */ + +static void +modify_region (Lisp_Object buffer, Lisp_Object start, Lisp_Object end) +{ + struct buffer *buf = XBUFFER (buffer), *old = current_buffer; + + set_buffer_internal (buf); + modify_region_1 (XINT (start), XINT (end), true); + set_buffer_internal (old); +} - /* Extract the interval at the position pointed to by BEGIN from OBJECT, a string or buffer. Additionally, check that the positions pointed to by BEGIN and END are within the bounds of OBJECT, and @@ -241,7 +252,7 @@ interval_has_all_properties (Lisp_Object plist, INTERVAL i) /* Return nonzero if the plist of interval I has any of the properties of PLIST, regardless of their values. */ -static inline int +static int interval_has_some_properties (Lisp_Object plist, INTERVAL i) { register Lisp_Object tail1, tail2, sym; @@ -263,7 +274,7 @@ interval_has_some_properties (Lisp_Object plist, INTERVAL i) /* Return nonzero if the plist of interval I has any of the property names in LIST, regardless of their values. */ -static inline int +static int interval_has_some_properties_list (Lisp_Object list, INTERVAL i) { register Lisp_Object tail1, tail2, sym; @@ -556,7 +567,8 @@ If POSITION is at the end of OBJECT, the value is nil. */) DEFUN ("get-text-property", Fget_text_property, Sget_text_property, 2, 3, 0, doc: /* Return the value of POSITION's property PROP, in OBJECT. -OBJECT is optional and defaults to the current buffer. +OBJECT should be a buffer or a string; if omitted or nil, it defaults +to the current buffer. If POSITION is at the end of OBJECT, the value is nil. */) (Lisp_Object position, Lisp_Object prop, Lisp_Object object) { @@ -760,7 +772,7 @@ past position LIMIT; return LIMIT if nothing is found before LIMIT. */) if (BUFFERP (object) && current_buffer != XBUFFER (object)) { - record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); + record_unwind_current_buffer (); Fset_buffer (object); } @@ -843,7 +855,7 @@ position LIMIT; return LIMIT if nothing is found before reaching LIMIT. */) if (BUFFERP (object) && current_buffer != XBUFFER (object)) { - record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); + record_unwind_current_buffer (); Fset_buffer (object); } @@ -1163,7 +1175,7 @@ Return t if any property value actually changed, nil otherwise. */) } if (BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end), 1); + modify_region (object, start, end); /* We are at the beginning of interval I, with LEN chars to scan. */ for (;;) @@ -1301,7 +1313,7 @@ set_text_properties (Lisp_Object start, Lisp_Object end, Lisp_Object properties, } if (BUFFERP (object) && !NILP (coherent_change_p)) - modify_region (XBUFFER (object), XINT (start), XINT (end), 1); + modify_region (object, start, end); set_text_properties_1 (start, end, properties, object, i); @@ -1312,14 +1324,13 @@ set_text_properties (Lisp_Object start, Lisp_Object end, Lisp_Object properties, } /* Replace properties of text from START to END with new list of - properties PROPERTIES. BUFFER is the buffer containing + properties PROPERTIES. OBJECT is the buffer or string containing the text. This does not obey any hooks. - You can provide the interval that START is located in as I, - or pass NULL for I and this function will find it. + You should provide the interval that START is located in as I. START and END can be in any order. */ void -set_text_properties_1 (Lisp_Object start, Lisp_Object end, Lisp_Object properties, Lisp_Object buffer, INTERVAL i) +set_text_properties_1 (Lisp_Object start, Lisp_Object end, Lisp_Object properties, Lisp_Object object, INTERVAL i) { register INTERVAL prev_changed = NULL; register ptrdiff_t s, len; @@ -1338,8 +1349,7 @@ set_text_properties_1 (Lisp_Object start, Lisp_Object end, Lisp_Object propertie else return; - if (i == NULL) - i = find_interval (buffer_intervals (XBUFFER (buffer)), s); + eassert (i); if (i->position != s) { @@ -1350,11 +1360,11 @@ set_text_properties_1 (Lisp_Object start, Lisp_Object end, Lisp_Object propertie { copy_properties (unchanged, i); i = split_interval_left (i, len); - set_properties (properties, i, buffer); + set_properties (properties, i, object); return; } - set_properties (properties, i, buffer); + set_properties (properties, i, object); if (LENGTH (i) == len) return; @@ -1377,7 +1387,7 @@ set_text_properties_1 (Lisp_Object start, Lisp_Object end, Lisp_Object propertie /* We have to call set_properties even if we are going to merge the intervals, so as to make the undo records and cause redisplay to happen. */ - set_properties (properties, i, buffer); + set_properties (properties, i, object); if (prev_changed) merge_interval_left (i); return; @@ -1388,7 +1398,7 @@ set_text_properties_1 (Lisp_Object start, Lisp_Object end, Lisp_Object propertie /* We have to call set_properties even if we are going to merge the intervals, so as to make the undo records and cause redisplay to happen. */ - set_properties (properties, i, buffer); + set_properties (properties, i, object); if (!prev_changed) prev_changed = i; else @@ -1450,7 +1460,7 @@ Use `set-text-properties' if you want to remove all text properties. */) } if (BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end), 1); + modify_region (object, start, end); /* We are at the beginning of an interval, with len to scan */ for (;;) @@ -1564,7 +1574,7 @@ Return t if any property was actually removed, nil otherwise. */) else if (LENGTH (i) == len) { if (!modified && BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end), 1); + modify_region (object, start, end); remove_properties (Qnil, properties, i, object); if (BUFFERP (object)) signal_after_change (XINT (start), XINT (end) - XINT (start), @@ -1577,7 +1587,7 @@ Return t if any property was actually removed, nil otherwise. */) i = split_interval_left (i, len); copy_properties (unchanged, i); if (!modified && BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end), 1); + modify_region (object, start, end); remove_properties (Qnil, properties, i, object); if (BUFFERP (object)) signal_after_change (XINT (start), XINT (end) - XINT (start), @@ -1588,7 +1598,7 @@ Return t if any property was actually removed, nil otherwise. */) if (interval_has_some_properties_list (properties, i)) { if (!modified && BUFFERP (object)) - modify_region (XBUFFER (object), XINT (start), XINT (end), 1); + modify_region (object, start, end); remove_properties (Qnil, properties, i, object); modified = 1; }