diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/file.cpp | 96 | ||||
| -rw-r--r-- | common/file.h | 11 | 
2 files changed, 63 insertions, 44 deletions
| diff --git a/common/file.cpp b/common/file.cpp index b111975795..f7dfa2ae8f 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -22,6 +22,40 @@  #include "file.h"  #include "engine.h"	// For debug/warning/error +FILE *fopen_nocase(const char *path, const char *mode) +{ +	FILE *file; + +	file = fopen(path, mode); +	if (file) +		return file; + +	char buf[256], *ptr; +	int32 i = 0, pos = 0; + +	strcpy(buf, path); +	while (buf[i] != 0) { +		if ((buf[i] == '/') || (buf[i] == '\\')) { +			pos = i + 1; +		} +		i++; +	} +	 +	ptr = buf + pos; +	do +		*ptr++ = toupper(*ptr); +	while (*ptr); +	file = fopen(buf, mode); +	if (file) +		return file; + +	ptr = buf + pos; +	do +		*ptr++ = tolower(*ptr); +	while (*ptr); +	return fopen(buf, mode); +} +  File::File() {  	_handle = NULL;  	_ioFailed = false; @@ -33,7 +67,7 @@ File::~File() {  }  bool File::open(const char *filename, int mode, byte encbyte) { -	char buf[256], *ptr; +  	if (_handle) {  		debug(2, "File %s already opened", filename);  		return false; @@ -41,53 +75,15 @@ bool File::open(const char *filename, int mode, byte encbyte) {  	clearIOFailed(); -	int32 i = 0, pos = 0; - -	strcpy(buf, filename); -	while (buf[i] != 0) { -		if ((buf[i] == '/') || (buf[i] == '\\')) { -			pos = i + 1; -		} -		i++; -	} -	 -	if (mode == 1) { -		_handle = fopen(buf, "rb"); -		if (_handle == NULL) { -			ptr = buf + pos; -			do -				*ptr++ = toupper(*ptr); -			while (*ptr); -			_handle = fopen(buf, "rb"); -		} -		if (_handle == NULL) { -			ptr = buf + pos; -			do -				*ptr++ = tolower(*ptr); -			while (*ptr); -			_handle = fopen(buf, "rb"); -		} +	if (mode == kFileReadMode) { +		_handle = fopen_nocase(filename, "rb");  		if (_handle == NULL) {  			debug(2, "File %s not found", filename);  			return false;  		}  	} -	else if (mode == 2) { -		_handle = fopen(buf, "wb"); -		if (_handle == NULL) { -			ptr = buf + pos; -			do -				*ptr++ = toupper(*ptr); -			while (*ptr); -			_handle = fopen(buf, "wb"); -		} -		if (_handle == NULL) { -			ptr = buf + pos; -			do -				*ptr++ = tolower(*ptr); -			while (*ptr); -			_handle = fopen(buf, "wb"); -		} +	else if (mode == kFileWriteMode) { +		_handle = fopen_nocase(filename, "wb");  		if (_handle == NULL) {  			debug(2, "File %s not opened", filename);  			return false; @@ -138,6 +134,20 @@ uint32 File::pos() {  	return ftell(_handle);  } +uint32 File::size() { +	if (_handle == NULL) { +		error("File is not open!"); +		return 0; +	} + +	uint32 oldPos = ftell(_handle); +	fseek(_handle, 0, SEEK_END); +	uint32 length = ftell(_handle); +	fseek(_handle, oldPos, SEEK_SET); +	 +	return length; +} +  void File::seek(int32 offs, int whence) {  	if (_handle == NULL) {  		error("File is not open!"); diff --git a/common/file.h b/common/file.h index e2a2e97b94..b037b6cdc2 100644 --- a/common/file.h +++ b/common/file.h @@ -26,6 +26,10 @@  #include "stdafx.h"  #include "scummsys.h" +// fopen_nocase is like fopen only that it will try various variations +// of the given filename (with different cases) if the initial one isn't found. +FILE *fopen_nocase(const char *path, const char *mode); +  class File {  private: @@ -34,16 +38,21 @@ private:  	byte _encbyte;  public: +	enum { +		kFileReadMode = 1, +		kFileWriteMode = 2 +	};  	File();  	~File(); -	bool open(const char *filename, int mode = 1, byte encbyte = 0); +	bool open(const char *filename, int mode = kFileReadMode, byte encbyte = 0);  	void close();  	bool isOpen();  	bool ioFailed();  	void clearIOFailed();  	bool eof();  	uint32 pos(); +	uint32 size();  	void seek(int32 offs, int whence);  	uint32 read(void *ptr, uint32 size);  	byte readByte(); | 
