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