86 lines
1.9 KiB
JavaScript
86 lines
1.9 KiB
JavaScript
const {Number:NumberT} = require('./Number');
|
|
const utils = require('./utils');
|
|
|
|
class StringT {
|
|
constructor(length, encoding = 'ascii') {
|
|
this.length = length;
|
|
this.encoding = encoding;
|
|
}
|
|
|
|
decode(stream, parent) {
|
|
let length, pos;
|
|
|
|
if (this.length != null) {
|
|
length = utils.resolveLength(this.length, stream, parent);
|
|
} else {
|
|
let buffer;
|
|
({buffer, length, pos} = stream);
|
|
|
|
while ((pos < length) && (buffer[pos] !== 0x00)) {
|
|
++pos;
|
|
}
|
|
|
|
length = pos - stream.pos;
|
|
}
|
|
|
|
let { encoding } = this;
|
|
if (typeof encoding === 'function') {
|
|
encoding = encoding.call(parent, parent) || 'ascii';
|
|
}
|
|
|
|
const string = stream.readString(length, encoding);
|
|
|
|
if ((this.length == null) && (stream.pos < stream.length)) {
|
|
stream.pos++;
|
|
}
|
|
|
|
return string;
|
|
}
|
|
|
|
size(val, parent) {
|
|
// Use the defined value if no value was given
|
|
if (!val) {
|
|
return utils.resolveLength(this.length, null, parent);
|
|
}
|
|
|
|
let { encoding } = this;
|
|
if (typeof encoding === 'function') {
|
|
encoding = encoding.call(parent != null ? parent.val : undefined, parent != null ? parent.val : undefined) || 'ascii';
|
|
}
|
|
|
|
if (encoding === 'utf16be') {
|
|
encoding = 'utf16le';
|
|
}
|
|
|
|
let size = Buffer.byteLength(val, encoding);
|
|
if (this.length instanceof NumberT) {
|
|
size += this.length.size();
|
|
}
|
|
|
|
if ((this.length == null)) {
|
|
size++;
|
|
}
|
|
|
|
return size;
|
|
}
|
|
|
|
encode(stream, val, parent) {
|
|
let { encoding } = this;
|
|
if (typeof encoding === 'function') {
|
|
encoding = encoding.call(parent != null ? parent.val : undefined, parent != null ? parent.val : undefined) || 'ascii';
|
|
}
|
|
|
|
if (this.length instanceof NumberT) {
|
|
this.length.encode(stream, Buffer.byteLength(val, encoding));
|
|
}
|
|
|
|
stream.writeString(val, encoding);
|
|
|
|
if ((this.length == null)) {
|
|
return stream.writeUInt8(0x00);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = StringT;
|