Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 19x 19x 16x 241592x 241592x 241591x 241591x 241591x 241586x 241586x 241586x 335x 333x 333x 1x 333x 333x 333x 20708x | import { define } from "../define"; import { StringFactory } from "../types"; export const string: StringFactory = (encoding, headSd) => define( (ctx, data) => { const head = ctx.i; // approximated payload length (unfavorable for ucs2, good enough for utf8, perfect for latin1) headSd.ser(ctx, data.length); const begin = ctx.i; const headSize = begin - head; encoding.encode(ctx, data); const end = ctx.i; const size = end - begin; // stop if approximation is correct if (size === data.length) return; // write actual header after payload headSd.ser(ctx, size); const requiredHeadSize = ctx.i - end; // check if approximated header size is wrong if (headSize !== requiredHeadSize) { // if yes, shift the payload ctx.bytes.copyWithin(head + requiredHeadSize, begin, end); } ctx.i = head; headSd.ser(ctx, size); ctx.i = end + (requiredHeadSize - headSize); }, (ctx) => encoding.decode(ctx, headSd.des(ctx)) ); |