def record_header(cursor)
origin = cursor.position
header = {}
cursor.backward.name("header") do |c|
case page_header[:format]
when :compact
header[:next] = c.name("next") { origin + c.get_sint16 }
bits1 = c.name("bits1") { c.get_uint16 }
header[:type] = RECORD_TYPES[bits1 & 0x07]
header[:heap_number] = (bits1 & 0xfff8) >> 3
when :redundant
header[:next] = c.name("next") { c.get_uint16 }
bits1 = c.name("bits1") { c.get_uint24 }
header[:offset_size] = (bits1 & 1) == 0 ? 2 : 1
header[:n_fields] = (bits1 & (((1 << 10) - 1) << 1)) >> 1
header[:heap_number] = (bits1 & (((1 << 13) - 1) << 11)) >> 11
end
bits2 = c.name("bits2") { c.get_uint8 }
header[:n_owned] = bits2 & 0x0f
info = (bits2 & 0xf0) >> 4
header[:min_rec] = (info & RECORD_INFO_MIN_REC_FLAG) != 0
header[:deleted] = (info & RECORD_INFO_DELETED_FLAG) != 0
case page_header[:format]
when :compact
record_header_compact_additional(header, cursor)
when :redundant
record_header_redundant_additional(header, cursor)
end
header[:length] = origin - cursor.position
end
header
end