int addToBTree()

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