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