116 lines
2.4 KiB
C++
116 lines
2.4 KiB
C++
|
|
#include <packer.hpp>
|
||
|
|
#include <cassert>
|
||
|
|
|
||
|
|
void Packer::write_int8(int8_t v) {
|
||
|
|
oss_->write((const char *)&v, sizeof(v));
|
||
|
|
}
|
||
|
|
|
||
|
|
void Packer::write_int16(int16_t v) {
|
||
|
|
oss_->write((const char *)&v, sizeof(v));
|
||
|
|
}
|
||
|
|
|
||
|
|
void Packer::write_int32(int32_t v) {
|
||
|
|
oss_->write((const char *)&v, sizeof(v));
|
||
|
|
}
|
||
|
|
|
||
|
|
void Packer::write_int64(int64_t v) {
|
||
|
|
oss_->write((const char *)&v, sizeof(v));
|
||
|
|
}
|
||
|
|
|
||
|
|
void Packer::overwrite_int8(size_t tell_after, int8_t v) {
|
||
|
|
oss_->seekp(tell_after - 1);
|
||
|
|
write_int8(v);
|
||
|
|
oss_->seekp(0, std::ios_base::end);
|
||
|
|
}
|
||
|
|
|
||
|
|
void Packer::overwrite_int16(size_t tell_after, int16_t v) {
|
||
|
|
oss_->seekp(tell_after - 2);
|
||
|
|
write_int16(v);
|
||
|
|
oss_->seekp(0, std::ios_base::end);
|
||
|
|
}
|
||
|
|
|
||
|
|
void Packer::overwrite_int32(size_t tell_after, int32_t v) {
|
||
|
|
oss_->seekp(tell_after - 4);
|
||
|
|
write_int32(v);
|
||
|
|
oss_->seekp(0, std::ios_base::end);
|
||
|
|
}
|
||
|
|
|
||
|
|
void Packer::overwrite_int64(size_t tell_after, int64_t v) {
|
||
|
|
oss_->seekp(tell_after - 8);
|
||
|
|
write_int64(v);
|
||
|
|
oss_->seekp(0, std::ios_base::end);
|
||
|
|
}
|
||
|
|
|
||
|
|
int Packer::lua_writer(lua_State *L, const void *p, size_t sz, void *ud) {
|
||
|
|
Packer *pkr = (Packer *)ud;
|
||
|
|
pkr->oss_->write((const char *)p, sz);
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
Unpacker::Unpacker(const char *d, size_t s) {
|
||
|
|
assert(d != nullptr);
|
||
|
|
assert(s >= 0);
|
||
|
|
data_ = d;
|
||
|
|
size_ = s;
|
||
|
|
}
|
||
|
|
|
||
|
|
int8_t Unpacker::read_int8() {
|
||
|
|
assert(size_ >= 1);
|
||
|
|
int8_t result;
|
||
|
|
memcpy(&result, data_, 1);
|
||
|
|
data_ += 1;
|
||
|
|
size_ -= 1;
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
int16_t Unpacker::read_int16() {
|
||
|
|
assert(size_ >= 2);
|
||
|
|
int16_t result;
|
||
|
|
memcpy(&result, data_, 2);
|
||
|
|
data_ += 2;
|
||
|
|
size_ -= 2;
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
int32_t Unpacker::read_int32() {
|
||
|
|
assert(size_ >= 4);
|
||
|
|
int32_t result;
|
||
|
|
memcpy(&result, data_, 4);
|
||
|
|
data_ += 4;
|
||
|
|
size_ -= 4;
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
int64_t Unpacker::read_int64() {
|
||
|
|
assert(size_ >= 8);
|
||
|
|
int64_t result;
|
||
|
|
memcpy(&result, data_, 8);
|
||
|
|
data_ += 8;
|
||
|
|
size_ -= 8;
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
void Unpacker::skip(size_t n) {
|
||
|
|
assert(size_ >= n);
|
||
|
|
data_ += n;
|
||
|
|
size_ -= n;
|
||
|
|
}
|
||
|
|
|
||
|
|
Unpacker Unpacker::read_section(size_t n) {
|
||
|
|
assert(size_ >= n);
|
||
|
|
const char *d = data_;
|
||
|
|
data_ += n;
|
||
|
|
size_ -= n;
|
||
|
|
return Unpacker(d, n);
|
||
|
|
}
|
||
|
|
|
||
|
|
const char *Unpacker::lua_reader(lua_State *L, void *ud, size_t *size) {
|
||
|
|
Unpacker *unpk = (Unpacker *)ud;
|
||
|
|
const char *retval = unpk->data_;
|
||
|
|
*size = unpk->size_;
|
||
|
|
if (unpk->size_ == 0) retval = nullptr;
|
||
|
|
unpk->data_ += unpk->size_;
|
||
|
|
unpk->size_ = 0;
|
||
|
|
return retval;
|
||
|
|
}
|