22 , encoder(std::move(encoding))
24 offset = filestream.tellg();
35 stream.read(reinterpret_cast<char*>(ptr), size*nmemb);
36 auto bytes_read =
stream.gcount();
38 size_t result = bytes_read / size;
40 if (result != nmemb && !
Eof()) {
41 perror(
"Reading error: ");
49 Read0(ptr, size, nmemb);
51 if (
Read0(ptr, size, nmemb) != nmemb) {
52 fprintf(stderr,
"Read error at %" PRIu32
". The file is probably corrupted\n",
Tell());
58 void LcfReader::Read<bool>(
bool& ref) {
63 void LcfReader::Read<int8_t>(int8_t& ref) {
68 void LcfReader::Read<uint8_t>(uint8_t& ref) {
73 void LcfReader::Read<int16_t>(int16_t& ref) {
79 void LcfReader::Read<uint32_t>(uint32_t& ref) {
86 unsigned char temp = 0;
90 if (
Read0(&temp, 1, 1) == 0) {
97 fprintf(stderr,
"Invalid compressed integer at %" PRIu32
"\n",
Tell());
100 }
while (temp & 0x80);
102 return loops > 5 ? 0 : value;
106 void LcfReader::Read<int32_t>(int32_t& ref) {
111 void LcfReader::Read<double>(
double& ref) {
117 void LcfReader::Read<bool>(std::vector<bool> &buffer,
size_t size) {
120 for (
unsigned i = 0; i < size; ++i) {
123 buffer.push_back(val > 0);
128 void LcfReader::Read<uint8_t>(std::vector<uint8_t> &buffer,
size_t size) {
131 for (
unsigned int i = 0; i < size; ++i) {
139 void LcfReader::Read<int16_t>(std::vector<int16_t> &buffer,
size_t size) {
141 size_t items = size / 2;
142 for (
unsigned int i = 0; i <
items; ++i) {
155 void LcfReader::Read<int32_t>(std::vector<int32_t> &buffer,
size_t size) {
157 size_t items = size / 4;
158 for (
unsigned int i = 0; i <
items; ++i) {
171 void LcfReader::Read<uint32_t>(std::vector<uint32_t> &buffer,
size_t size) {
173 size_t items = size / 4;
174 for (
unsigned int i = 0; i <
items; ++i) {
188 Read((size > 0 ? &ref.front():
nullptr), 1, size);
201 constexpr
auto fast_seek_size = 32;
204 stream.seekg(pos, std::ios_base::beg);
208 if (pos <= fast_seek_size) {
211 char buf[fast_seek_size];
215 stream.seekg(pos, std::ios_base::cur);
220 stream.seekg(pos, std::ios_base::end);
224 assert(
false &&
"Invalid SeekMode");
244 void LcfReader::SkipDebug(
const struct LcfReader::Chunk& chunk_info,
const char* srcfile) {
247 const char* srcfilename = strrchr(srcfile,
'\\');
249 const char* srcfilename = strrchr(srcfile,
'/');
251 if (srcfilename == NULL) {
252 srcfilename = srcfile;
256 fprintf(stderr,
"Skipped Chunk %02X (%" PRIu32
" byte) in lcf at %" PRIX32
" (%s)\n",
259 for (uint32_t i = 0; i < chunk_info.
length; ++i) {
262 fprintf(stderr,
"%02X ",
byte);
263 if ((i+1) % 16 == 0) {
264 fprintf(stderr,
"\n");
270 fprintf(stderr,
"\n");
283 vsprintf(str, fmt, args);
308 #ifdef WORDS_BIGENDIAN 318 ((ui<<8) & 0x00FF0000) |
319 ((ui>>8) & 0x0000FF00) |
325 uint32_t *p = reinterpret_cast<uint32_t *>(&d);
void Seek(size_t pos, SeekMode mode=FromStart)
void Skip(const struct LcfReader::Chunk &chunk_info)
static void SwapByteOrder(int16_t &us)
std::vector< int32_t > buffer
void Read(void *ptr, size_t size, size_t nmemb)
void Encode(std::string &str)
size_t Read0(void *ptr, size_t size, size_t nmemb)
LcfReader(std::istream &filestream, std::string encoding="")
static const std::string & GetError()
void ReadString(std::string &ref, size_t size)
std::vector< RPG::Item > & items
static int IntSize(unsigned int x)
static void SetError(const char *fmt,...)
static std::string error_str
void Encode(std::string &str)