in hfs/btree.c [1259:1320]
static int increaseHeight(BTree* tree, uint32_t newNode) {
uint32_t oldRoot;
uint32_t newRoot;
BTNodeDescriptor newDescriptor;
BTKey* oldRootKey;
BTKey* newNodeKey;
uint16_t oldRootOffset;
uint16_t newNodeOffset;
uint16_t freeOffset;
oldRoot = tree->headerRec->rootNode;
oldRootKey = READ_KEY(tree, (oldRoot * tree->headerRec->nodeSize) + 14, tree->io);
newNodeKey = READ_KEY(tree, (newNode * tree->headerRec->nodeSize) + 14, tree->io);
newRoot = getNewNode(tree);
newDescriptor.fLink = 0;
newDescriptor.bLink = 0;
newDescriptor.kind = kBTIndexNode;
newDescriptor.height = tree->headerRec->treeDepth + 1;
newDescriptor.numRecords = 2;
newDescriptor.reserved = 0;
oldRootOffset = 14;
newNodeOffset = oldRootOffset + sizeof(oldRootKey->keyLength) + oldRootKey->keyLength + sizeof(uint32_t);
freeOffset = newNodeOffset + sizeof(newNodeKey->keyLength) + newNodeKey->keyLength + sizeof(uint32_t);
tree->headerRec->rootNode = newRoot;
tree->headerRec->treeDepth = newDescriptor.height;
ASSERT(WRITE_KEY(tree, newRoot * tree->headerRec->nodeSize + oldRootOffset, oldRootKey, tree->io), "WRITE_KEY");
FLIPENDIAN(oldRoot);
ASSERT(WRITE(tree->io, newRoot * tree->headerRec->nodeSize + oldRootOffset + sizeof(oldRootKey->keyLength) + oldRootKey->keyLength,
sizeof(uint32_t), &oldRoot), "WRITE");
ASSERT(WRITE_KEY(tree, newRoot * tree->headerRec->nodeSize + newNodeOffset, newNodeKey, tree->io), "WRITE_KEY");
FLIPENDIAN(newNode);
ASSERT(WRITE(tree->io, newRoot * tree->headerRec->nodeSize + newNodeOffset + sizeof(newNodeKey->keyLength) + newNodeKey->keyLength,
sizeof(uint32_t), &newNode), "WRITE");
FLIPENDIAN(oldRootOffset);
ASSERT(WRITE(tree->io, (newRoot * tree->headerRec->nodeSize) + tree->headerRec->nodeSize - (sizeof(uint16_t) * 1),
sizeof(uint16_t), &oldRootOffset), "WRITE");
FLIPENDIAN(newNodeOffset);
ASSERT(WRITE(tree->io, (newRoot * tree->headerRec->nodeSize) + tree->headerRec->nodeSize - (sizeof(uint16_t) * 2),
sizeof(uint16_t), &newNodeOffset), "WRITE");
FLIPENDIAN(freeOffset);
ASSERT(WRITE(tree->io, (newRoot * tree->headerRec->nodeSize) + tree->headerRec->nodeSize - (sizeof(uint16_t) * 3),
sizeof(uint16_t), &freeOffset), "WRITE");
ASSERT(writeBTNodeDescriptor(&newDescriptor, tree->headerRec->rootNode, tree), "writeBTNodeDescriptor");
ASSERT(writeBTHeaderRec(tree), "writeBTHeaderRec");
free(oldRootKey);
free(newNodeKey);
return TRUE;
}