import { _intTo16 } from "../../custom/util"; import { bytes } from "../../util/bytes"; import { bs } from "../../../modules/as-bs"; import { BACK_SLASH, QUOTE } from "../../custom/chars"; import { SERIALIZE_ESCAPE_TABLE } from "../../globals/tables"; /** * Serializes valid strings into their JSON counterpart * @param src string * @returns void */ export function serializeString(src: string): void { const srcSize = bytes(src); bs.ensureSize(srcSize + 4); let srcPtr = changetype(src); const srcEnd = srcPtr + srcSize; store(bs.offset, QUOTE); bs.offset += 2; let lastPtr: usize = srcPtr; while (srcPtr < srcEnd) { const code = load(srcPtr); if (code == 34 || code == 92 || code < 32) { const remBytes = srcPtr - lastPtr; memory.copy(bs.offset, lastPtr, remBytes); bs.offset += remBytes; const escaped = load(SERIALIZE_ESCAPE_TABLE + (code << 2)); if ((escaped & 0xffff) != BACK_SLASH) { bs.ensureSize(10); store(bs.offset, 13511005048209500, 0); store(bs.offset, escaped, 8); bs.offset += 12; } else { bs.ensureSize(2); store(bs.offset, escaped, 0); bs.offset += 4; } lastPtr = srcPtr + 2; } srcPtr += 2; } const remBytes = srcEnd - lastPtr; memory.copy(bs.offset, lastPtr, remBytes); bs.offset += remBytes; store(bs.offset, QUOTE); bs.offset += 2; }