()
| 22 | let offset = 27; |
| 23 | |
| 24 | function readNode() { |
| 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': properties.push(view.getInt16(offset, true)); offset += 2; break; |
| 55 | case 'C': properties.push(buffer[offset] !== 0); offset += 1; break; |
| 56 | case 'I': properties.push(view.getInt32(offset, true)); offset += 4; break; |
| 57 | case 'F': properties.push(view.getFloat32(offset, true)); offset += 4; break; |
| 58 | case 'D': properties.push(view.getFloat64(offset, true)); offset += 8; break; |
| 59 | case 'L': properties.push(view.getBigInt64(offset, true)); offset += 8; break; |
| 60 | case 'S': |
| 61 | case 'R': |
| 62 | const strLen = view.getUint32(offset, true); offset += 4; |
| 63 | if (typeCode === 'S') { |
| 64 | properties.push(new TextDecoder().decode(buffer.slice(offset, offset + strLen))); |
| 65 | } else { |
| 66 | properties.push(buffer.slice(offset, offset + strLen)); |
| 67 | } |
| 68 | offset += strLen; |
| 69 | break; |
| 70 | case 'f': case 'd': case 'l': case 'i': case 'b': |
| 71 | const arrayLen = view.getUint32(offset, true); |
| 72 | const encoding = view.getUint32(offset + 4, true); |
| 73 | const compressedLen = view.getUint32(offset + 8, true); |
| 74 | offset += 12; |
| 75 | |
| 76 | if (encoding === 0) { |
| 77 | const elemSize = typeCode === 'd' || typeCode === 'l' ? 8 : 4; |
| 78 | const arr = []; |
| 79 | for (let i = 0; i < arrayLen; i++) { |
| 80 | if (typeCode === 'd') arr.push(view.getFloat64(offset + i * 8, true)); |
| 81 | else if (typeCode === 'f') arr.push(view.getFloat32(offset + i * 4, true)); |
no test coverage detected