static uint32_t removeNode()

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;
}