mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2025-07-02 22:14:37 +00:00
Update Aquaria/BBGE/External sources to comply with the new ttvfs API
This commit is contained in:
parent
8026cdd905
commit
6203bc7ce4
17 changed files with 179 additions and 390 deletions
|
@ -1,125 +0,0 @@
|
|||
#ifdef BBGE_BUILD_VFS
|
||||
|
||||
#include "FileAPI.h"
|
||||
#include "ttvfs_zip/VFSZipArchiveLoader.h"
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
ttvfs::VFSHelper vfs;
|
||||
|
||||
|
||||
VFILE *vfopen(const char *fn, const char *mode)
|
||||
{
|
||||
if (strchr(mode, 'w'))
|
||||
{
|
||||
fprintf(stderr, "FileAPI.h: File writing via VFS not yet supported!");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
VFILE *vf = vfs.GetFile(fn);
|
||||
if (!vf || !vf->open(mode))
|
||||
return NULL;
|
||||
++(vf->ref); // keep the file alive until closed.
|
||||
return vf;
|
||||
}
|
||||
|
||||
size_t vfread(void *ptr, size_t size, size_t count, VFILE *vf)
|
||||
{
|
||||
return vf->read(ptr, size * count) / size;
|
||||
}
|
||||
|
||||
int vfclose(VFILE *vf)
|
||||
{
|
||||
bool closed = vf->close();
|
||||
vf->ref--;
|
||||
return closed ? 0 : EOF;
|
||||
}
|
||||
|
||||
size_t vfwrite(const void *ptr, size_t size, size_t count, VFILE *vf)
|
||||
{
|
||||
return vf->write(ptr, size * count) / size;
|
||||
}
|
||||
|
||||
// return 0 on success, -1 on error
|
||||
int vfseek(VFILE *vf, long int offset, int origin)
|
||||
{
|
||||
bool ok = false;
|
||||
switch(origin)
|
||||
{
|
||||
case SEEK_SET: ok = vf->seek(offset); break;
|
||||
case SEEK_CUR: ok = vf->seekRel(offset); break;
|
||||
case SEEK_END: ok = vf->seek((long int)(vf->size() - offset)); break;
|
||||
}
|
||||
return ok ? 0 : -1;
|
||||
}
|
||||
|
||||
char *vfgets(char *str, int num, VFILE *vf)
|
||||
{
|
||||
char *s = str;
|
||||
if (vf->iseof())
|
||||
return NULL;
|
||||
char *ptr = (char*)vf->getBuf() + vf->getpos();
|
||||
unsigned int remain = int(vf->size() - vf->getpos());
|
||||
if (remain < (unsigned int)num)
|
||||
num = remain;
|
||||
else
|
||||
--num; // be sure to keep space for the final null char
|
||||
int i = 0;
|
||||
char c;
|
||||
for( ; i < num && *ptr; ++i)
|
||||
{
|
||||
c = (*s++ = *ptr++);
|
||||
if(c == '\n' || c == '\r')
|
||||
{
|
||||
++i;
|
||||
c = *ptr++; // because windows linebreaks suck.
|
||||
if(c == '\n' || c == '\r')
|
||||
++i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
vf->seekRel(i);
|
||||
*s++ = 0;
|
||||
return str;
|
||||
}
|
||||
|
||||
void vfclear(VFILE *vf)
|
||||
{
|
||||
vf->dropBuf(true);
|
||||
}
|
||||
|
||||
long int vftell(VFILE *vf)
|
||||
{
|
||||
return (long int)vf->getpos();
|
||||
}
|
||||
|
||||
|
||||
InStream::InStream(const std::string& fn)
|
||||
: std::istringstream()
|
||||
{
|
||||
open(fn.c_str());
|
||||
}
|
||||
|
||||
InStream::InStream(const char *fn)
|
||||
: std::istringstream()
|
||||
{
|
||||
open(fn);
|
||||
}
|
||||
|
||||
bool InStream::open(const char *fn)
|
||||
{
|
||||
ttvfs::VFSFile *vf = vfs.GetFile(fn);
|
||||
if(vf)
|
||||
{
|
||||
vf->open("r");
|
||||
str((char*)vf->getBuf()); // stringstream will always make a copy
|
||||
vf->close();
|
||||
vf->dropBuf(true);
|
||||
return true;
|
||||
}
|
||||
setstate(std::ios::failbit);
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -1,55 +0,0 @@
|
|||
#ifndef FILE_API_H
|
||||
#define FILE_API_H
|
||||
|
||||
// TODO: need VFS output functions?
|
||||
|
||||
#ifdef BBGE_BUILD_VFS
|
||||
|
||||
#include "ttvfs/VFS.h"
|
||||
#include <sstream>
|
||||
|
||||
extern ttvfs::VFSHelper vfs;
|
||||
typedef ttvfs::VFSFile VFILE;
|
||||
|
||||
|
||||
VFILE *vfopen(const char *fn, const char *mode);
|
||||
size_t vfread(void *ptr, size_t size, size_t count, VFILE *vf);
|
||||
int vfclose(VFILE *vf);
|
||||
size_t vfwrite(const void *ptr, size_t size, size_t count, VFILE *vf);
|
||||
int vfseek(VFILE *vf, long int offset, int origin);
|
||||
char *vfgets(char *str, int num, VFILE *vf);
|
||||
void vfclear(VFILE *vf);
|
||||
long int vftell(VFILE *vf);
|
||||
|
||||
// This class is a minimal adapter to support STL-like read-only file streams for VFS files, using std::istringstream.
|
||||
class InStream : public std::istringstream
|
||||
{
|
||||
public:
|
||||
InStream(const char *fn);
|
||||
InStream(const std::string& fn);
|
||||
bool open(const char *fn);
|
||||
inline bool is_open() { return good(); }
|
||||
inline void close() {}
|
||||
private:
|
||||
void _init(const char *fn);
|
||||
};
|
||||
|
||||
#else // BBGE_BUILD_VFS
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fstream>
|
||||
typedef std::ifstream InStream;
|
||||
typedef FILE VFILE;
|
||||
#define vfopen fopen
|
||||
#define vfread fread
|
||||
#define vfclose fclose
|
||||
#define vfwrite fwrite
|
||||
#define vfseek fseek
|
||||
#define vfgets fgets
|
||||
#define vftell ftell
|
||||
#define vfclear
|
||||
|
||||
#endif // BBGE_BUILD_VFS
|
||||
|
||||
|
||||
#endif // FILE_API_H
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
//STL headers
|
||||
#include <string>
|
||||
#include "FileAPI.h"
|
||||
#include "ttvfs_stdio.h"
|
||||
#include "ByteBuffer.h"
|
||||
using namespace std;
|
||||
|
||||
|
@ -53,26 +53,22 @@ bool GLFont::Create (const char *file_name, int tex, bool loadTexture)
|
|||
//Destroy the old font if there was one, just to be safe
|
||||
Destroy();
|
||||
|
||||
|
||||
#ifdef BBGE_BUILD_VFS
|
||||
//Open input file
|
||||
ttvfs::VFSFile *vf = vfs.GetFile(file_name);
|
||||
if (!vf)
|
||||
return false;
|
||||
ByteBuffer bb((void*)vf->getBuf(), vf->size(), ByteBuffer::TAKE_OVER);
|
||||
vf->dropBuf(false);
|
||||
#else
|
||||
|
||||
VFILE *fh = vfopen(file_name, "rb");
|
||||
if (!fh)
|
||||
return false;
|
||||
vfseek(fh, 0, SEEK_END);
|
||||
long int sz = vftell(fh);
|
||||
vfseek(fh, 0, SEEK_SET);
|
||||
|
||||
size_t sz = 0;
|
||||
if(vfsize(fh, &sz) < 0)
|
||||
{
|
||||
vfclose(fh);
|
||||
return false;
|
||||
}
|
||||
|
||||
ByteBuffer bb(sz);
|
||||
bb.resize(sz);
|
||||
vfread(bb.contents(), 1, sz, fh);
|
||||
vfclose(fh);
|
||||
#endif
|
||||
|
||||
// Read the header from file
|
||||
header.tex = tex;
|
||||
|
|
|
@ -953,17 +953,10 @@ bool TiXmlDocument::LoadFile( VFILE* file, TiXmlEncoding encoding )
|
|||
location.Clear();
|
||||
|
||||
// Get the file size, so we can pre-allocate the string. HUGE speed impact.
|
||||
long length = 0;
|
||||
#ifdef BBGE_BUILD_VFS
|
||||
length = file->size();
|
||||
#else
|
||||
fseek( file, 0, SEEK_END );
|
||||
length = ftell( file );
|
||||
fseek( file, 0, SEEK_SET );
|
||||
#endif
|
||||
size_t length = 0;
|
||||
|
||||
// Strange case, but good to handle up front.
|
||||
if ( length <= 0 )
|
||||
if ( vfsize(file, &length) < 0 || length <= 0 )
|
||||
{
|
||||
SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN );
|
||||
return false;
|
||||
|
@ -990,15 +983,6 @@ bool TiXmlDocument::LoadFile( VFILE* file, TiXmlEncoding encoding )
|
|||
}
|
||||
*/
|
||||
|
||||
#ifdef BBGE_BUILD_VFS
|
||||
char *buf = (char*)file->getBuf();
|
||||
file->dropBuf(false);
|
||||
if (!buf)
|
||||
{
|
||||
SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
|
||||
return false;
|
||||
}
|
||||
#else
|
||||
char* buf = new char[ length+1 ];
|
||||
buf[0] = 0;
|
||||
|
||||
|
@ -1007,7 +991,6 @@ bool TiXmlDocument::LoadFile( VFILE* file, TiXmlEncoding encoding )
|
|||
SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN );
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
return LoadMem(buf, length, encoding);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ distribution.
|
|||
#pragma warning( disable : 4786 )
|
||||
#endif
|
||||
|
||||
#include "FileAPI.h"
|
||||
#include "ttvfs_stdio.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue