21 stream(fopen(filename,
"rb"))
28 stream(fopen(filename.c_str(),
"rb"))
43 size_t result = fread(ptr, size, nmemb,
stream);
45 if (result != nmemb && !
Eof()) {
46 perror(
"Reading error: ");
54 Read0(ptr, size, nmemb);
56 assert(
Read0(ptr, size, nmemb) == nmemb);
61 void LcfReader::Read<bool>(
bool& ref) {
66 void LcfReader::Read<uint8_t>(uint8_t& ref) {
71 void LcfReader::Read<int16_t>(int16_t& ref) {
77 void LcfReader::Read<uint32_t>(uint32_t& ref) {
84 unsigned char temp = 0;
88 if (
Read0(&temp, 1, 1) == 0) {
93 }
while (temp & 0x80);
98 void LcfReader::Read<int>(
int& ref) {
103 void LcfReader::Read<double>(
double& ref) {
109 void LcfReader::Read<bool>(std::vector<bool> &buffer,
size_t size) {
112 for (
unsigned i = 0; i < size; ++i) {
115 buffer.push_back(val > 0);
120 void LcfReader::Read<uint8_t>(std::vector<uint8_t> &buffer,
size_t size) {
123 for (
unsigned int i = 0; i < size; ++i) {
126 buffer.push_back(val);
131 void LcfReader::Read<int16_t>(std::vector<int16_t> &buffer,
size_t size) {
133 size_t items = size / 2;
134 for (
unsigned int i = 0; i <
items; ++i) {
138 buffer.push_back(val);
141 Seek(1, FromCurrent);
147 void LcfReader::Read<uint32_t>(std::vector<uint32_t> &buffer,
size_t size) {
149 size_t items = size / 4;
150 for (
unsigned int i = 0; i <
items; ++i) {
154 buffer.push_back(val);
157 Seek(size % 4, FromCurrent);
163 char* chars =
new char[size + 1];
165 Read(chars, 1, size);
166 ref =
Encode(std::string(chars));
181 fseek(
stream, pos, SEEK_SET);
184 fseek(
stream, pos, SEEK_CUR);
187 fseek(
stream, pos, SEEK_END);
190 assert(
false &&
"Invalid SeekMode");
195 return (uint32_t)ftell(
stream);
199 return (ungetc(ch,
stream) == ch);
203 void LcfReader::SkipDebug(
const struct LcfReader::Chunk& chunk_info,
const char* srcfile) {
206 const char* srcfilename = strrchr(srcfile,
'\\');
208 const char* srcfilename = strrchr(srcfile,
'/');
210 if (srcfilename == NULL) {
211 srcfilename = srcfile;
215 fprintf(stderr,
"Skipped Chunk %02X (%d byte) in %s at %X (%s)\n",
218 for (uint32_t i = 0; i < chunk_info.
length; ++i) {
221 fprintf(stderr,
"%02X ", byte);
222 if ((i+1) % 16 == 0) {
223 fprintf(stderr,
"\n");
226 fprintf(stderr,
"\n");
239 vsprintf(str, fmt, args);
264 #ifdef WORDS_BIGENDIAN
274 ((ui<<8) & 0x00FF0000) |
275 ((ui>>8) & 0x0000FF00) |
281 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::string Recode(const std::string &str_to_encode, const std::string &source_encoding)
void Read(void *ptr, size_t size, size_t nmemb)
LcfReader(const char *filename, std::string encoding="")
size_t Read0(void *ptr, size_t size, size_t nmemb)
std::string Encode(const std::string &str_to_encode)
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