static int make_huffman_tree(GtHuffman *huffman) { GtHuffmanTree *n1 = NULL, *n2 = NULL, GT_UNUSED *n3 = NULL, *newnode = NULL; unsigned long i, symbol; unsigned long long freq; int GT_UNUSED deleted; bool nodecreated = false; if (huffman->numofsymbols == 0) huffman->roothuffmantree = NULL; else if (huffman->numofsymbols == 1) { huffman->roothuffmantree = gt_rbtree_root_key(huffman->rbt_root); huffman->roothuffmantree->code.code = 0; huffman->roothuffmantree->code.numofbits = 1; } else { for (i = 0; i < huffman->numofsymbols - 1; i++) { n1 = gt_rbtree_minimum_key(huffman->rbt_root); n1 = huffman_tree_ref(n1); deleted = gt_rbtree_erase(huffman->rbt_root, n1); gt_assert(deleted == 0); n2 = gt_rbtree_minimum_key(huffman->rbt_root); n2 = huffman_tree_ref(n2); deleted = gt_rbtree_erase(huffman->rbt_root, n2); gt_assert(deleted == 0); symbol = n1->symbol.symbol < n2->symbol.symbol ? n2->symbol.symbol : n1->symbol.symbol; freq = n1->symbol.freq + n2->symbol.freq; newnode = huffman_tree_new(symbol, freq); if (n1->symbol.freq < n2->symbol.freq) { newnode->leftchild = n2; newnode->rightchild = n1; } else { newnode->leftchild = n1; newnode->rightchild = n2; } gt_assert(huffman->rbt_root); n3 = gt_rbtree_search(huffman->rbt_root, newnode, &nodecreated); gt_assert(nodecreated && n3); } huffman->roothuffmantree = (GtHuffmanTree*)newnode; huffman->roothuffmantree->code.code = 0; huffman->roothuffmantree->code.numofbits = 0; } return 0; }
static bool nrbt_mangle_tree(GtRBTreeSearchOrder how, GtRBTreeDoAction what, GtRBTree *tree, GtUword lag, GtError *err) { GtUword i; bool nodecreated, haserr = false; if (how == GT_RBTREE_RANDOMORDER) { for (i = 0; i < (GtUword) GT_RBTREE_SIZE; ++i) { gt_rbtree_ytab[i] = i; } gt_rbtree_permuteintarray (gt_rbtree_ytab); } for (i = 0; i < GT_RBTREE_SIZE + lag; ++i) { void *elem; GtUword j, k; switch (how) { case GT_RBTREE_RANDOMORDER: if (i >= lag) { k = gt_rbtree_ytab[i - lag]; } else { k = gt_rbtree_ytab[GT_RBTREE_SIZE - i - 1 + lag]; } j = gt_rbtree_ytab[i]; break; case GT_RBTREE_ASCENDING: k = i - lag; j = i; break; case GT_RBTREE_DESCENDING: k = GT_RBTREE_SIZE - i - 1 + lag; j = GT_RBTREE_SIZE - i - 1; break; default: abort (); } switch (what) { case GtRBTreeBuildDelete: case GtRBTreeBuild: if (i < (GtUword) GT_RBTREE_SIZE) { if (gt_rbtree_find (tree, gt_rbtree_xtab + j) != NULL) { gt_error_set(err,"Found element which is not in tree yet"); haserr = true; } if (!haserr) { elem = gt_rbtree_search(tree, gt_rbtree_xtab + j, &nodecreated); if (elem == NULL || gt_rbtree_find(tree, gt_rbtree_xtab + j) == NULL) { gt_error_set(err,"Couldn't find element after it was added"); haserr = true; } } } if (haserr || what ==GtRBTreeBuild || i < lag) break; j = k; /*@fallthrough@*/ case GtRBTreeDelete: elem = gt_rbtree_find (tree, gt_rbtree_xtab + j); if (elem == NULL || gt_rbtree_erase (tree, gt_rbtree_xtab + j) != 0) { gt_error_set(err,"Error deleting element"); haserr = true; } break; case GtRBTreeFind: if (gt_rbtree_find (tree, gt_rbtree_xtab + j) == NULL) { gt_error_set(err,"Couldn't find element after it was added"); haserr = true; } break; } } return haserr; }