static uint32_t findFree()

in hfs/btree.c [676:722]


static uint32_t findFree(BTree* tree) {
  unsigned char byte;
  uint32_t byteNumber;
  uint32_t mapNode;
  
  BTNodeDescriptor* descriptor;
  
  off_t mapRecordStart;
  off_t mapRecordLength;
  
  int i;

  mapRecordStart = getRecordOffset(2, 0, tree);
  mapRecordLength = tree->headerRec->nodeSize - 256;
  mapNode = 0;
  byteNumber = 0;
  
  while(TRUE) {
    while(byteNumber < mapRecordLength) {
      READ(tree->io, mapRecordStart + byteNumber, 1, &byte);
      if(byte != 0xFF) {
        for(i = 0; i < 8; i++) {
          if((byte & (1 << (7 - i))) == 0) {
            byte |= (1 << (7 - i));
            tree->headerRec->freeNodes--;
            ASSERT(writeBTHeaderRec(tree), "writeBTHeaderRec");
            ASSERT(WRITE(tree->io, mapRecordStart + byteNumber, 1, &byte), "WRITE");
            return ((byteNumber * 8) + i);
          }
        }
      }
      byteNumber++;
    }
    
    descriptor = readBTNodeDescriptor(mapNode, tree);
    mapNode = descriptor->fLink;
    free(descriptor);
    
    if(mapNode == 0) {
      return 0;
    }
    
    mapRecordStart = mapNode * tree->headerRec->nodeSize + 14;
    mapRecordLength = tree->headerRec->nodeSize - 20;
    byteNumber = 0;
  }
}