to be run later by report_interval_modification. */
Lisp_Object interval_insert_behind_hooks;
Lisp_Object interval_insert_in_front_hooks;
+
+
+/* Signal a `text-read-only' error. This function makes it easier
+ to capture that error in GDB by putting a breakpoint on it. */
+
+static void
+text_read_only ()
+{
+ Fsignal (Qtext_read_only, Qnil);
+}
+
+
\f
/* Extract the interval at the position pointed to by BEGIN from
OBJECT, a string or buffer. Additionally, check that the positions
return textget (Ftext_properties_at (position, object), prop);
}
-DEFUN ("get-char-property", Fget_char_property, Sget_char_property, 2, 3, 0,
- "Return the value of POSITION's property PROP, in OBJECT.\n\
-OBJECT is optional and defaults to the current buffer.\n\
-If POSITION is at the end of OBJECT, the value is nil.\n\
-If OBJECT is a buffer, then overlay properties are considered as well as\n\
-text properties.\n\
-If OBJECT is a window, then that window's buffer is used, but window-specific\n\
-overlays are considered only if they are associated with OBJECT.")
- (position, prop, object)
+/* Return the value of POSITION's property PROP, in OBJECT.
+ OBJECT is optional and defaults to the current buffer.
+ If OVERLAY is non-0, then in the case that the returned property is from
+ an overlay, the overlay found is returned in *OVERLAY, otherwise nil is
+ returned in *OVERLAY.
+ If POSITION is at the end of OBJECT, the value is nil.
+ If OBJECT is a buffer, then overlay properties are considered as well as
+ text properties.
+ If OBJECT is a window, then that window's buffer is used, but
+ window-specific overlays are considered only if they are associated
+ with OBJECT. */
+Lisp_Object
+get_char_property_and_overlay (position, prop, object, overlay)
Lisp_Object position, object;
register Lisp_Object prop;
+ Lisp_Object *overlay;
{
struct window *w = 0;
{
tem = Foverlay_get (overlay_vec[noverlays], prop);
if (!NILP (tem))
- return (tem);
+ {
+ if (overlay)
+ /* Return the overlay we got the property from. */
+ *overlay = overlay_vec[noverlays];
+ return tem;
+ }
}
}
+
+ if (overlay)
+ /* Indicate that the return value is not from an overlay. */
+ *overlay = Qnil;
+
/* Not a buffer, or no appropriate overlay, so fall through to the
simpler case. */
- return (Fget_text_property (position, prop, object));
+ return Fget_text_property (position, prop, object);
+}
+
+DEFUN ("get-char-property", Fget_char_property, Sget_char_property, 2, 3, 0,
+ "Return the value of POSITION's property PROP, in OBJECT.\n\
+OBJECT is optional and defaults to the current buffer.\n\
+If POSITION is at the end of OBJECT, the value is nil.\n\
+If OBJECT is a buffer, then overlay properties are considered as well as\n\
+text properties.\n\
+If OBJECT is a window, then that window's buffer is used, but window-specific\n\
+overlays are considered only if they are associated with OBJECT.")
+ (position, prop, object)
+ Lisp_Object position, object;
+ register Lisp_Object prop;
+{
+ return get_char_property_and_overlay (position, prop, object, 0);
}
\f
DEFUN ("next-char-property-change", Fnext_char_property_change,
/* For an insert operation, check the two chars around the position. */
if (start == end)
{
- INTERVAL prev;
+ INTERVAL prev = NULL;
Lisp_Object before, after;
/* Set I to the interval containing the char after START,
if (TMEM (Qread_only, tem)
|| (NILP (Fplist_get (i->plist, Qread_only))
&& TMEM (Qcategory, tem)))
- Fsignal (Qtext_read_only, Qnil);
+ text_read_only ();
}
}
if (! TMEM (Qread_only, tem)
&& (! NILP (Fplist_get (prev->plist,Qread_only))
|| ! TMEM (Qcategory, tem)))
- Fsignal (Qtext_read_only, Qnil);
+ text_read_only ();
}
}
}
if (TMEM (Qread_only, tem)
|| (NILP (Fplist_get (i->plist, Qread_only))
&& TMEM (Qcategory, tem)))
- Fsignal (Qtext_read_only, Qnil);
+ text_read_only ();
tem = textget (prev->plist, Qrear_nonsticky);
if (! TMEM (Qread_only, tem)
&& (! NILP (Fplist_get (prev->plist, Qread_only))
|| ! TMEM (Qcategory, tem)))
- Fsignal (Qtext_read_only, Qnil);
+ text_read_only ();
}
}
}
do
{
if (! INTERVAL_WRITABLE_P (i))
- Fsignal (Qtext_read_only, Qnil);
+ text_read_only ();
mod_hooks = textget (i->plist, Qmodification_hooks);
if (! NILP (mod_hooks) && ! EQ (mod_hooks, prev_mod_hooks))