in hfs/btree.c [847:914]
static uint32_t removeNode(BTree* tree, uint32_t node) {
unsigned char byte;
off_t mapRecordStart;
uint32_t mapNode;
size_t mapRecordLength;
BTNodeDescriptor *descriptor;
BTNodeDescriptor *oDescriptor;
mapRecordStart = getRecordOffset(2, 0, tree);
mapRecordLength = tree->headerRec->nodeSize - 256;
mapNode = 0;
while((node / 8) >= mapRecordLength) {
descriptor = readBTNodeDescriptor(mapNode, tree);
mapNode = descriptor->fLink;
free(descriptor);
if(mapNode == 0) {
hfs_panic("Cannot remove node because I can't map it!");
return 0;
}
mapRecordStart = mapNode * tree->headerRec->nodeSize + 14;
mapRecordLength = tree->headerRec->nodeSize - 20;
node -= mapRecordLength * 8;
}
READ(tree->io, mapRecordStart + (node / 8), 1, &byte);
byte &= ~(1 << (7 - (node % 8)));
tree->headerRec->freeNodes++;
descriptor = readBTNodeDescriptor(node, tree);
if(tree->headerRec->firstLeafNode == node) {
tree->headerRec->firstLeafNode = descriptor->fLink;
}
if(tree->headerRec->lastLeafNode == node) {
tree->headerRec->lastLeafNode = descriptor->bLink;
}
if(node == tree->headerRec->rootNode) {
tree->headerRec->rootNode = 0;
}
if(descriptor->bLink != 0) {
oDescriptor = readBTNodeDescriptor(descriptor->bLink, tree);
oDescriptor->fLink = descriptor->fLink;
ASSERT(writeBTNodeDescriptor(oDescriptor, descriptor->bLink, tree), "writeBTNodeDescriptor");
free(oDescriptor);
}
if(descriptor->fLink != 0) {
oDescriptor = readBTNodeDescriptor(descriptor->fLink, tree);
oDescriptor->bLink = descriptor->bLink;
ASSERT(writeBTNodeDescriptor(oDescriptor, descriptor->fLink, tree), "writeBTNodeDescriptor");
free(oDescriptor);
}
free(descriptor);
ASSERT(WRITE(tree->io, mapRecordStart + (node / 8), 1, &byte), "WRITE");
ASSERT(writeBTHeaderRec(tree), "writeBTHeaderRec");
return TRUE;
}