|
Graphviz 2.29.20120208.0545
|
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 }
1.7.4