import { Encodings } from "./_node.ts";import { indexOfNeedle } from "../../bytes/index_of_needle.ts";
export function numberToBytes(n: number): Uint8Array { if (n === 0) return new Uint8Array([0]);
const bytes = []; bytes.unshift(n & 255); while (n >= 256) { n = n >>> 8; bytes.unshift(n & 255); } return new Uint8Array(bytes);}
function findLastIndex( targetBuffer: Uint8Array, buffer: Uint8Array, offset: number,) { offset = offset > targetBuffer.length ? targetBuffer.length : offset;
const searchableBuffer = targetBuffer.slice(0, offset + buffer.length); const searchableBufferLastIndex = searchableBuffer.length - 1; const bufferLastIndex = buffer.length - 1;
let lastMatchIndex = -1; let matches = 0; let index = -1; for (let x = 0; x <= searchableBufferLastIndex; x++) { if ( searchableBuffer[searchableBufferLastIndex - x] === buffer[bufferLastIndex - matches] ) { if (lastMatchIndex === -1) { lastMatchIndex = x; } matches++; } else { matches = 0; if (lastMatchIndex !== -1) { x = lastMatchIndex + 1; lastMatchIndex = -1; } continue; }
if (matches === buffer.length) { index = x; break; } }
if (index === -1) return index;
return searchableBufferLastIndex - index;}
function indexOfBuffer( targetBuffer: Uint8Array, buffer: Uint8Array, byteOffset: number, encoding: Encodings, forwardDirection: boolean,) { if (!Encodings[encoding] === undefined) { throw new Error(`Unknown encoding code ${encoding}`); }
if (!forwardDirection) {
if (byteOffset < 0) { byteOffset = targetBuffer.length + byteOffset; }
if (buffer.length === 0) { return byteOffset <= targetBuffer.length ? byteOffset : targetBuffer.length; }
return findLastIndex(targetBuffer, buffer, byteOffset); }
if (buffer.length === 0) { return byteOffset <= targetBuffer.length ? byteOffset : targetBuffer.length; }
return indexOfNeedle(targetBuffer, buffer, byteOffset);}
function indexOfNumber( targetBuffer: Uint8Array, number: number, byteOffset: number, forwardDirection: boolean,) { const bytes = numberToBytes(number);
if (bytes.length > 1) { throw new Error("Multi byte number search is not supported"); }
return indexOfBuffer( targetBuffer, numberToBytes(number), byteOffset, Encodings.UTF8, forwardDirection, );}
export default { indexOfBuffer, indexOfNumber };export { indexOfBuffer, indexOfNumber };