Mercurial > emacs
comparison src/intervals.c @ 76736:5c1ef8542b10
(merge_properties): Use explicit loop instead of
Fplist_member to avoid QUIT. Don't use Fcdr.
(intervals_equal): Likewise. Rewrite loop to perform length check
on the fly rather than calling Flength. Don't use Fcar.
author | Kim F. Storm <storm@cua.dk> |
---|---|
date | Sun, 25 Mar 2007 23:46:19 +0000 |
parents | 9bb519568fdf |
children | 922696f363b0 4ef881a120fe |
comparison
equal
deleted
inserted
replaced
76735:0066c9c25dd2 | 76736:5c1ef8542b10 |
---|---|
123 | 123 |
124 o = source->plist; | 124 o = source->plist; |
125 while (CONSP (o)) | 125 while (CONSP (o)) |
126 { | 126 { |
127 sym = XCAR (o); | 127 sym = XCAR (o); |
128 val = Fplist_member (target->plist, sym); | 128 o = XCDR (o); |
129 CHECK_CONS (o); | |
130 | |
131 val = target->plist; | |
132 while (CONSP (val) && !EQ (XCAR (val), sym)) | |
133 { | |
134 val = XCDR (val); | |
135 if (!CONSP (val)) | |
136 break; | |
137 val = XCDR (val); | |
138 } | |
129 | 139 |
130 if (NILP (val)) | 140 if (NILP (val)) |
131 { | 141 { |
132 o = XCDR (o); | |
133 CHECK_CONS (o); | |
134 val = XCAR (o); | 142 val = XCAR (o); |
135 target->plist = Fcons (sym, Fcons (val, target->plist)); | 143 target->plist = Fcons (sym, Fcons (val, target->plist)); |
136 o = XCDR (o); | 144 } |
137 } | 145 o = XCDR (o); |
138 else | |
139 o = Fcdr (XCDR (o)); | |
140 } | 146 } |
141 } | 147 } |
142 | 148 |
143 /* Return 1 if the two intervals have the same properties, | 149 /* Return 1 if the two intervals have the same properties, |
144 0 otherwise. */ | 150 0 otherwise. */ |
145 | 151 |
146 int | 152 int |
147 intervals_equal (i0, i1) | 153 intervals_equal (i0, i1) |
148 INTERVAL i0, i1; | 154 INTERVAL i0, i1; |
149 { | 155 { |
150 register Lisp_Object i0_cdr, i0_sym, i1_val; | 156 register Lisp_Object i0_cdr, i0_sym; |
151 register int i1_len; | 157 register Lisp_Object i1_cdr, i1_val; |
152 | 158 |
153 if (DEFAULT_INTERVAL_P (i0) && DEFAULT_INTERVAL_P (i1)) | 159 if (DEFAULT_INTERVAL_P (i0) && DEFAULT_INTERVAL_P (i1)) |
154 return 1; | 160 return 1; |
155 | 161 |
156 if (DEFAULT_INTERVAL_P (i0) || DEFAULT_INTERVAL_P (i1)) | 162 if (DEFAULT_INTERVAL_P (i0) || DEFAULT_INTERVAL_P (i1)) |
157 return 0; | 163 return 0; |
158 | 164 |
159 i1_len = XFASTINT (Flength (i1->plist)); | |
160 if (i1_len & 0x1) /* Paranoia -- plists are always even */ | |
161 abort (); | |
162 i1_len /= 2; | |
163 i0_cdr = i0->plist; | 165 i0_cdr = i0->plist; |
164 while (CONSP (i0_cdr)) | 166 i1_cdr = i1->plist; |
165 { | 167 while (CONSP (i0_cdr) && CONSP (i1_cdr)) |
166 /* Lengths of the two plists were unequal. */ | 168 { |
167 if (i1_len == 0) | |
168 return 0; | |
169 | |
170 i0_sym = XCAR (i0_cdr); | 169 i0_sym = XCAR (i0_cdr); |
171 i1_val = Fplist_member (i1->plist, i0_sym); | 170 i0_cdr = XCDR (i0_cdr); |
171 if (!CONSP (i0_cdr)) | |
172 return 0; /* abort (); */ | |
173 i1_val = i1->plist; | |
174 while (CONSP (i1_val) && !EQ (XCAR (i1_val), i0_sym)) | |
175 { | |
176 i1_val = XCDR (i1_val); | |
177 if (!CONSP (i1_val)) | |
178 return 0; /* abort (); */ | |
179 i1_val = XCDR (i1_val); | |
180 } | |
172 | 181 |
173 /* i0 has something i1 doesn't. */ | 182 /* i0 has something i1 doesn't. */ |
174 if (EQ (i1_val, Qnil)) | 183 if (EQ (i1_val, Qnil)) |
175 return 0; | 184 return 0; |
176 | 185 |
177 /* i0 and i1 both have sym, but it has different values in each. */ | 186 /* i0 and i1 both have sym, but it has different values in each. */ |
187 if (!CONSP (i1_val) | |
188 || (i1_val = XCDR (i1_val), !CONSP (i1_val)) | |
189 || !EQ (XCAR (i1_val), XCAR (i0_cdr))) | |
190 return 0; | |
191 | |
178 i0_cdr = XCDR (i0_cdr); | 192 i0_cdr = XCDR (i0_cdr); |
179 CHECK_CONS (i0_cdr); | 193 |
180 if (!EQ (Fcar (Fcdr (i1_val)), XCAR (i0_cdr))) | 194 i1_cdr = XCDR (i1_cdr); |
181 return 0; | 195 if (!CONSP (i1_cdr)) |
182 | 196 return 0; /* abort (); */ |
183 i0_cdr = XCDR (i0_cdr); | 197 i1_cdr = XCDR (i1_cdr); |
184 i1_len--; | 198 } |
185 } | 199 |
186 | 200 /* Lengths of the two plists were equal. */ |
187 /* Lengths of the two plists were unequal. */ | 201 return (NILP (i0_cdr) && NILP (i1_cdr)); |
188 if (i1_len > 0) | |
189 return 0; | |
190 | |
191 return 1; | |
192 } | 202 } |
193 | 203 |
194 | 204 |
195 /* Traverse an interval tree TREE, performing FUNCTION on each node. | 205 /* Traverse an interval tree TREE, performing FUNCTION on each node. |
196 No guarantee is made about the order of traversal. | 206 No guarantee is made about the order of traversal. |