in hfs/btree.c [267:375]
static uint32_t linearCheck(uint32_t* heightTable, unsigned char* map, BTree* tree, uint32_t *errCount) {
uint8_t i;
uint8_t j;
uint32_t node;
uint32_t count;
uint32_t leafRecords;
BTNodeDescriptor* descriptor;
uint32_t prevNode;
off_t recordOffset;
BTKey* key;
BTKey* previousKey;
count = 0;
leafRecords = 0;
for(i = 0; i <= tree->headerRec->treeDepth; i++) {
node = heightTable[i];
if(node != 0) {
descriptor = readBTNodeDescriptor(node, tree);
while(descriptor->bLink != 0) {
node = descriptor->bLink;
free(descriptor);
descriptor = readBTNodeDescriptor(node, tree);
}
free(descriptor);
prevNode = 0;
previousKey = NULL;
if(i == 1) {
if(node != tree->headerRec->firstLeafNode) {
printf("BTREE CONSISTENCY ERROR: First leaf node (%d) is not correct. Should be: %d\n", tree->headerRec->firstLeafNode, node);
(*errCount)++;
}
}
while(node != 0) {
descriptor = readBTNodeDescriptor(node, tree);
if(descriptor->bLink != prevNode) {
printf("BTREE CONSISTENCY ERROR: Node %d is not properly linked with previous node %d\n", node, prevNode);
(*errCount)++;
}
if(descriptor->height != i) {
printf("BTREE CONSISTENCY ERROR: Node %d (%d) is not properly linked with nodes of the same height %d\n", node, descriptor->height, i);
(*errCount)++;
}
if((map[node / 8] & (1 << (7 - (node % 8)))) == 0) {
printf("BTREE CONSISTENCY ERROR: Node %d not marked allocated\n", node);
(*errCount)++;
}
/*if(descriptor->kind == kBTIndexNode && descriptor->numRecords < 2) {
printf("BTREE CONSISTENCY ERROR: Node %d does not have at least two children\n", node);
(*errCount)++;
}*/
for(j = 0; j < descriptor->numRecords; j++) {
recordOffset = getRecordOffset(j, node, tree);
key = READ_KEY(tree, recordOffset, tree->io);
if(previousKey != NULL) {
if(COMPARE(tree, key, previousKey) < 0) {
printf("BTREE CONSISTENCY ERROR: Ordering not preserved during linear check for record %d node %d: ", j, node);
(*errCount)++;
tree->keyPrint(previousKey);
printf(" < ");
tree->keyPrint(key);
printf("\n");
}
free(previousKey);
}
if(i == 1) {
leafRecords++;
}
previousKey = key;
}
count++;
prevNode = node;
node = descriptor->fLink;
free(descriptor);
}
if(i == 1) {
if(prevNode != tree->headerRec->lastLeafNode) {
printf("BTREE CONSISTENCY ERROR: Last leaf node (%d) is not correct. Should be: %d\n", tree->headerRec->lastLeafNode, node);
(*errCount)++;
}
}
free(previousKey);
}
}
if(leafRecords != tree->headerRec->leafRecords) {
printf("BTREE CONSISTENCY ERROR: leafRecords (%d) is not correct. Should be: %d\n", tree->headerRec->leafRecords, leafRecords);
(*errCount)++;
}
return count;
}