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.