| decode_node#(OFFSET, SIZE, BUF; ND; ERR) {if SIZE < 2 * NODE_HEADER_SIZE then {debug#("persistence: decode_node expected size wrong"); ERR := EINVAL} else if ¬ OFFSET + SIZE ≤ # BUF then {debug#("persistence: decode_node buffer insufficient"); ERR := EINVAL} else let NDHD = ? in {decode_header#(OFFSET, BUF; NDHD; ERR); if ERR = ESUCCESS ∧ NDHD.ispadding then {debug#("persistence: decode_node got padding node"); ERR := EIO}; if ERR = ESUCCESS ∧ align↑(NDHD.size, 2 * NODE_HEADER_SIZE) + 2 * NODE_HEADER_SIZE ≠ SIZE then {debug#("persistence: decode_node node of wrong size"); ERR := EIO}; if ERR = ESUCCESS then {decode_node_headerless#(OFFSET + NODE_HEADER_SIZE, BUF; ND, SIZE; ERR); if ERR ≠ ESUCCESS then debug#("persistence: decode_node decoding failed") else if SIZE ≠ NDHD.size then {debug#("persistence: decode_node size of node unexpected"); ERR := EINVAL}}; if ERR = ESUCCESS ∧ ¬ range=(BUF, OFFSET + NODE_HEADER_SIZE + align↑(NDHD.size, 2 * NODE_HEADER_SIZE), validtrailer, 0, NODE_HEADER_SIZE) then {debug#("persistence: decode_node no validtrailer"); ERR := EIO}} } |