dtrenew.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include <cdt/dthdr.h>
  2. #include <stddef.h>
  3. /* Renew the object at the current finger.
  4. **
  5. ** Written by Kiem-Phong Vo (5/25/96)
  6. */
  7. void* dtrenew(Dt_t* dt, void* obj)
  8. {
  9. void* key;
  10. Dtlink_t *e, *t, **s;
  11. Dtdisc_t* disc = dt->disc;
  12. UNFLATTEN(dt);
  13. if(!(e = dt->data->here) || _DTOBJ(e,disc->link) != obj)
  14. return NULL;
  15. if(dt->data->type&DT_QUEUE)
  16. return obj;
  17. else if(dt->data->type&(DT_OSET|DT_OBAG) )
  18. { if(!e->right ) /* make left child the new root */
  19. dt->data->here = e->left;
  20. else /* make right child the new root */
  21. { dt->data->here = e->right;
  22. /* merge left subtree to right subtree */
  23. if(e->left)
  24. { for(t = e->right; t->left; t = t->left)
  25. ;
  26. t->left = e->left;
  27. }
  28. }
  29. }
  30. else /*if(dt->data->type&(DT_SET|DT_BAG))*/
  31. { s = dt->data->htab + HINDEX(dt->data->ntab,e->hash);
  32. if((t = *s) == e)
  33. *s = e->right;
  34. else
  35. { for(; t->right != e; t = t->right)
  36. ;
  37. t->right = e->right;
  38. }
  39. key = _DTKEY(obj,disc->key,disc->size);
  40. e->hash = dtstrhash(key, disc->size);
  41. dt->data->here = NULL;
  42. }
  43. dt->data->size -= 1;
  44. return dt->meth->searchf(dt, e, DT_RENEW) ? obj : NULL;
  45. }