libxslt-wasm
Version:
JavaScript bindings for libxslt compiled to WebAssembly
43 lines (42 loc) • 1.62 kB
JavaScript
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 };