diff options
-rw-r--r-- | Makefile.common | 2 | ||||
-rw-r--r-- | common/file.cpp | 171 | ||||
-rw-r--r-- | common/file.h | 57 | ||||
-rw-r--r-- | scumm/sys.cpp | 20 | ||||
-rw-r--r-- | scummvm.dsp | 8 |
5 files changed, 241 insertions, 17 deletions
diff --git a/Makefile.common b/Makefile.common index 237c853f70..449bb859f3 100644 --- a/Makefile.common +++ b/Makefile.common @@ -10,7 +10,7 @@ ZIPFILE := scummvm-`date '+%Y-%m-%d'`.zip INCS = scumm/scumm.h common/scummsys.h common/stdafx.h COMMON_OBJS = common/config-file.o common/engine.o common/gameDetector.o \ - common/main.o common/timer.o common/util.o common/scaler.o + common/main.o common/timer.o common/util.o common/scaler.o common/file.o GUI_OBJS = gui/gui.o gui/newgui.o gui/widget.o gui/dialog.o gui/ListWidget.o \ gui/ScrollBarWidget.o diff --git a/common/file.cpp b/common/file.cpp new file mode 100644 index 0000000000..edb7ad997e --- /dev/null +++ b/common/file.cpp @@ -0,0 +1,171 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2002 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "file.h" + +#ifdef NEED_STRDUP +char *strdup(const char *s) { + if (s) { + int len = strlen(s) + 1; + char *d = (char *)malloc(len); + if (d) + memcpy(d, s, len); + return d; + } + return NULL; +} +#endif /* NEED_STRDUP */ + +File::File() { + _handle = NULL; + _readFailed = false; + _encbyte = 0; +} + +File::~File() { + close(); +} + +bool File::open(const char *filename, int mode, byte encbyte) { + char * buf; + if (_handle) { + debug(2, "File %s already opened", filename); + return false; + } + + clearReadFailed(); + buf = strdup(filename); + if (mode == 1) { + _handle = fopen(buf, "rb"); + if (_handle == NULL) { + _handle = fopen(strupr(buf), "rb"); + if (_handle == NULL) { + _handle = fopen(strlwr(buf), "rb"); + } + else { + debug(2, "File %s not found", filename); + return false; + } + } + } + else { + warning("Only read mode supported!"); + return false; + } + + return true; +} + +void File::close() { + if (_handle) + fclose(_handle); +} + +bool File::readFailed() { + return _readFailed != 0; +} + +void File::clearReadFailed() { + _readFailed = false; +} + +bool File::eof() { + if (_handle == NULL) { + error("File is not open!"); + return false; + } + + return feof(_handle) != 0; +} + +uint32 File::pos() { + if (_handle == NULL) { + error("File is not open!"); + return 0; + } + + return ftell(_handle); +} + +void File::seek(uint32 offs, int whence) { + if (_handle == NULL) { + error("File is not open!"); + return; + } + + if (fseek(_handle, offs, whence) != 0) + clearerr(_handle); +} + +void File::read(void *ptr, uint32 size) { + byte *ptr2 = (byte *)ptr; + + if (_handle == NULL) { + error("File is not open!"); + return; + } + + if (size == 0) + return; + + if ((uint32)fread(ptr2, size, 1, _handle) != 1) { + clearerr(_handle); + _readFailed = true; + } + + do { + *ptr2++ ^= _encbyte; + } while (--size); +} + +byte File::fileReadByte() { + byte b; + + if (fread(&b, 1, 1, _handle) != 1) { + clearerr(_handle); + _readFailed = true; + } + return b ^ _encbyte; +} + +uint16 File::fileReadWordLE() { + uint a = fileReadByte(); + uint b = fileReadByte(); + return a | (b << 8); +} + +uint32 File::fileReadDwordLE() { + uint a = fileReadWordLE(); + uint b = fileReadWordLE(); + return (b << 16) | a; +} + +uint16 File::fileReadWordBE() { + uint b = fileReadByte(); + uint a = fileReadByte(); + return a | (b << 8); +} + +uint32 File::fileReadDwordBE() { + uint b = fileReadWordBE(); + uint a = fileReadWordBE(); + return (b << 16) | a; +} diff --git a/common/file.h b/common/file.h new file mode 100644 index 0000000000..ea57aa9859 --- /dev/null +++ b/common/file.h @@ -0,0 +1,57 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2002 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include <stdio.h> +#include "stdafx.h" +#include "scummsys.h" +#include "scumm.h" + +#ifndef FILE_H +#define FILE_H + +class File { +private: + + FILE * _handle; + bool _readFailed; + byte _encbyte; + +public: + + File(); + ~File(); + bool open(const char *filename, int mode = 1, byte encbyte = 0); + void close(); + bool readFailed(); + void clearReadFailed(); + bool eof(); + uint32 pos(); + void seek(uint32 offs, int whence); + void read(void *ptr, uint32 size); + byte fileReadByte(); + uint16 fileReadWordLE(); + uint32 fileReadDwordLE(); + uint16 fileReadWordBE(); + uint32 fileReadDwordBE(); + +}; + +#endif diff --git a/scumm/sys.cpp b/scumm/sys.cpp index 2369f53520..e8619a331e 100644 --- a/scumm/sys.cpp +++ b/scumm/sys.cpp @@ -162,33 +162,21 @@ uint32 Scumm::fileReadDwordBE(void *handle) return (b << 16) | a; } -bool Scumm::checkFixedDisk() +bool Scumm::checkFixedDisk() { return true; } #ifdef NEED_STRDUP -char *strdup(const char *s) -{ - if (s) { - int len = strlen(s) + 1; - char *d = (char *)malloc(len); - if (d) - memcpy(d, s, len); - return d; - } - return NULL; -} +char *strdup(const char *s); #endif /* NEED_STRDUP */ -void *operator new(size_t size) -{ +void *operator new(size_t size) { return calloc(size, 1); } -void operator delete(void *ptr) -{ +void operator delete(void *ptr) { free(ptr); } diff --git a/scummvm.dsp b/scummvm.dsp index 5813ea8593..c0a19b9a8c 100644 --- a/scummvm.dsp +++ b/scummvm.dsp @@ -170,6 +170,14 @@ SOURCE=.\common\engine.h # End Source File
# Begin Source File
+SOURCE=.\common\file.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\common\file.h
+# End Source File
+# Begin Source File
+
SOURCE=.\common\gameDetector.cpp
# End Source File
# Begin Source File
|