Mercurial > emacs
annotate src/textprop.c @ 2053:8bdcc55ebd8f
(Qmodification_hooks): Renamed from Qmodification.
(syms_of_textprop): Changed accordingly.
| author | Richard M. Stallman <rms@gnu.org> |
|---|---|
| date | Sun, 07 Mar 1993 09:35:31 +0000 |
| parents | 2bdbd6ed2430 |
| children | a43d0bb1b7d8 |
| rev | line source |
|---|---|
| 1029 | 1 /* Interface code for dealing with text properties. |
|
2053
8bdcc55ebd8f
(Qmodification_hooks): Renamed from Qmodification.
Richard M. Stallman <rms@gnu.org>
parents:
1965
diff
changeset
|
2 Copyright (C) 1993 Free Software Foundation, Inc. |
| 1029 | 3 |
| 4 This file is part of GNU Emacs. | |
| 5 | |
| 6 GNU Emacs is free software; you can redistribute it and/or modify | |
| 7 it under the terms of the GNU General Public License as published by | |
| 8 the Free Software Foundation; either version 1, or (at your option) | |
| 9 any later version. | |
| 10 | |
| 11 GNU Emacs is distributed in the hope that it will be useful, | |
| 12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 14 GNU General Public License for more details. | |
| 15 | |
| 16 You should have received a copy of the GNU General Public License | |
| 17 along with GNU Emacs; see the file COPYING. If not, write to | |
| 18 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
| 19 | |
| 20 #include "config.h" | |
| 21 #include "lisp.h" | |
| 22 #include "intervals.h" | |
| 23 #include "buffer.h" | |
| 24 | |
| 25 | |
| 26 /* NOTES: previous- and next- property change will have to skip | |
| 27 zero-length intervals if they are implemented. This could be done | |
| 28 inside next_interval and previous_interval. | |
| 29 | |
| 1211 | 30 set_properties needs to deal with the interval property cache. |
| 31 | |
| 1029 | 32 It is assumed that for any interval plist, a property appears |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
33 only once on the list. Although some code i.e., remove_properties, |
| 1029 | 34 handles the more general case, the uniqueness of properties is |
| 35 neccessary for the system to remain consistent. This requirement | |
| 36 is enforced by the subrs installing properties onto the intervals. */ | |
| 37 | |
|
1302
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
38 /* The rest of the file is within this conditional */ |
|
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
39 #ifdef USE_TEXT_PROPERTIES |
| 1029 | 40 |
| 41 /* Types of hooks. */ | |
| 42 Lisp_Object Qmouse_left; | |
| 43 Lisp_Object Qmouse_entered; | |
| 44 Lisp_Object Qpoint_left; | |
| 45 Lisp_Object Qpoint_entered; | |
|
2053
8bdcc55ebd8f
(Qmodification_hooks): Renamed from Qmodification.
Richard M. Stallman <rms@gnu.org>
parents:
1965
diff
changeset
|
46 Lisp_Object Qmodification_hooks; |
| 1029 | 47 |
| 48 /* Visual properties text (including strings) may have. */ | |
| 49 Lisp_Object Qforeground, Qbackground, Qfont, Qunderline, Qstipple; | |
| 50 Lisp_Object Qinvisible, Qread_only; | |
| 51 | |
| 1055 | 52 /* Extract the interval at the position pointed to by BEGIN from |
| 53 OBJECT, a string or buffer. Additionally, check that the positions | |
| 54 pointed to by BEGIN and END are within the bounds of OBJECT, and | |
| 55 reverse them if *BEGIN is greater than *END. The objects pointed | |
| 56 to by BEGIN and END may be integers or markers; if the latter, they | |
| 57 are coerced to integers. | |
| 1029 | 58 |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
59 When OBJECT is a string, we increment *BEGIN and *END |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
60 to make them origin-one. |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
61 |
| 1029 | 62 Note that buffer points don't correspond to interval indices. |
| 63 For example, point-max is 1 greater than the index of the last | |
| 64 character. This difference is handled in the caller, which uses | |
| 65 the validated points to determine a length, and operates on that. | |
| 66 Exceptions are Ftext_properties_at, Fnext_property_change, and | |
| 67 Fprevious_property_change which call this function with BEGIN == END. | |
| 68 Handle this case specially. | |
| 69 | |
| 70 If FORCE is soft (0), it's OK to return NULL_INTERVAL. Otherwise, | |
| 1055 | 71 create an interval tree for OBJECT if one doesn't exist, provided |
| 72 the object actually contains text. In the current design, if there | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
73 is no text, there can be no text properties. */ |
| 1029 | 74 |
| 75 #define soft 0 | |
| 76 #define hard 1 | |
| 77 | |
| 78 static INTERVAL | |
| 79 validate_interval_range (object, begin, end, force) | |
| 80 Lisp_Object object, *begin, *end; | |
| 81 int force; | |
| 82 { | |
| 83 register INTERVAL i; | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
84 int searchpos; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
85 |
| 1029 | 86 CHECK_STRING_OR_BUFFER (object, 0); |
| 87 CHECK_NUMBER_COERCE_MARKER (*begin, 0); | |
| 88 CHECK_NUMBER_COERCE_MARKER (*end, 0); | |
| 89 | |
| 90 /* If we are asked for a point, but from a subr which operates | |
| 91 on a range, then return nothing. */ | |
| 92 if (*begin == *end && begin != end) | |
| 93 return NULL_INTERVAL; | |
| 94 | |
| 95 if (XINT (*begin) > XINT (*end)) | |
| 96 { | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
97 Lisp_Object n; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
98 n = *begin; |
| 1029 | 99 *begin = *end; |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
100 *end = n; |
| 1029 | 101 } |
| 102 | |
| 103 if (XTYPE (object) == Lisp_Buffer) | |
| 104 { | |
| 105 register struct buffer *b = XBUFFER (object); | |
| 106 | |
| 107 if (!(BUF_BEGV (b) <= XINT (*begin) && XINT (*begin) <= XINT (*end) | |
| 108 && XINT (*end) <= BUF_ZV (b))) | |
| 109 args_out_of_range (*begin, *end); | |
| 110 i = b->intervals; | |
| 111 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
112 /* If there's no text, there are no properties. */ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
113 if (BUF_BEGV (b) == BUF_ZV (b)) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
114 return NULL_INTERVAL; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
115 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
116 searchpos = XINT (*begin); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
117 if (searchpos == BUF_Z (b)) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
118 searchpos--; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
119 #if 0 |
| 1029 | 120 /* Special case for point-max: return the interval for the |
| 121 last character. */ | |
| 122 if (*begin == *end && *begin == BUF_Z (b)) | |
| 123 *begin -= 1; | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
124 #endif |
| 1029 | 125 } |
| 126 else | |
| 127 { | |
| 128 register struct Lisp_String *s = XSTRING (object); | |
| 129 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
130 if (! (0 <= XINT (*begin) && XINT (*begin) <= XINT (*end) |
| 1029 | 131 && XINT (*end) <= s->size)) |
| 132 args_out_of_range (*begin, *end); | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
133 /* User-level Positions in strings start with 0, |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
134 but the interval code always wants positions starting with 1. */ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
135 XFASTINT (*begin) += 1; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
136 XFASTINT (*end) += 1; |
| 1029 | 137 i = s->intervals; |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
138 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
139 if (s->size == 0) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
140 return NULL_INTERVAL; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
141 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
142 searchpos = XINT (*begin); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
143 if (searchpos > s->size) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
144 searchpos--; |
| 1029 | 145 } |
| 146 | |
| 147 if (NULL_INTERVAL_P (i)) | |
| 148 return (force ? create_root_interval (object) : i); | |
| 149 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
150 return find_interval (i, searchpos); |
| 1029 | 151 } |
| 152 | |
| 153 /* Validate LIST as a property list. If LIST is not a list, then | |
| 154 make one consisting of (LIST nil). Otherwise, verify that LIST | |
| 155 is even numbered and thus suitable as a plist. */ | |
| 156 | |
| 157 static Lisp_Object | |
| 158 validate_plist (list) | |
| 159 { | |
| 160 if (NILP (list)) | |
| 161 return Qnil; | |
| 162 | |
| 163 if (CONSP (list)) | |
| 164 { | |
| 165 register int i; | |
| 166 register Lisp_Object tail; | |
| 167 for (i = 0, tail = list; !NILP (tail); i++) | |
| 168 tail = Fcdr (tail); | |
| 169 if (i & 1) | |
| 170 error ("Odd length text property list"); | |
| 171 return list; | |
| 172 } | |
| 173 | |
| 174 return Fcons (list, Fcons (Qnil, Qnil)); | |
| 175 } | |
| 176 | |
| 177 /* Return nonzero if interval I has all the properties, | |
| 178 with the same values, of list PLIST. */ | |
| 179 | |
| 180 static int | |
| 181 interval_has_all_properties (plist, i) | |
| 182 Lisp_Object plist; | |
| 183 INTERVAL i; | |
| 184 { | |
| 185 register Lisp_Object tail1, tail2, sym1, sym2; | |
| 186 register int found; | |
| 187 | |
| 188 /* Go through each element of PLIST. */ | |
| 189 for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) | |
| 190 { | |
| 191 sym1 = Fcar (tail1); | |
| 192 found = 0; | |
| 193 | |
| 194 /* Go through I's plist, looking for sym1 */ | |
| 195 for (tail2 = i->plist; ! NILP (tail2); tail2 = Fcdr (Fcdr (tail2))) | |
| 196 if (EQ (sym1, Fcar (tail2))) | |
| 197 { | |
| 198 /* Found the same property on both lists. If the | |
| 199 values are unequal, return zero. */ | |
| 200 if (! EQ (Fequal (Fcar (Fcdr (tail1)), Fcar (Fcdr (tail2))), | |
| 201 Qt)) | |
| 202 return 0; | |
| 203 | |
| 204 /* Property has same value on both lists; go to next one. */ | |
| 205 found = 1; | |
| 206 break; | |
| 207 } | |
| 208 | |
| 209 if (! found) | |
| 210 return 0; | |
| 211 } | |
| 212 | |
| 213 return 1; | |
| 214 } | |
| 215 | |
| 216 /* Return nonzero if the plist of interval I has any of the | |
| 217 properties of PLIST, regardless of their values. */ | |
| 218 | |
| 219 static INLINE int | |
| 220 interval_has_some_properties (plist, i) | |
| 221 Lisp_Object plist; | |
| 222 INTERVAL i; | |
| 223 { | |
| 224 register Lisp_Object tail1, tail2, sym; | |
| 225 | |
| 226 /* Go through each element of PLIST. */ | |
| 227 for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) | |
| 228 { | |
| 229 sym = Fcar (tail1); | |
| 230 | |
| 231 /* Go through i's plist, looking for tail1 */ | |
| 232 for (tail2 = i->plist; ! NILP (tail2); tail2 = Fcdr (Fcdr (tail2))) | |
| 233 if (EQ (sym, Fcar (tail2))) | |
| 234 return 1; | |
| 235 } | |
| 236 | |
| 237 return 0; | |
| 238 } | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
239 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
240 /* Set the properties of INTERVAL to PROPERTIES, |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
241 and record undo info for the previous values. |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
242 OBJECT is the string or buffer that INTERVAL belongs to. */ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
243 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
244 static void |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
245 set_properties (properties, interval, object) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
246 Lisp_Object properties, object; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
247 INTERVAL interval; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
248 { |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
249 Lisp_Object oldprops; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
250 oldprops = interval->plist; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
251 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
252 /* Record undo for old properties. */ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
253 while (XTYPE (oldprops) == Lisp_Cons) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
254 { |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
255 Lisp_Object sym; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
256 sym = Fcar (oldprops); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
257 record_property_change (interval->position, LENGTH (interval), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
258 sym, Fcar_safe (Fcdr (oldprops)), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
259 object); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
260 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
261 oldprops = Fcdr_safe (Fcdr (oldprops)); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
262 } |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
263 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
264 /* Store new properties. */ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
265 interval->plist = Fcopy_sequence (properties); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
266 } |
| 1029 | 267 |
| 268 /* Add the properties of PLIST to the interval I, or set | |
| 269 the value of I's property to the value of the property on PLIST | |
| 270 if they are different. | |
| 271 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
272 OBJECT should be the string or buffer the interval is in. |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
273 |
| 1029 | 274 Return nonzero if this changes I (i.e., if any members of PLIST |
| 275 are actually added to I's plist) */ | |
| 276 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
277 static int |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
278 add_properties (plist, i, object) |
| 1029 | 279 Lisp_Object plist; |
| 280 INTERVAL i; | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
281 Lisp_Object object; |
| 1029 | 282 { |
| 283 register Lisp_Object tail1, tail2, sym1, val1; | |
| 284 register int changed = 0; | |
| 285 register int found; | |
| 286 | |
| 287 /* Go through each element of PLIST. */ | |
| 288 for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) | |
| 289 { | |
| 290 sym1 = Fcar (tail1); | |
| 291 val1 = Fcar (Fcdr (tail1)); | |
| 292 found = 0; | |
| 293 | |
| 294 /* Go through I's plist, looking for sym1 */ | |
| 295 for (tail2 = i->plist; ! NILP (tail2); tail2 = Fcdr (Fcdr (tail2))) | |
| 296 if (EQ (sym1, Fcar (tail2))) | |
| 297 { | |
| 298 register Lisp_Object this_cdr = Fcdr (tail2); | |
| 299 | |
| 300 /* Found the property. Now check its value. */ | |
| 301 found = 1; | |
| 302 | |
| 303 /* The properties have the same value on both lists. | |
| 304 Continue to the next property. */ | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
305 if (!NILP (Fequal (val1, Fcar (this_cdr)))) |
| 1029 | 306 break; |
| 307 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
308 /* Record this change in the buffer, for undo purposes. */ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
309 if (XTYPE (object) == Lisp_Buffer) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
310 { |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
311 record_property_change (i->position, LENGTH (i), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
312 sym1, Fcar (this_cdr), object); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
313 modify_region (make_number (i->position), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
314 make_number (i->position + LENGTH (i))); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
315 } |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
316 |
| 1029 | 317 /* I's property has a different value -- change it */ |
| 318 Fsetcar (this_cdr, val1); | |
| 319 changed++; | |
| 320 break; | |
| 321 } | |
| 322 | |
| 323 if (! found) | |
| 324 { | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
325 /* Record this change in the buffer, for undo purposes. */ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
326 if (XTYPE (object) == Lisp_Buffer) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
327 { |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
328 record_property_change (i->position, LENGTH (i), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
329 sym1, Qnil, object); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
330 modify_region (make_number (i->position), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
331 make_number (i->position + LENGTH (i))); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
332 } |
| 1029 | 333 i->plist = Fcons (sym1, Fcons (val1, i->plist)); |
| 334 changed++; | |
| 335 } | |
| 336 } | |
| 337 | |
| 338 return changed; | |
| 339 } | |
| 340 | |
| 341 /* For any members of PLIST which are properties of I, remove them | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
342 from I's plist. |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
343 OBJECT is the string or buffer containing I. */ |
| 1029 | 344 |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
345 static int |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
346 remove_properties (plist, i, object) |
| 1029 | 347 Lisp_Object plist; |
| 348 INTERVAL i; | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
349 Lisp_Object object; |
| 1029 | 350 { |
| 351 register Lisp_Object tail1, tail2, sym; | |
| 352 register Lisp_Object current_plist = i->plist; | |
| 353 register int changed = 0; | |
| 354 | |
| 355 /* Go through each element of plist. */ | |
| 356 for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) | |
| 357 { | |
| 358 sym = Fcar (tail1); | |
| 359 | |
| 360 /* First, remove the symbol if its at the head of the list */ | |
| 361 while (! NILP (current_plist) && EQ (sym, Fcar (current_plist))) | |
| 362 { | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
363 if (XTYPE (object) == Lisp_Buffer) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
364 { |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
365 record_property_change (i->position, LENGTH (i), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
366 sym, Fcar (Fcdr (current_plist)), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
367 object); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
368 modify_region (make_number (i->position), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
369 make_number (i->position + LENGTH (i))); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
370 } |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
371 |
| 1029 | 372 current_plist = Fcdr (Fcdr (current_plist)); |
| 373 changed++; | |
| 374 } | |
| 375 | |
| 376 /* Go through i's plist, looking for sym */ | |
| 377 tail2 = current_plist; | |
| 378 while (! NILP (tail2)) | |
| 379 { | |
| 380 register Lisp_Object this = Fcdr (Fcdr (tail2)); | |
| 381 if (EQ (sym, Fcar (this))) | |
| 382 { | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
383 if (XTYPE (object) == Lisp_Buffer) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
384 { |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
385 record_property_change (i->position, LENGTH (i), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
386 sym, Fcar (Fcdr (this)), object); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
387 modify_region (make_number (i->position), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
388 make_number (i->position + LENGTH (i))); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
389 } |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
390 |
| 1029 | 391 Fsetcdr (Fcdr (tail2), Fcdr (Fcdr (this))); |
| 392 changed++; | |
| 393 } | |
| 394 tail2 = this; | |
| 395 } | |
| 396 } | |
| 397 | |
| 398 if (changed) | |
| 399 i->plist = current_plist; | |
| 400 return changed; | |
| 401 } | |
| 402 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
403 #if 0 |
| 1029 | 404 /* Remove all properties from interval I. Return non-zero |
| 405 if this changes the interval. */ | |
| 406 | |
| 407 static INLINE int | |
| 408 erase_properties (i) | |
| 409 INTERVAL i; | |
| 410 { | |
| 411 if (NILP (i->plist)) | |
| 412 return 0; | |
| 413 | |
| 414 i->plist = Qnil; | |
| 415 return 1; | |
| 416 } | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
417 #endif |
| 1029 | 418 |
| 419 DEFUN ("text-properties-at", Ftext_properties_at, | |
| 420 Stext_properties_at, 1, 2, 0, | |
| 421 "Return the list of properties held by the character at POSITION\n\ | |
| 422 in optional argument OBJECT, a string or buffer. If nil, OBJECT\n\ | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
423 defaults to the current buffer.\n\ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
424 If POSITION is at the end of OBJECT, the value is nil.") |
| 1029 | 425 (pos, object) |
| 426 Lisp_Object pos, object; | |
| 427 { | |
| 428 register INTERVAL i; | |
| 429 | |
| 430 if (NILP (object)) | |
| 431 XSET (object, Lisp_Buffer, current_buffer); | |
| 432 | |
| 433 i = validate_interval_range (object, &pos, &pos, soft); | |
| 434 if (NULL_INTERVAL_P (i)) | |
| 435 return Qnil; | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
436 /* If POS is at the end of the interval, |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
437 it means it's the end of OBJECT. |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
438 There are no properties at the very end, |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
439 since no character follows. */ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
440 if (XINT (pos) == LENGTH (i) + i->position) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
441 return Qnil; |
| 1029 | 442 |
| 443 return i->plist; | |
| 444 } | |
| 445 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
446 DEFUN ("get-text-property", Fget_text_property, Sget_text_property, 2, 3, 0, |
|
1930
1cdbdbe2f70a
* textprop.c (Fget_text_property): Fix typo in function's declaration.
Jim Blandy <jimb@redhat.com>
parents:
1857
diff
changeset
|
447 "Return the value of position POS's property PROP, in OBJECT.\n\ |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
448 OBJECT is optional and defaults to the current buffer.\n\ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
449 If POSITION is at the end of OBJECT, the value is nil.") |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
450 (pos, prop, object) |
|
1930
1cdbdbe2f70a
* textprop.c (Fget_text_property): Fix typo in function's declaration.
Jim Blandy <jimb@redhat.com>
parents:
1857
diff
changeset
|
451 Lisp_Object pos, object; |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
452 register Lisp_Object prop; |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
453 { |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
454 register INTERVAL i; |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
455 register Lisp_Object tail; |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
456 |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
457 if (NILP (object)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
458 XSET (object, Lisp_Buffer, current_buffer); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
459 i = validate_interval_range (object, &pos, &pos, soft); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
460 if (NULL_INTERVAL_P (i)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
461 return Qnil; |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
462 |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
463 /* If POS is at the end of the interval, |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
464 it means it's the end of OBJECT. |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
465 There are no properties at the very end, |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
466 since no character follows. */ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
467 if (XINT (pos) == LENGTH (i) + i->position) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
468 return Qnil; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
469 |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
470 for (tail = i->plist; !NILP (tail); tail = Fcdr (Fcdr (tail))) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
471 { |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
472 register Lisp_Object tem; |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
473 tem = Fcar (tail); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
474 if (EQ (prop, tem)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
475 return Fcar (Fcdr (tail)); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
476 } |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
477 return Qnil; |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
478 } |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
479 |
| 1029 | 480 DEFUN ("next-property-change", Fnext_property_change, |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
481 Snext_property_change, 1, 2, 0, |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
482 "Return the position of next property change.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
483 Scans characters forward from POS in OBJECT till it finds\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
484 a change in some text property, then returns the position of the change.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
485 The optional second argument OBJECT is the string or buffer to scan.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
486 Return nil if the property is constant all the way to the end of OBJECT.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
487 If the value is non-nil, it is a position greater than POS, never equal.") |
| 1029 | 488 (pos, object) |
| 489 Lisp_Object pos, object; | |
| 490 { | |
| 491 register INTERVAL i, next; | |
| 492 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
493 if (NILP (object)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
494 XSET (object, Lisp_Buffer, current_buffer); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
495 |
| 1029 | 496 i = validate_interval_range (object, &pos, &pos, soft); |
| 497 if (NULL_INTERVAL_P (i)) | |
| 498 return Qnil; | |
| 499 | |
| 500 next = next_interval (i); | |
| 501 while (! NULL_INTERVAL_P (next) && intervals_equal (i, next)) | |
| 502 next = next_interval (next); | |
| 503 | |
| 504 if (NULL_INTERVAL_P (next)) | |
| 505 return Qnil; | |
| 506 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
507 return next->position - (XTYPE (object) == Lisp_String); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
508 ; |
| 1029 | 509 } |
| 510 | |
| 1211 | 511 DEFUN ("next-single-property-change", Fnext_single_property_change, |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
512 Snext_single_property_change, 1, 3, 0, |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
513 "Return the position of next property change for a specific property.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
514 Scans characters forward from POS till it finds\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
515 a change in the PROP property, then returns the position of the change.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
516 The optional third argument OBJECT is the string or buffer to scan.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
517 Return nil if the property is constant all the way to the end of OBJECT.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
518 If the value is non-nil, it is a position greater than POS, never equal.") |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
519 (pos, prop, object) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
520 Lisp_Object pos, prop, object; |
| 1211 | 521 { |
| 522 register INTERVAL i, next; | |
| 523 register Lisp_Object here_val; | |
| 524 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
525 if (NILP (object)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
526 XSET (object, Lisp_Buffer, current_buffer); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
527 |
| 1211 | 528 i = validate_interval_range (object, &pos, &pos, soft); |
| 529 if (NULL_INTERVAL_P (i)) | |
| 530 return Qnil; | |
| 531 | |
| 532 here_val = Fget (prop, i->plist); | |
| 533 next = next_interval (i); | |
| 534 while (! NULL_INTERVAL_P (next) && EQ (here_val, Fget (prop, next->plist))) | |
| 535 next = next_interval (next); | |
| 536 | |
| 537 if (NULL_INTERVAL_P (next)) | |
| 538 return Qnil; | |
| 539 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
540 return next->position - (XTYPE (object) == Lisp_String); |
| 1211 | 541 } |
| 542 | |
| 1029 | 543 DEFUN ("previous-property-change", Fprevious_property_change, |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
544 Sprevious_property_change, 1, 2, 0, |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
545 "Return the position of previous property change.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
546 Scans characters backwards from POS in OBJECT till it finds\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
547 a change in some text property, then returns the position of the change.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
548 The optional second argument OBJECT is the string or buffer to scan.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
549 Return nil if the property is constant all the way to the start of OBJECT.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
550 If the value is non-nil, it is a position less than POS, never equal.") |
| 1029 | 551 (pos, object) |
| 552 Lisp_Object pos, object; | |
| 553 { | |
| 554 register INTERVAL i, previous; | |
| 555 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
556 if (NILP (object)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
557 XSET (object, Lisp_Buffer, current_buffer); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
558 |
| 1029 | 559 i = validate_interval_range (object, &pos, &pos, soft); |
| 560 if (NULL_INTERVAL_P (i)) | |
| 561 return Qnil; | |
| 562 | |
| 563 previous = previous_interval (i); | |
| 564 while (! NULL_INTERVAL_P (previous) && intervals_equal (previous, i)) | |
| 565 previous = previous_interval (previous); | |
| 566 if (NULL_INTERVAL_P (previous)) | |
| 567 return Qnil; | |
| 568 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
569 return (previous->position + LENGTH (previous) - 1 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
570 - (XTYPE (object) == Lisp_String)); |
| 1029 | 571 } |
| 572 | |
| 1211 | 573 DEFUN ("previous-single-property-change", Fprevious_single_property_change, |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
574 Sprevious_single_property_change, 2, 3, 0, |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
575 "Return the position of previous property change for a specific property.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
576 Scans characters backward from POS till it finds\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
577 a change in the PROP property, then returns the position of the change.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
578 The optional third argument OBJECT is the string or buffer to scan.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
579 Return nil if the property is constant all the way to the start of OBJECT.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
580 If the value is non-nil, it is a position less than POS, never equal.") |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
581 (pos, prop, object) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
582 Lisp_Object pos, prop, object; |
| 1211 | 583 { |
| 584 register INTERVAL i, previous; | |
| 585 register Lisp_Object here_val; | |
| 586 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
587 if (NILP (object)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
588 XSET (object, Lisp_Buffer, current_buffer); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
589 |
| 1211 | 590 i = validate_interval_range (object, &pos, &pos, soft); |
| 591 if (NULL_INTERVAL_P (i)) | |
| 592 return Qnil; | |
| 593 | |
| 594 here_val = Fget (prop, i->plist); | |
| 595 previous = previous_interval (i); | |
| 596 while (! NULL_INTERVAL_P (previous) | |
| 597 && EQ (here_val, Fget (prop, previous->plist))) | |
| 598 previous = previous_interval (previous); | |
| 599 if (NULL_INTERVAL_P (previous)) | |
| 600 return Qnil; | |
| 601 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
602 return (previous->position + LENGTH (previous) - 1 |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
603 - (XTYPE (object) == Lisp_String)); |
| 1211 | 604 } |
| 605 | |
| 1029 | 606 DEFUN ("add-text-properties", Fadd_text_properties, |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
607 Sadd_text_properties, 3, 4, 0, |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
608 "Add properties to the text from START to END.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
609 The third argument PROPS is a property list\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
610 specifying the property values to add.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
611 The optional fourth argument, OBJECT,\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
612 is the string or buffer containing the text.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
613 Return t if any property value actually changed, nil otherwise.") |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
614 (start, end, properties, object) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
615 Lisp_Object start, end, properties, object; |
| 1029 | 616 { |
| 617 register INTERVAL i, unchanged; | |
| 618 register int s, len, modified; | |
| 619 | |
| 620 properties = validate_plist (properties); | |
| 621 if (NILP (properties)) | |
| 622 return Qnil; | |
| 623 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
624 if (NILP (object)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
625 XSET (object, Lisp_Buffer, current_buffer); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
626 |
| 1029 | 627 i = validate_interval_range (object, &start, &end, hard); |
| 628 if (NULL_INTERVAL_P (i)) | |
| 629 return Qnil; | |
| 630 | |
| 631 s = XINT (start); | |
| 632 len = XINT (end) - s; | |
| 633 | |
| 634 /* If we're not starting on an interval boundary, we have to | |
| 635 split this interval. */ | |
| 636 if (i->position != s) | |
| 637 { | |
| 638 /* If this interval already has the properties, we can | |
| 639 skip it. */ | |
| 640 if (interval_has_all_properties (properties, i)) | |
| 641 { | |
| 642 int got = (LENGTH (i) - (s - i->position)); | |
| 643 if (got >= len) | |
| 644 return Qnil; | |
| 645 len -= got; | |
| 646 } | |
| 647 else | |
| 648 { | |
| 649 unchanged = i; | |
| 650 i = split_interval_right (unchanged, s - unchanged->position + 1); | |
| 651 copy_properties (unchanged, i); | |
| 652 if (LENGTH (i) > len) | |
| 653 { | |
| 654 i = split_interval_left (i, len + 1); | |
| 655 copy_properties (unchanged, i); | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
656 add_properties (properties, i, object); |
| 1029 | 657 return Qt; |
| 658 } | |
| 659 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
660 add_properties (properties, i, object); |
| 1029 | 661 modified = 1; |
| 662 len -= LENGTH (i); | |
| 663 i = next_interval (i); | |
| 664 } | |
| 665 } | |
| 666 | |
| 667 /* We are at the beginning of an interval, with len to scan */ | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
668 while (len > 0) |
| 1029 | 669 { |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
670 if (i == 0) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
671 abort (); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
672 |
| 1029 | 673 if (LENGTH (i) >= len) |
| 674 { | |
| 675 if (interval_has_all_properties (properties, i)) | |
| 676 return modified ? Qt : Qnil; | |
| 677 | |
| 678 if (LENGTH (i) == len) | |
| 679 { | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
680 add_properties (properties, i, object); |
| 1029 | 681 return Qt; |
| 682 } | |
| 683 | |
| 684 /* i doesn't have the properties, and goes past the change limit */ | |
| 685 unchanged = i; | |
| 686 i = split_interval_left (unchanged, len + 1); | |
| 687 copy_properties (unchanged, i); | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
688 add_properties (properties, i, object); |
| 1029 | 689 return Qt; |
| 690 } | |
| 691 | |
| 692 len -= LENGTH (i); | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
693 modified += add_properties (properties, i, object); |
| 1029 | 694 i = next_interval (i); |
| 695 } | |
| 696 } | |
| 697 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
698 DEFUN ("put-text-property", Fput_text_property, |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
699 Sput_text_property, 4, 5, 0, |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
700 "Set one property of the text from START to END.\n\ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
701 The third and fourth arguments PROP and VALUE\n\ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
702 specify the property to add.\n\ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
703 The optional fifth argument, OBJECT,\n\ |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
704 is the string or buffer containing the text.") |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
705 (start, end, prop, value, object) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
706 Lisp_Object start, end, prop, value, object; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
707 { |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
708 Fadd_text_properties (start, end, |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
709 Fcons (prop, Fcons (value, Qnil)), |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
710 object); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
711 return Qnil; |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
712 } |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
713 |
| 1029 | 714 DEFUN ("set-text-properties", Fset_text_properties, |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
715 Sset_text_properties, 3, 4, 0, |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
716 "Completely replace properties of text from START to END.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
717 The third argument PROPS is the new property list.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
718 The optional fourth argument, OBJECT,\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
719 is the string or buffer containing the text.") |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
720 (start, end, props, object) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
721 Lisp_Object start, end, props, object; |
| 1029 | 722 { |
| 723 register INTERVAL i, unchanged; | |
| 1211 | 724 register INTERVAL prev_changed = NULL_INTERVAL; |
| 1029 | 725 register int s, len; |
| 726 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
727 props = validate_plist (props); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
728 if (NILP (props)) |
| 1029 | 729 return Qnil; |
| 730 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
731 if (NILP (object)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
732 XSET (object, Lisp_Buffer, current_buffer); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
733 |
| 1029 | 734 i = validate_interval_range (object, &start, &end, hard); |
| 735 if (NULL_INTERVAL_P (i)) | |
| 736 return Qnil; | |
| 737 | |
| 738 s = XINT (start); | |
| 739 len = XINT (end) - s; | |
| 740 | |
| 741 if (i->position != s) | |
| 742 { | |
| 743 unchanged = i; | |
| 744 i = split_interval_right (unchanged, s - unchanged->position + 1); | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
745 set_properties (props, i, object); |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
746 |
| 1029 | 747 if (LENGTH (i) > len) |
| 748 { | |
| 1211 | 749 i = split_interval_right (i, len); |
| 750 copy_properties (unchanged, i); | |
| 1029 | 751 return Qt; |
| 752 } | |
| 753 | |
| 1211 | 754 if (LENGTH (i) == len) |
| 755 return Qt; | |
| 756 | |
| 757 prev_changed = i; | |
| 1029 | 758 len -= LENGTH (i); |
| 759 i = next_interval (i); | |
| 760 } | |
| 761 | |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
762 /* We are starting at the beginning of an interval, I */ |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
763 while (len > 0) |
| 1029 | 764 { |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
765 if (i == 0) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
766 abort (); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
767 |
| 1029 | 768 if (LENGTH (i) >= len) |
| 769 { | |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
770 if (LENGTH (i) > len) |
|
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
771 i = split_interval_left (i, len + 1); |
| 1029 | 772 |
| 1211 | 773 if (NULL_INTERVAL_P (prev_changed)) |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
774 set_properties (props, i, object); |
| 1211 | 775 else |
| 776 merge_interval_left (i); | |
| 1029 | 777 return Qt; |
| 778 } | |
| 779 | |
| 780 len -= LENGTH (i); | |
| 1211 | 781 if (NULL_INTERVAL_P (prev_changed)) |
| 782 { | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
783 set_properties (props, i, object); |
| 1211 | 784 prev_changed = i; |
| 785 } | |
| 786 else | |
| 787 prev_changed = i = merge_interval_left (i); | |
| 788 | |
| 1029 | 789 i = next_interval (i); |
| 790 } | |
| 791 | |
| 792 return Qt; | |
| 793 } | |
| 794 | |
| 795 DEFUN ("remove-text-properties", Fremove_text_properties, | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
796 Sremove_text_properties, 3, 4, 0, |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
797 "Remove some properties from text from START to END.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
798 The third argument PROPS is a property list\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
799 whose property names specify the properties to remove.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
800 \(The values stored in PROPS are ignored.)\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
801 The optional fourth argument, OBJECT,\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
802 is the string or buffer containing the text.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
803 Return t if any property was actually removed, nil otherwise.") |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
804 (start, end, props, object) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
805 Lisp_Object start, end, props, object; |
| 1029 | 806 { |
| 807 register INTERVAL i, unchanged; | |
| 808 register int s, len, modified; | |
| 809 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
810 if (NILP (object)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
811 XSET (object, Lisp_Buffer, current_buffer); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
812 |
| 1029 | 813 i = validate_interval_range (object, &start, &end, soft); |
| 814 if (NULL_INTERVAL_P (i)) | |
| 815 return Qnil; | |
| 816 | |
| 817 s = XINT (start); | |
| 818 len = XINT (end) - s; | |
| 1211 | 819 |
| 1029 | 820 if (i->position != s) |
| 821 { | |
| 822 /* No properties on this first interval -- return if | |
| 823 it covers the entire region. */ | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
824 if (! interval_has_some_properties (props, i)) |
| 1029 | 825 { |
| 826 int got = (LENGTH (i) - (s - i->position)); | |
| 827 if (got >= len) | |
| 828 return Qnil; | |
| 829 len -= got; | |
| 830 } | |
| 831 /* Remove the properties from this interval. If it's short | |
| 832 enough, return, splitting it if it's too short. */ | |
| 833 else | |
| 834 { | |
| 835 unchanged = i; | |
| 836 i = split_interval_right (unchanged, s - unchanged->position + 1); | |
| 837 copy_properties (unchanged, i); | |
| 838 if (LENGTH (i) > len) | |
| 839 { | |
| 840 i = split_interval_left (i, len + 1); | |
| 841 copy_properties (unchanged, i); | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
842 remove_properties (props, i, object); |
| 1029 | 843 return Qt; |
| 844 } | |
| 845 | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
846 remove_properties (props, i, object); |
| 1029 | 847 modified = 1; |
| 848 len -= LENGTH (i); | |
| 849 i = next_interval (i); | |
| 850 } | |
| 851 } | |
| 852 | |
| 853 /* We are at the beginning of an interval, with len to scan */ | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
854 while (len > 0) |
| 1029 | 855 { |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
856 if (i == 0) |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
857 abort (); |
|
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
858 |
| 1029 | 859 if (LENGTH (i) >= len) |
| 860 { | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
861 if (! interval_has_some_properties (props, i)) |
| 1029 | 862 return modified ? Qt : Qnil; |
| 863 | |
| 864 if (LENGTH (i) == len) | |
| 865 { | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
866 remove_properties (props, i, object); |
| 1029 | 867 return Qt; |
| 868 } | |
| 869 | |
| 870 /* i has the properties, and goes past the change limit */ | |
| 871 unchanged = split_interval_right (i, len + 1); | |
| 872 copy_properties (unchanged, i); | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
873 remove_properties (props, i, object); |
| 1029 | 874 return Qt; |
| 875 } | |
| 876 | |
| 877 len -= LENGTH (i); | |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
878 modified += remove_properties (props, i, object); |
| 1029 | 879 i = next_interval (i); |
| 880 } | |
| 881 } | |
| 882 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
883 #if 0 /* You can use set-text-properties for this. */ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
884 |
| 1029 | 885 DEFUN ("erase-text-properties", Ferase_text_properties, |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
886 Serase_text_properties, 2, 3, 0, |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
887 "Remove all properties from the text from START to END.\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
888 The optional third argument, OBJECT,\n\ |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
889 is the string or buffer containing the text.") |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
890 (start, end, object) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
891 Lisp_Object start, end, object; |
| 1029 | 892 { |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
893 register INTERVAL i; |
| 1305 | 894 register INTERVAL prev_changed = NULL_INTERVAL; |
| 1029 | 895 register int s, len, modified; |
| 896 | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
897 if (NILP (object)) |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
898 XSET (object, Lisp_Buffer, current_buffer); |
|
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
899 |
| 1029 | 900 i = validate_interval_range (object, &start, &end, soft); |
| 901 if (NULL_INTERVAL_P (i)) | |
| 902 return Qnil; | |
| 903 | |
| 904 s = XINT (start); | |
| 905 len = XINT (end) - s; | |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
906 |
| 1029 | 907 if (i->position != s) |
| 908 { | |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
909 register int got; |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
910 register INTERVAL unchanged = i; |
| 1029 | 911 |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
912 /* If there are properties here, then this text will be modified. */ |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
913 if (! NILP (i->plist)) |
| 1029 | 914 { |
| 915 i = split_interval_right (unchanged, s - unchanged->position + 1); | |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
916 i->plist = Qnil; |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
917 modified++; |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
918 |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
919 if (LENGTH (i) > len) |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
920 { |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
921 i = split_interval_right (i, len + 1); |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
922 copy_properties (unchanged, i); |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
923 return Qt; |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
924 } |
| 1029 | 925 |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
926 if (LENGTH (i) == len) |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
927 return Qt; |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
928 |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
929 got = LENGTH (i); |
| 1029 | 930 } |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
931 /* If the text of I is without any properties, and contains |
|
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
932 LEN or more characters, then we may return without changing |
|
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
933 anything.*/ |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
934 else if (LENGTH (i) - (s - i->position) <= len) |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
935 return Qnil; |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
936 /* The amount of text to change extends past I, so just note |
|
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
937 how much we've gotten. */ |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
938 else |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
939 got = LENGTH (i) - (s - i->position); |
| 1029 | 940 |
| 941 len -= got; | |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
942 prev_changed = i; |
| 1029 | 943 i = next_interval (i); |
| 944 } | |
| 945 | |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
946 /* We are starting at the beginning of an interval, I. */ |
| 1029 | 947 while (len > 0) |
| 948 { | |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
949 if (LENGTH (i) >= len) |
| 1029 | 950 { |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
951 /* If I has no properties, simply merge it if possible. */ |
|
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
952 if (NILP (i->plist)) |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
953 { |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
954 if (! NULL_INTERVAL_P (prev_changed)) |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
955 merge_interval_left (i); |
| 1029 | 956 |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
957 return modified ? Qt : Qnil; |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
958 } |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
959 |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
960 if (LENGTH (i) > len) |
|
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
961 i = split_interval_left (i, len + 1); |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
962 if (! NULL_INTERVAL_P (prev_changed)) |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
963 merge_interval_left (i); |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
964 else |
|
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
965 i->plist = Qnil; |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
966 |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
967 return Qt; |
| 1029 | 968 } |
| 969 | |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
970 /* Here if we still need to erase past the end of I */ |
| 1029 | 971 len -= LENGTH (i); |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
972 if (NULL_INTERVAL_P (prev_changed)) |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
973 { |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
974 modified += erase_properties (i); |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
975 prev_changed = i; |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
976 } |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
977 else |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
978 { |
|
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
979 modified += ! NILP (i->plist); |
|
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
980 /* Merging I will give it the properties of PREV_CHANGED. */ |
|
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
981 prev_changed = i = merge_interval_left (i); |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
982 } |
|
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
983 |
| 1029 | 984 i = next_interval (i); |
| 985 } | |
| 986 | |
| 987 return modified ? Qt : Qnil; | |
| 988 } | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
989 #endif /* 0 */ |
| 1029 | 990 |
| 991 void | |
| 992 syms_of_textprop () | |
| 993 { | |
| 994 DEFVAR_INT ("interval-balance-threshold", &interval_balance_threshold, | |
|
1715
cd23f7ef1bd0
* floatfns.c (Flog): Fix unescaped newline in string.
Jim Blandy <jimb@redhat.com>
parents:
1305
diff
changeset
|
995 "Threshold for rebalancing interval trees, expressed as the\n\ |
| 1029 | 996 percentage by which the left interval tree should not differ from the right."); |
| 997 interval_balance_threshold = 8; | |
| 998 | |
| 999 /* Common attributes one might give text */ | |
| 1000 | |
| 1001 staticpro (&Qforeground); | |
| 1002 Qforeground = intern ("foreground"); | |
| 1003 staticpro (&Qbackground); | |
| 1004 Qbackground = intern ("background"); | |
| 1005 staticpro (&Qfont); | |
| 1006 Qfont = intern ("font"); | |
| 1007 staticpro (&Qstipple); | |
| 1008 Qstipple = intern ("stipple"); | |
| 1009 staticpro (&Qunderline); | |
| 1010 Qunderline = intern ("underline"); | |
| 1011 staticpro (&Qread_only); | |
| 1012 Qread_only = intern ("read-only"); | |
| 1013 staticpro (&Qinvisible); | |
| 1014 Qinvisible = intern ("invisible"); | |
| 1015 | |
| 1016 /* Properties that text might use to specify certain actions */ | |
| 1017 | |
| 1018 staticpro (&Qmouse_left); | |
| 1019 Qmouse_left = intern ("mouse-left"); | |
| 1020 staticpro (&Qmouse_entered); | |
| 1021 Qmouse_entered = intern ("mouse-entered"); | |
| 1022 staticpro (&Qpoint_left); | |
| 1023 Qpoint_left = intern ("point-left"); | |
| 1024 staticpro (&Qpoint_entered); | |
| 1025 Qpoint_entered = intern ("point-entered"); | |
|
2053
8bdcc55ebd8f
(Qmodification_hooks): Renamed from Qmodification.
Richard M. Stallman <rms@gnu.org>
parents:
1965
diff
changeset
|
1026 staticpro (&Qmodification_hooks); |
|
8bdcc55ebd8f
(Qmodification_hooks): Renamed from Qmodification.
Richard M. Stallman <rms@gnu.org>
parents:
1965
diff
changeset
|
1027 Qmodification_hooks = intern ("modification-hooks"); |
| 1029 | 1028 |
| 1029 defsubr (&Stext_properties_at); | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1030 defsubr (&Sget_text_property); |
| 1029 | 1031 defsubr (&Snext_property_change); |
| 1211 | 1032 defsubr (&Snext_single_property_change); |
| 1029 | 1033 defsubr (&Sprevious_property_change); |
| 1211 | 1034 defsubr (&Sprevious_single_property_change); |
| 1029 | 1035 defsubr (&Sadd_text_properties); |
|
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1036 defsubr (&Sput_text_property); |
| 1029 | 1037 defsubr (&Sset_text_properties); |
| 1038 defsubr (&Sremove_text_properties); | |
|
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1039 /* defsubr (&Serase_text_properties); */ |
| 1029 | 1040 } |
|
1302
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1041 |
|
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1042 #else |
|
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1043 |
|
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1044 lose -- this shouldn't be compiled if USE_TEXT_PROPERTIES isn't defined |
|
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1045 |
|
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1046 #endif /* USE_TEXT_PROPERTIES */ |
