()
| 23 | let offset = 27; |
| 24 | |
| 25 | function readNode() { |
| 26 | const startOffset = offset; |
| 27 | let endOffset, numProperties, propertyListLen, nameLen; |
| 28 | |
| 29 | if (is64Bit) { |
| 30 | endOffset = Number(view.getBigUint64(offset, true)); |
| 31 | numProperties = Number(view.getBigUint64(offset + 8, true)); |
| 32 | propertyListLen = Number(view.getBigUint64(offset + 16, true)); |
| 33 | nameLen = view.getUint8(offset + 24); |
| 34 | offset += 25; |
| 35 | } else { |
| 36 | endOffset = view.getUint32(offset, true); |
| 37 | numProperties = view.getUint32(offset + 4, true); |
| 38 | propertyListLen = view.getUint32(offset + 8, true); |
| 39 | nameLen = view.getUint8(offset + 12); |
| 40 | offset += 13; |
| 41 | } |
| 42 | |
| 43 | if (endOffset === 0) return null; |
| 44 | |
| 45 | const name = new TextDecoder().decode(buffer.slice(offset, offset + nameLen)); |
| 46 | offset += nameLen; |
| 47 | |
| 48 | // Read properties |
| 49 | const properties = []; |
| 50 | const propsEnd = offset + propertyListLen; |
| 51 | |
| 52 | while (offset < propsEnd) { |
| 53 | const typeCode = String.fromCharCode(buffer[offset]); |
| 54 | offset++; |
| 55 | |
| 56 | switch (typeCode) { |
| 57 | case 'Y': |
| 58 | properties.push(view.getInt16(offset, true)); |
| 59 | offset += 2; |
| 60 | break; |
| 61 | case 'C': |
| 62 | properties.push(buffer[offset] !== 0); |
| 63 | offset += 1; |
| 64 | break; |
| 65 | case 'I': |
| 66 | properties.push(view.getInt32(offset, true)); |
| 67 | offset += 4; |
| 68 | break; |
| 69 | case 'F': |
| 70 | properties.push(view.getFloat32(offset, true)); |
| 71 | offset += 4; |
| 72 | break; |
| 73 | case 'D': |
| 74 | properties.push(view.getFloat64(offset, true)); |
| 75 | offset += 8; |
| 76 | break; |
| 77 | case 'L': |
| 78 | properties.push(view.getBigInt64(offset, true)); |
| 79 | offset += 8; |
| 80 | break; |
| 81 | case 'S': |
| 82 | case 'R': |
no test coverage detected