Change EMUFILE fseek,ftell, and other related functions to use types that follow the C standard (long int for position offsets and size_t for sizes). This allows for larger max file sizes on unix platforms and cleaner code that better maps to the C standard.
This commit is contained in:
parent
b338d4a037
commit
5e9e80eddc
|
@ -78,7 +78,7 @@ void EMUFILE_FILE::open(const char* fname, const char* mode)
|
|||
}
|
||||
|
||||
|
||||
void EMUFILE_FILE::truncate(s32 length)
|
||||
void EMUFILE_FILE::truncate(size_t length)
|
||||
{
|
||||
::fflush(fp);
|
||||
#ifdef _MSC_VER
|
||||
|
|
|
@ -109,13 +109,13 @@ public:
|
|||
double readdouble();
|
||||
size_t readdouble(double* val);
|
||||
|
||||
virtual int fseek(int offset, int origin) = 0;
|
||||
virtual int fseek(long int offset, int origin) = 0;
|
||||
|
||||
virtual int ftell() = 0;
|
||||
virtual int size() = 0;
|
||||
virtual long int ftell() = 0;
|
||||
virtual size_t size() = 0;
|
||||
virtual void fflush() = 0;
|
||||
|
||||
virtual void truncate(s32 length) = 0;
|
||||
virtual void truncate(size_t length) = 0;
|
||||
};
|
||||
|
||||
//todo - handle read-only specially?
|
||||
|
@ -123,9 +123,10 @@ class EMUFILE_MEMORY : public EMUFILE {
|
|||
protected:
|
||||
std::vector<u8> *vec;
|
||||
bool ownvec;
|
||||
s32 pos, len;
|
||||
long int pos;
|
||||
size_t len;
|
||||
|
||||
void reserve(u32 amt) {
|
||||
void reserve(size_t amt) {
|
||||
if(vec->size() < amt)
|
||||
vec->resize(amt);
|
||||
}
|
||||
|
@ -133,12 +134,12 @@ protected:
|
|||
public:
|
||||
|
||||
EMUFILE_MEMORY(std::vector<u8> *underlying) : vec(underlying), ownvec(false), pos(0), len((s32)underlying->size()) { }
|
||||
EMUFILE_MEMORY(u32 preallocate) : vec(new std::vector<u8>()), ownvec(true), pos(0), len(0) {
|
||||
EMUFILE_MEMORY(size_t preallocate) : vec(new std::vector<u8>()), ownvec(true), pos(0), len(0) {
|
||||
vec->resize(preallocate);
|
||||
len = preallocate;
|
||||
}
|
||||
EMUFILE_MEMORY() : vec(new std::vector<u8>()), ownvec(true), pos(0), len(0) { vec->reserve(1024); }
|
||||
EMUFILE_MEMORY(void* buf, s32 size) : vec(new std::vector<u8>()), ownvec(true), pos(0), len(size) {
|
||||
EMUFILE_MEMORY(void* buf, size_t size) : vec(new std::vector<u8>()), ownvec(true), pos(0), len(size) {
|
||||
vec->resize(size);
|
||||
if(size != 0)
|
||||
memcpy(&vec->front(),buf,size);
|
||||
|
@ -150,7 +151,7 @@ public:
|
|||
|
||||
virtual EMUFILE* memwrap();
|
||||
|
||||
virtual void truncate(s32 length)
|
||||
virtual void truncate(size_t length)
|
||||
{
|
||||
vec->resize(length);
|
||||
len = length;
|
||||
|
@ -216,13 +217,13 @@ public:
|
|||
//they handle the return values correctly
|
||||
|
||||
virtual void fwrite(const void *ptr, size_t bytes){
|
||||
reserve(pos+(s32)bytes);
|
||||
reserve(pos+bytes);
|
||||
memcpy(buf()+pos,ptr,bytes);
|
||||
pos += (s32)bytes;
|
||||
pos += bytes;
|
||||
len = std::max<int>(pos,len);
|
||||
}
|
||||
|
||||
virtual int fseek(int offset, int origin){
|
||||
virtual int fseek(long int offset, int origin){
|
||||
//work differently for read-only...?
|
||||
switch(origin) {
|
||||
case SEEK_SET:
|
||||
|
@ -241,13 +242,13 @@ public:
|
|||
return 0;
|
||||
}
|
||||
|
||||
virtual int ftell() {
|
||||
virtual long int ftell() {
|
||||
return pos;
|
||||
}
|
||||
|
||||
virtual void fflush() {}
|
||||
|
||||
void set_len(s32 length)
|
||||
void set_len(size_t length)
|
||||
{
|
||||
len = length;
|
||||
if(pos > length)
|
||||
|
@ -258,7 +259,7 @@ public:
|
|||
vec->resize(len);
|
||||
}
|
||||
|
||||
virtual int size() { return (int)len; }
|
||||
virtual size_t size() { return len; }
|
||||
};
|
||||
|
||||
class EMUFILE_FILE : public EMUFILE {
|
||||
|
@ -288,7 +289,7 @@ public:
|
|||
|
||||
bool is_open() { return fp != NULL; }
|
||||
|
||||
virtual void truncate(s32 length);
|
||||
virtual void truncate(size_t length);
|
||||
|
||||
virtual int fprintf(const char *format, ...) {
|
||||
va_list argptr;
|
||||
|
@ -321,20 +322,20 @@ public:
|
|||
failbit = true;
|
||||
}
|
||||
|
||||
virtual int fseek(int offset, int origin) {
|
||||
virtual int fseek(long int offset, int origin) {
|
||||
return ::fseek(fp, offset, origin);
|
||||
}
|
||||
|
||||
virtual int ftell() {
|
||||
return (u32)::ftell(fp);
|
||||
virtual long int ftell() {
|
||||
return ::ftell(fp);
|
||||
}
|
||||
|
||||
virtual int size() {
|
||||
int oldpos = ftell();
|
||||
virtual size_t size() {
|
||||
long int oldpos = ftell();
|
||||
fseek(0,SEEK_END);
|
||||
int len = ftell();
|
||||
long int len = ftell();
|
||||
fseek(oldpos,SEEK_SET);
|
||||
return len;
|
||||
return static_cast<size_t>(len);
|
||||
}
|
||||
|
||||
virtual void fflush() {
|
||||
|
|
|
@ -327,7 +327,7 @@ FCEUFILE * FCEU_fopen(const char *path, const char *ipsfn, const char *mode, cha
|
|||
if(gzfile) {
|
||||
delete fp;
|
||||
|
||||
int size;
|
||||
size_t size;
|
||||
for(size=0; gzgetc(gzfile) != EOF; size++) {}
|
||||
EMUFILE_MEMORY* ms = new EMUFILE_MEMORY(size);
|
||||
gzseek(gzfile,0,SEEK_SET);
|
||||
|
|
|
@ -35,7 +35,7 @@ struct FCEUFILE {
|
|||
int archiveIndex;
|
||||
|
||||
//the size of the file
|
||||
int size;
|
||||
size_t size;
|
||||
|
||||
//whether the file is contained in an archive
|
||||
bool isArchive() { return archiveCount > 0; }
|
||||
|
|
Loading…
Reference in New Issue