UNPKG

libxslt-wasm

Version:

JavaScript bindings for libxslt compiled to WebAssembly

43 lines (42 loc) 1.62 kB
import { DataSegment } from "./DataSegment.js"; import { POINTER_SIZE } from "../constants.js"; import { setValue, stringToNewUTF8 } from "../internal/emscripten.js"; import { free, calloc } from "../internal/main.js"; /** * An array of pointers to UTF-8 encoded strings or `.dataOffset` == `char**`. * May be null terminated */ class StringPtrArray extends DataSegment { stringPtrArray = []; isNullTerminated = false; static fromStringArray(stringArray, isNullTerminated = false) { if (stringArray.length === 0) { throw new Error("StringPtrArray.fromStringArray array must have a length"); } const stringPtrArray = stringArray.map((str) => stringToNewUTF8(str)); const stringPtrArrayPtr = calloc(stringPtrArray.length + (isNullTerminated ? 1 : 0), POINTER_SIZE); stringPtrArray.forEach((stringPtr, index) => { setValue(stringPtrArrayPtr + index * POINTER_SIZE, stringPtr, "*"); }); return Object.assign(new StringPtrArray(stringPtrArrayPtr), { stringPtrArray: stringPtrArray, isNullTerminated: isNullTerminated, }); } // Aligns with `TypedArray` API get byteLength() { return (this.stringPtrArray.length * POINTER_SIZE + (this.isNullTerminated ? POINTER_SIZE : 0)); } delete() { this.stringPtrArray.forEach((stringPtr) => { free(stringPtr); }); if (this.dataOffset !== null) { free(this.dataOffset); } this.stringPtrArray = []; super.delete(); } } export { StringPtrArray };