dtdisc.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <cdt/dthdr.h>
  2. #include <stddef.h>
  3. /* Change discipline.
  4. ** dt : dictionary
  5. ** disc : discipline
  6. **
  7. ** Written by Kiem-Phong Vo (5/26/96)
  8. */
  9. Dtdisc_t *dtdisc(Dt_t *dt, Dtdisc_t *disc) {
  10. Dtsearch_f searchf;
  11. Dtlink_t *r, *t;
  12. char* k;
  13. Dtdisc_t* old;
  14. if(!(old = dt->disc) ) /* initialization call from dtopen() */
  15. { dt->disc = disc;
  16. return disc;
  17. }
  18. if(!disc) /* only want to know current discipline */
  19. return old;
  20. searchf = dt->meth->searchf;
  21. UNFLATTEN(dt);
  22. dt->disc = disc;
  23. if(dt->data->type&DT_QUEUE)
  24. goto done;
  25. else /*if(dt->data->type&(DT_SET|DT_OSET|DT_OBAG))*/
  26. {
  27. r = dtflatten(dt);
  28. dt->data->type &= ~DT_FLATTEN;
  29. dt->data->here = NULL;
  30. dt->data->size = 0;
  31. if(dt->data->type&DT_SET)
  32. { Dtlink_t **s, **ends;
  33. ends = (s = dt->data->htab) + dt->data->ntab;
  34. while(s < ends)
  35. *s++ = NULL;
  36. }
  37. /* reinsert them */
  38. while(r)
  39. { t = r->right;
  40. k = _DTOBJ(r,disc->link);
  41. k = _DTKEY(k, disc->key, disc->size);
  42. r->hash = dtstrhash(k, disc->size);
  43. (void)searchf(dt, r, DT_RENEW);
  44. r = t;
  45. }
  46. }
  47. done:
  48. return old;
  49. }