( data: Uint8Array, rangeSize = CHECK_SIZE, maxRanges = MAX_UTF8_SAMPLE_RANGES )
| 73 | }; |
| 74 | |
| 75 | const createSampleRanges = ( |
| 76 | data: Uint8Array, |
| 77 | rangeSize = CHECK_SIZE, |
| 78 | maxRanges = MAX_UTF8_SAMPLE_RANGES |
| 79 | ): ByteRange[] => { |
| 80 | const n = data.length; |
| 81 | if (n <= rangeSize) return [[0, n]]; |
| 82 | |
| 83 | const ranges: ByteRange[] = []; |
| 84 | const dk = n >>> 1; |
| 85 | const rk = rangeSize >>> 1; |
| 86 | addSampleRange(ranges, data, 0, rangeSize); |
| 87 | addSampleRange(ranges, data, Math.max(0, dk - rk), Math.min(n, dk + rk)); |
| 88 | addSampleRange(ranges, data, Math.max(0, n - rangeSize), n); |
| 89 | |
| 90 | let nextHighByteSearchStart = rangeSize; |
| 91 | while (ranges.length < maxRanges && nextHighByteSearchStart < n) { |
| 92 | let highByteIndex = -1; |
| 93 | for (let i = nextHighByteSearchStart; i < n; i++) { |
| 94 | if (data[i] >= 0x80) { |
| 95 | highByteIndex = i; |
| 96 | break; |
| 97 | } |
| 98 | } |
| 99 | if (highByteIndex < 0) break; |
| 100 | |
| 101 | const start = Math.max(0, highByteIndex - rk); |
| 102 | const end = Math.min(data.length, start + rangeSize); |
| 103 | addSampleRange(ranges, data, start, end); |
| 104 | nextHighByteSearchStart = Math.max(highByteIndex + rangeSize, end); |
| 105 | } |
| 106 | |
| 107 | return ranges.sort((a, b) => a[0] - b[0]); |
| 108 | }; |
| 109 | |
| 110 | const createLegacyDetectionSample = (data: Uint8Array): Uint8Array => { |
| 111 | const n = data.length; |
no test coverage detected