parent
a0661ca3c8
commit
48510bc3ad
40
src/dfile.cc
40
src/dfile.cc
|
@ -9,6 +9,36 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
// The size of decompression buffer for reading compressed [DFile]s.
|
||||||
|
#define DFILE_DECOMPRESSION_BUFFER_SIZE (0x400)
|
||||||
|
|
||||||
|
// Specifies that [DFile] has unget character.
|
||||||
|
//
|
||||||
|
// NOTE: There is an unused function at 0x4E5894 which ungets one character and
|
||||||
|
// stores it in [ungotten]. Since that function is not used, this flag will
|
||||||
|
// never be set.
|
||||||
|
#define DFILE_HAS_UNGETC (0x01)
|
||||||
|
|
||||||
|
// Specifies that [DFile] has reached end of stream.
|
||||||
|
#define DFILE_EOF (0x02)
|
||||||
|
|
||||||
|
// Specifies that [DFile] is in error state.
|
||||||
|
//
|
||||||
|
// [dfileRewind] can be used to clear this flag.
|
||||||
|
#define DFILE_ERROR (0x04)
|
||||||
|
|
||||||
|
// Specifies that [DFile] was opened in text mode.
|
||||||
|
#define DFILE_TEXT (0x08)
|
||||||
|
|
||||||
|
// Specifies that [DFile] has unget compressed character.
|
||||||
|
#define DFILE_HAS_COMPRESSED_UNGETC (0x10)
|
||||||
|
|
||||||
|
static int dbaseFindEntryByFilePath(const void* a1, const void* a2);
|
||||||
|
static DFile* dfileOpenInternal(DBase* dbase, const char* filename, const char* mode, DFile* a4);
|
||||||
|
static int dfileReadCharInternal(DFile* stream);
|
||||||
|
static bool dfileReadCompressed(DFile* stream, void* ptr, size_t size);
|
||||||
|
static void dfileUngetCompressed(DFile* stream, int ch);
|
||||||
|
|
||||||
// Reads .DAT file contents.
|
// Reads .DAT file contents.
|
||||||
//
|
//
|
||||||
// 0x4E4F58
|
// 0x4E4F58
|
||||||
|
@ -587,7 +617,7 @@ int dfileEof(DFile* stream)
|
||||||
// specified [filePath].
|
// specified [filePath].
|
||||||
//
|
//
|
||||||
// 0x4E5D70
|
// 0x4E5D70
|
||||||
int dbaseFindEntryByFilePath(const void* a1, const void* a2)
|
static int dbaseFindEntryByFilePath(const void* a1, const void* a2)
|
||||||
{
|
{
|
||||||
const char* filePath = (const char*)a1;
|
const char* filePath = (const char*)a1;
|
||||||
DBaseEntry* entry = (DBaseEntry*)a2;
|
DBaseEntry* entry = (DBaseEntry*)a2;
|
||||||
|
@ -596,7 +626,7 @@ int dbaseFindEntryByFilePath(const void* a1, const void* a2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0x4E5D9C
|
// 0x4E5D9C
|
||||||
DFile* dfileOpenInternal(DBase* dbase, const char* filePath, const char* mode, DFile* dfile)
|
static DFile* dfileOpenInternal(DBase* dbase, const char* filePath, const char* mode, DFile* dfile)
|
||||||
{
|
{
|
||||||
DBaseEntry* entry = (DBaseEntry*)bsearch(filePath, dbase->entries, dbase->entriesLength, sizeof(*dbase->entries), dbaseFindEntryByFilePath);
|
DBaseEntry* entry = (DBaseEntry*)bsearch(filePath, dbase->entries, dbase->entriesLength, sizeof(*dbase->entries), dbaseFindEntryByFilePath);
|
||||||
if (entry == NULL) {
|
if (entry == NULL) {
|
||||||
|
@ -702,7 +732,7 @@ err:
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0x4E5F9C
|
// 0x4E5F9C
|
||||||
int dfileReadCharInternal(DFile* stream)
|
static int dfileReadCharInternal(DFile* stream)
|
||||||
{
|
{
|
||||||
if (stream->entry->compressed == 1) {
|
if (stream->entry->compressed == 1) {
|
||||||
char ch;
|
char ch;
|
||||||
|
@ -758,7 +788,7 @@ int dfileReadCharInternal(DFile* stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0x4E6078
|
// 0x4E6078
|
||||||
bool dfileReadCompressed(DFile* stream, void* ptr, size_t size)
|
static bool dfileReadCompressed(DFile* stream, void* ptr, size_t size)
|
||||||
{
|
{
|
||||||
if ((stream->flags & DFILE_HAS_COMPRESSED_UNGETC) != 0) {
|
if ((stream->flags & DFILE_HAS_COMPRESSED_UNGETC) != 0) {
|
||||||
unsigned char* byteBuffer = (unsigned char*)ptr;
|
unsigned char* byteBuffer = (unsigned char*)ptr;
|
||||||
|
@ -816,7 +846,7 @@ bool dfileReadCompressed(DFile* stream, void* ptr, size_t size)
|
||||||
// NOTE: Inlined.
|
// NOTE: Inlined.
|
||||||
//
|
//
|
||||||
// 0x4E613C
|
// 0x4E613C
|
||||||
void dfileUngetCompressed(DFile* stream, int ch)
|
static void dfileUngetCompressed(DFile* stream, int ch)
|
||||||
{
|
{
|
||||||
stream->compressedUngotten = ch;
|
stream->compressedUngotten = ch;
|
||||||
stream->flags |= DFILE_HAS_COMPRESSED_UNGETC;
|
stream->flags |= DFILE_HAS_COMPRESSED_UNGETC;
|
||||||
|
|
29
src/dfile.h
29
src/dfile.h
|
@ -6,30 +6,6 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
|
||||||
// The size of decompression buffer for reading compressed [DFile]s.
|
|
||||||
#define DFILE_DECOMPRESSION_BUFFER_SIZE (0x400)
|
|
||||||
|
|
||||||
// Specifies that [DFile] has unget character.
|
|
||||||
//
|
|
||||||
// NOTE: There is an unused function at 0x4E5894 which ungets one character and
|
|
||||||
// stores it in [ungotten]. Since that function is not used, this flag will
|
|
||||||
// never be set.
|
|
||||||
#define DFILE_HAS_UNGETC (0x01)
|
|
||||||
|
|
||||||
// Specifies that [DFile] has reached end of stream.
|
|
||||||
#define DFILE_EOF (0x02)
|
|
||||||
|
|
||||||
// Specifies that [DFile] is in error state.
|
|
||||||
//
|
|
||||||
// [dfileRewind] can be used to clear this flag.
|
|
||||||
#define DFILE_ERROR (0x04)
|
|
||||||
|
|
||||||
// Specifies that [DFile] was opened in text mode.
|
|
||||||
#define DFILE_TEXT (0x08)
|
|
||||||
|
|
||||||
// Specifies that [DFile] has unget compressed character.
|
|
||||||
#define DFILE_HAS_COMPRESSED_UNGETC (0x10)
|
|
||||||
|
|
||||||
typedef struct DBase DBase;
|
typedef struct DBase DBase;
|
||||||
typedef struct DBaseEntry DBaseEntry;
|
typedef struct DBaseEntry DBaseEntry;
|
||||||
typedef struct DFile DFile;
|
typedef struct DFile DFile;
|
||||||
|
@ -150,10 +126,5 @@ int dfileSeek(DFile* stream, long offset, int origin);
|
||||||
long dfileTell(DFile* stream);
|
long dfileTell(DFile* stream);
|
||||||
void dfileRewind(DFile* stream);
|
void dfileRewind(DFile* stream);
|
||||||
int dfileEof(DFile* stream);
|
int dfileEof(DFile* stream);
|
||||||
int dbaseFindEntryByFilePath(const void* a1, const void* a2);
|
|
||||||
DFile* dfileOpenInternal(DBase* dbase, const char* filename, const char* mode, DFile* a4);
|
|
||||||
int dfileReadCharInternal(DFile* stream);
|
|
||||||
bool dfileReadCompressed(DFile* stream, void* ptr, size_t size);
|
|
||||||
void dfileUngetCompressed(DFile* stream, int ch);
|
|
||||||
|
|
||||||
#endif /* DFILE_H */
|
#endif /* DFILE_H */
|
||||||
|
|
Loading…
Reference in New Issue