in hfs/btree.c [1322:1372]
int addToBTree(BTree* tree, BTKey* searchKey, size_t length, unsigned char* content) {
int callAgain;
BTNodeDescriptor newDescriptor;
uint16_t offset;
uint16_t freeOffset;
uint32_t newNode;
if(tree->headerRec->rootNode != 0) {
do {
callAgain = FALSE;
newNode = addRecord(tree, tree->headerRec->rootNode, searchKey, length, content, &callAgain);
if(newNode != 0) {
increaseHeight(tree, newNode);
}
} while(callAgain);
} else {
// add the first leaf node
tree->headerRec->rootNode = getNewNode(tree);
tree->headerRec->firstLeafNode = tree->headerRec->rootNode;
tree->headerRec->lastLeafNode = tree->headerRec->rootNode;
tree->headerRec->leafRecords = 1;
tree->headerRec->treeDepth = 1;
newDescriptor.fLink = 0;
newDescriptor.bLink = 0;
newDescriptor.kind = kBTLeafNode;
newDescriptor.height = 1;
newDescriptor.numRecords = 1;
newDescriptor.reserved = 0;
offset = 14;
freeOffset = offset + sizeof(searchKey->keyLength) + searchKey->keyLength + length;
ASSERT(WRITE_KEY(tree, tree->headerRec->rootNode * tree->headerRec->nodeSize + offset, searchKey, tree->io), "WRITE_KEY");
ASSERT(WRITE(tree->io, tree->headerRec->rootNode * tree->headerRec->nodeSize + offset + sizeof(searchKey->keyLength) + searchKey->keyLength,
length, content), "WRITE");
FLIPENDIAN(offset);
ASSERT(WRITE(tree->io, (tree->headerRec->rootNode * tree->headerRec->nodeSize) + tree->headerRec->nodeSize - (sizeof(uint16_t) * 1),
sizeof(uint16_t), &offset), "WRITE");
FLIPENDIAN(freeOffset);
ASSERT(WRITE(tree->io, (tree->headerRec->rootNode * tree->headerRec->nodeSize) + tree->headerRec->nodeSize - (sizeof(uint16_t) * 2),
sizeof(uint16_t), &freeOffset), "WRITE");
ASSERT(writeBTNodeDescriptor(&newDescriptor, tree->headerRec->rootNode, tree), "writeBTNodeDescriptor");
ASSERT(writeBTHeaderRec(tree), "writeBTHeaderRec");
}
return TRUE;
}