dtmethod.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include <cdt/dthdr.h>
  2. #include <stdlib.h>
  3. /* Change search method.
  4. **
  5. ** Written by Kiem-Phong Vo (05/25/96)
  6. */
  7. Dtmethod_t* dtmethod(Dt_t* dt, Dtmethod_t* meth)
  8. {
  9. Dtlink_t *list, *r;
  10. Dtdisc_t* disc = dt->disc;
  11. Dtmethod_t* oldmeth = dt->meth;
  12. if(!meth || meth->type == oldmeth->type)
  13. return oldmeth;
  14. /* get the list of elements */
  15. list = dtflatten(dt);
  16. if(dt->data->type&DT_QUEUE)
  17. dt->data->head = NULL;
  18. else if(dt->data->type&DT_SET)
  19. { if(dt->data->ntab > 0)
  20. free(dt->data->htab);
  21. dt->data->ntab = 0;
  22. dt->data->htab = NULL;
  23. }
  24. dt->data->here = NULL;
  25. dt->data->type = (dt->data->type&~(DT_METHODS|DT_FLATTEN)) | meth->type;
  26. dt->meth = meth;
  27. if(dt->searchf == oldmeth->searchf)
  28. dt->searchf = meth->searchf;
  29. if(meth->type&DT_QUEUE)
  30. { if(!(oldmeth->type&DT_QUEUE))
  31. { if((r = list) )
  32. { Dtlink_t* t;
  33. for(t = r->right; t; r = t, t = t->right )
  34. t->left = r;
  35. list->left = r;
  36. }
  37. }
  38. dt->data->head = list;
  39. }
  40. else if(meth->type&(DT_OSET|DT_OBAG))
  41. { dt->data->size = 0;
  42. while(list)
  43. { r = list->right;
  44. meth->searchf(dt, list, DT_RENEW);
  45. list = r;
  46. }
  47. }
  48. else if(oldmeth->type&DT_SET)
  49. { int rehash;
  50. if((meth->type&DT_SET) && !(oldmeth->type&DT_SET))
  51. rehash = 1;
  52. else rehash = 0;
  53. dt->data->size = dt->data->loop = 0;
  54. while(list)
  55. { r = list->right;
  56. if(rehash)
  57. { void* key = _DTOBJ(list,disc->link);
  58. key = _DTKEY(key,disc->key,disc->size);
  59. list->hash = dtstrhash(key, disc->size);
  60. }
  61. (void)meth->searchf(dt, list, DT_RENEW);
  62. list = r;
  63. }
  64. }
  65. return oldmeth;
  66. }