dtflatten.c 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #include <cdt/dthdr.h>
  2. #include <stddef.h>
  3. /* Flatten a dictionary into a linked list.
  4. ** This may be used when many traversals are likely.
  5. **
  6. ** Written by Kiem-Phong Vo (5/25/96).
  7. */
  8. Dtlink_t* dtflatten(Dt_t* dt)
  9. {
  10. Dtlink_t *t, *r, *list, *last, **s, **ends;
  11. /* already flattened */
  12. if(dt->data->type&DT_FLATTEN )
  13. return dt->data->here;
  14. list = last = NULL;
  15. if(dt->data->type&DT_SET)
  16. { for(ends = (s = dt->data->htab) + dt->data->ntab; s < ends; ++s)
  17. { if((t = *s) )
  18. { if(last)
  19. last->right = t;
  20. else list = last = t;
  21. while(last->right)
  22. last = last->right;
  23. *s = last;
  24. }
  25. }
  26. }
  27. else if(dt->data->type&DT_QUEUE)
  28. list = dt->data->head;
  29. else if((r = dt->data->here) ) /*if(dt->data->type&(DT_OSET|DT_OBAG))*/
  30. { while((t = r->left) )
  31. RROTATE(r,t);
  32. for(list = last = r, r = r->right; r; last = r, r = r->right)
  33. { if((t = r->left) )
  34. { do RROTATE(r,t);
  35. while((t = r->left) );
  36. last->right = r;
  37. }
  38. }
  39. }
  40. dt->data->here = list;
  41. dt->data->type |= DT_FLATTEN;
  42. return list;
  43. }