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