diff options
Diffstat (limited to 'usr/src/lib/libast/common/cdt/dtflatten.c')
-rw-r--r-- | usr/src/lib/libast/common/cdt/dtflatten.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/usr/src/lib/libast/common/cdt/dtflatten.c b/usr/src/lib/libast/common/cdt/dtflatten.c new file mode 100644 index 0000000000..86ca685dea --- /dev/null +++ b/usr/src/lib/libast/common/cdt/dtflatten.c @@ -0,0 +1,75 @@ +/*********************************************************************** +* * +* This software is part of the ast package * +* Copyright (c) 1985-2007 AT&T Knowledge Ventures * +* and is licensed under the * +* Common Public License, Version 1.0 * +* by AT&T Knowledge Ventures * +* * +* A copy of the License is available at * +* http://www.opensource.org/licenses/cpl1.0.txt * +* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * +* * +* Information and Software Systems Research * +* AT&T Research * +* Florham Park NJ * +* * +* Glenn Fowler <gsf@research.att.com> * +* David Korn <dgk@research.att.com> * +* Phong Vo <kpv@research.att.com> * +* * +***********************************************************************/ +#include "dthdr.h" + +/* Flatten a dictionary into a linked list. +** This may be used when many traversals are likely. +** +** Written by Kiem-Phong Vo (5/25/96). +*/ + +#if __STD_C +Dtlink_t* dtflatten(Dt_t* dt) +#else +Dtlink_t* dtflatten(dt) +Dt_t* dt; +#endif +{ + reg Dtlink_t *t, *r, *list, *last, **s, **ends; + + /* already flattened */ + if(dt->data->type&DT_FLATTEN ) + return dt->data->here; + + list = last = NIL(Dtlink_t*); + if(dt->data->type&(DT_SET|DT_BAG)) + { for(ends = (s = dt->data->htab) + dt->data->ntab; s < ends; ++s) + { if((t = *s) ) + { if(last) + last->right = t; + else list = last = t; + while(last->right) + last = last->right; + *s = last; + } + } + } + else if(dt->data->type&(DT_LIST|DT_STACK|DT_QUEUE) ) + list = dt->data->head; + else if((r = dt->data->here) ) /*if(dt->data->type&(DT_OSET|DT_OBAG))*/ + { while((t = r->left) ) + RROTATE(r,t); + for(list = last = r, r = r->right; r; last = r, r = r->right) + { if((t = r->left) ) + { do RROTATE(r,t); + while((t = r->left) ); + + last->right = r; + } + } + } + + dt->data->here = list; + dt->data->type |= DT_FLATTEN; + + return list; +} |