static inline void sasbtree_print(SASStringBTree_t btree) { SASStringBTreeNode_t root = SASStringBTreeGetRootNode(btree); if (root) { printf("{"); sasbtree_print_node(root); printf("}"); } printf("\n"); }
void * SASStringBTreeEnumNext (SASStringBTreeEnum_t sbtenum) { __SBEnumeration *stringenum = (__SBEnumeration *) sbtenum; void *result = NULL; bool found = false; char *maxkey; SASLock (stringenum->tree, SasUserLock__WRITE); maxkey = SASStringBTreeGetMaxKey (stringenum->tree); #if __SASDebugPrint__ > 1 sas_printf ("SASStringBTreeEnumNext; enum->tree=%p maxkey=%s\n", stringenum->tree, maxkey); #endif if (maxkey != NULL) { stringenum->hasmore = (strcmp (stringenum->curkey, maxkey) < 0); if (stringenum->hasmore) { SASStringBTreeNode_t curnode = stringenum->ref.node; long treemod = SASStringBTreeGetModCount (stringenum->tree); if ((curnode != NULL) && (treemod == stringenum->curmod)) { short curpos = stringenum->ref.pos; SASStringBTreeNodeHeader *curSBnode = (SASStringBTreeNodeHeader *) curnode; if (curpos < curSBnode->count) { if (curSBnode->branch[curpos] == NULL) { curpos++; stringenum->ref.pos = curpos; result = curSBnode->vals[curpos]; stringenum->curkey = curSBnode->keys[curpos]; stringenum->hasmore = (strcmp (stringenum->curkey, maxkey) < 0); found = true; } else { found = SASStringBTreeNodeSearchGT (curnode, stringenum->curkey, &stringenum->ref); if (found) { curnode = stringenum->ref.node; curSBnode = (SASStringBTreeNodeHeader *) curnode; curpos = stringenum->ref.pos; result = curSBnode->vals[curpos]; stringenum->curkey = curSBnode->keys[curpos]; stringenum->curcount -= 1; stringenum->hasmore = (strcmp (stringenum->curkey, maxkey) < 0); } } if (stringenum->hasmore) stringenum->curcount -= 1; else if (found) stringenum->curcount = 1; else stringenum->curcount = 0; } } if (!found) { #if __SASDebugPrint__ > 1 sas_printf ("SASStringBTreeEnumNext; !found enum->tree=%s\n", stringenum->tree, stringenum->curkey); #endif SASStringBTreeNode_t curnode = SASStringBTreeGetRootNode (stringenum->tree); if (stringenum->ref.node == NULL) { found = SASStringBTreeNodeSearchGE (curnode, stringenum->curkey, &stringenum->ref); #if __SASDebugPrint__ > 1 sas_printf ("SASStringBTreeEnumNext; !found curnode=%p SearchGE=%d\n", curnode, found); #endif } else { found = SASStringBTreeNodeSearchGT (curnode, stringenum->curkey, &stringenum->ref); #if __SASDebugPrint__ > 1 sas_printf ("SASStringBTreeEnumNext; !found curnode=%p SearchGT=%d\n", curnode, found); #endif } if (found) { short curpos = stringenum->ref.pos; SASStringBTreeNodeHeader *curSBnode = (SASStringBTreeNodeHeader *) stringenum->ref.node; result = curSBnode->vals[curpos]; stringenum->curkey = curSBnode->keys[curpos]; stringenum->curmod = treemod; stringenum->curcount = SASStringBTreeGetCurCount (stringenum->tree); stringenum->hasmore = (strcmp (stringenum->curkey, maxkey) < 0); #if __SASDebugPrint__ > 1 sas_printf ("SASStringBTreeEnumNext; curpos=%hd node=%p result=%p\n", curpos, curSBnode, result); #endif } else { stringenum->hasmore = false; } } } #ifdef __SASDebugPrint__ } else { sas_printf ("SASStringBTreeEnumNext; enum->tree=%p invalid\n", stringenum->tree); #endif } SASUnlock (stringenum->tree); // sas_printf("{%s,%s,%d}",stringenum->curkey, maxkey, stringenum->hasmore); return result; }