| 181 { |
181 { |
| 182 int fnd; |
182 int fnd; |
| 183 return rb_find_ikey_n(n, ikey, &fnd); |
183 return rb_find_ikey_n(n, ikey, &fnd); |
| 184 } |
184 } |
| 185 |
185 |
| 186 Rb_node rb_find_gkey_n(Rb_node n, void *key, Rb_compfn *fxn, int *fnd) |
186 Rb_node rb_find_gkey_n(Rb_node n, const void *key, Rb_compfn *fxn, int *fnd) |
| 187 { |
187 { |
| 188 int cmp; |
188 int cmp; |
| 189 |
189 |
| 190 *fnd = 0; |
190 *fnd = 0; |
| 191 if (!ishead(n)) { |
191 if (!ishead(n)) { |
| 192 fprintf(stderr, "rb_find_key_n called on non-head %p\n", |
192 fprintf(stderr, "rb_find_gkey_n called on non-head %p\n", |
| 193 DONT_COMPLAIN n); |
193 DONT_COMPLAIN n); |
| 194 exit(1); |
194 exit(1); |
| 195 } |
195 } |
| 196 if (n->p.root == n) return n; |
196 if (n->p.root == n) return n; |
| 197 cmp = (*fxn)(key, n->c.list.blink->k.key); |
197 cmp = (*fxn)(key, n->c.list.blink->k.key); |
| 210 } |
210 } |
| 211 if (cmp < 0) n = n->c.child.left ; else n = n->c.child.right; |
211 if (cmp < 0) n = n->c.child.left ; else n = n->c.child.right; |
| 212 } |
212 } |
| 213 } |
213 } |
| 214 |
214 |
| 215 Rb_node rb_find_gkey(Rb_node n, void *key, Rb_compfn *fxn) |
215 Rb_node rb_find_gkey(Rb_node n, const void *key, Rb_compfn *fxn) |
| 216 { |
216 { |
| 217 int fnd; |
217 int fnd; |
| 218 return rb_find_gkey_n(n, key, fxn, &fnd); |
218 return rb_find_gkey_n(n, key, fxn, &fnd); |
| 219 } |
219 } |
| 220 |
220 |
| 221 Rb_node rb_find_key_n(Rb_node n, char *key, int *fnd) |
221 Rb_node rb_find_key_n(Rb_node n, const char *key, int *fnd) |
| 222 { |
222 { |
| 223 return rb_find_gkey_n(n, key, (Rb_compfn*)strcmp, fnd); |
223 return rb_find_gkey_n(n, key, (Rb_compfn*)strcmp, fnd); |
| 224 } |
224 } |
| 225 |
225 |
| 226 Rb_node rb_find_key(Rb_node n, char *key) |
226 Rb_node rb_find_key(Rb_node n, const char *key) |
| 227 { |
227 { |
| 228 int fnd; |
228 int fnd; |
| 229 return rb_find_gkey_n(n, key, (Rb_compfn*)strcmp, &fnd); |
229 return rb_find_gkey_n(n, key, (Rb_compfn*)strcmp, &fnd); |
| 230 } |
230 } |
| 231 |
231 |
| 232 Rb_node rb_insert_b(Rb_node n, void *key, void *val) |
232 static int ptrcmp(const void *a, const void *b) |
| |
233 { |
| |
234 return (a<b ? -1 : ((a==b) ? 0 : 1)); |
| |
235 } |
| |
236 |
| |
237 Rb_node rb_find_pkey_n(Rb_node n, const void *key, int *fnd) |
| |
238 { |
| |
239 return rb_find_gkey_n(n, key, ptrcmp, fnd); |
| |
240 } |
| |
241 |
| |
242 Rb_node rb_find_pkey(Rb_node n, const void *key) |
| |
243 { |
| |
244 int fnd; |
| |
245 return rb_find_gkey_n(n, key, ptrcmp, &fnd); |
| |
246 } |
| |
247 |
| |
248 Rb_node rb_insert_b(Rb_node n, const void *key, void *val) |
| 233 { |
249 { |
| 234 Rb_node newleft, newright, newnode, list, p; |
250 Rb_node newleft, newright, newnode, list, p; |
| 235 |
251 |
| 236 if (ishead(n)) { |
252 if (ishead(n)) { |
| 237 if (n->p.root == n) { /* Tree is empty */ |
253 if (n->p.root == n) { /* Tree is empty */ |
| 579 void *rb_val(Rb_node n) |
595 void *rb_val(Rb_node n) |
| 580 { |
596 { |
| 581 return n->v.val; |
597 return n->v.val; |
| 582 } |
598 } |
| 583 |
599 |
| 584 Rb_node rb_insert_a(Rb_node nd, void *key, void *val) |
600 Rb_node rb_insert_a(Rb_node nd, const void *key, void *val) |
| 585 { |
601 { |
| 586 return rb_insert_b(nd->c.list.flink, key, val); |
602 return rb_insert_b(nd->c.list.flink, key, val); |
| 587 } |
603 } |
| 588 |
604 |
| 589 Rb_node rb_insert(Rb_node tree, char *key, void *val) |
605 Rb_node rb_insert(Rb_node tree, const char *key, void *val) |
| 590 { |
606 { |
| 591 return rb_insert_b(rb_find_key(tree, key), key, val); |
607 return rb_insert_b(rb_find_key(tree, key), key, val); |
| 592 } |
608 } |
| 593 |
609 |
| 594 Rb_node rb_inserti(Rb_node tree, int ikey, void *val) |
610 Rb_node rb_inserti(Rb_node tree, int ikey, void *val) |
| 595 { |
611 { |
| 596 return rb_insert_b(rb_find_ikey(tree, ikey), (void *) ikey, val); |
612 return rb_insert_b(rb_find_ikey(tree, ikey), (void *) ikey, val); |
| 597 } |
613 } |
| 598 |
614 |
| 599 Rb_node rb_insertg(Rb_node tree, void *key, void *val, Rb_compfn *func) |
615 Rb_node rb_insertg(Rb_node tree, const void *key, void *val, Rb_compfn *func) |
| 600 { |
616 { |
| 601 return rb_insert_b(rb_find_gkey(tree, key, func), key, val); |
617 return rb_insert_b(rb_find_gkey(tree, key, func), key, val); |
| 602 } |
618 } |
| 603 |
619 |
| 604 |
620 Rb_node rb_insertp(Rb_node tree, const void *key, void *val) |
| |
621 { |
| |
622 return rb_insertg(tree, key, val, ptrcmp); |
| |
623 } |
| |
624 |
| |
625 |