- added a FileReader wrapper for kopen4load.

Needed when transitioning the hightile loader to GZDoom's texture loader.
This commit is contained in:
Christoph Oelckers 2019-10-05 17:30:23 +02:00
parent 3fb5154dc9
commit bedfc262c4
3 changed files with 57 additions and 6 deletions

View File

@ -10,6 +10,7 @@
#define cache1d_h_ #define cache1d_h_
#include "compat.h" #include "compat.h"
#include "files.h"
#include "vfs.h" #include "vfs.h"
@ -151,5 +152,55 @@ extern int32_t lz4CompressionLevel;
int32_t kdfread_LZ4(void *buffer, int dasizeof, int count, buildvfs_kfd fil); int32_t kdfread_LZ4(void *buffer, int dasizeof, int count, buildvfs_kfd fil);
void dfwrite_LZ4(const void *buffer, int dasizeof, int count, buildvfs_FILE fil); void dfwrite_LZ4(const void *buffer, int dasizeof, int count, buildvfs_FILE fil);
class KFileReaderInterface : public FileReaderInterface
{
buildvfs_kfd khandle = buildvfs_kfd_invalid;
public:
KFileReaderInterface(int handle)
{
khandle = handle;
Length = 0;
if (khandle != buildvfs_kfd_invalid)
{
klseek(khandle, 0, SEEK_END);
Length = ktell(khandle);
klseek(khandle, 0, SEEK_SET);
}
}
~KFileReaderInterface()
{
if (khandle != buildvfs_kfd_invalid)
{
kclose(khandle);
}
}
virtual long Tell() const
{
return ktell(khandle);
}
virtual long Seek(long offset, int origin)
{
return klseek(khandle, offset, origin);
}
virtual long Read(void* buffer, long len)
{
return kread(khandle, buffer, (int32_t)len);
}
virtual char* Gets(char* strbuf, int len)
{
// Not supported by the underlying system, so we do not need it anyway.
return nullptr;
}
};
inline FileReader kopenFileReader(const char* name, int where)
{
int handle = where == 0 ? kopen4loadfrommod(name, 0) : kopen4load(name, where);
KFileReaderInterface *fri = handle == buildvfs_kfd_invalid? nullptr : new KFileReaderInterface(handle);
return FileReader(fri);
}
#endif // cache1d_h_ #endif // cache1d_h_

View File

@ -301,16 +301,15 @@ void scriptfile_preparse(scriptfile *sf, char *tx, int32_t flen)
scriptfile *scriptfile_fromfile(const char *fn) scriptfile *scriptfile_fromfile(const char *fn)
{ {
buildvfs_kfd fp = kopen4load(fn, 0); auto fr = kopenFileReader(fn, 0);
if (fp == buildvfs_kfd_invalid) return nullptr; if (!fr.isOpen()) return nullptr;
uint32_t flen = kfilelength(fp); uint32_t flen = fr.GetLength();
char * tx = (char *)Xmalloc(flen + 2); char * tx = (char *)Xmalloc(flen + 2);
scriptfile *sf = (scriptfile *)Xmalloc(sizeof(scriptfile)); scriptfile *sf = (scriptfile *)Xmalloc(sizeof(scriptfile));
kread(fp, tx, flen); fr.Read(tx, flen);
kclose(fp);
tx[flen] = tx[flen+1] = 0; tx[flen] = tx[flen+1] = 0;

View File

@ -123,12 +123,13 @@ class FileReader
FileReader(const FileReader &r) = delete; FileReader(const FileReader &r) = delete;
FileReader &operator=(const FileReader &r) = delete; FileReader &operator=(const FileReader &r) = delete;
public:
explicit FileReader(FileReaderInterface *r) explicit FileReader(FileReaderInterface *r)
{ {
mReader = r; mReader = r;
} }
public:
enum ESeek enum ESeek
{ {
SeekSet = SEEK_SET, SeekSet = SEEK_SET,