From: Gerd Moellmann Date: Sun, 26 Sep 1999 10:53:22 +0000 (+0000) Subject: (next_single_char_property_change): New. X-Git-Tag: emacs-pretest-21.0.90~6623 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=0b0737d1c74782f08b9bf8b48783545bc8bb318d;p=emacs.git (next_single_char_property_change): New. --- diff --git a/src/textprop.c b/src/textprop.c index bd877073e49..14cebd69d64 100644 --- a/src/textprop.c +++ b/src/textprop.c @@ -675,6 +675,60 @@ past position LIMIT; return LIMIT if nothing is found before LIMIT.") } return Fprevious_property_change (position, Qnil, temp); } + + +/* Value is the position in OBJECT after POS where the value of + property PROP changes. OBJECT must be a string or buffer. If + OBJECT is nil, use the current buffer. LIMIT if not nil limits the + search. */ + +Lisp_Object +next_single_char_property_change (pos, prop, object, limit) + Lisp_Object prop, pos, object, limit; +{ + if (STRINGP (object)) + { + pos = Fnext_single_property_change (pos, prop, object, limit); + if (NILP (pos)) + { + if (NILP (limit)) + pos = make_number (XSTRING (object)->size); + else + pos = limit; + } + } + else + { + Lisp_Object initial_value, value; + struct buffer *old_current_buffer = NULL; + int count = specpdl_ptr - specpdl; + + if (!NILP (object)) + CHECK_BUFFER (object, 0); + + if (BUFFERP (object) && current_buffer != XBUFFER (object)) + { + record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); + Fset_buffer (object); + } + + initial_value = Fget_char_property (pos, prop, object); + + while (XFASTINT (pos) < XFASTINT (limit)) + { + pos = Fnext_char_property_change (pos, limit); + value = Fget_char_property (pos, prop, object); + if (!EQ (value, initial_value)) + break; + } + + unbind_to (count, Qnil); + } + + return pos; +} + + DEFUN ("next-property-change", Fnext_property_change, Snext_property_change, 1, 3, 0,