module.exports = class IOStream {
constructor(buf, start_pos = 0, size = 0) {
if (size != 0) {
this.buf = Buffer.allocUnsafe(size)
this.length = size
} else {
this.buf = buf
this.length = buf.length
}
this.pos = start_pos
}
EOF() {
return this.pos >= this.length
}
ReadData(len) {
var A = this.buf.slice(this.pos, this.pos+len)
this.pos += len;
return A
}
ReadByte() {
const b = this.buf[this.pos]
this.pos++
return b
}
ReadChar() {
const b = this.buf[this.pos]
this.pos++
return String.fromCharCode(b)
}
ReadUint16() {
var i = this.ReadByte()
i |= this.ReadByte()<<8
return i
}
ReadUint32() {
const i = this.buf.readInt32LE(this.pos)
this.pos += 4
return i
}
ReadString() {
var s = ""
do {
var b = this.buf[this.pos++]
if (b)
s += String.fromCharCode(b)
} while (b)
return s
}
ReadUint7() {
var i = 0;
do {
var c = this.ReadByte();
i = (i<<7) | (c & 0x7f)
} while ((c & 0x80))
return i;
}
ReadITF8() {
var i = this.buf[this.pos];
this.pos++;
if (i >= 0xf0) {
i = (i & 0x0f) << 28;
i += (this.buf[this.pos+0] << 20)
+ (this.buf[this.pos+1] << 12)
+ (this.buf[this.pos+2] << 4)
+ (this.buf[this.pos+3] >> 4);
this.pos += 4;
} else if (i >= 0xe0) {
i = (i & 0x0f) << 24;
i += (this.buf[this.pos+0] << 16)
+ (this.buf[this.pos+1] << 8)
+ (this.buf[this.pos+2] << 0);
this.pos += 3;
} else if (i >= 0xc0) {
i = (i & 0x1f) << 16;
i += (this.buf[this.pos+0] << 8)
+ (this.buf[this.pos+1] << 0);
this.pos += 2;
} else if (i >= 0x80) {
i = (i & 0x3f) << 8;
i += this.buf[this.pos];
this.pos++;;
} else {
}
return i;
}
WriteByte(b) {
this.buf[this.pos++] = b
}
WriteChar(b) {
this.buf[this.pos++] = b.charCodeAt(0)
}
WriteString(str) {
for (var i = 0; i < str.length; i++)
this.buf[this.pos++] = str.charCodeAt(i)
this.buf[this.pos++] = 0
}
WriteData(buf, len) {
for (var i = 0; i < len; i++)
this.buf[this.pos++] = buf[i]
}
WriteStream(stream) {
this.WriteData(stream.buf, stream.pos)
}
WriteUint16(u) {
this.WriteByte(u&0xff)
this.WriteByte((u>>8)&0xff)
}
WriteUint32(u) {
this.buf.writeInt32LE(u, this.pos);
this.pos += 4;
}
WriteUint7(i) {
var s = 0;
var X = i;
do {
s += 7;
X >>= 7;
} while (X > 0);
do {
s -= 7;
this.WriteByte(((i >> s) & 0x7f) + ((s > 0) << 7))
} while (s > 0);
}
WriteITF8(i) {
if (i < 0)
i = (1<<32) + i
if (i <= 0x0000007f) {
this.buf[this.pos++] = i
} else if (i <= 0x00003fff) {
this.buf[this.pos++] = 0x80 | Math.floor(i / 256)
this.buf[this.pos++] = i & 0xff;
} else if (i < 0x0001ffff) {
this.buf[this.pos++] = 0xc0 | Math.floor(i / 65536)
this.buf[this.pos++] = Math.floor(i / 256) & 0xff
this.buf[this.pos++] = i & 0xff;
} else if (i < 0x0fffffff) {
this.buf[this.pos++] = 0xe0 | Math.floor(i / 16777216)
this.buf[this.pos++] = Math.floor(i / 65536) & 0xff
this.buf[this.pos++] = Math.floor(i / 256) & 0xff
this.buf[this.pos++] = i & 0xff;
} else {
this.buf[this.pos++] = 0xf0 | Math.floor(i / 268435456)
this.buf[this.pos++] = Math.floor(i / 1048576) & 0xff
this.buf[this.pos++] = Math.floor(i / 4096) & 0xff
this.buf[this.pos++] = Math.floor(i / 4) & 0xff
this.buf[this.pos++] = i & 0x0f;
}
}
WriteByteNeg(b) {
this.buf[--this.pos] = b;
}
};