Graphviz 2.29.20120208.0545
lib/cdt/dtflatten.c
Go to the documentation of this file.
00001 #include        "dthdr.h"
00002 
00003 /*      Flatten a dictionary into a linked list.
00004 **      This may be used when many traversals are likely.
00005 **
00006 **      Written by Kiem-Phong Vo (5/25/96).
00007 */
00008 
00009 #if __STD_C
00010 Dtlink_t* dtflatten(Dt_t* dt)
00011 #else
00012 Dtlink_t* dtflatten(dt)
00013 Dt_t*   dt;
00014 #endif
00015 {
00016         reg Dtlink_t    *t, *r, *list, *last, **s, **ends;
00017 
00018         /* already flattened */
00019         if(dt->data->type&DT_FLATTEN )
00020                 return dt->data->here;
00021 
00022         list = last = NIL(Dtlink_t*);
00023         if(dt->data->type&(DT_SET|DT_BAG))
00024         {       for(ends = (s = dt->data->htab) + dt->data->ntab; s < ends; ++s)
00025                 {       if((t = *s) )
00026                         {       if(last)
00027                                         last->right = t;
00028                                 else    list = last = t;
00029                                 while(last->right)
00030                                         last = last->right;
00031                                 *s = last;
00032                         }
00033                 }
00034         }
00035         else if(dt->data->type&(DT_LIST|DT_STACK|DT_QUEUE) )
00036                 list = dt->data->head;
00037         else if((r = dt->data->here) ) /*if(dt->data->type&(DT_OSET|DT_OBAG))*/
00038         {       while((t = r->left) )
00039                         RROTATE(r,t);
00040                 for(list = last = r, r = r->right; r; last = r, r = r->right)
00041                 {       if((t = r->left) )
00042                         {       do      RROTATE(r,t);
00043                                 while((t = r->left) );
00044 
00045                                 last->right = r;
00046                         }
00047                 }
00048         }
00049 
00050         dt->data->here = list;
00051         dt->data->type |= DT_FLATTEN;
00052 
00053         return list;
00054 }