diff options
author | Jim Blandy <jimb@redhat.com> | 1993-07-18 06:28:12 +0000 |
---|---|---|
committer | Jim Blandy <jimb@redhat.com> | 1993-07-18 06:28:12 +0000 |
commit | ad9c19400fd3e55d6fe78a7aa582bdc94cd8b3cc (patch) | |
tree | 0c3525dc43d4de8da313b7fa926769ab0c85e2eb | |
parent | 23c6349cdd816e4cb0639ad397d8df6aee35cb27 (diff) | |
download | emacs-ad9c19400fd3e55d6fe78a7aa582bdc94cd8b3cc.tar.gz |
* intervals.c (split_interval_left, split_interval_right): Change
OFFSET argument of these functions to be origin 0, not origin 1.
This is what all the callers currently want.
* intervals.c, textprop.c: All callers changed.
* textprop.c (Ftext_property_not_all): Renamed from
Ftext_property_all, and changed sense of return value, so that it
returns useful information if not all characters have properties
EQ to value. Now all the existential and universal questions can
be asked.
* textprop.c (syms_of_textprop): Don't forget defsubr for
Stext_property_all.
* textprop.c (Ftext_property_any, Ftext_property_all): Use EQ to
compare property values, not Fequal.
* textprop.c (Ftext_property_any, Ftext_property_all): New
functions, from David Gillespie.
* intervals.h (Ftext_property_any, Ftext_property_all): Declare them.
-rw-r--r-- | src/textprop.c | 92 |
1 files changed, 82 insertions, 10 deletions
diff --git a/src/textprop.c b/src/textprop.c index e16f44c8932..72e0c1a2d25 100644 --- a/src/textprop.c +++ b/src/textprop.c @@ -688,7 +688,7 @@ Return t if any property value actually changed, nil otherwise.") else { unchanged = i; - i = split_interval_right (unchanged, s - unchanged->position + 1); + i = split_interval_right (unchanged, s - unchanged->position); copy_properties (unchanged, i); } } @@ -712,7 +712,7 @@ Return t if any property value actually changed, nil otherwise.") /* i doesn't have the properties, and goes past the change limit */ unchanged = i; - i = split_interval_left (unchanged, len + 1); + i = split_interval_left (unchanged, len); copy_properties (unchanged, i); add_properties (properties, i, object); return Qt; @@ -768,12 +768,12 @@ is the string or buffer containing the text.") if (i->position != s) { unchanged = i; - i = split_interval_right (unchanged, s - unchanged->position + 1); + i = split_interval_right (unchanged, s - unchanged->position); if (LENGTH (i) > len) { copy_properties (unchanged, i); - i = split_interval_left (i, len + 1); + i = split_interval_left (i, len); set_properties (props, i, object); return Qt; } @@ -797,7 +797,7 @@ is the string or buffer containing the text.") if (LENGTH (i) >= len) { if (LENGTH (i) > len) - i = split_interval_left (i, len + 1); + i = split_interval_left (i, len); if (NULL_INTERVAL_P (prev_changed)) set_properties (props, i, object); @@ -863,7 +863,7 @@ Return t if any property was actually removed, nil otherwise.") else { unchanged = i; - i = split_interval_right (unchanged, s - unchanged->position + 1); + i = split_interval_right (unchanged, s - unchanged->position); copy_properties (unchanged, i); } } @@ -887,7 +887,7 @@ Return t if any property was actually removed, nil otherwise.") /* i has the properties, and goes past the change limit */ unchanged = i; - i = split_interval_left (i, len + 1); + i = split_interval_left (i, len); copy_properties (unchanged, i); remove_properties (props, i, object); return Qt; @@ -899,6 +899,76 @@ Return t if any property was actually removed, nil otherwise.") } } +DEFUN ("text-property-any", Ftext_property_any, + Stext_property_any, 4, 5, 0, + "Check text from START to END to see if PROP is ever `eq' to VALUE.\n\ +If so, return the position of the first character whose PROP is `eq'\n\ +to VALUE. Otherwise return nil.\n\ +The optional fifth argument, OBJECT, is the string or buffer\n\ +containing the text.") + (start, end, prop, value, object) + Lisp_Object start, end, prop, value, object; +{ + register INTERVAL i; + register int e, pos; + + if (NILP (object)) + XSET (object, Lisp_Buffer, current_buffer); + i = validate_interval_range (object, &start, &end, soft); + e = XINT (end); + + while (! NULL_INTERVAL_P (i)) + { + if (i->position >= e) + break; + if (EQ (textget (i->plist, prop), value)) + { + pos = i->position; + if (pos < XINT (start)) + pos = XINT (start); + return make_number (pos - (XTYPE (object) == Lisp_String)); + } + i = next_interval (i); + } + return Qnil; +} + +DEFUN ("text-property-not-all", Ftext_property_not_all, + Stext_property_not_all, 4, 5, 0, + "Check text from START to END to see if PROP is ever not `eq' to VALUE.\n\ +If so, return the position of the first character whose PROP is not\n\ +`eq' to VALUE. Otherwise, return nil.\n\ +The optional fifth argument, OBJECT, is the string or buffer\n\ +containing the text.") + (start, end, prop, value, object) + Lisp_Object start, end, prop, value, object; +{ + register INTERVAL i; + register int s, e; + + if (NILP (object)) + XSET (object, Lisp_Buffer, current_buffer); + i = validate_interval_range (object, &start, &end, soft); + if (NULL_INTERVAL_P (i)) + return (NILP (value) || EQ (start, end)) ? Qt : Qnil; + s = XINT (start); + e = XINT (end); + + while (! NULL_INTERVAL_P (i)) + { + if (i->position >= e) + break; + if (! EQ (textget (i->plist, prop), value)) + { + if (i->position > s) + s = i->position; + return make_number (s - (XTYPE (object) == Lisp_String)); + } + i = next_interval (i); + } + return Qnil; +} + #if 0 /* You can use set-text-properties for this. */ DEFUN ("erase-text-properties", Ferase_text_properties, @@ -931,13 +1001,13 @@ is the string or buffer containing the text.") /* If there are properties here, then this text will be modified. */ if (! NILP (i->plist)) { - i = split_interval_right (unchanged, s - unchanged->position + 1); + i = split_interval_right (unchanged, s - unchanged->position); i->plist = Qnil; modified++; if (LENGTH (i) > len) { - i = split_interval_right (i, len + 1); + i = split_interval_right (i, len); copy_properties (unchanged, i); return Qt; } @@ -977,7 +1047,7 @@ is the string or buffer containing the text.") } if (LENGTH (i) > len) - i = split_interval_left (i, len + 1); + i = split_interval_left (i, len); if (! NULL_INTERVAL_P (prev_changed)) merge_interval_left (i); else @@ -1159,6 +1229,8 @@ percentage by which the left interval tree should not differ from the right."); defsubr (&Sput_text_property); defsubr (&Sset_text_properties); defsubr (&Sremove_text_properties); + defsubr (&Stext_property_any); + defsubr (&Stext_property_not_all); /* defsubr (&Serase_text_properties); */ /* defsubr (&Scopy_text_properties); */ } |