Mercurial > emacs
annotate src/textprop.c @ 10943:6a2af2832a42
(indent-new-comment-line): Clean up handling of \(...\) in comment-start-skip.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 08 Mar 1995 03:49:00 +0000 |
parents | 0480d65be55d |
children | 7f0bc7bcf1f3 |
rev | line source |
---|---|
1029 | 1 /* Interface code for dealing with text properties. |
10488
701e7acfe885
(Ftext_property_any): Handle the trivial case specially.
Karl Heuer <kwzh@gnu.org>
parents:
10312
diff
changeset
|
2 Copyright (C) 1993, 1994, 1995 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 | |
3698 | 8 the Free Software Foundation; either version 2, or (at your option) |
1029 | 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 | |
4696
1fc792473491
Include <config.h> instead of "config.h".
Roland McGrath <roland@gnu.org>
parents:
4649
diff
changeset
|
20 #include <config.h> |
1029 | 21 #include "lisp.h" |
22 #include "intervals.h" | |
23 #include "buffer.h" | |
6063
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
24 #include "window.h" |
8962
722763fed8ce
(Fget_char_property): Pass new arg to overlays_at.
Richard M. Stallman <rms@gnu.org>
parents:
8907
diff
changeset
|
25 |
722763fed8ce
(Fget_char_property): Pass new arg to overlays_at.
Richard M. Stallman <rms@gnu.org>
parents:
8907
diff
changeset
|
26 #ifndef NULL |
722763fed8ce
(Fget_char_property): Pass new arg to overlays_at.
Richard M. Stallman <rms@gnu.org>
parents:
8907
diff
changeset
|
27 #define NULL (void *)0 |
722763fed8ce
(Fget_char_property): Pass new arg to overlays_at.
Richard M. Stallman <rms@gnu.org>
parents:
8907
diff
changeset
|
28 #endif |
1029 | 29 |
30 | |
31 /* NOTES: previous- and next- property change will have to skip | |
32 zero-length intervals if they are implemented. This could be done | |
33 inside next_interval and previous_interval. | |
34 | |
1211 | 35 set_properties needs to deal with the interval property cache. |
36 | |
1029 | 37 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
|
38 only once on the list. Although some code i.e., remove_properties, |
1029 | 39 handles the more general case, the uniqueness of properties is |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3553
diff
changeset
|
40 necessary for the system to remain consistent. This requirement |
1029 | 41 is enforced by the subrs installing properties onto the intervals. */ |
42 | |
1302
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
43 /* 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
|
44 #ifdef USE_TEXT_PROPERTIES |
1029 | 45 |
46 /* Types of hooks. */ | |
47 Lisp_Object Qmouse_left; | |
48 Lisp_Object Qmouse_entered; | |
49 Lisp_Object Qpoint_left; | |
50 Lisp_Object Qpoint_entered; | |
2058
a43d0bb1b7d8
(Fget_text_property): Use textget.
Richard M. Stallman <rms@gnu.org>
parents:
2053
diff
changeset
|
51 Lisp_Object Qcategory; |
a43d0bb1b7d8
(Fget_text_property): Use textget.
Richard M. Stallman <rms@gnu.org>
parents:
2053
diff
changeset
|
52 Lisp_Object Qlocal_map; |
1029 | 53 |
54 /* Visual properties text (including strings) may have. */ | |
55 Lisp_Object Qforeground, Qbackground, Qfont, Qunderline, Qstipple; | |
6755
a2bccbc870e6
(syms_of_textprop): Initialize Qintangible.
Karl Heuer <kwzh@gnu.org>
parents:
6681
diff
changeset
|
56 Lisp_Object Qinvisible, Qread_only, Qintangible; |
4381
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
57 |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
58 /* Sticky properties */ |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
59 Lisp_Object Qfront_sticky, Qrear_nonsticky; |
3960
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
60 |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
61 /* If o1 is a cons whose cdr is a cons, return non-zero and set o2 to |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
62 the o1's cdr. Otherwise, return zero. This is handy for |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
63 traversing plists. */ |
9945
9b2ecbd894e4
(PLIST_ELT_P): Avoid assignments in arguments to a type-test macro.
Karl Heuer <kwzh@gnu.org>
parents:
9541
diff
changeset
|
64 #define PLIST_ELT_P(o1, o2) (CONSP (o1) && ((o2)=XCONS (o1)->cdr, CONSP (o2))) |
3960
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
65 |
4242
49007dbbec4c
(syms_of_textprop): Set up Lisp var Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents:
4214
diff
changeset
|
66 Lisp_Object Vinhibit_point_motion_hooks; |
10925
0480d65be55d
(Vdefault_properties): New vbl.
Boris Goldowsky <boris@gnu.org>
parents:
10488
diff
changeset
|
67 Lisp_Object Vdefault_properties; |
4242
49007dbbec4c
(syms_of_textprop): Set up Lisp var Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents:
4214
diff
changeset
|
68 |
1029 | 69 |
1055 | 70 /* Extract the interval at the position pointed to by BEGIN from |
71 OBJECT, a string or buffer. Additionally, check that the positions | |
72 pointed to by BEGIN and END are within the bounds of OBJECT, and | |
73 reverse them if *BEGIN is greater than *END. The objects pointed | |
74 to by BEGIN and END may be integers or markers; if the latter, they | |
75 are coerced to integers. | |
1029 | 76 |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
77 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
|
78 to make them origin-one. |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
79 |
1029 | 80 Note that buffer points don't correspond to interval indices. |
81 For example, point-max is 1 greater than the index of the last | |
82 character. This difference is handled in the caller, which uses | |
83 the validated points to determine a length, and operates on that. | |
84 Exceptions are Ftext_properties_at, Fnext_property_change, and | |
85 Fprevious_property_change which call this function with BEGIN == END. | |
86 Handle this case specially. | |
87 | |
88 If FORCE is soft (0), it's OK to return NULL_INTERVAL. Otherwise, | |
1055 | 89 create an interval tree for OBJECT if one doesn't exist, provided |
90 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
|
91 is no text, there can be no text properties. */ |
1029 | 92 |
93 #define soft 0 | |
94 #define hard 1 | |
95 | |
96 static INTERVAL | |
97 validate_interval_range (object, begin, end, force) | |
98 Lisp_Object object, *begin, *end; | |
99 int force; | |
100 { | |
101 register INTERVAL i; | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
102 int searchpos; |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
103 |
1029 | 104 CHECK_STRING_OR_BUFFER (object, 0); |
105 CHECK_NUMBER_COERCE_MARKER (*begin, 0); | |
106 CHECK_NUMBER_COERCE_MARKER (*end, 0); | |
107 | |
108 /* If we are asked for a point, but from a subr which operates | |
109 on a range, then return nothing. */ | |
8907
f7de8b4cb1b8
(validate_interval_range, property_value, Fget_char_property,
Karl Heuer <kwzh@gnu.org>
parents:
8856
diff
changeset
|
110 if (EQ (*begin, *end) && begin != end) |
1029 | 111 return NULL_INTERVAL; |
112 | |
113 if (XINT (*begin) > XINT (*end)) | |
114 { | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
115 Lisp_Object n; |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
116 n = *begin; |
1029 | 117 *begin = *end; |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
118 *end = n; |
1029 | 119 } |
120 | |
9109
6e44ddc40153
(validate_interval_range, add_properties, remove_properties,
Karl Heuer <kwzh@gnu.org>
parents:
9071
diff
changeset
|
121 if (BUFFERP (object)) |
1029 | 122 { |
123 register struct buffer *b = XBUFFER (object); | |
124 | |
125 if (!(BUF_BEGV (b) <= XINT (*begin) && XINT (*begin) <= XINT (*end) | |
126 && XINT (*end) <= BUF_ZV (b))) | |
127 args_out_of_range (*begin, *end); | |
10312
4bf079c613c6
(validate_interval_range): Use BUF_INTERVALS.
Richard M. Stallman <rms@gnu.org>
parents:
10159
diff
changeset
|
128 i = BUF_INTERVALS (b); |
1029 | 129 |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
130 /* 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
|
131 if (BUF_BEGV (b) == BUF_ZV (b)) |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
132 return NULL_INTERVAL; |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
133 |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
134 searchpos = XINT (*begin); |
1029 | 135 } |
136 else | |
137 { | |
138 register struct Lisp_String *s = XSTRING (object); | |
139 | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
140 if (! (0 <= XINT (*begin) && XINT (*begin) <= XINT (*end) |
1029 | 141 && XINT (*end) <= s->size)) |
142 args_out_of_range (*begin, *end); | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
143 /* 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
|
144 but the interval code always wants positions starting with 1. */ |
9331
bbf226780027
(validate_interval_range): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9321
diff
changeset
|
145 XSETFASTINT (*begin, XFASTINT (*begin) + 1); |
3996
b9bdcf862c67
* textprop.c (validate_interval_range): Don't increment both
Jim Blandy <jimb@redhat.com>
parents:
3960
diff
changeset
|
146 if (begin != end) |
9331
bbf226780027
(validate_interval_range): Don't use XFASTINT as an lvalue.
Karl Heuer <kwzh@gnu.org>
parents:
9321
diff
changeset
|
147 XSETFASTINT (*end, XFASTINT (*end) + 1); |
1029 | 148 i = s->intervals; |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
149 |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
150 if (s->size == 0) |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
151 return NULL_INTERVAL; |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
152 |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
153 searchpos = XINT (*begin); |
1029 | 154 } |
155 | |
156 if (NULL_INTERVAL_P (i)) | |
157 return (force ? create_root_interval (object) : i); | |
158 | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
159 return find_interval (i, searchpos); |
1029 | 160 } |
161 | |
162 /* Validate LIST as a property list. If LIST is not a list, then | |
163 make one consisting of (LIST nil). Otherwise, verify that LIST | |
164 is even numbered and thus suitable as a plist. */ | |
165 | |
166 static Lisp_Object | |
167 validate_plist (list) | |
4797
4dd43e41207a
(validate_plist): Add argument declaration for `list'.
Brian Fox <bfox@gnu.org>
parents:
4696
diff
changeset
|
168 Lisp_Object list; |
1029 | 169 { |
170 if (NILP (list)) | |
171 return Qnil; | |
172 | |
173 if (CONSP (list)) | |
174 { | |
175 register int i; | |
176 register Lisp_Object tail; | |
177 for (i = 0, tail = list; !NILP (tail); i++) | |
3996
b9bdcf862c67
* textprop.c (validate_interval_range): Don't increment both
Jim Blandy <jimb@redhat.com>
parents:
3960
diff
changeset
|
178 { |
b9bdcf862c67
* textprop.c (validate_interval_range): Don't increment both
Jim Blandy <jimb@redhat.com>
parents:
3960
diff
changeset
|
179 tail = Fcdr (tail); |
b9bdcf862c67
* textprop.c (validate_interval_range): Don't increment both
Jim Blandy <jimb@redhat.com>
parents:
3960
diff
changeset
|
180 QUIT; |
b9bdcf862c67
* textprop.c (validate_interval_range): Don't increment both
Jim Blandy <jimb@redhat.com>
parents:
3960
diff
changeset
|
181 } |
1029 | 182 if (i & 1) |
183 error ("Odd length text property list"); | |
184 return list; | |
185 } | |
186 | |
187 return Fcons (list, Fcons (Qnil, Qnil)); | |
188 } | |
189 | |
190 /* Return nonzero if interval I has all the properties, | |
191 with the same values, of list PLIST. */ | |
192 | |
193 static int | |
194 interval_has_all_properties (plist, i) | |
195 Lisp_Object plist; | |
196 INTERVAL i; | |
197 { | |
198 register Lisp_Object tail1, tail2, sym1, sym2; | |
199 register int found; | |
200 | |
201 /* Go through each element of PLIST. */ | |
202 for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) | |
203 { | |
204 sym1 = Fcar (tail1); | |
205 found = 0; | |
206 | |
207 /* Go through I's plist, looking for sym1 */ | |
208 for (tail2 = i->plist; ! NILP (tail2); tail2 = Fcdr (Fcdr (tail2))) | |
209 if (EQ (sym1, Fcar (tail2))) | |
210 { | |
211 /* Found the same property on both lists. If the | |
212 values are unequal, return zero. */ | |
3998
c0560357c84e
Compare the values of text properties using EQ, not Fequal.
Jim Blandy <jimb@redhat.com>
parents:
3996
diff
changeset
|
213 if (! EQ (Fcar (Fcdr (tail1)), Fcar (Fcdr (tail2)))) |
1029 | 214 return 0; |
215 | |
216 /* Property has same value on both lists; go to next one. */ | |
217 found = 1; | |
218 break; | |
219 } | |
220 | |
221 if (! found) | |
222 return 0; | |
223 } | |
224 | |
225 return 1; | |
226 } | |
227 | |
228 /* Return nonzero if the plist of interval I has any of the | |
229 properties of PLIST, regardless of their values. */ | |
230 | |
231 static INLINE int | |
232 interval_has_some_properties (plist, i) | |
233 Lisp_Object plist; | |
234 INTERVAL i; | |
235 { | |
236 register Lisp_Object tail1, tail2, sym; | |
237 | |
238 /* Go through each element of PLIST. */ | |
239 for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) | |
240 { | |
241 sym = Fcar (tail1); | |
242 | |
243 /* Go through i's plist, looking for tail1 */ | |
244 for (tail2 = i->plist; ! NILP (tail2); tail2 = Fcdr (Fcdr (tail2))) | |
245 if (EQ (sym, Fcar (tail2))) | |
246 return 1; | |
247 } | |
248 | |
249 return 0; | |
250 } | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
251 |
3960
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
252 /* Changing the plists of individual intervals. */ |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
253 |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
254 /* Return the value of PROP in property-list PLIST, or Qunbound if it |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
255 has none. */ |
8907
f7de8b4cb1b8
(validate_interval_range, property_value, Fget_char_property,
Karl Heuer <kwzh@gnu.org>
parents:
8856
diff
changeset
|
256 static Lisp_Object |
3960
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
257 property_value (plist, prop) |
8856
7e9547af43e8
(property_value): Declare args plist, prop.
Richard M. Stallman <rms@gnu.org>
parents:
8762
diff
changeset
|
258 Lisp_Object plist, prop; |
3960
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
259 { |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
260 Lisp_Object value; |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
261 |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
262 while (PLIST_ELT_P (plist, value)) |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
263 if (EQ (XCONS (plist)->car, prop)) |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
264 return XCONS (value)->car; |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
265 else |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
266 plist = XCONS (value)->cdr; |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
267 |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
268 return Qunbound; |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
269 } |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
270 |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
271 /* Set the properties of INTERVAL to PROPERTIES, |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
272 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
|
273 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
|
274 |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
275 static void |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
276 set_properties (properties, interval, object) |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
277 Lisp_Object properties, object; |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
278 INTERVAL interval; |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
279 { |
3960
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
280 Lisp_Object sym, value; |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
281 |
3960
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
282 if (BUFFERP (object)) |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
283 { |
3960
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
284 /* For each property in the old plist which is missing from PROPERTIES, |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
285 or has a different value in PROPERTIES, make an undo record. */ |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
286 for (sym = interval->plist; |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
287 PLIST_ELT_P (sym, value); |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
288 sym = XCONS (value)->cdr) |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
289 if (! EQ (property_value (properties, XCONS (sym)->car), |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
290 XCONS (value)->car)) |
4076
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
291 { |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
292 modify_region (XBUFFER (object), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
293 make_number (interval->position), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
294 make_number (interval->position + LENGTH (interval))); |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
295 record_property_change (interval->position, LENGTH (interval), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
296 XCONS (sym)->car, XCONS (value)->car, |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
297 object); |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
298 } |
3960
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
299 |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
300 /* For each new property that has no value at all in the old plist, |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
301 make an undo record binding it to nil, so it will be removed. */ |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
302 for (sym = properties; |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
303 PLIST_ELT_P (sym, value); |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
304 sym = XCONS (value)->cdr) |
7be89f84a882
* textprop.c (set_properties): Add undo records to remove entirely
Jim Blandy <jimb@redhat.com>
parents:
3858
diff
changeset
|
305 if (EQ (property_value (interval->plist, XCONS (sym)->car), Qunbound)) |
4076
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
306 { |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
307 modify_region (XBUFFER (object), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
308 make_number (interval->position), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
309 make_number (interval->position + LENGTH (interval))); |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
310 record_property_change (interval->position, LENGTH (interval), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
311 XCONS (sym)->car, Qnil, |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
312 object); |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
313 } |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
314 } |
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 /* Store new properties. */ |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
317 interval->plist = Fcopy_sequence (properties); |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
318 } |
1029 | 319 |
320 /* Add the properties of PLIST to the interval I, or set | |
321 the value of I's property to the value of the property on PLIST | |
322 if they are different. | |
323 | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
324 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
|
325 |
1029 | 326 Return nonzero if this changes I (i.e., if any members of PLIST |
327 are actually added to I's plist) */ | |
328 | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
329 static int |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
330 add_properties (plist, i, object) |
1029 | 331 Lisp_Object plist; |
332 INTERVAL i; | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
333 Lisp_Object object; |
1029 | 334 { |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
335 Lisp_Object tail1, tail2, sym1, val1; |
1029 | 336 register int changed = 0; |
337 register int found; | |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
338 struct gcpro gcpro1, gcpro2, gcpro3; |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
339 |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
340 tail1 = plist; |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
341 sym1 = Qnil; |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
342 val1 = Qnil; |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
343 /* No need to protect OBJECT, because we can GC only in the case |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
344 where it is a buffer, and live buffers are always protected. |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
345 I and its plist are also protected, via OBJECT. */ |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
346 GCPRO3 (tail1, sym1, val1); |
1029 | 347 |
348 /* Go through each element of PLIST. */ | |
349 for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) | |
350 { | |
351 sym1 = Fcar (tail1); | |
352 val1 = Fcar (Fcdr (tail1)); | |
353 found = 0; | |
354 | |
355 /* Go through I's plist, looking for sym1 */ | |
356 for (tail2 = i->plist; ! NILP (tail2); tail2 = Fcdr (Fcdr (tail2))) | |
357 if (EQ (sym1, Fcar (tail2))) | |
358 { | |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
359 /* No need to gcpro, because tail2 protects this |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
360 and it must be a cons cell (we get an error otherwise). */ |
6516
8278049ee7a7
(add_properties, remove_properties): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6064
diff
changeset
|
361 register Lisp_Object this_cdr; |
1029 | 362 |
6516
8278049ee7a7
(add_properties, remove_properties): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6064
diff
changeset
|
363 this_cdr = Fcdr (tail2); |
1029 | 364 /* Found the property. Now check its value. */ |
365 found = 1; | |
366 | |
367 /* The properties have the same value on both lists. | |
368 Continue to the next property. */ | |
3998
c0560357c84e
Compare the values of text properties using EQ, not Fequal.
Jim Blandy <jimb@redhat.com>
parents:
3996
diff
changeset
|
369 if (EQ (val1, Fcar (this_cdr))) |
1029 | 370 break; |
371 | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
372 /* Record this change in the buffer, for undo purposes. */ |
9109
6e44ddc40153
(validate_interval_range, add_properties, remove_properties,
Karl Heuer <kwzh@gnu.org>
parents:
9071
diff
changeset
|
373 if (BUFFERP (object)) |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
374 { |
2783
789c11177579
The text property routines can now modify buffers other
Jim Blandy <jimb@redhat.com>
parents:
2762
diff
changeset
|
375 modify_region (XBUFFER (object), |
789c11177579
The text property routines can now modify buffers other
Jim Blandy <jimb@redhat.com>
parents:
2762
diff
changeset
|
376 make_number (i->position), |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
377 make_number (i->position + LENGTH (i))); |
4076
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
378 record_property_change (i->position, LENGTH (i), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
379 sym1, Fcar (this_cdr), object); |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
380 } |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
381 |
1029 | 382 /* I's property has a different value -- change it */ |
383 Fsetcar (this_cdr, val1); | |
384 changed++; | |
385 break; | |
386 } | |
387 | |
388 if (! found) | |
389 { | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
390 /* Record this change in the buffer, for undo purposes. */ |
9109
6e44ddc40153
(validate_interval_range, add_properties, remove_properties,
Karl Heuer <kwzh@gnu.org>
parents:
9071
diff
changeset
|
391 if (BUFFERP (object)) |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
392 { |
2783
789c11177579
The text property routines can now modify buffers other
Jim Blandy <jimb@redhat.com>
parents:
2762
diff
changeset
|
393 modify_region (XBUFFER (object), |
789c11177579
The text property routines can now modify buffers other
Jim Blandy <jimb@redhat.com>
parents:
2762
diff
changeset
|
394 make_number (i->position), |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
395 make_number (i->position + LENGTH (i))); |
4076
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
396 record_property_change (i->position, LENGTH (i), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
397 sym1, Qnil, object); |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
398 } |
1029 | 399 i->plist = Fcons (sym1, Fcons (val1, i->plist)); |
400 changed++; | |
401 } | |
402 } | |
403 | |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
404 UNGCPRO; |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
405 |
1029 | 406 return changed; |
407 } | |
408 | |
409 /* 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
|
410 from I's plist. |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
411 OBJECT is the string or buffer containing I. */ |
1029 | 412 |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
413 static int |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
414 remove_properties (plist, i, object) |
1029 | 415 Lisp_Object plist; |
416 INTERVAL i; | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
417 Lisp_Object object; |
1029 | 418 { |
6516
8278049ee7a7
(add_properties, remove_properties): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6064
diff
changeset
|
419 register Lisp_Object tail1, tail2, sym, current_plist; |
1029 | 420 register int changed = 0; |
421 | |
6516
8278049ee7a7
(add_properties, remove_properties): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6064
diff
changeset
|
422 current_plist = i->plist; |
1029 | 423 /* Go through each element of plist. */ |
424 for (tail1 = plist; ! NILP (tail1); tail1 = Fcdr (Fcdr (tail1))) | |
425 { | |
426 sym = Fcar (tail1); | |
427 | |
428 /* First, remove the symbol if its at the head of the list */ | |
429 while (! NILP (current_plist) && EQ (sym, Fcar (current_plist))) | |
430 { | |
9109
6e44ddc40153
(validate_interval_range, add_properties, remove_properties,
Karl Heuer <kwzh@gnu.org>
parents:
9071
diff
changeset
|
431 if (BUFFERP (object)) |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
432 { |
4076
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
433 modify_region (XBUFFER (object), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
434 make_number (i->position), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
435 make_number (i->position + LENGTH (i))); |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
436 record_property_change (i->position, LENGTH (i), |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
437 sym, Fcar (Fcdr (current_plist)), |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
438 object); |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
439 } |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
440 |
1029 | 441 current_plist = Fcdr (Fcdr (current_plist)); |
442 changed++; | |
443 } | |
444 | |
445 /* Go through i's plist, looking for sym */ | |
446 tail2 = current_plist; | |
447 while (! NILP (tail2)) | |
448 { | |
6516
8278049ee7a7
(add_properties, remove_properties): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6064
diff
changeset
|
449 register Lisp_Object this; |
8278049ee7a7
(add_properties, remove_properties): Use assignment, not initialization.
Karl Heuer <kwzh@gnu.org>
parents:
6064
diff
changeset
|
450 this = Fcdr (Fcdr (tail2)); |
1029 | 451 if (EQ (sym, Fcar (this))) |
452 { | |
9109
6e44ddc40153
(validate_interval_range, add_properties, remove_properties,
Karl Heuer <kwzh@gnu.org>
parents:
9071
diff
changeset
|
453 if (BUFFERP (object)) |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
454 { |
2783
789c11177579
The text property routines can now modify buffers other
Jim Blandy <jimb@redhat.com>
parents:
2762
diff
changeset
|
455 modify_region (XBUFFER (object), |
789c11177579
The text property routines can now modify buffers other
Jim Blandy <jimb@redhat.com>
parents:
2762
diff
changeset
|
456 make_number (i->position), |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
457 make_number (i->position + LENGTH (i))); |
4076
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
458 record_property_change (i->position, LENGTH (i), |
9fd5ecacfbbb
(Qinsert_in_front_hooks, Qinsert_behind_hooks): New vars.
Richard M. Stallman <rms@gnu.org>
parents:
4007
diff
changeset
|
459 sym, Fcar (Fcdr (this)), object); |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
460 } |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
461 |
1029 | 462 Fsetcdr (Fcdr (tail2), Fcdr (Fcdr (this))); |
463 changed++; | |
464 } | |
465 tail2 = this; | |
466 } | |
467 } | |
468 | |
469 if (changed) | |
470 i->plist = current_plist; | |
471 return changed; | |
472 } | |
473 | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
474 #if 0 |
1029 | 475 /* Remove all properties from interval I. Return non-zero |
476 if this changes the interval. */ | |
477 | |
478 static INLINE int | |
479 erase_properties (i) | |
480 INTERVAL i; | |
481 { | |
482 if (NILP (i->plist)) | |
483 return 0; | |
484 | |
485 i->plist = Qnil; | |
486 return 1; | |
487 } | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
488 #endif |
1029 | 489 |
490 DEFUN ("text-properties-at", Ftext_properties_at, | |
491 Stext_properties_at, 1, 2, 0, | |
492 "Return the list of properties held by the character at POSITION\n\ | |
493 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
|
494 defaults to the current buffer.\n\ |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
495 If POSITION is at the end of OBJECT, the value is nil.") |
1029 | 496 (pos, object) |
497 Lisp_Object pos, object; | |
498 { | |
499 register INTERVAL i; | |
500 | |
501 if (NILP (object)) | |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
502 XSETBUFFER (object, current_buffer); |
1029 | 503 |
504 i = validate_interval_range (object, &pos, &pos, soft); | |
505 if (NULL_INTERVAL_P (i)) | |
506 return Qnil; | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
507 /* 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
|
508 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
|
509 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
|
510 since no character follows. */ |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
511 if (XINT (pos) == LENGTH (i) + i->position) |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
512 return Qnil; |
1029 | 513 |
514 return i->plist; | |
515 } | |
516 | |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
517 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
|
518 "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
|
519 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
|
520 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
|
521 (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
|
522 Lisp_Object pos, object; |
8271
e8556db1b7f3
(Fget_text_property): Simplify using Ftext_properties_at.
Richard M. Stallman <rms@gnu.org>
parents:
7773
diff
changeset
|
523 Lisp_Object prop; |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
524 { |
8271
e8556db1b7f3
(Fget_text_property): Simplify using Ftext_properties_at.
Richard M. Stallman <rms@gnu.org>
parents:
7773
diff
changeset
|
525 return textget (Ftext_properties_at (pos, object), prop); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
526 } |
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
527 |
6063
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
528 DEFUN ("get-char-property", Fget_char_property, Sget_char_property, 2, 3, 0, |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
529 "Return the value of position POS's property PROP, in OBJECT.\n\ |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
530 OBJECT is optional and defaults to the current buffer.\n\ |
6681 | 531 If POS is at the end of OBJECT, the value is nil.\n\ |
6063
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
532 If OBJECT is a buffer, then overlay properties are considered as well as\n\ |
6064
bdfff039f6e3
(Fget_char_property): Fix docstring.
Karl Heuer <kwzh@gnu.org>
parents:
6063
diff
changeset
|
533 text properties.\n\ |
bdfff039f6e3
(Fget_char_property): Fix docstring.
Karl Heuer <kwzh@gnu.org>
parents:
6063
diff
changeset
|
534 If OBJECT is a window, then that window's buffer is used, but window-specific\n\ |
6063
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
535 overlays are considered only if they are associated with OBJECT.") |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
536 (pos, prop, object) |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
537 Lisp_Object pos, object; |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
538 register Lisp_Object prop; |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
539 { |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
540 struct window *w = 0; |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
541 |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
542 CHECK_NUMBER_COERCE_MARKER (pos, 0); |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
543 |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
544 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
545 XSETBUFFER (object, current_buffer); |
6063
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
546 |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
547 if (WINDOWP (object)) |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
548 { |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
549 w = XWINDOW (object); |
8907
f7de8b4cb1b8
(validate_interval_range, property_value, Fget_char_property,
Karl Heuer <kwzh@gnu.org>
parents:
8856
diff
changeset
|
550 object = w->buffer; |
6063
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
551 } |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
552 if (BUFFERP (object)) |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
553 { |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
554 int posn = XINT (pos); |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
555 int noverlays; |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
556 Lisp_Object *overlay_vec, tem; |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
557 int next_overlay; |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
558 int len; |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
559 |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
560 /* First try with room for 40 overlays. */ |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
561 len = 40; |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
562 overlay_vec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object)); |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
563 |
8962
722763fed8ce
(Fget_char_property): Pass new arg to overlays_at.
Richard M. Stallman <rms@gnu.org>
parents:
8907
diff
changeset
|
564 noverlays = overlays_at (posn, 0, &overlay_vec, &len, |
722763fed8ce
(Fget_char_property): Pass new arg to overlays_at.
Richard M. Stallman <rms@gnu.org>
parents:
8907
diff
changeset
|
565 &next_overlay, NULL); |
6063
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
566 |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
567 /* If there are more than 40, |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
568 make enough space for all, and try again. */ |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
569 if (noverlays > len) |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
570 { |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
571 len = noverlays; |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
572 overlay_vec = (Lisp_Object *) alloca (len * sizeof (Lisp_Object)); |
8962
722763fed8ce
(Fget_char_property): Pass new arg to overlays_at.
Richard M. Stallman <rms@gnu.org>
parents:
8907
diff
changeset
|
573 noverlays = overlays_at (posn, 0, &overlay_vec, &len, |
722763fed8ce
(Fget_char_property): Pass new arg to overlays_at.
Richard M. Stallman <rms@gnu.org>
parents:
8907
diff
changeset
|
574 &next_overlay, NULL); |
6063
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
575 } |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
576 noverlays = sort_overlays (overlay_vec, noverlays, w); |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
577 |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
578 /* Now check the overlays in order of decreasing priority. */ |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
579 while (--noverlays >= 0) |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
580 { |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
581 tem = Foverlay_get (overlay_vec[noverlays], prop); |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
582 if (!NILP (tem)) |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
583 return (tem); |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
584 } |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
585 } |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
586 /* Not a buffer, or no appropriate overlay, so fall through to the |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
587 simpler case. */ |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
588 return (Fget_text_property (pos, prop, object)); |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
589 } |
233fffcfb6c8
(Fget_char_property): New function.
Karl Heuer <kwzh@gnu.org>
parents:
5646
diff
changeset
|
590 |
1029 | 591 DEFUN ("next-property-change", Fnext_property_change, |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
592 Snext_property_change, 1, 3, 0, |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
593 "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
|
594 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
|
595 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
|
596 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
|
597 Return nil if the property is constant all the way to the end of OBJECT.\n\ |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
598 If the value is non-nil, it is a position greater than POS, never equal.\n\n\ |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
599 If the optional third argument LIMIT is non-nil, don't search\n\ |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
600 past position LIMIT; return LIMIT if nothing is found before LIMIT.") |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
601 (pos, object, limit) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
602 Lisp_Object pos, object, limit; |
1029 | 603 { |
604 register INTERVAL i, next; | |
605 | |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
606 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
607 XSETBUFFER (object, current_buffer); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
608 |
7092
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
609 if (!NILP (limit)) |
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
610 CHECK_NUMBER_COERCE_MARKER (limit, 0); |
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
611 |
1029 | 612 i = validate_interval_range (object, &pos, &pos, soft); |
613 if (NULL_INTERVAL_P (i)) | |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
614 return limit; |
1029 | 615 |
616 next = next_interval (i); | |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
617 while (! NULL_INTERVAL_P (next) && intervals_equal (i, next) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
618 && (NILP (limit) || next->position < XFASTINT (limit))) |
1029 | 619 next = next_interval (next); |
620 | |
621 if (NULL_INTERVAL_P (next)) | |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
622 return limit; |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
623 if (! NILP (limit) && !(next->position < XFASTINT (limit))) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
624 return limit; |
1029 | 625 |
9321
e6759002383c
(Fnext_property_change, property_change_between_p,
Karl Heuer <kwzh@gnu.org>
parents:
9280
diff
changeset
|
626 XSETFASTINT (pos, next->position - (STRINGP (object))); |
8907
f7de8b4cb1b8
(validate_interval_range, property_value, Fget_char_property,
Karl Heuer <kwzh@gnu.org>
parents:
8856
diff
changeset
|
627 return pos; |
4381
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
628 } |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
629 |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
630 /* Return 1 if there's a change in some property between BEG and END. */ |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
631 |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
632 int |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
633 property_change_between_p (beg, end) |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
634 int beg, end; |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
635 { |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
636 register INTERVAL i, next; |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
637 Lisp_Object object, pos; |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
638 |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
639 XSETBUFFER (object, current_buffer); |
9321
e6759002383c
(Fnext_property_change, property_change_between_p,
Karl Heuer <kwzh@gnu.org>
parents:
9280
diff
changeset
|
640 XSETFASTINT (pos, beg); |
4381
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
641 |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
642 i = validate_interval_range (object, &pos, &pos, soft); |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
643 if (NULL_INTERVAL_P (i)) |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
644 return 0; |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
645 |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
646 next = next_interval (i); |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
647 while (! NULL_INTERVAL_P (next) && intervals_equal (i, next)) |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
648 { |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
649 next = next_interval (next); |
4614
2c5557903994
(property_change_between_p): Test NULL_INTERVAL_P
Richard M. Stallman <rms@gnu.org>
parents:
4381
diff
changeset
|
650 if (NULL_INTERVAL_P (next)) |
2c5557903994
(property_change_between_p): Test NULL_INTERVAL_P
Richard M. Stallman <rms@gnu.org>
parents:
4381
diff
changeset
|
651 return 0; |
4381
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
652 if (next->position >= end) |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
653 return 0; |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
654 } |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
655 |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
656 if (NULL_INTERVAL_P (next)) |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
657 return 0; |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
658 |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
659 return 1; |
1029 | 660 } |
661 | |
1211 | 662 DEFUN ("next-single-property-change", Fnext_single_property_change, |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
663 Snext_single_property_change, 2, 4, 0, |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
664 "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
|
665 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
|
666 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
|
667 The optional third argument OBJECT is the string or buffer to scan.\n\ |
5020
94de08fd8a7c
(Fnext_single_property_change): Fix missing \n\.
Richard M. Stallman <rms@gnu.org>
parents:
4986
diff
changeset
|
668 The property values are compared with `eq'.\n\ |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
669 Return nil if the property is constant all the way to the end of OBJECT.\n\ |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
670 If the value is non-nil, it is a position greater than POS, never equal.\n\n\ |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
671 If the optional fourth argument LIMIT is non-nil, don't search\n\ |
5645 | 672 past position LIMIT; return LIMIT if nothing is found before LIMIT.") |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
673 (pos, prop, object, limit) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
674 Lisp_Object pos, prop, object, limit; |
1211 | 675 { |
676 register INTERVAL i, next; | |
677 register Lisp_Object here_val; | |
678 | |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
679 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
680 XSETBUFFER (object, current_buffer); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
681 |
7092
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
682 if (!NILP (limit)) |
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
683 CHECK_NUMBER_COERCE_MARKER (limit, 0); |
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
684 |
1211 | 685 i = validate_interval_range (object, &pos, &pos, soft); |
686 if (NULL_INTERVAL_P (i)) | |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
687 return limit; |
1211 | 688 |
2762
dd28ed1e1928
* textprop.c (Fnext_single_property_change,
Jim Blandy <jimb@redhat.com>
parents:
2124
diff
changeset
|
689 here_val = textget (i->plist, prop); |
1211 | 690 next = next_interval (i); |
2762
dd28ed1e1928
* textprop.c (Fnext_single_property_change,
Jim Blandy <jimb@redhat.com>
parents:
2124
diff
changeset
|
691 while (! NULL_INTERVAL_P (next) |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
692 && EQ (here_val, textget (next->plist, prop)) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
693 && (NILP (limit) || next->position < XFASTINT (limit))) |
1211 | 694 next = next_interval (next); |
695 | |
696 if (NULL_INTERVAL_P (next)) | |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
697 return limit; |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
698 if (! NILP (limit) && !(next->position < XFASTINT (limit))) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
699 return limit; |
1211 | 700 |
9321
e6759002383c
(Fnext_property_change, property_change_between_p,
Karl Heuer <kwzh@gnu.org>
parents:
9280
diff
changeset
|
701 XSETFASTINT (pos, next->position - (STRINGP (object))); |
8907
f7de8b4cb1b8
(validate_interval_range, property_value, Fget_char_property,
Karl Heuer <kwzh@gnu.org>
parents:
8856
diff
changeset
|
702 return pos; |
1211 | 703 } |
704 | |
1029 | 705 DEFUN ("previous-property-change", Fprevious_property_change, |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
706 Sprevious_property_change, 1, 3, 0, |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
707 "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
|
708 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
|
709 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
|
710 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
|
711 Return nil if the property is constant all the way to the start of OBJECT.\n\ |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
712 If the value is non-nil, it is a position less than POS, never equal.\n\n\ |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
713 If the optional third argument LIMIT is non-nil, don't search\n\ |
5645 | 714 back past position LIMIT; return LIMIT if nothing is found until LIMIT.") |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
715 (pos, object, limit) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
716 Lisp_Object pos, object, limit; |
1029 | 717 { |
718 register INTERVAL i, previous; | |
719 | |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
720 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
721 XSETBUFFER (object, current_buffer); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
722 |
7092
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
723 if (!NILP (limit)) |
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
724 CHECK_NUMBER_COERCE_MARKER (limit, 0); |
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
725 |
1029 | 726 i = validate_interval_range (object, &pos, &pos, soft); |
727 if (NULL_INTERVAL_P (i)) | |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
728 return limit; |
1029 | 729 |
5644
2abe67658895
(Fprevious_property_change): Move back at least 1 char.
Richard M. Stallman <rms@gnu.org>
parents:
5114
diff
changeset
|
730 /* Start with the interval containing the char before point. */ |
2abe67658895
(Fprevious_property_change): Move back at least 1 char.
Richard M. Stallman <rms@gnu.org>
parents:
5114
diff
changeset
|
731 if (i->position == XFASTINT (pos)) |
2abe67658895
(Fprevious_property_change): Move back at least 1 char.
Richard M. Stallman <rms@gnu.org>
parents:
5114
diff
changeset
|
732 i = previous_interval (i); |
2abe67658895
(Fprevious_property_change): Move back at least 1 char.
Richard M. Stallman <rms@gnu.org>
parents:
5114
diff
changeset
|
733 |
1029 | 734 previous = previous_interval (i); |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
735 while (! NULL_INTERVAL_P (previous) && intervals_equal (previous, i) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
736 && (NILP (limit) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
737 || previous->position + LENGTH (previous) > XFASTINT (limit))) |
1029 | 738 previous = previous_interval (previous); |
739 if (NULL_INTERVAL_P (previous)) | |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
740 return limit; |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
741 if (!NILP (limit) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
742 && !(previous->position + LENGTH (previous) > XFASTINT (limit))) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
743 return limit; |
1029 | 744 |
9321
e6759002383c
(Fnext_property_change, property_change_between_p,
Karl Heuer <kwzh@gnu.org>
parents:
9280
diff
changeset
|
745 XSETFASTINT (pos, (previous->position + LENGTH (previous) |
e6759002383c
(Fnext_property_change, property_change_between_p,
Karl Heuer <kwzh@gnu.org>
parents:
9280
diff
changeset
|
746 - (STRINGP (object)))); |
8907
f7de8b4cb1b8
(validate_interval_range, property_value, Fget_char_property,
Karl Heuer <kwzh@gnu.org>
parents:
8856
diff
changeset
|
747 return pos; |
1029 | 748 } |
749 | |
1211 | 750 DEFUN ("previous-single-property-change", Fprevious_single_property_change, |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
751 Sprevious_single_property_change, 2, 4, 0, |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
752 "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
|
753 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
|
754 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
|
755 The optional third argument OBJECT is the string or buffer to scan.\n\ |
4986
31b1545319dc
(Fprevious_single_property_change): Fix missing \n\.
Richard M. Stallman <rms@gnu.org>
parents:
4797
diff
changeset
|
756 The property values are compared with `eq'.\n\ |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
757 Return nil if the property is constant all the way to the start of OBJECT.\n\ |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
758 If the value is non-nil, it is a position less than POS, never equal.\n\n\ |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
759 If the optional fourth argument LIMIT is non-nil, don't search\n\ |
5645 | 760 back past position LIMIT; return LIMIT if nothing is found until LIMIT.") |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
761 (pos, prop, object, limit) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
762 Lisp_Object pos, prop, object, limit; |
1211 | 763 { |
764 register INTERVAL i, previous; | |
765 register Lisp_Object here_val; | |
766 | |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
767 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
768 XSETBUFFER (object, current_buffer); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
769 |
7092
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
770 if (!NILP (limit)) |
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
771 CHECK_NUMBER_COERCE_MARKER (limit, 0); |
b6b93953cc83
(F*_property_change): Typecheck limit argument.
Karl Heuer <kwzh@gnu.org>
parents:
6755
diff
changeset
|
772 |
1211 | 773 i = validate_interval_range (object, &pos, &pos, soft); |
7773
2226c7efb3da
(Fprevious_single_property_change): Check for null interval after correcting
Karl Heuer <kwzh@gnu.org>
parents:
7582
diff
changeset
|
774 |
2226c7efb3da
(Fprevious_single_property_change): Check for null interval after correcting
Karl Heuer <kwzh@gnu.org>
parents:
7582
diff
changeset
|
775 /* Start with the interval containing the char before point. */ |
2226c7efb3da
(Fprevious_single_property_change): Check for null interval after correcting
Karl Heuer <kwzh@gnu.org>
parents:
7582
diff
changeset
|
776 if (! NULL_INTERVAL_P (i) && i->position == XFASTINT (pos)) |
2226c7efb3da
(Fprevious_single_property_change): Check for null interval after correcting
Karl Heuer <kwzh@gnu.org>
parents:
7582
diff
changeset
|
777 i = previous_interval (i); |
2226c7efb3da
(Fprevious_single_property_change): Check for null interval after correcting
Karl Heuer <kwzh@gnu.org>
parents:
7582
diff
changeset
|
778 |
1211 | 779 if (NULL_INTERVAL_P (i)) |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
780 return limit; |
1211 | 781 |
2762
dd28ed1e1928
* textprop.c (Fnext_single_property_change,
Jim Blandy <jimb@redhat.com>
parents:
2124
diff
changeset
|
782 here_val = textget (i->plist, prop); |
1211 | 783 previous = previous_interval (i); |
784 while (! NULL_INTERVAL_P (previous) | |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
785 && EQ (here_val, textget (previous->plist, prop)) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
786 && (NILP (limit) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
787 || previous->position + LENGTH (previous) > XFASTINT (limit))) |
1211 | 788 previous = previous_interval (previous); |
789 if (NULL_INTERVAL_P (previous)) | |
5086
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
790 return limit; |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
791 if (!NILP (limit) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
792 && !(previous->position + LENGTH (previous) > XFASTINT (limit))) |
6e9634463e93
(Ftext_property_not_all): Swap t and nil values in
Richard M. Stallman <rms@gnu.org>
parents:
5020
diff
changeset
|
793 return limit; |
1211 | 794 |
9321
e6759002383c
(Fnext_property_change, property_change_between_p,
Karl Heuer <kwzh@gnu.org>
parents:
9280
diff
changeset
|
795 XSETFASTINT (pos, (previous->position + LENGTH (previous) |
e6759002383c
(Fnext_property_change, property_change_between_p,
Karl Heuer <kwzh@gnu.org>
parents:
9280
diff
changeset
|
796 - (STRINGP (object)))); |
8907
f7de8b4cb1b8
(validate_interval_range, property_value, Fget_char_property,
Karl Heuer <kwzh@gnu.org>
parents:
8856
diff
changeset
|
797 return pos; |
1211 | 798 } |
799 | |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
800 /* Callers note, this can GC when OBJECT is a buffer (or nil). */ |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
801 |
1029 | 802 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
|
803 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
|
804 "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
|
805 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
|
806 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
|
807 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
|
808 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
|
809 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
|
810 (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
|
811 Lisp_Object start, end, properties, object; |
1029 | 812 { |
813 register INTERVAL i, unchanged; | |
2124
54179ef9ce35
* textprop.c (Fadd_text_properties): Initialize the modified flag.
Jim Blandy <jimb@redhat.com>
parents:
2058
diff
changeset
|
814 register int s, len, modified = 0; |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
815 struct gcpro gcpro1; |
1029 | 816 |
817 properties = validate_plist (properties); | |
818 if (NILP (properties)) | |
819 return Qnil; | |
820 | |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
821 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
822 XSETBUFFER (object, current_buffer); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
823 |
1029 | 824 i = validate_interval_range (object, &start, &end, hard); |
825 if (NULL_INTERVAL_P (i)) | |
826 return Qnil; | |
827 | |
828 s = XINT (start); | |
829 len = XINT (end) - s; | |
830 | |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
831 /* No need to protect OBJECT, because we GC only if it's a buffer, |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
832 and live buffers are always protected. */ |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
833 GCPRO1 (properties); |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
834 |
1029 | 835 /* If we're not starting on an interval boundary, we have to |
836 split this interval. */ | |
837 if (i->position != s) | |
838 { | |
839 /* If this interval already has the properties, we can | |
840 skip it. */ | |
841 if (interval_has_all_properties (properties, i)) | |
842 { | |
843 int got = (LENGTH (i) - (s - i->position)); | |
844 if (got >= len) | |
845 return Qnil; | |
846 len -= got; | |
3858
e07d474bdba9
(Fremove_text_properties, Fadd_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
3698
diff
changeset
|
847 i = next_interval (i); |
1029 | 848 } |
849 else | |
850 { | |
851 unchanged = i; | |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
852 i = split_interval_right (unchanged, s - unchanged->position); |
1029 | 853 copy_properties (unchanged, i); |
854 } | |
855 } | |
856 | |
3553
5f9688c0b704
(Fadd_text_properties): Don't treat the initial
Richard M. Stallman <rms@gnu.org>
parents:
2783
diff
changeset
|
857 /* We are at the beginning of interval I, with LEN chars to scan. */ |
2124
54179ef9ce35
* textprop.c (Fadd_text_properties): Initialize the modified flag.
Jim Blandy <jimb@redhat.com>
parents:
2058
diff
changeset
|
858 for (;;) |
1029 | 859 { |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
860 if (i == 0) |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
861 abort (); |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
862 |
1029 | 863 if (LENGTH (i) >= len) |
864 { | |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
865 /* We can UNGCPRO safely here, because there will be just |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
866 one more chance to gc, in the next call to add_properties, |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
867 and after that we will not need PROPERTIES or OBJECT again. */ |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
868 UNGCPRO; |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
869 |
1029 | 870 if (interval_has_all_properties (properties, i)) |
871 return modified ? Qt : Qnil; | |
872 | |
873 if (LENGTH (i) == len) | |
874 { | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
875 add_properties (properties, i, object); |
1029 | 876 return Qt; |
877 } | |
878 | |
879 /* i doesn't have the properties, and goes past the change limit */ | |
880 unchanged = i; | |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
881 i = split_interval_left (unchanged, len); |
1029 | 882 copy_properties (unchanged, i); |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
883 add_properties (properties, i, object); |
1029 | 884 return Qt; |
885 } | |
886 | |
887 len -= LENGTH (i); | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
888 modified += add_properties (properties, i, object); |
1029 | 889 i = next_interval (i); |
890 } | |
891 } | |
892 | |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
893 /* Callers note, this can GC when OBJECT is a buffer (or nil). */ |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
894 |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
895 DEFUN ("put-text-property", Fput_text_property, |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
896 Sput_text_property, 4, 5, 0, |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
897 "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
|
898 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
|
899 specify the property to add.\n\ |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
900 The optional fifth argument, OBJECT,\n\ |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
901 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
|
902 (start, end, prop, value, object) |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
903 Lisp_Object start, end, prop, value, object; |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
904 { |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
905 Fadd_text_properties (start, end, |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
906 Fcons (prop, Fcons (value, Qnil)), |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
907 object); |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
908 return Qnil; |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
909 } |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
910 |
1029 | 911 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
|
912 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
|
913 "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
|
914 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
|
915 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
|
916 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
|
917 (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
|
918 Lisp_Object start, end, props, object; |
1029 | 919 { |
920 register INTERVAL i, unchanged; | |
1211 | 921 register INTERVAL prev_changed = NULL_INTERVAL; |
1029 | 922 register int s, len; |
9071
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
923 Lisp_Object ostart, oend; |
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
924 |
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
925 ostart = start; |
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
926 oend = end; |
1029 | 927 |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
928 props = validate_plist (props); |
1029 | 929 |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
930 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
931 XSETBUFFER (object, current_buffer); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
932 |
9541
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
933 /* If we want no properties for a whole string, |
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
934 get rid of its intervals. */ |
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
935 if (NILP (props) && STRINGP (object) |
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
936 && XFASTINT (start) == 0 |
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
937 && XFASTINT (end) == XSTRING (object)->size) |
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
938 { |
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
939 XSTRING (object)->intervals = 0; |
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
940 return Qt; |
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
941 } |
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
942 |
8686 | 943 i = validate_interval_range (object, &start, &end, soft); |
9541
449e024f13be
(Fset_text_properties): Special case for getting
Richard M. Stallman <rms@gnu.org>
parents:
9331
diff
changeset
|
944 |
1029 | 945 if (NULL_INTERVAL_P (i)) |
8686 | 946 { |
947 /* If buffer has no props, and we want none, return now. */ | |
948 if (NILP (props)) | |
949 return Qnil; | |
950 | |
9071
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
951 /* Restore the original START and END values |
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
952 because validate_interval_range increments them for strings. */ |
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
953 start = ostart; |
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
954 end = oend; |
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
955 |
8686 | 956 i = validate_interval_range (object, &start, &end, hard); |
957 /* This can return if start == end. */ | |
958 if (NULL_INTERVAL_P (i)) | |
959 return Qnil; | |
960 } | |
1029 | 961 |
962 s = XINT (start); | |
963 len = XINT (end) - s; | |
964 | |
965 if (i->position != s) | |
966 { | |
967 unchanged = i; | |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
968 i = split_interval_right (unchanged, s - unchanged->position); |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
969 |
1029 | 970 if (LENGTH (i) > len) |
971 { | |
1211 | 972 copy_properties (unchanged, i); |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
973 i = split_interval_left (i, len); |
3553
5f9688c0b704
(Fadd_text_properties): Don't treat the initial
Richard M. Stallman <rms@gnu.org>
parents:
2783
diff
changeset
|
974 set_properties (props, i, object); |
1029 | 975 return Qt; |
976 } | |
977 | |
3553
5f9688c0b704
(Fadd_text_properties): Don't treat the initial
Richard M. Stallman <rms@gnu.org>
parents:
2783
diff
changeset
|
978 set_properties (props, i, object); |
5f9688c0b704
(Fadd_text_properties): Don't treat the initial
Richard M. Stallman <rms@gnu.org>
parents:
2783
diff
changeset
|
979 |
1211 | 980 if (LENGTH (i) == len) |
981 return Qt; | |
982 | |
983 prev_changed = i; | |
1029 | 984 len -= LENGTH (i); |
985 i = next_interval (i); | |
986 } | |
987 | |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
988 /* 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
|
989 while (len > 0) |
1029 | 990 { |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
991 if (i == 0) |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
992 abort (); |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
993 |
1029 | 994 if (LENGTH (i) >= len) |
995 { | |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
996 if (LENGTH (i) > len) |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
997 i = split_interval_left (i, len); |
1029 | 998 |
1211 | 999 if (NULL_INTERVAL_P (prev_changed)) |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1000 set_properties (props, i, object); |
1211 | 1001 else |
1002 merge_interval_left (i); | |
1029 | 1003 return Qt; |
1004 } | |
1005 | |
1006 len -= LENGTH (i); | |
1211 | 1007 if (NULL_INTERVAL_P (prev_changed)) |
1008 { | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1009 set_properties (props, i, object); |
1211 | 1010 prev_changed = i; |
1011 } | |
1012 else | |
1013 prev_changed = i = merge_interval_left (i); | |
1014 | |
1029 | 1015 i = next_interval (i); |
1016 } | |
1017 | |
1018 return Qt; | |
1019 } | |
1020 | |
1021 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
|
1022 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
|
1023 "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
|
1024 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
|
1025 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
|
1026 \(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
|
1027 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
|
1028 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
|
1029 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
|
1030 (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
|
1031 Lisp_Object start, end, props, object; |
1029 | 1032 { |
1033 register INTERVAL i, unchanged; | |
2124
54179ef9ce35
* textprop.c (Fadd_text_properties): Initialize the modified flag.
Jim Blandy <jimb@redhat.com>
parents:
2058
diff
changeset
|
1034 register int s, len, modified = 0; |
1029 | 1035 |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1036 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
1037 XSETBUFFER (object, current_buffer); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1038 |
1029 | 1039 i = validate_interval_range (object, &start, &end, soft); |
1040 if (NULL_INTERVAL_P (i)) | |
1041 return Qnil; | |
1042 | |
1043 s = XINT (start); | |
1044 len = XINT (end) - s; | |
1211 | 1045 |
1029 | 1046 if (i->position != s) |
1047 { | |
1048 /* No properties on this first interval -- return if | |
1049 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
|
1050 if (! interval_has_some_properties (props, i)) |
1029 | 1051 { |
1052 int got = (LENGTH (i) - (s - i->position)); | |
1053 if (got >= len) | |
1054 return Qnil; | |
1055 len -= got; | |
3858
e07d474bdba9
(Fremove_text_properties, Fadd_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
3698
diff
changeset
|
1056 i = next_interval (i); |
1029 | 1057 } |
3553
5f9688c0b704
(Fadd_text_properties): Don't treat the initial
Richard M. Stallman <rms@gnu.org>
parents:
2783
diff
changeset
|
1058 /* Split away the beginning of this interval; what we don't |
5f9688c0b704
(Fadd_text_properties): Don't treat the initial
Richard M. Stallman <rms@gnu.org>
parents:
2783
diff
changeset
|
1059 want to modify. */ |
1029 | 1060 else |
1061 { | |
1062 unchanged = i; | |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1063 i = split_interval_right (unchanged, s - unchanged->position); |
1029 | 1064 copy_properties (unchanged, i); |
1065 } | |
1066 } | |
1067 | |
1068 /* We are at the beginning of an interval, with len to scan */ | |
2124
54179ef9ce35
* textprop.c (Fadd_text_properties): Initialize the modified flag.
Jim Blandy <jimb@redhat.com>
parents:
2058
diff
changeset
|
1069 for (;;) |
1029 | 1070 { |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1071 if (i == 0) |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1072 abort (); |
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1073 |
1029 | 1074 if (LENGTH (i) >= len) |
1075 { | |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1076 if (! interval_has_some_properties (props, i)) |
1029 | 1077 return modified ? Qt : Qnil; |
1078 | |
1079 if (LENGTH (i) == len) | |
1080 { | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1081 remove_properties (props, i, object); |
1029 | 1082 return Qt; |
1083 } | |
1084 | |
1085 /* i has the properties, and goes past the change limit */ | |
3553
5f9688c0b704
(Fadd_text_properties): Don't treat the initial
Richard M. Stallman <rms@gnu.org>
parents:
2783
diff
changeset
|
1086 unchanged = i; |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1087 i = split_interval_left (i, len); |
1029 | 1088 copy_properties (unchanged, i); |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1089 remove_properties (props, i, object); |
1029 | 1090 return Qt; |
1091 } | |
1092 | |
1093 len -= LENGTH (i); | |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1094 modified += remove_properties (props, i, object); |
1029 | 1095 i = next_interval (i); |
1096 } | |
1097 } | |
1098 | |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1099 DEFUN ("text-property-any", Ftext_property_any, |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1100 Stext_property_any, 4, 5, 0, |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1101 "Check text from START to END to see if PROP is ever `eq' to VALUE.\n\ |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1102 If so, return the position of the first character whose PROP is `eq'\n\ |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1103 to VALUE. Otherwise return nil.\n\ |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1104 The optional fifth argument, OBJECT, is the string or buffer\n\ |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1105 containing the text.") |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1106 (start, end, prop, value, object) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1107 Lisp_Object start, end, prop, value, object; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1108 { |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1109 register INTERVAL i; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1110 register int e, pos; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1111 |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1112 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
1113 XSETBUFFER (object, current_buffer); |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1114 i = validate_interval_range (object, &start, &end, soft); |
10488
701e7acfe885
(Ftext_property_any): Handle the trivial case specially.
Karl Heuer <kwzh@gnu.org>
parents:
10312
diff
changeset
|
1115 if (NULL_INTERVAL_P (i)) |
701e7acfe885
(Ftext_property_any): Handle the trivial case specially.
Karl Heuer <kwzh@gnu.org>
parents:
10312
diff
changeset
|
1116 return (!NILP (value) || EQ (start, end) ? Qnil : start); |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1117 e = XINT (end); |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1118 |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1119 while (! NULL_INTERVAL_P (i)) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1120 { |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1121 if (i->position >= e) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1122 break; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1123 if (EQ (textget (i->plist, prop), value)) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1124 { |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1125 pos = i->position; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1126 if (pos < XINT (start)) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1127 pos = XINT (start); |
9109
6e44ddc40153
(validate_interval_range, add_properties, remove_properties,
Karl Heuer <kwzh@gnu.org>
parents:
9071
diff
changeset
|
1128 return make_number (pos - (STRINGP (object))); |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1129 } |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1130 i = next_interval (i); |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1131 } |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1132 return Qnil; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1133 } |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1134 |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1135 DEFUN ("text-property-not-all", Ftext_property_not_all, |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1136 Stext_property_not_all, 4, 5, 0, |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1137 "Check text from START to END to see if PROP is ever not `eq' to VALUE.\n\ |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1138 If so, return the position of the first character whose PROP is not\n\ |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1139 `eq' to VALUE. Otherwise, return nil.\n\ |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1140 The optional fifth argument, OBJECT, is the string or buffer\n\ |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1141 containing the text.") |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1142 (start, end, prop, value, object) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1143 Lisp_Object start, end, prop, value, object; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1144 { |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1145 register INTERVAL i; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1146 register int s, e; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1147 |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1148 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
1149 XSETBUFFER (object, current_buffer); |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1150 i = validate_interval_range (object, &start, &end, soft); |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1151 if (NULL_INTERVAL_P (i)) |
5114
b37f62d72049
(Ftext_property_not_all): For trivial yes, return start, not Qt.
Richard M. Stallman <rms@gnu.org>
parents:
5086
diff
changeset
|
1152 return (NILP (value) || EQ (start, end)) ? Qnil : start; |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1153 s = XINT (start); |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1154 e = XINT (end); |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1155 |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1156 while (! NULL_INTERVAL_P (i)) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1157 { |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1158 if (i->position >= e) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1159 break; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1160 if (! EQ (textget (i->plist, prop), value)) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1161 { |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1162 if (i->position > s) |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1163 s = i->position; |
9109
6e44ddc40153
(validate_interval_range, add_properties, remove_properties,
Karl Heuer <kwzh@gnu.org>
parents:
9071
diff
changeset
|
1164 return make_number (s - (STRINGP (object))); |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1165 } |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1166 i = next_interval (i); |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1167 } |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1168 return Qnil; |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1169 } |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1170 |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1171 #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
|
1172 |
1029 | 1173 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
|
1174 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
|
1175 "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
|
1176 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
|
1177 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
|
1178 (start, end, object) |
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1179 Lisp_Object start, end, object; |
1029 | 1180 { |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1181 register INTERVAL i; |
1305 | 1182 register INTERVAL prev_changed = NULL_INTERVAL; |
1029 | 1183 register int s, len, modified; |
1184 | |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1185 if (NILP (object)) |
9280
4b238c43e59f
(Ftext_properties_at, Fget_char_property, Fnext_property_change,
Karl Heuer <kwzh@gnu.org>
parents:
9109
diff
changeset
|
1186 XSETBUFFER (object, current_buffer); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1187 |
1029 | 1188 i = validate_interval_range (object, &start, &end, soft); |
1189 if (NULL_INTERVAL_P (i)) | |
1190 return Qnil; | |
1191 | |
1192 s = XINT (start); | |
1193 len = XINT (end) - s; | |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1194 |
1029 | 1195 if (i->position != s) |
1196 { | |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1197 register int got; |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1198 register INTERVAL unchanged = i; |
1029 | 1199 |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1200 /* 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
|
1201 if (! NILP (i->plist)) |
1029 | 1202 { |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1203 i = split_interval_right (unchanged, s - unchanged->position); |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1204 i->plist = Qnil; |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1205 modified++; |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1206 |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1207 if (LENGTH (i) > len) |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1208 { |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1209 i = split_interval_right (i, len); |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1210 copy_properties (unchanged, i); |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1211 return Qt; |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1212 } |
1029 | 1213 |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1214 if (LENGTH (i) == len) |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1215 return Qt; |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1216 |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1217 got = LENGTH (i); |
1029 | 1218 } |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1219 /* 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
|
1220 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
|
1221 anything.*/ |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1222 else if (LENGTH (i) - (s - i->position) <= len) |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1223 return Qnil; |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1224 /* 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
|
1225 how much we've gotten. */ |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1226 else |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1227 got = LENGTH (i) - (s - i->position); |
1029 | 1228 |
1229 len -= got; | |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1230 prev_changed = i; |
1029 | 1231 i = next_interval (i); |
1232 } | |
1233 | |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1234 /* We are starting at the beginning of an interval, I. */ |
1029 | 1235 while (len > 0) |
1236 { | |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1237 if (LENGTH (i) >= len) |
1029 | 1238 { |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1239 /* 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
|
1240 if (NILP (i->plist)) |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1241 { |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1242 if (! NULL_INTERVAL_P (prev_changed)) |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1243 merge_interval_left (i); |
1029 | 1244 |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1245 return modified ? Qt : Qnil; |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1246 } |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1247 |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1248 if (LENGTH (i) > len) |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1249 i = split_interval_left (i, len); |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1250 if (! NULL_INTERVAL_P (prev_changed)) |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1251 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
|
1252 else |
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1253 i->plist = Qnil; |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1254 |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1255 return Qt; |
1029 | 1256 } |
1257 | |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1258 /* Here if we still need to erase past the end of I */ |
1029 | 1259 len -= LENGTH (i); |
1272
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1260 if (NULL_INTERVAL_P (prev_changed)) |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1261 { |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1262 modified += erase_properties (i); |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1263 prev_changed = i; |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1264 } |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1265 else |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1266 { |
1283
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1267 modified += ! NILP (i->plist); |
6f4cbcc62eba
Minor optimizations of Fset_text_properties and Ferase_text_properties.
Joseph Arceneaux <jla@gnu.org>
parents:
1272
diff
changeset
|
1268 /* 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
|
1269 prev_changed = i = merge_interval_left (i); |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1270 } |
bfd04f61eb16
Mods to Ferase_text_properties
Joseph Arceneaux <jla@gnu.org>
parents:
1211
diff
changeset
|
1271 |
1029 | 1272 i = next_interval (i); |
1273 } | |
1274 | |
1275 return modified ? Qt : Qnil; | |
1276 } | |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1277 #endif /* 0 */ |
1029 | 1278 |
4007
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1279 /* I don't think this is the right interface to export; how often do you |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1280 want to do something like this, other than when you're copying objects |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1281 around? |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1282 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1283 I think it would be better to have a pair of functions, one which |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1284 returns the text properties of a region as a list of ranges and |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1285 plists, and another which applies such a list to another object. */ |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1286 |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1287 /* Add properties from SRC to SRC of SRC, starting at POS in DEST. |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1288 SRC and DEST may each refer to strings or buffers. |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1289 Optional sixth argument PROP causes only that property to be copied. |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1290 Properties are copied to DEST as if by `add-text-properties'. |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1291 Return t if any property value actually changed, nil otherwise. */ |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1292 |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1293 /* Note this can GC when DEST is a buffer. */ |
4007
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1294 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1295 Lisp_Object |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1296 copy_text_properties (start, end, src, pos, dest, prop) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1297 Lisp_Object start, end, src, pos, dest, prop; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1298 { |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1299 INTERVAL i; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1300 Lisp_Object res; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1301 Lisp_Object stuff; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1302 Lisp_Object plist; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1303 int s, e, e2, p, len, modified = 0; |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1304 struct gcpro gcpro1, gcpro2; |
4007
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1305 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1306 i = validate_interval_range (src, &start, &end, soft); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1307 if (NULL_INTERVAL_P (i)) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1308 return Qnil; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1309 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1310 CHECK_NUMBER_COERCE_MARKER (pos, 0); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1311 { |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1312 Lisp_Object dest_start, dest_end; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1313 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1314 dest_start = pos; |
9321
e6759002383c
(Fnext_property_change, property_change_between_p,
Karl Heuer <kwzh@gnu.org>
parents:
9280
diff
changeset
|
1315 XSETFASTINT (dest_end, XINT (dest_start) + (XINT (end) - XINT (start))); |
4007
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1316 /* Apply this to a copy of pos; it will try to increment its arguments, |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1317 which we don't want. */ |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1318 validate_interval_range (dest, &dest_start, &dest_end, soft); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1319 } |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1320 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1321 s = XINT (start); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1322 e = XINT (end); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1323 p = XINT (pos); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1324 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1325 stuff = Qnil; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1326 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1327 while (s < e) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1328 { |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1329 e2 = i->position + LENGTH (i); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1330 if (e2 > e) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1331 e2 = e; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1332 len = e2 - s; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1333 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1334 plist = i->plist; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1335 if (! NILP (prop)) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1336 while (! NILP (plist)) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1337 { |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1338 if (EQ (Fcar (plist), prop)) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1339 { |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1340 plist = Fcons (prop, Fcons (Fcar (Fcdr (plist)), Qnil)); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1341 break; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1342 } |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1343 plist = Fcdr (Fcdr (plist)); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1344 } |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1345 if (! NILP (plist)) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1346 { |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1347 /* Must defer modifications to the interval tree in case src |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1348 and dest refer to the same string or buffer. */ |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1349 stuff = Fcons (Fcons (make_number (p), |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1350 Fcons (make_number (p + len), |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1351 Fcons (plist, Qnil))), |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1352 stuff); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1353 } |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1354 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1355 i = next_interval (i); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1356 if (NULL_INTERVAL_P (i)) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1357 break; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1358 |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1359 p += len; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1360 s = i->position; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1361 } |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1362 |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1363 GCPRO2 (stuff, dest); |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1364 |
4007
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1365 while (! NILP (stuff)) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1366 { |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1367 res = Fcar (stuff); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1368 res = Fadd_text_properties (Fcar (res), Fcar (Fcdr (res)), |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1369 Fcar (Fcdr (Fcdr (res))), dest); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1370 if (! NILP (res)) |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1371 modified++; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1372 stuff = Fcdr (stuff); |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1373 } |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1374 |
10159
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1375 UNGCPRO; |
1299d37b51bb
(add_properties): Add gcpro's.
Richard M. Stallman <rms@gnu.org>
parents:
9945
diff
changeset
|
1376 |
4007
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1377 return modified ? Qt : Qnil; |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1378 } |
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1379 |
1029 | 1380 void |
1381 syms_of_textprop () | |
1382 { | |
10925
0480d65be55d
(Vdefault_properties): New vbl.
Boris Goldowsky <boris@gnu.org>
parents:
10488
diff
changeset
|
1383 DEFVAR_LISP ("default-properties", &Vdefault_properties, |
0480d65be55d
(Vdefault_properties): New vbl.
Boris Goldowsky <boris@gnu.org>
parents:
10488
diff
changeset
|
1384 "Property-list used as default values.\n\ |
0480d65be55d
(Vdefault_properties): New vbl.
Boris Goldowsky <boris@gnu.org>
parents:
10488
diff
changeset
|
1385 The value of a property in this list is seen as the value for every character\n\ |
0480d65be55d
(Vdefault_properties): New vbl.
Boris Goldowsky <boris@gnu.org>
parents:
10488
diff
changeset
|
1386 that does not have its own value for that property."); |
0480d65be55d
(Vdefault_properties): New vbl.
Boris Goldowsky <boris@gnu.org>
parents:
10488
diff
changeset
|
1387 Vdefault_properties = Qnil; |
0480d65be55d
(Vdefault_properties): New vbl.
Boris Goldowsky <boris@gnu.org>
parents:
10488
diff
changeset
|
1388 |
4242
49007dbbec4c
(syms_of_textprop): Set up Lisp var Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents:
4214
diff
changeset
|
1389 DEFVAR_LISP ("inhibit-point-motion-hooks", &Vinhibit_point_motion_hooks, |
9071
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
1390 "If non-nil, don't run `point-left' and `point-entered' text properties.\n\ |
2d4d0f6e7be0
(syms_of_textprop): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
8962
diff
changeset
|
1391 This also inhibits the use of the `intangible' text property."); |
4242
49007dbbec4c
(syms_of_textprop): Set up Lisp var Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents:
4214
diff
changeset
|
1392 Vinhibit_point_motion_hooks = Qnil; |
49007dbbec4c
(syms_of_textprop): Set up Lisp var Vinhibit_point_motion_hooks.
Richard M. Stallman <rms@gnu.org>
parents:
4214
diff
changeset
|
1393 |
1029 | 1394 /* Common attributes one might give text */ |
1395 | |
1396 staticpro (&Qforeground); | |
1397 Qforeground = intern ("foreground"); | |
1398 staticpro (&Qbackground); | |
1399 Qbackground = intern ("background"); | |
1400 staticpro (&Qfont); | |
1401 Qfont = intern ("font"); | |
1402 staticpro (&Qstipple); | |
1403 Qstipple = intern ("stipple"); | |
1404 staticpro (&Qunderline); | |
1405 Qunderline = intern ("underline"); | |
1406 staticpro (&Qread_only); | |
1407 Qread_only = intern ("read-only"); | |
1408 staticpro (&Qinvisible); | |
1409 Qinvisible = intern ("invisible"); | |
6755
a2bccbc870e6
(syms_of_textprop): Initialize Qintangible.
Karl Heuer <kwzh@gnu.org>
parents:
6681
diff
changeset
|
1410 staticpro (&Qintangible); |
a2bccbc870e6
(syms_of_textprop): Initialize Qintangible.
Karl Heuer <kwzh@gnu.org>
parents:
6681
diff
changeset
|
1411 Qintangible = intern ("intangible"); |
2058
a43d0bb1b7d8
(Fget_text_property): Use textget.
Richard M. Stallman <rms@gnu.org>
parents:
2053
diff
changeset
|
1412 staticpro (&Qcategory); |
a43d0bb1b7d8
(Fget_text_property): Use textget.
Richard M. Stallman <rms@gnu.org>
parents:
2053
diff
changeset
|
1413 Qcategory = intern ("category"); |
a43d0bb1b7d8
(Fget_text_property): Use textget.
Richard M. Stallman <rms@gnu.org>
parents:
2053
diff
changeset
|
1414 staticpro (&Qlocal_map); |
a43d0bb1b7d8
(Fget_text_property): Use textget.
Richard M. Stallman <rms@gnu.org>
parents:
2053
diff
changeset
|
1415 Qlocal_map = intern ("local-map"); |
4381
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
1416 staticpro (&Qfront_sticky); |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
1417 Qfront_sticky = intern ("front-sticky"); |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
1418 staticpro (&Qrear_nonsticky); |
b0556af4d680
(Qfront_sticky, Qrear_nonsticky): New variables.
Richard M. Stallman <rms@gnu.org>
parents:
4242
diff
changeset
|
1419 Qrear_nonsticky = intern ("rear-nonsticky"); |
1029 | 1420 |
1421 /* Properties that text might use to specify certain actions */ | |
1422 | |
1423 staticpro (&Qmouse_left); | |
1424 Qmouse_left = intern ("mouse-left"); | |
1425 staticpro (&Qmouse_entered); | |
1426 Qmouse_entered = intern ("mouse-entered"); | |
1427 staticpro (&Qpoint_left); | |
1428 Qpoint_left = intern ("point-left"); | |
1429 staticpro (&Qpoint_entered); | |
1430 Qpoint_entered = intern ("point-entered"); | |
1431 | |
1432 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
|
1433 defsubr (&Sget_text_property); |
7582
454c279b6d18
(syms_of_textprop): Set up Lisp fn get-char-property.
Richard M. Stallman <rms@gnu.org>
parents:
7307
diff
changeset
|
1434 defsubr (&Sget_char_property); |
1029 | 1435 defsubr (&Snext_property_change); |
1211 | 1436 defsubr (&Snext_single_property_change); |
1029 | 1437 defsubr (&Sprevious_property_change); |
1211 | 1438 defsubr (&Sprevious_single_property_change); |
1029 | 1439 defsubr (&Sadd_text_properties); |
1965
2bdbd6ed2430
(Fadd_text_properties, Fremove_text_properties):
Richard M. Stallman <rms@gnu.org>
parents:
1930
diff
changeset
|
1440 defsubr (&Sput_text_property); |
1029 | 1441 defsubr (&Sset_text_properties); |
1442 defsubr (&Sremove_text_properties); | |
4144
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1443 defsubr (&Stext_property_any); |
8f5545cf9774
* intervals.c (split_interval_left, split_interval_right): Change
Jim Blandy <jimb@redhat.com>
parents:
4076
diff
changeset
|
1444 defsubr (&Stext_property_not_all); |
1857
9d65dfc7bdb7
(Fadd_text_properties): Put OBJECT arg last. Make it optional.
Richard M. Stallman <rms@gnu.org>
parents:
1715
diff
changeset
|
1445 /* defsubr (&Serase_text_properties); */ |
4007
55da23f04d01
* textprop.c (copy_text_properties): Pass a copy of POS to
Jim Blandy <jimb@redhat.com>
parents:
3998
diff
changeset
|
1446 /* defsubr (&Scopy_text_properties); */ |
1029 | 1447 } |
1302
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1448 |
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1449 #else |
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1450 |
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1451 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
|
1452 |
538cc0cd6d83
* textprop.c: Conditionalize all functions on
Joseph Arceneaux <jla@gnu.org>
parents:
1283
diff
changeset
|
1453 #endif /* USE_TEXT_PROPERTIES */ |