You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.0 KiB
83 lines
2.0 KiB
// StringBuf - a way to keep string memory operations to a minimum
|
|
// while building the strings for the xml files
|
|
class StringBuf {
|
|
constructor(options) {
|
|
this._buf = Buffer.alloc((options && options.size) || 16384);
|
|
this._encoding = (options && options.encoding) || 'utf8';
|
|
|
|
// where in the buffer we are at
|
|
this._inPos = 0;
|
|
|
|
// for use by toBuffer()
|
|
this._buffer = undefined;
|
|
}
|
|
|
|
get length() {
|
|
return this._inPos;
|
|
}
|
|
|
|
get capacity() {
|
|
return this._buf.length;
|
|
}
|
|
|
|
get buffer() {
|
|
return this._buf;
|
|
}
|
|
|
|
toBuffer() {
|
|
// return the current data as a single enclosing buffer
|
|
if (!this._buffer) {
|
|
this._buffer = Buffer.alloc(this.length);
|
|
this._buf.copy(this._buffer, 0, 0, this.length);
|
|
}
|
|
return this._buffer;
|
|
}
|
|
|
|
reset(position) {
|
|
position = position || 0;
|
|
this._buffer = undefined;
|
|
this._inPos = position;
|
|
}
|
|
|
|
_grow(min) {
|
|
let size = this._buf.length * 2;
|
|
while (size < min) {
|
|
size *= 2;
|
|
}
|
|
const buf = Buffer.alloc(size);
|
|
this._buf.copy(buf, 0);
|
|
this._buf = buf;
|
|
}
|
|
|
|
addText(text) {
|
|
this._buffer = undefined;
|
|
|
|
let inPos = this._inPos + this._buf.write(text, this._inPos, this._encoding);
|
|
|
|
// if we've hit (or nearing capacity), grow the buf
|
|
while (inPos >= this._buf.length - 4) {
|
|
this._grow(this._inPos + text.length);
|
|
|
|
// keep trying to write until we've completely written the text
|
|
inPos = this._inPos + this._buf.write(text, this._inPos, this._encoding);
|
|
}
|
|
|
|
this._inPos = inPos;
|
|
}
|
|
|
|
addStringBuf(inBuf) {
|
|
if (inBuf.length) {
|
|
this._buffer = undefined;
|
|
|
|
if (this.length + inBuf.length > this.capacity) {
|
|
this._grow(this.length + inBuf.length);
|
|
}
|
|
// eslint-disable-next-line no-underscore-dangle
|
|
inBuf._buf.copy(this._buf, this._inPos, 0, inBuf.length);
|
|
this._inPos += inBuf.length;
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = StringBuf;
|