diff options
161 files changed, 2242 insertions, 12987 deletions
diff --git a/backends/fs/abstract-fs-factory.h b/backends/fs/abstract-fs-factory.h new file mode 100644 index 0000000000..41bfaaa34b --- /dev/null +++ b/backends/fs/abstract-fs-factory.h @@ -0,0 +1,48 @@ +#ifndef ABSTRACT_FILESYSTEM_FACTORY_H +#define ABSTRACT_FILESYSTEM_FACTORY_H + +#include "common/str.h" + +/** + * Creates concrete FilesystemNode objects depending on the current architecture. + */ +class AbstractFilesystemFactory { +public: + typedef Common::String String; + + /** + * Destructor. + */ + virtual ~AbstractFilesystemFactory() {}; + + /** + * Returns a node representing the "current directory". + * If your system does not support this concept, you can either try to + * emulate it or simply return some "sensible" default directory node, + * e.g. the same value as getRoot() returns. + */ + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const = 0; + + /** + * Construct a node based on a path; the path is in the same format as it + * would be for calls to fopen(). + * + * Furthermore getNodeForPath(oldNode.path()) should create a new node + * identical to oldNode. Hence, we can use the "path" value for persistent + * storage e.g. in the config file. + * + * @param path The path string to create a FilesystemNode for. + */ + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const = 0; + + /** + * Returns a special node representing the filesystem root. + * The starting point for any file system browsing. + * + * On Unix, this will be simply the node for / (the root directory). + * On Windows, it will be a special node which "contains" all drives (C:, D:, E:). + */ + virtual AbstractFilesystemNode *makeRootFileNode() const = 0; +}; + +#endif /*ABSTRACT_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/abstract-fs.h b/backends/fs/abstract-fs.h index 09b08cfe60..371c38a495 100644 --- a/backends/fs/abstract-fs.h +++ b/backends/fs/abstract-fs.h @@ -27,7 +27,6 @@ #include "common/array.h" #include "common/str.h" - #include "common/fs.h" class AbstractFilesystemNode; @@ -49,86 +48,88 @@ protected: typedef FilesystemNode::ListMode ListMode; /** - * The parent node of this directory. - * The parent of the root is the root itself. - */ - virtual AbstractFilesystemNode *parent() const = 0; - - /** - * The child node with the given name. If no child with this name + * Returns the child node with the given name. If no child with this name * exists, returns 0. When called on a non-directory node, it should * handle this gracefully by returning 0. * + * Example: + * Calling getChild() for a node with path "/foo/bar" using name="file.txt", + * would produce a new node with "/foo/bar/file.txt" as path. + * + * @note This function will append a separator char (\ or /) to the end of the + * path if needed. + * * @note Handling calls on non-dir nodes gracefully makes it possible to * switch to a lazy type detection scheme in the future. + * + * @param name String containing the name of the child to create a new node. */ - virtual AbstractFilesystemNode *child(const String &name) const = 0; - + virtual AbstractFilesystemNode *getChild(const String &name) const = 0; /** - * Returns a special node representing the FS root. The starting point for - * any file system browsing. - * On Unix, this will be simply the node for / (the root directory). - * On Windows, it will be a special node which "contains" all drives (C:, D:, E:). + * The parent node of this directory. + * The parent of the root is the root itself. */ - static AbstractFilesystemNode *getRoot(); + virtual AbstractFilesystemNode *getParent() const = 0; +public: /** - * Returns a node representing the "current directory". If your system does - * not support this concept, you can either try to emulate it or - * simply return some "sensible" default directory node, e.g. the same - * value as getRoot() returns. + * Destructor. */ - static AbstractFilesystemNode *getCurrentDirectory(); + virtual ~AbstractFilesystemNode() {} + /* + * Indicates whether the object refered by this path exists in the filesystem or not. + */ + virtual bool exists() const = 0; /** - * Construct a node based on a path; the path is in the same format as it - * would be for calls to fopen(). - * - * Furthermore getNodeForPath(oldNode.path()) should create a new node - * identical to oldNode. Hence, we can use the "path" value for persistent - * storage e.g. in the config file. - * - * @todo: This is of course a place where non-portable code easily will sneak - * in, because the format of the path used here is not well-defined. - * So we really should reconsider this API and try to come up with - * something which is more portable but still flexible enough for our - * purposes. + * Return a list of child nodes of this directory node. If called on a node + * that does not represent a directory, false is returned. + * + * @param list List to put the contents of the directory in. + * @param mode Mode to use while listing the directory. + * @param hidden Whether to include hidden files or not in the results. + * + * @return true if succesful, false otherwise (e.g. when the directory does not exist). */ - static AbstractFilesystemNode *getNodeForPath(const String &path); + virtual bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const = 0; + /** + * Returns a human readable path string. + * + * @note By default, this method returns the value of getName(). + */ + virtual String getDisplayName() const { return getName(); } -public: - virtual ~AbstractFilesystemNode() {} - - virtual String name() const = 0; + /** + * Returns a string with an architecture dependent path description. + */ + virtual String getName() const = 0; - // By default, we use the actual file name as 'display name'. - virtual String displayName() const { return name(); } - - virtual bool isValid() const = 0; - + /** + * Returns the 'path' of the current node, usable in fopen(). + */ + virtual String getPath() const = 0; + + /** + * Indicates whether this path refers to a directory or not. + */ virtual bool isDirectory() const = 0; /** - * Return the 'path' of the current node, usable in fopen(). See also - * the static getNodeForPath() method. + * Indicates whether this path can be read from or not. */ - virtual String path() const = 0; - virtual bool listDir(AbstractFSList &list, ListMode mode) const = 0; - + virtual bool isReadable() const = 0; + + /** + * Indicates whether this path can be written to or not. + */ + virtual bool isWritable() const = 0; /* TODO: - bool exists(); - - bool isDirectory(); bool isFile(); - - bool isReadable(); - bool isWriteable(); */ }; - #endif diff --git a/backends/fs/amigaos4/amigaos4-fs-factory.cpp b/backends/fs/amigaos4/amigaos4-fs-factory.cpp new file mode 100644 index 0000000000..becbd49003 --- /dev/null +++ b/backends/fs/amigaos4/amigaos4-fs-factory.cpp @@ -0,0 +1,16 @@ +#include "backends/fs/amigaos4/amigaos4-fs-factory.h" +#include "backends/fs/amigaos4/amigaos4-fs.cpp" + +DECLARE_SINGLETON(AmigaOSFilesystemFactory); + +AbstractFilesystemNode *AmigaOSFilesystemFactory::makeRootFileNode() const { + return new AmigaOSFilesystemNode(); +} + +AbstractFilesystemNode *AmigaOSFilesystemFactory::makeCurrentDirectoryFileNode() const { + return new AmigaOSFilesystemNode(); +} + +AbstractFilesystemNode *AmigaOSFilesystemFactory::makeFileNodePath(const String &path) const { + return new AmigaOSFilesystemNode(path); +} diff --git a/backends/fs/amigaos4/amigaos4-fs-factory.h b/backends/fs/amigaos4/amigaos4-fs-factory.h new file mode 100644 index 0000000000..ed8af24648 --- /dev/null +++ b/backends/fs/amigaos4/amigaos4-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef AMIGAOS_FILESYSTEM_FACTORY_H +#define AMIGAOS_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates AmigaOSFilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class AmigaOSFilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<AmigaOSFilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + AmigaOSFilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*AMIGAOS_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp index ffed8bc87c..88af467ae5 100644 --- a/backends/fs/amigaos4/amigaos4-fs.cpp +++ b/backends/fs/amigaos4/amigaos4-fs.cpp @@ -38,58 +38,76 @@ #include <common/stdafx.h> #include "common/util.h" - #include "engines/engine.h" #include "backends/fs/abstract-fs.h" #define ENTER() /* debug(6, "Enter") */ #define LEAVE() /* debug(6, "Leave") */ - const uint32 kExAllBufferSize = 40960; // TODO: is this okay for sure? +/** + * Implementation of the ScummVM file system API. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. + */ class AmigaOSFilesystemNode : public AbstractFilesystemNode { - protected: - BPTR _pFileLock; - String _sDisplayName; - bool _bIsDirectory; - bool _bIsValid; - String _sPath; - - public: - AmigaOSFilesystemNode(); - AmigaOSFilesystemNode(BPTR pLock, const char *pDisplayName = 0); - AmigaOSFilesystemNode(const String &p); - - // Note: Copy constructor is needed because it duplicates the file lock - AmigaOSFilesystemNode(const AmigaOSFilesystemNode &node); - - virtual ~AmigaOSFilesystemNode(); - - virtual String displayName() const { return _sDisplayName; }; - virtual String name() const { return _sDisplayName; }; - virtual bool isValid() const { return _bIsValid; }; - virtual bool isDirectory() const { return _bIsDirectory; }; - virtual String path() const { return _sPath; }; - - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - virtual AbstractFSList listVolumes() const; - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *child(const String &n) const; +protected: + BPTR _pFileLock; + String _sDisplayName; + String _sPath; + bool _bIsDirectory; + bool _bIsValid; + +public: + /** + * Creates a AmigaOSFilesystemNode with the root node as path. + */ + AmigaOSFilesystemNode(); + + /** + * Creates a AmigaOSFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + */ + AmigaOSFilesystemNode(const String &p); + + /** + * FIXME: document this constructor. + */ + AmigaOSFilesystemNode(BPTR pLock, const char *pDisplayName = 0); + + /** + * Copy constructor. + * + * @note Needed because it duplicates the file lock + */ + AmigaOSFilesystemNode(const AmigaOSFilesystemNode &node); + + /** + * Destructor. + */ + virtual ~AmigaOSFilesystemNode(); + + virtual bool exists() const { return true; } //FIXME: this is just a stub + virtual String getDisplayName() const { return _sDisplayName; }; + virtual String getName() const { return _sDisplayName; }; + virtual String getPath() const { return _sPath; }; + virtual bool isDirectory() const { return _bIsDirectory; }; + virtual bool isReadable() const { return true; } //FIXME: this is just a stub + virtual bool isValid() const { return _bIsValid; }; + virtual bool isWritable() const { return true; } //FIXME: this is just a stub + + virtual AbstractFilesystemNode *getChild(const String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode) const; + virtual AbstractFilesystemNode *getParent() const; + + /** + * Creates a list with all the volumes present in the root node. + */ + virtual AbstractFSList listVolumes() const; }; -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - return AbstractFilesystemNode::getRoot(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { - return new AmigaOSFilesystemNode(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new AmigaOSFilesystemNode(path); -} - AmigaOSFilesystemNode::AmigaOSFilesystemNode() { ENTER(); _sDisplayName = "Available Disks"; @@ -100,7 +118,6 @@ AmigaOSFilesystemNode::AmigaOSFilesystemNode() { LEAVE(); } - AmigaOSFilesystemNode::AmigaOSFilesystemNode(const String &p) { ENTER(); @@ -150,7 +167,6 @@ AmigaOSFilesystemNode::AmigaOSFilesystemNode(const String &p) { const char c = _sPath.lastChar(); if (c != '/' && c != ':') _sPath += '/'; - } else { //_bIsDirectory = false; @@ -170,7 +186,7 @@ AmigaOSFilesystemNode::AmigaOSFilesystemNode(BPTR pLock, const char *pDisplayNam int bufSize = MAXPATHLEN; _pFileLock = 0; - while (1) { + while (true) { char *n = new char[bufSize]; if (IDOS->NameFromLock(pLock, (STRPTR)n, bufSize) != DOSFALSE) { _sPath = n; @@ -186,6 +202,7 @@ AmigaOSFilesystemNode::AmigaOSFilesystemNode(BPTR pLock, const char *pDisplayNam delete [] n; return; } + bufSize *= 2; delete [] n; } @@ -238,7 +255,31 @@ AmigaOSFilesystemNode::~AmigaOSFilesystemNode() { LEAVE(); } -bool AmigaOSFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { +AbstractFilesystemNode *AmigaOSFilesystemNode::getChild(const String &n) const { + if (!_bIsDirectory) { + debug(6, "Not a directory"); + return 0; + } + + String newPath(_sPath); + + if (_sPath.lastChar() != '/') + newPath += '/'; + + newPath += n; + BPTR lock = IDOS->Lock(newPath.c_str(), SHARED_LOCK); + + if (!lock) { + debug(6, "Bad path"); + return 0; + } + + IDOS->UnLock(lock); + + return new AmigaOSFilesystemNode(newPath); +} + +bool AmigaOSFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode) const { ENTER(); if (!_bIsValid) { @@ -308,10 +349,11 @@ bool AmigaOSFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const } LEAVE(); + return true; } -AbstractFilesystemNode *AmigaOSFilesystemNode::parent() const { +AbstractFilesystemNode *AmigaOSFilesystemNode::getParent() const { ENTER(); if (!_bIsDirectory) { @@ -337,33 +379,8 @@ AbstractFilesystemNode *AmigaOSFilesystemNode::parent() const { node = new AmigaOSFilesystemNode(); LEAVE(); - return node; -} - -AbstractFilesystemNode *AmigaOSFilesystemNode::child(const String &n) const { - if (!_bIsDirectory) { - debug(6, "Not a directory"); - return 0; - } - - String newPath(_sPath); - - if (_sPath.lastChar() != '/') - newPath += '/'; - - newPath += n; - - BPTR lock = IDOS->Lock(newPath.c_str(), SHARED_LOCK); - - if (!lock) { - debug(6, "Bad path"); - return 0; - } - - IDOS->UnLock(lock); - - return new AmigaOSFilesystemNode(newPath); + return node; } AbstractFSList AmigaOSFilesystemNode::listVolumes() const { @@ -431,7 +448,8 @@ AbstractFSList AmigaOSFilesystemNode::listVolumes() const { IDOS->UnLockDosList(kLockFlags); LEAVE(); + return myList; } -#endif +#endif //defined(__amigaos4__) diff --git a/backends/fs/dc/dc-fs.cpp b/backends/fs/dc/dc-fs.cpp index 010ca20276..070c9b075b 100644 --- a/backends/fs/dc/dc-fs.cpp +++ b/backends/fs/dc/dc-fs.cpp @@ -25,40 +25,62 @@ #if defined(__DC__) #include "common/stdafx.h" - #include "backends/fs/abstract-fs.h" #include <ronin/cdfs.h> #include <stdio.h> #include <unistd.h> -/* - * Implementation of the ScummVM file system API based on ronin. +/** + * Implementation of the ScummVM file system API based on POSIX. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. */ - class RoninCDFilesystemNode : public AbstractFilesystemNode { protected: String _displayName; + String _path; bool _isDirectory; bool _isValid; - String _path; public: + /** + * Creates a RoninCDFilesystemNode with the root node as path. + */ RoninCDFilesystemNode(); + + /** + * Creates a RoninCDFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + * @param verify true if the isValid and isDirectory flags should be verified during the construction. + */ RoninCDFilesystemNode(const String &path, bool verify); - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } - virtual bool isValid() const { return _isValid; } + virtual bool exists() const { return true; } //FIXME: this is just a stub + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } + virtual bool isReadable() const { return true; } //FIXME: this is just a stub + virtual bool isValid() const { return _isValid; } + virtual bool isWritable() const { return true; } //FIXME: this is just a stub - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *child(const String &n) const; + virtual AbstractFilesystemNode *getChild(const String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode) const; + virtual AbstractFilesystemNode *getParent() const; }; - +/** + * Returns the last component of a given path. + * + * Examples: + * /foo/bar.txt would return /bar.txt + * /foo/bar/ would return /bar/ + * + * @param str String containing the path. + * @return Pointer to the first char of the last component inside str. + */ static const char *lastPathComponent(const Common::String &str) { const char *start = str.c_str(); const char *cur = start + str.size() - 2; @@ -70,22 +92,6 @@ static const char *lastPathComponent(const Common::String &str) { return cur + 1; } - -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - // Since there is no way to _set_ the current directory, - // it will always be /... - - return getRoot(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { - return new RoninCDFilesystemNode(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new RoninCDFilesystemNode(path, true); -} - RoninCDFilesystemNode::RoninCDFilesystemNode() { // The root dir. _path = "/"; @@ -118,10 +124,23 @@ RoninCDFilesystemNode::RoninCDFilesystemNode(const String &p, bool verify) { } } -bool RoninCDFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { +AbstractFilesystemNode *RoninCDFilesystemNode::getChild(const String &n) const { + // FIXME: Pretty lame implementation! We do no error checking to speak + // of, do not check if this is a special node, etc. assert(_isDirectory); - DIR *dirp = opendir(_path.c_str()); + + String newPath(_path); + if (_path.lastChar() != '/') + newPath += '/'; + newPath += n; + + return new RoninCDFilesystemNode(newPath, true); +} +bool RoninCDFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode) const { + assert(_isDirectory); + + DIR *dirp = opendir(_path.c_str()); struct dirent *dp; if (dirp == NULL) @@ -150,35 +169,22 @@ bool RoninCDFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const if (entry._isDirectory) entry._path += "/"; + myList.push_back(new RoninCDFilesystemNode(entry)); } closedir(dirp); + return true; } -AbstractFilesystemNode *RoninCDFilesystemNode::parent() const { +AbstractFilesystemNode *RoninCDFilesystemNode::getParent() const { if (_path == "/") return 0; const char *start = _path.c_str(); const char *end = lastPathComponent(_path); - RoninCDFilesystemNode *p = new RoninCDFilesystemNode(String(start, end - start), false); - - return p; -} - -AbstractFilesystemNode *RoninCDFilesystemNode::child(const String &n) const { - // FIXME: Pretty lame implementation! We do no error checking to speak - // of, do not check if this is a special node, etc. - assert(_isDirectory); - String newPath(_path); - if (_path.lastChar() != '/') - newPath += '/'; - newPath += n; - RoninCDFilesystemNode *p = new RoninCDFilesystemNode(newPath, true); - - return p; + return new RoninCDFilesystemNode(String(start, end - start), false); } #endif // defined(__DC__) diff --git a/backends/fs/dc/ronincd-fs-factory.cpp b/backends/fs/dc/ronincd-fs-factory.cpp new file mode 100644 index 0000000000..0229a44c45 --- /dev/null +++ b/backends/fs/dc/ronincd-fs-factory.cpp @@ -0,0 +1,16 @@ +#include "backends/fs/dc/ronincd-fs-factory.h" +#include "backends/fs/dc/dc-fs.cpp" + +DECLARE_SINGLETON(RoninCDFilesystemFactory); + +AbstractFilesystemNode *RoninCDFilesystemFactory::makeRootFileNode() const { + return new RoninCDFilesystemNode(); +} + +AbstractFilesystemNode *RoninCDFilesystemFactory::makeCurrentDirectoryFileNode() const { + return new RoninCDFilesystemNode(); +} + +AbstractFilesystemNode *RoninCDFilesystemFactory::makeFileNodePath(const String &path) const { + return new RoninCDFilesystemNode(path, true); +} diff --git a/backends/fs/dc/ronincd-fs-factory.h b/backends/fs/dc/ronincd-fs-factory.h new file mode 100644 index 0000000000..426ef7ef2c --- /dev/null +++ b/backends/fs/dc/ronincd-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef RONINCD_FILESYSTEM_FACTORY_H +#define RONINCD_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates RoninCDFilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class RoninCDFilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<RoninCDFilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + RoninCDFilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*RONINCD_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/ds/ds-fs-factory.cpp b/backends/fs/ds/ds-fs-factory.cpp new file mode 100644 index 0000000000..7e64b37411 --- /dev/null +++ b/backends/fs/ds/ds-fs-factory.cpp @@ -0,0 +1,29 @@ +#include "backends/fs/ds/ds-fs-factory.h" +#include "backends/fs/ds/ds-fs.cpp" +#include "dsmain.h" //for the isGBAMPAvailable() function + +DECLARE_SINGLETON(DSFilesystemFactory); + +AbstractFilesystemNode *DSFilesystemFactory::makeRootFileNode() const { + if (DS::isGBAMPAvailable()) { + return new DS::GBAMPFileSystemNode(); + } else { + return new DS::DSFileSystemNode(); + } +} + +AbstractFilesystemNode *DSFilesystemFactory::makeCurrentDirectoryFileNode() const { + if (DS::isGBAMPAvailable()) { + return new DS::GBAMPFileSystemNode(); + } else { + return new DS::DSFileSystemNode(); + } +} + +AbstractFilesystemNode *DSFilesystemFactory::makeFileNodePath(const String &path) const { + if (DS::isGBAMPAvailable()) { + return new DS::GBAMPFileSystemNode(path); + } else { + return new DS::DSFileSystemNode(path); + } +} diff --git a/backends/fs/ds/ds-fs-factory.h b/backends/fs/ds/ds-fs-factory.h new file mode 100644 index 0000000000..a2e96aa548 --- /dev/null +++ b/backends/fs/ds/ds-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef DS_FILESYSTEM_FACTORY_H +#define DS_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates DSFilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class DSFilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<DSFilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + DSFilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*DS_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/ds/ds-fs.cpp b/backends/fs/ds/ds-fs.cpp index abfd0397c6..c0138459a9 100644 --- a/backends/fs/ds/ds-fs.cpp +++ b/backends/fs/ds/ds-fs.cpp @@ -20,24 +20,18 @@ * */ - #include "stdafx.h" #include "str.h" -#include "fs.h" #include "common/util.h" //#include <NDS/ARM9/console.h> //basic print funcionality #include "ds-fs.h" #include "dsmain.h" #include "gba_nds_fat.h" - namespace DS { - - - ////////////////////////////////////////////////////////////// -// DSFileSystemNode - Flash ROM file system using Zip files +// DSFileSystemNode - Flash ROM file system using Zip files // ////////////////////////////////////////////////////////////// ZipFile* DSFileSystemNode::_zipFile = NULL; @@ -66,7 +60,6 @@ DSFileSystemNode::DSFileSystemNode(const String& path) { char disp[128]; char* pathStr = (char *) path.c_str(); - int lastSlash = 3; for (int r = 0; r < (int) strlen(pathStr) - 1; r++) { if (path[r] == '\\') { @@ -81,13 +74,10 @@ DSFileSystemNode::DSFileSystemNode(const String& path) { // _isValid = true; // _isDirectory = false; - - if (!strncmp(pathStr, "ds:/", 4)) { pathStr += 4; } - if (*pathStr == '\0') { _isValid = true; _isDirectory = true; @@ -130,35 +120,10 @@ DSFileSystemNode::DSFileSystemNode(const String& path, bool isDir) { } DSFileSystemNode::DSFileSystemNode(const DSFileSystemNode* node) { - + //TODO: not implemented? } -AbstractFilesystemNode* DSFileSystemNode::parent() const { -// consolePrintf("parent\n"); - DSFileSystemNode *p; - - if (_path != "ds:/") { - char *path = (char *) _path.c_str(); - int lastSlash = 4; - - for (int r = 4; r < (int) strlen((char *) path); r++) { - if (path[r] == '\\') { - lastSlash = r; - } - } - - p = new DSFileSystemNode(String(path, lastSlash)); - ((DSFileSystemNode *) (p))->_isDirectory = true; - } else { - p = new DSFileSystemNode(); - } - - return p; - -} - - -AbstractFilesystemNode *DSFileSystemNode::child(const Common::String& n) const { +AbstractFilesystemNode *DSFileSystemNode::getChild(const Common::String& n) const { if (_path.lastChar() == '\\') { return new DSFileSystemNode(_path + n); } else { @@ -168,14 +133,10 @@ AbstractFilesystemNode *DSFileSystemNode::child(const Common::String& n) const { return NULL; } - -bool DSFileSystemNode::listDir(AbstractFSList &dirList, ListMode mode) const { +bool DSFileSystemNode::getChildren(AbstractFSList &dirList, ListMode mode) const { // consolePrintf("Listdir\n"); - - // consolePrintf("Directory\n"); - char temp[128]; strcpy(temp, _path.c_str()); @@ -190,14 +151,13 @@ bool DSFileSystemNode::listDir(AbstractFSList &dirList, ListMode mode) const { /* // This is the root dir, so add the RAM folder DSFileSystemNode* dsfsn = new DSFileSystemNode("ds:/ram"); dsfsn->_isDirectory = true; - dirList->push_back(wrap(dsfsn));*/ + dirList->push_back(wrap(dsfsn)); +*/ } } else { _zipFile->changeDirectory(temp); } - - if (_zipFile->restartFile()) { do { char n[128]; @@ -218,12 +178,32 @@ bool DSFileSystemNode::listDir(AbstractFSList &dirList, ListMode mode) const { return true; } +AbstractFilesystemNode* DSFileSystemNode::getParent() const { +// consolePrintf("parent\n"); + DSFileSystemNode *p; + if (_path != "ds:/") { + char *path = (char *) _path.c_str(); + int lastSlash = 4; + + for (int r = 4; r < (int) strlen((char *) path); r++) { + if (path[r] == '\\') { + lastSlash = r; + } + } + p = new DSFileSystemNode(String(path, lastSlash)); + ((DSFileSystemNode *) (p))->_isDirectory = true; + } else { + p = new DSFileSystemNode(); + } + + return p; +} -///////////////////////////////////////////////////////////////////////// -// GBAMPFileSystemNode - File system using GBA Movie Player and CF card -///////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// GBAMPFileSystemNode - File system using GBA Movie Player and CF card // +////////////////////////////////////////////////////////////////////////// GBAMPFileSystemNode::GBAMPFileSystemNode() { _displayName = "mp:/"; @@ -290,35 +270,10 @@ GBAMPFileSystemNode::GBAMPFileSystemNode(const String& path, bool isDirectory) { GBAMPFileSystemNode::GBAMPFileSystemNode(const GBAMPFileSystemNode* node) { - -} - - -AbstractFilesystemNode* GBAMPFileSystemNode::parent() const { -// consolePrintf("parent\n"); - GBAMPFileSystemNode *p; - - if (_path != "mp:/") { - char *path = (char *) _path.c_str(); - int lastSlash = 4; - - for (int r = 4; r < (int) strlen((char *) path); r++) { - if (path[r] == '/') { - lastSlash = r; - } - } - - p = new GBAMPFileSystemNode(String(path, lastSlash)); - p->_isDirectory = true; - } else { - p = new GBAMPFileSystemNode(); - } - - return p; - + //TODO: not implemented? } -AbstractFilesystemNode *GBAMPFileSystemNode::child(const Common::String& n) const { +AbstractFilesystemNode *GBAMPFileSystemNode::getChild(const Common::String& n) const { if (_path.lastChar() == '\\') { return new DSFileSystemNode(_path + n); } else { @@ -328,7 +283,7 @@ AbstractFilesystemNode *GBAMPFileSystemNode::child(const Common::String& n) cons return NULL; } -bool GBAMPFileSystemNode::listDir(AbstractFSList& dirList, ListMode mode) const { +bool GBAMPFileSystemNode::getChildren(AbstractFSList& dirList, ListMode mode) const { // consolePrintf("Listdir\n"); enum { TYPE_NO_MORE = 0, TYPE_FILE = 1, TYPE_DIR = 2 }; @@ -346,7 +301,6 @@ bool GBAMPFileSystemNode::listDir(AbstractFSList& dirList, ListMode mode) const pathTemp++; } - // consolePrintf("This dir: %s\n", path); FAT_chdir(path); @@ -369,8 +323,6 @@ bool GBAMPFileSystemNode::listDir(AbstractFSList& dirList, ListMode mode) const // dsfsn->_isDirectory = entryType == DIR; dirList.push_back((dsfsn)); } - - } else { // consolePrintf("Skipping %s\n", fname); } @@ -385,6 +337,28 @@ bool GBAMPFileSystemNode::listDir(AbstractFSList& dirList, ListMode mode) const return true; } +AbstractFilesystemNode* GBAMPFileSystemNode::getParent() const { +// consolePrintf("parent\n"); + GBAMPFileSystemNode *p; + + if (_path != "mp:/") { + char *path = (char *) _path.c_str(); + int lastSlash = 4; + + for (int r = 4; r < (int) strlen((char *) path); r++) { + if (path[r] == '/') { + lastSlash = r; + } + } + + p = new GBAMPFileSystemNode(String(path, lastSlash)); + p->_isDirectory = true; + } else { + p = new GBAMPFileSystemNode(); + } + + return p; +} // Stdio replacements #define MAX_FILE_HANDLES 32 @@ -393,9 +367,6 @@ bool inited = false; DS::fileHandle handle[MAX_FILE_HANDLES]; FILE* std_fopen(const char* name, const char* mode) { - - - if (!inited) { for (int r = 0; r < MAX_FILE_HANDLES; r++) { handle[r].used = false; @@ -403,9 +374,6 @@ FILE* std_fopen(const char* name, const char* mode) { inited = true; currentDir[0] = '\0'; } - - - char* realName = (char *) name; @@ -413,7 +381,7 @@ FILE* std_fopen(const char* name, const char* mode) { if ((name[0] == 'd') && (name[1] == 's') && (name[2] == ':') && (name[3] == '/')) { realName += 4; } - + if ((name[0] == 'm') && (name[1] == 'p') && (name[2] == ':') && (name[3] == '/')) { realName += 4; } @@ -421,7 +389,6 @@ FILE* std_fopen(const char* name, const char* mode) { // consolePrintf("Open file:"); // consolePrintf("'%s', [%s]", realName, mode); - if (DS::isGBAMPAvailable()) { FAT_chdir("/"); @@ -443,10 +410,9 @@ FILE* std_fopen(const char* name, const char* mode) { return (FILE *) result; } - // Fail to open file for writing. It's in ROM! - + // Allocate a file handle int r = 0; while (handle[r].used) r++; @@ -459,7 +425,6 @@ FILE* std_fopen(const char* name, const char* mode) { handle[r].sramFile = (DSSaveFile *) DSSaveFileManager::instance()->openSavefile(realName, false); } - if (handle[r].sramFile) { handle[r].used = true; handle[r].pos = 0; @@ -513,6 +478,7 @@ FILE* std_fopen(const char* name, const char* mode) { return NULL; } } + void std_fclose(FILE* handle) { if (DS::isGBAMPAvailable()) { @@ -528,14 +494,9 @@ void std_fclose(FILE* handle) { } size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle) { - // consolePrintf("fread %d,%d %d ", size, numItems, ptr); - - if (DS::isGBAMPAvailable()) { - - int bytes = FAT_fread((void *) ptr, size, numItems, (FAT_FILE *) handle); if (!std_feof(handle)) { return numItems; @@ -560,27 +521,24 @@ size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle) { } - return item;*/ - - + return item; +*/ int items = 0; //for (int r = 0; r < numItems; r++) { if (!std_feof(handle)) { - - - /* for (int t = 0; t < size; t++) { if (feof(handle)) eof = true; *(((char *) (ptr)) + r * size + t) = getc(handle); }*/ int left = size * numItems; int bytesRead = -1; + while ((left > 0) && (!FAT_feof((FAT_FILE *) handle))) { int amount = left > 8192? 8192: left; // do { bytesRead = FAT_fread((void *) ptr, 1, amount, (FAT_FILE *) handle); - /* if (bytesRead == 0) { +/* if (bytesRead == 0) { consolePrintf("Pos:%d items:%d num:%d amount:%d read:%d\n", ftell(handle), items, numItems, amount, bytesRead); left++; @@ -592,27 +550,24 @@ size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle) { fread(ptr, 1024, 1, handle); swiWaitForVBlank(); //while (true); - }*/ - //} while (bytesRead == 0); + } + + } while (bytesRead == 0); +*/ left -= bytesRead; ptr = ((char *) (ptr)) + bytesRead; } items = numItems - (left / size); - - - - + // FAT_fread((void *) ptr, size, 1, ((int) (handle)) - 1); - // ptr = ((char *) (ptr)) + size; - +// ptr = ((char *) (ptr)) + size; } - //} +// } // consolePrintf("...done %d \n", items) return items; - } if (handle->sramFile) { @@ -630,7 +585,6 @@ size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle) { return bytes / size; } - if (handle->pos + size * numItems > handle->size) { numItems = (handle->size - handle->pos) / size; if (numItems < 0) numItems = 0; @@ -639,10 +593,8 @@ size_t std_fread(const void* ptr, size_t size, size_t numItems, FILE* handle) { // consolePrintf("read %d ", size * numItems); memcpy((void *) ptr, handle->data + handle->pos, size * numItems); - handle->pos += size * numItems; - return numItems; } @@ -657,7 +609,6 @@ size_t std_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle) { //consolePrintf("fwrite size=%d\n", size * numItems); if (DS::isGBAMPAvailable()) { - FAT_fwrite(((char *) (ptr)), size, numItems, (FAT_FILE *) handle); return numItems; @@ -675,7 +626,6 @@ size_t std_fwrite(const void* ptr, size_t size, size_t numItems, FILE* handle) { return numItems; } - if (handle->sramFile) { handle->sramFile->write(ptr, size); return size; @@ -704,6 +654,7 @@ bool std_feof(FILE* handle) { } void std_fflush(FILE* handle) { + //FIXME: not implemented? // consolePrintf("fflush "); } @@ -711,7 +662,6 @@ char* std_fgets(char* str, int size, FILE* file) { // consolePrintf("fgets file=%d ", file); if (DS::isGBAMPAvailable()) { - char* s = str; while ((*s++ = std_getc(file)) >= 32) { // consolePrintf("%d ", *s); @@ -723,7 +673,6 @@ char* std_fgets(char* str, int size, FILE* file) { return str; } - if (file->sramFile) { file->pos--; int p = -1; @@ -743,7 +692,6 @@ char* std_fgets(char* str, int size, FILE* file) { } long int std_ftell(FILE* handle) { - if (DS::isGBAMPAvailable()) { return FAT_ftell((FAT_FILE *) handle); } @@ -758,39 +706,30 @@ int std_fseek(FILE* handle, long int offset, int whence) { return FAT_fseek((FAT_FILE *) handle, offset, whence); } - switch (whence) { - case SEEK_CUR: { + case SEEK_CUR: handle->pos += offset; break; - } - - case SEEK_SET: { + case SEEK_SET: handle->pos = offset; break; - } - - case SEEK_END: { + case SEEK_END: handle->pos = handle->size + offset; break; - } - - default: { + default: handle->pos = offset; break; - } - } return 0; } void std_clearerr(FILE* handle) { + //FIXME: not implemented? // consolePrintf("clearerr "); } int std_getc(FILE* handle) { - if (DS::isGBAMPAvailable()) { char c; FAT_fread(&c, 1, 1, (FAT_FILE *) handle); @@ -852,24 +791,3 @@ int std_ferror(FILE* handle) { } } // namespace DS - -// These functions are added to AbstractFileSystemNode and are therefore outside -// the DS namespace. - -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { -// consolePrintf("New node"); - - if (DS::isGBAMPAvailable()) { - return new DS::GBAMPFileSystemNode(); - } else { - return new DS::DSFileSystemNode(); - } -} - -AbstractFilesystemNode* AbstractFilesystemNode::getNodeForPath(const String& path) { - if (DS::isGBAMPAvailable()) { - return new DS::GBAMPFileSystemNode(path); - } else { - return new DS::DSFileSystemNode(path); - } -} diff --git a/backends/fs/ds/ds-fs.h b/backends/fs/ds/ds-fs.h index ef651b7ea7..e3014d0d2e 100644 --- a/backends/fs/ds/ds-fs.h +++ b/backends/fs/ds/ds-fs.h @@ -23,8 +23,6 @@ #ifndef _DS_FS_H #define _DS_FS_H - - //#include <NDS/ARM9/console.h> #include "fs.h" #include "zipreader.h" @@ -32,81 +30,134 @@ #include "scummconsole.h" #include "gba_nds_fat.h" #include "backends/fs/abstract-fs.h" -//#include "backends/fs/fs.h" namespace DS { /** + * Implementation of the ScummVM file system API. * This class is used when a Flash cart is in use. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. */ class DSFileSystemNode : public AbstractFilesystemNode { protected: - static ZipFile* _zipFile; - typedef class Common::String String; + static ZipFile* _zipFile; + String _displayName; + String _path; bool _isDirectory; bool _isValid; - String _path; int _refCountVal; public: + /** + * Creates a DSFilesystemNode with the root node as path. + */ DSFileSystemNode(); + + /** + * Creates a DSFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + */ DSFileSystemNode(const String &path); - DSFileSystemNode(const DSFileSystemNode *node); + + /** + * Creates a DSFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + * @param path true if path is a directory, false otherwise. + */ DSFileSystemNode(const String& path, bool isDir); - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } - virtual bool isValid() const { return _isValid; } + /** + * Copy constructor. + */ + DSFileSystemNode(const DSFileSystemNode *node); + + virtual bool exists() const { return true; } //FIXME: this is just a stub + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } + virtual bool isReadable() const { return true; } //FIXME: this is just a stub + virtual bool isValid() const { return _isValid; } + virtual bool isWritable() const { return true; } //FIXME: this is just a stub - virtual bool listDir(AbstractFSList &list, ListMode mode = FilesystemNode::kListDirectoriesOnly) const; - virtual AbstractFilesystemNode *parent() const; + /** + * Returns a copy of this node. + */ virtual AbstractFilesystemNode *clone() const { return new DSFileSystemNode(this); } - virtual AbstractFilesystemNode *child(const Common::String& name) const; + virtual AbstractFilesystemNode *getChild(const Common::String& name) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode = FilesystemNode::kListDirectoriesOnly) const; + virtual AbstractFilesystemNode *getParent() const; + + /** + * Returns the zip file this node points to. + * TODO: check this documentation. + */ static ZipFile* getZip() { return _zipFile; } }; - -/** + /** + * Implementation of the ScummVM file system API. * This class is used when the GBAMP (GBA Movie Player) is used with a CompactFlash card. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. */ class GBAMPFileSystemNode : public AbstractFilesystemNode { protected: typedef class Common::String String; String _displayName; + String _path; bool _isDirectory; bool _isValid; - String _path; - int _refCountVal; public: + /** + * Creates a GBAMPFilesystemNode with the root node as path. + */ GBAMPFileSystemNode(); + + /** + * Creates a GBAMPFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + */ GBAMPFileSystemNode(const String &path); + + /** + * Creates a DSFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + * @param path true if path is a directory, false otherwise. + */ GBAMPFileSystemNode(const String &path, bool isDirectory); + + /** + * Copy constructor. + */ GBAMPFileSystemNode(const GBAMPFileSystemNode *node); - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } - - virtual bool isValid() const { return _isValid; } + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } - virtual bool listDir(AbstractFSList &list, ListMode mode = FilesystemNode::kListDirectoriesOnly) const; - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *clone() const { return new GBAMPFileSystemNode(this); } - virtual AbstractFilesystemNode *child(const Common::String& name) const; + virtual bool isValid() const { return _isValid; } + /** + * Returns a copy of this node. + */ + virtual AbstractFilesystemNode *clone() const { return new GBAMPFileSystemNode(this); } + virtual AbstractFilesystemNode *getChild(const Common::String& name) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode = FilesystemNode::kListDirectoriesOnly) const; + virtual AbstractFilesystemNode *getParent() const; }; - - - struct fileHandle { int pos; bool used; @@ -116,7 +167,6 @@ struct fileHandle { DSSaveFile* sramFile; }; - #undef stderr #undef stdout #undef stdin @@ -140,6 +190,6 @@ void std_clearerr(FILE* handle); void std_cwd(char* dir); void std_fflush(FILE* handle); -} +} //namespace DS -#endif +#endif //_DS_FS_H diff --git a/backends/fs/fs-factory-maker.cpp b/backends/fs/fs-factory-maker.cpp new file mode 100644 index 0000000000..bae3d1a30a --- /dev/null +++ b/backends/fs/fs-factory-maker.cpp @@ -0,0 +1,113 @@ +#include "backends/fs/abstract-fs-factory.h" + +/* + * All the following includes choose, at compile time, which specific backend will be used + * during the execution of the ScummVM. + * + * It has to be done this way because not all the necessary libraries will be available in + * all build environments. Additionally, this results in smaller binaries. + */ +#if defined(__amigaos4__) + #include "backends/fs/amigaos4/amigaos4-fs-factory.cpp" +#endif + +#if defined(__DC__) + #include "backends/fs/dc/ronincd-fs-factory.cpp" +#endif + +#if defined(__DS__) + #include "backends/fs/ds/ds-fs-factory.cpp" +#endif + +#if defined(__GP32__) + #include "backends/fs/gp32/gp32-fs-factory.cpp" +#endif + +#if defined(__MORPHOS__) + #include "backends/fs/morphos/abox-fs-factory.cpp" +#endif + +#if defined(PALMOS_MODE) + #include "backends/fs/palmos/palmos-fs-factory.cpp" +#endif + +#if defined(__PLAYSTATION2__) + #include "backends/fs/ps2/ps2-fs-factory.cpp" +#endif + +#if defined(__PSP__) + #include "backends/fs/psp/psp-fs-factory.cpp" +#endif + +#if defined(__SYMBIAN32__) + #include "backends/fs/symbian/symbian-fs-factory.cpp" +#endif + +#if defined(UNIX) + #include "backends/fs/posix/posix-fs-factory.cpp" +#endif + +#if defined(WIN32) + #include "backends/fs/windows/windows-fs-factory.cpp" +#endif + +/** + * Creates concrete FilesystemFactory objects depending on the current architecture. + */ +class FilesystemFactoryMaker { +public: + + /** + * Returns the correct concrete factory depending on the current build architecture. + */ + static AbstractFilesystemFactory *makeFactory(); + +protected: + FilesystemFactoryMaker() {}; // avoid instances of this class +}; + +AbstractFilesystemFactory *FilesystemFactoryMaker::makeFactory(){ + #if defined(__amigaos4__) + return &AmigaOSFilesystemFactory::instance(); + #endif + + #if defined(__DC__) + return &RoninCDFilesystemFactory::instance(); + #endif + + #if defined(__DS__) + return &DSFilesystemFactory::instance(); + #endif + + #if defined(__GP32__) + return &GP32FilesystemFactory::instance(); + #endif + + #if defined(__MORPHOS__) + return &ABoxFilesystemFactory::instance(); + #endif + + #if defined(PALMOS_MODE) + return &PalmOSFilesystemFactory::instance(); + #endif + + #if defined(__PLAYSTATION2__) + return &Ps2FilesystemFactory::instance(); + #endif + + #if defined(__PSP__) + return &PSPFilesystemFactory::instance(); + #endif + + #if defined(__SYMBIAN32__) + return &SymbianFilesystemFactory::instance(); + #endif + + #if defined(UNIX) + return &POSIXFilesystemFactory::instance(); + #endif + + #if defined(WIN32) + return &WindowsFilesystemFactory::instance(); + #endif +} diff --git a/backends/fs/gp32/gp32-fs-factory.cpp b/backends/fs/gp32/gp32-fs-factory.cpp new file mode 100644 index 0000000000..6328836c0e --- /dev/null +++ b/backends/fs/gp32/gp32-fs-factory.cpp @@ -0,0 +1,16 @@ +#include "backends/fs/gp32/gp32-fs-factory.h" +#include "backends/fs/gp32/gp32-fs.cpp" + +DECLARE_SINGLETON(GP32FilesystemFactory); + +AbstractFilesystemNode *GP32FilesystemFactory::makeRootFileNode() const { + return new GP32FilesystemNode(); +} + +AbstractFilesystemNode *GP32FilesystemFactory::makeCurrentDirectoryFileNode() const { + return new GP32FilesystemNode(); +} + +AbstractFilesystemNode *GP32FilesystemFactory::makeFileNodePath(const String &path) const { + return new GP32FilesystemNode(path); +} diff --git a/backends/fs/gp32/gp32-fs-factory.h b/backends/fs/gp32/gp32-fs-factory.h new file mode 100644 index 0000000000..fc15b52bc6 --- /dev/null +++ b/backends/fs/gp32/gp32-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef GP32_FILESYSTEM_FACTORY_H +#define GP32_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates GP32FilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class GP32FilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<GP32FilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + GP32FilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*GP32_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/gp32/gp32-fs.cpp b/backends/fs/gp32/gp32-fs.cpp index 017fa98349..92968b5976 100644 --- a/backends/fs/gp32/gp32-fs.cpp +++ b/backends/fs/gp32/gp32-fs.cpp @@ -24,38 +24,80 @@ */ #include "stdafx.h" - #include "backends/fs/abstract-fs.h" +#define MAX_PATH_SIZE 256 + +/** + * Implementation of the ScummVM file system API. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. + */ class GP32FilesystemNode : public AbstractFilesystemNode { protected: String _displayName; + String _path; bool _isDirectory; bool _isRoot; - String _path; public: + /** + * Creates a GP32FilesystemNode with the root node as path. + */ GP32FilesystemNode(); + + /** + * Creates a GP32FilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + */ GP32FilesystemNode(const String &path); - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } + virtual bool isDirectory() const { return _isDirectory; } // FIXME: isValid should return false if this Node can't be used! - // client code can rely on the return value. + // so client code can rely on the return value. + virtual bool isReadable() const { return true; } //FIXME: this is just a stub virtual bool isValid() const { return true; } - virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } + virtual bool isWritable() const { return true; } //FIXME: this is just a stub - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *child(const String &n) const; + virtual AbstractFilesystemNode *getChild(const String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode) const; + virtual AbstractFilesystemNode *getParent() const; }; -#define MAX_PATH_SIZE 256 - const char gpRootPath[] = "gp:\\"; //char gpCurrentPath[MAX_PATH_SIZE] = "gp:\\"; // must end with '\' +/** + * Returns the last component of a given path. + * + * Examples: + * gp:\foo\bar.txt would return "\bar.txt" + * gp:\foo\bar\ would return "\bar\" + * + * @param str Path to obtain the last component from. + * @return Pointer to the first char of the last component inside str. + */ +static const char *lastPathComponent(const Common::String &str) { + const char *start = str.c_str(); + const char *cur = start + str.size() - 2; + + while (cur >= start && *cur != '\\') { + --cur; + } + + return cur + 1; +} + +/** + * FIXME: document this function. + * + * @param path + * @param convPath + */ int gpMakePath(const char *path, char *convPath) { // copy root or current directory const char *p; @@ -106,18 +148,6 @@ int gpMakePath(const char *path, char *convPath) { return 0; } -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - return AbstractFilesystemNode::getRoot(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { - return new GP32FilesystemNode(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new GP32FilesystemNode(path); -} - GP32FilesystemNode::GP32FilesystemNode() { _isDirectory = true; _isRoot = true; @@ -132,8 +162,8 @@ GP32FilesystemNode::GP32FilesystemNode(const String &path) { gpMakePath(path.c_str(), convPath); _path = convPath; - pos = convPath; + while (*pos) if (*pos++ == '\\') dsplName = pos; @@ -150,14 +180,25 @@ GP32FilesystemNode::GP32FilesystemNode(const String &path) { _isDirectory = true; } -bool GP32FilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { +AbstractFilesystemNode *GP32FilesystemNode::getChild(const String &n) const { + // FIXME: Pretty lame implementation! We do no error checking to speak + // of, do not check if this is a special node, etc. + assert(_isDirectory); + + String newPath(_path); + if (_path.lastChar() != '\\') + newPath += '\\'; + newPath += n; + + return new GP32FilesystemNode(newPath); +} + +bool GP32FilesystemNode::getChildren(AbstractFSList &myList, ListMode mode) const { assert(_isDirectory); GPDIRENTRY dirEntry; GPFILEATTR attr; - GP32FilesystemNode entry; - uint32 read; if (mode == FilesystemNode::kListAll) @@ -168,9 +209,11 @@ bool GP32FilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { int startIdx = 0; // current file String listDir(_path); //listDir += "/"; + while (GpDirEnumList(listDir.c_str(), startIdx++, 1, &dirEntry, &read) == SM_OK) { if (dirEntry.name[0] == '.') continue; + entry._displayName = dirEntry.name; entry._path = _path; entry._path += dirEntry.name; @@ -194,18 +237,7 @@ bool GP32FilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { return true; } -static const char *lastPathComponent(const Common::String &str) { - const char *start = str.c_str(); - const char *cur = start + str.size() - 2; - - while (cur >= start && *cur != '\\') { - --cur; - } - - return cur + 1; -} - -AbstractFilesystemNode *GP32FilesystemNode::parent() const { +AbstractFilesystemNode *GP32FilesystemNode::getParent() const { if(_isRoot) return 0; @@ -218,16 +250,3 @@ AbstractFilesystemNode *GP32FilesystemNode::parent() const { return p; } - -AbstractFilesystemNode *GP32FilesystemNode::child(const String &n) const { - // FIXME: Pretty lame implementation! We do no error checking to speak - // of, do not check if this is a special node, etc. - assert(_isDirectory); - String newPath(_path); - if (_path.lastChar() != '\\') - newPath += '\\'; - newPath += n; - GP32FilesystemNode *p = new GP32FilesystemNode(newPath); - - return p; -} diff --git a/backends/fs/morphos/abox-fs-factory.cpp b/backends/fs/morphos/abox-fs-factory.cpp new file mode 100644 index 0000000000..9de810c361 --- /dev/null +++ b/backends/fs/morphos/abox-fs-factory.cpp @@ -0,0 +1,16 @@ +#include "backends/fs/morphos/abox-fs-factory.h" +#include "backends/fs/morphos/abox-fs.cpp" + +DECLARE_SINGLETON(ABoxFilesystemFactory); + +AbstractFilesystemNode *ABoxFilesystemFactory::makeRootFileNode() const { + return new ABoxFilesystemNode(); +} + +AbstractFilesystemNode *ABoxFilesystemFactory::makeCurrentDirectoryFileNode() const { + return new ABoxFilesystemNode(); +} + +AbstractFilesystemNode *ABoxFilesystemFactory::makeFileNodePath(const String &path) const { + return new ABoxFilesystemNode(path); +} diff --git a/backends/fs/morphos/abox-fs-factory.h b/backends/fs/morphos/abox-fs-factory.h new file mode 100644 index 0000000000..35f4472b8b --- /dev/null +++ b/backends/fs/morphos/abox-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef ABOX_FILESYSTEM_FACTORY_H +#define ABOX_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates ABoxFilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class ABoxFilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<ABoxFilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + ABoxFilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*ABOX_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/morphos/abox-fs.cpp b/backends/fs/morphos/abox-fs.cpp index 8206e83030..8f46f9a9a8 100644 --- a/backends/fs/morphos/abox-fs.cpp +++ b/backends/fs/morphos/abox-fs.cpp @@ -35,52 +35,66 @@ #include "base/engine.h" #include "backends/fs/abstract-fs.h" -/* +/** * Implementation of the ScummVM file system API based on the MorphOS A-Box API. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. */ - class ABoxFilesystemNode : public AbstractFilesystemNode { - protected: - BPTR _lock; - String _displayName; - bool _isDirectory; - bool _isValid; - String _path; - - public: - ABoxFilesystemNode(); - ABoxFilesystemNode(BPTR lock, CONST_STRPTR display_name = NULL); - ABoxFilesystemNode(const String &p); - ABoxFilesystemNode(const ABoxFilesystemNode &node); - - ~ABoxFilesystemNode(); - - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; }; - virtual bool isValid() const { return _isValid; } - virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } - - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - static AbstractFSList listRoot(); - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *child(const String &name) const; +protected: + BPTR _lock; + String _displayName; + String _path; + bool _isDirectory; + bool _isValid; + +public: + /** + * Creates a ABoxFilesystemNode with the root node as path. + */ + ABoxFilesystemNode(); + + /** + * Creates a ABoxFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + */ + ABoxFilesystemNode(const String &p); + + /** + * FIXME: document this constructor. + */ + ABoxFilesystemNode(BPTR lock, CONST_STRPTR display_name = NULL); + + /** + * Copy constructor. + */ + ABoxFilesystemNode(const ABoxFilesystemNode &node); + + /** + * Destructor. + */ + ~ABoxFilesystemNode(); + + virtual bool exists() const { return true; } //FIXME: this is just a stub + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; }; + virtual String getPath() const { return _path; } + virtual bool isDirectory() const { return _isDirectory; } + virtual bool isReadable() const { return true; } //FIXME: this is just a stub + virtual bool isValid() const { return _isValid; } + virtual bool isWritable() const { return true; } //FIXME: this is just a stub + + virtual AbstractFilesystemNode *getChild(const String &name) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode) const; + virtual AbstractFilesystemNode *getParent() const; + + /** + * Return the list of child nodes for the root node. + */ + static AbstractFSList getRootChildren(); }; - -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - return AbstractFilesystemNode::getRoot(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new ABoxFilesystemNode(path); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getRoot() -{ - return new ABoxFilesystemNode(); -} - ABoxFilesystemNode::ABoxFilesystemNode() { _displayName = "Mounted Volumes"; @@ -90,57 +104,6 @@ ABoxFilesystemNode::ABoxFilesystemNode() _lock = NULL; } -ABoxFilesystemNode::ABoxFilesystemNode(BPTR lock, CONST_STRPTR display_name) -{ - int bufsize = 256; - - _lock = NULL; - for (;;) - { - char name[bufsize]; - if (NameFromLock(lock, name, bufsize) != DOSFALSE) - { - _path = name; - _displayName = display_name ? display_name : FilePart(name); - break; - } - if (IoErr() != ERROR_LINE_TOO_LONG) - { - _isValid = false; - debug(6, "Error while retrieving path name: %ld", IoErr()); - return; - } - bufsize *= 2; - } - - _isDirectory = false; - _isValid = false; - - FileInfoBlock *fib = (FileInfoBlock*) AllocDosObject(DOS_FIB, NULL); - if (fib == NULL) - { - debug(6, "Failed to allocate memory for FileInfoBlock"); - return; - } - - if (Examine(lock, fib) != DOSFALSE) - { - _isDirectory = fib->fib_EntryType > 0; - if (_isDirectory) - { - if (fib->fib_EntryType != ST_ROOT) - _path += "/"; - _lock = DupLock(lock); - _isValid = (_lock != NULL); - } - else - { - _isValid = true; - } - } - FreeDosObject(DOS_FIB, fib); -} - ABoxFilesystemNode::ABoxFilesystemNode(const String &p) { int len = 0, offset = p.size(); @@ -168,7 +131,6 @@ ABoxFilesystemNode::ABoxFilesystemNode(const String &p) { } // Check whether the node exists and if it is a directory - BPTR pLock = Lock((STRPTR)_path.c_str(), SHARED_LOCK); if (pLock) { @@ -198,6 +160,58 @@ ABoxFilesystemNode::ABoxFilesystemNode(const String &p) { FreeDosObject(DOS_FIB, fib); } +ABoxFilesystemNode::ABoxFilesystemNode(BPTR lock, CONST_STRPTR display_name) +{ + int bufsize = 256; + + _lock = NULL; + for (;;) + { + char name[bufsize]; + if (NameFromLock(lock, name, bufsize) != DOSFALSE) + { + _path = name; + _displayName = display_name ? display_name : FilePart(name); + break; + } + if (IoErr() != ERROR_LINE_TOO_LONG) + { + _isValid = false; + debug(6, "Error while retrieving path name: %ld", IoErr()); + return; + } + bufsize *= 2; + } + + _isDirectory = false; + _isValid = false; + + FileInfoBlock *fib = (FileInfoBlock*) AllocDosObject(DOS_FIB, NULL); + if (fib == NULL) + { + debug(6, "Failed to allocate memory for FileInfoBlock"); + return; + } + + if (Examine(lock, fib) != DOSFALSE) + { + _isDirectory = fib->fib_EntryType > 0; + if (_isDirectory) + { + if (fib->fib_EntryType != ST_ROOT) + _path += "/"; + _lock = DupLock(lock); + _isValid = (_lock != NULL); + } + else + { + _isValid = true; + } + } + + FreeDosObject(DOS_FIB, fib); +} + ABoxFilesystemNode::ABoxFilesystemNode(const ABoxFilesystemNode& node) { _displayName = node._displayName; @@ -216,7 +230,27 @@ ABoxFilesystemNode::~ABoxFilesystemNode() } } -bool ABoxFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const +AbstractFilesystemNode *ABoxFilesystemNode::getChild(const String &name) const { + assert(_isDirectory); + String newPath(_path); + + if (_path.lastChar() != '/') + newPath += '/'; + newPath += name; + + BPTR lock = Lock(newPath.c_str(), SHARED_LOCK); + + if (!lock) + { + return 0; + } + + UnLock(lock); + + return new ABoxFilesystemNode(newPath); +} + +bool ABoxFilesystemNode::getChildren(AbstractFSList &list, ListMode mode) const { if (!_isValid) { @@ -232,7 +266,7 @@ bool ABoxFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const if (_lock == NULL) { /* This is the root node */ - myList = listRoot(); + list = getRootChildren(); return true; } @@ -266,7 +300,7 @@ bool ABoxFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const if (entry) { if (entry->isValid()) - myList.push_back(entry); + list.push_back(entry); else delete entry; } @@ -284,7 +318,7 @@ bool ABoxFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const return true; } -AbstractFilesystemNode *ABoxFilesystemNode::parent() const +AbstractFilesystemNode *ABoxFilesystemNode::getParent() const { AbstractFilesystemNode *node = NULL; @@ -309,29 +343,9 @@ AbstractFilesystemNode *ABoxFilesystemNode::parent() const return node; } -AbstractFilesystemNode *ABoxFilesystemNode::child(const String &name) const { - assert(_isDirectory); - String newPath(_path); - - if (_path.lastChar() != '/') - newPath += '/'; - newPath += name; - - BPTR lock = Lock(newPath.c_str(), SHARED_LOCK); - - if (!lock) - { - return 0; - } - - UnLock(lock); - - return new ABoxFilesystemNode(newPath); -} - -AbstractFSList ABoxFilesystemNode::listRoot() +AbstractFSList ABoxFilesystemNode::getRootChildren() { - AbstractFSList myList; + AbstractFSList list; DosList *dosList; CONST ULONG lockDosListFlags = LDF_READ | LDF_VOLUMES; char name[256]; @@ -339,15 +353,15 @@ AbstractFSList ABoxFilesystemNode::listRoot() dosList = LockDosList(lockDosListFlags); if (dosList == NULL) { - return myList; + return list; } dosList = NextDosEntry(dosList, LDF_VOLUMES); while (dosList) { - if (dosList->dol_Type == DLT_VOLUME && // Should always be true, but ... - dosList->dol_Name && // Same here - dosList->dol_Task // Will be NULL if volume is removed from drive but still in use by some program + if (dosList->dol_Type == DLT_VOLUME && // Should always be true, but ... + dosList->dol_Name && // Same here + dosList->dol_Task // Will be NULL if volume is removed from drive but still in use by some program ) { ABoxFilesystemNode *entry; @@ -365,7 +379,7 @@ AbstractFSList ABoxFilesystemNode::listRoot() if (entry) { if (entry->isValid()) - myList.push_back(entry); + list.push_back(entry); else delete entry; } @@ -377,9 +391,7 @@ AbstractFSList ABoxFilesystemNode::listRoot() UnLockDosList(lockDosListFlags); - return myList; + return list; } #endif // defined(__MORPHOS__) - - diff --git a/backends/fs/palmos/palmos-fs-factory.cpp b/backends/fs/palmos/palmos-fs-factory.cpp new file mode 100644 index 0000000000..1b0db0f042 --- /dev/null +++ b/backends/fs/palmos/palmos-fs-factory.cpp @@ -0,0 +1,16 @@ +#include "backends/fs/palmos/palmos-fs-factory.h" +#include "backends/fs/palmos/palmos-fs.cpp" + +DECLARE_SINGLETON(PalmOSFilesystemFactory); + +AbstractFilesystemNode *PalmOSFilesystemFactory::makeRootFileNode() const { + return new PalmOSFilesystemNode(); +} + +AbstractFilesystemNode *PalmOSFilesystemFactory::makeCurrentDirectoryFileNode() const { + return new PalmOSFilesystemNode(); +} + +AbstractFilesystemNode *PalmOSFilesystemFactory::makeFileNodePath(const String &path) const { + return new PalmOSFilesystemNode(path); +} diff --git a/backends/fs/palmos/palmos-fs-factory.h b/backends/fs/palmos/palmos-fs-factory.h new file mode 100644 index 0000000000..cfe246e806 --- /dev/null +++ b/backends/fs/palmos/palmos-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef PALMOS_FILESYSTEM_FACTORY_H +#define PALMOS_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates PalmOSFilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class PalmOSFilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<PalmOSFilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + PalmOSFilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*PALMOS_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/palmos/palmos-fs.cpp b/backends/fs/palmos/palmos-fs.cpp index 2c524bb830..eae3581196 100644 --- a/backends/fs/palmos/palmos-fs.cpp +++ b/backends/fs/palmos/palmos-fs.cpp @@ -30,36 +30,68 @@ #include "common/stdafx.h" #include "backends/fs/abstract-fs.h" -/* +/** * Implementation of the ScummVM file system API based on PalmOS VFS API. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. */ - class PalmOSFilesystemNode : public AbstractFilesystemNode { protected: String _displayName; + String _path; bool _isDirectory; bool _isValid; bool _isPseudoRoot; - String _path; public: + /** + * Creates a PalmOSFilesystemNode with the root node as path. + */ PalmOSFilesystemNode(); + + /** + * Creates a POSIXFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + */ PalmOSFilesystemNode(const String &p); - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } - virtual bool isValid() const { return _isValid; } + virtual bool exists() const { return true; } //FIXME: this is just a stub + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } + virtual bool isReadable() const { return true; } //FIXME: this is just a stub + virtual bool isValid() const { return _isValid; } + virtual bool isWritable() const { return true; } //FIXME: this is just a stub - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *child(const String &n) const; + virtual AbstractFilesystemNode *getChild(const String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode) const; + virtual AbstractFilesystemNode *getParent() const; private: - static void addFile (AbstractFSList &list, ListMode mode, const Char *base, FileInfoType* find_data); + /** + * Adds a single WindowsFilesystemNode to a given list. + * This method is used by getChildren() to populate the directory entries list. + * + * @param list List to put the file entry node in. + * @param mode Mode to use while adding the file entry to the list. + * @param base String with the directory being listed. + * @param find_data Describes a file that the FindFirstFile, FindFirstFileEx, or FindNextFile functions find. + */ + static void addFile(AbstractFSList &list, ListMode mode, const Char *base, FileInfoType* find_data); }; +/** + * Returns the last component of a given path. + * + * Examples: + * /foo/bar.txt would return /bar.txt + * /foo/bar/ would return /bar/ + * + * @param str String containing the path. + * @return Pointer to the first char of the last component inside str. + */ static const char *lastPathComponent(const Common::String &str) { const char *start = str.c_str(); const char *cur = start + str.size() - 2; @@ -95,19 +127,6 @@ void PalmOSFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const ch list.push_back(new PalmOSFilesystemNode(entry)); } -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - return AbstractFilesystemNode::getRoot(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { - return new PalmOSFilesystemNode(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new PalmOSFilesystemNode(path); -} - - PalmOSFilesystemNode::PalmOSFilesystemNode() { _isDirectory = true; _displayName = "Root"; @@ -122,13 +141,13 @@ PalmOSFilesystemNode::PalmOSFilesystemNode(const String &p) { UInt32 attr; FileRef handle; - Err e = VFSFileOpen(gVars->VFS.volRefNum, _path.c_str(), vfsModeRead, &handle); - if (!e) { - e = VFSFileGetAttributes(handle, &attr); + Err error = VFSFileOpen(gVars->VFS.volRefNum, _path.c_str(), vfsModeRead, &handle); + if (!error) { + error = VFSFileGetAttributes(handle, &attr); VFSFileClose(handle); } - if (e) { + if (error) { _isValid = false; _isDirectory = false; @@ -139,8 +158,31 @@ PalmOSFilesystemNode::PalmOSFilesystemNode(const String &p) { _isPseudoRoot = false; } -bool PalmOSFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { - Err e; +AbstractFilesystemNode *PalmOSFilesystemNode::getChild(const String &n) const { + assert(_isDirectory); + + String newPath(_path); + if (_path.lastChar() != '/') + newPath += '/'; + newPath += n; + + FileRef handle; + UInt32 attr; + Err error = VFSFileOpen(gVars->VFS.volRefNum, newPath.c_str(), vfsModeRead, &handle); + if (error) + return 0; + + error = VFSFileGetAttributes(handle, &attr); + VFSFileClose(handle); + + if (error || !(attr & vfsFileAttrDirectory)) + return 0; + + return new PalmOSFilesystemNode(newPath); +} + +bool PalmOSFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode) const { + Err error; Char nameP[256]; FileInfoType desc; FileRef handle; @@ -148,14 +190,14 @@ bool PalmOSFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const desc.nameP = nameP; desc.nameBufLen = 256; - e = VFSFileOpen(gVars->VFS.volRefNum, _path.c_str(), vfsModeRead, &handle); + error = VFSFileOpen(gVars->VFS.volRefNum, _path.c_str(), vfsModeRead, &handle); - if (e) + if (error) return false; while(dirIterator != expIteratorStop) { - e = VFSDirEntryEnumerate(handle, &dirIterator, &desc); - if (!e) { + error = VFSDirEntryEnumerate(handle, &dirIterator, &desc); + if (!error) { addFile(myList, mode, _path.c_str(), &desc); } } @@ -165,8 +207,7 @@ bool PalmOSFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const return true; } - -AbstractFilesystemNode *PalmOSFilesystemNode::parent() const { +AbstractFilesystemNode *PalmOSFilesystemNode::getParent() const { PalmOSFilesystemNode *p = 0; if (!_isPseudoRoot) { @@ -180,31 +221,7 @@ AbstractFilesystemNode *PalmOSFilesystemNode::parent() const { p->_displayName = lastPathComponent(p->_path); p->_isPseudoRoot =(p->_path == "/"); } - return p; -} - - -AbstractFilesystemNode *PalmOSFilesystemNode::child(const String &n) const { - assert(_isDirectory); - String newPath(_path); - - if (_path.lastChar() != '/') - newPath += '/'; - newPath += n; - - FileRef handle; - UInt32 attr; - Err e = VFSFileOpen(gVars->VFS.volRefNum, newPath.c_str(), vfsModeRead, &handle); - if (e) - return 0; - e = VFSFileGetAttributes(handle, &attr); - VFSFileClose(handle); - - if (e || !(attr & vfsFileAttrDirectory)) - return 0; - - PalmOSFilesystemNode *p = new PalmOSFilesystemNode(newPath); return p; } diff --git a/backends/fs/posix/posix-fs-factory.cpp b/backends/fs/posix/posix-fs-factory.cpp new file mode 100644 index 0000000000..bed3dc5f8f --- /dev/null +++ b/backends/fs/posix/posix-fs-factory.cpp @@ -0,0 +1,18 @@ +#include "backends/fs/posix/posix-fs-factory.h" +#include "backends/fs/posix/posix-fs.cpp" + +DECLARE_SINGLETON(POSIXFilesystemFactory); + +AbstractFilesystemNode *POSIXFilesystemFactory::makeRootFileNode() const { + return new POSIXFilesystemNode(); +} + +AbstractFilesystemNode *POSIXFilesystemFactory::makeCurrentDirectoryFileNode() const { + char buf[MAXPATHLEN]; + getcwd(buf, MAXPATHLEN); + return new POSIXFilesystemNode(buf, true); +} + +AbstractFilesystemNode *POSIXFilesystemFactory::makeFileNodePath(const String &path) const { + return new POSIXFilesystemNode(path, true); +} diff --git a/backends/fs/posix/posix-fs-factory.h b/backends/fs/posix/posix-fs-factory.h new file mode 100644 index 0000000000..93f0ac115b --- /dev/null +++ b/backends/fs/posix/posix-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef POSIX_FILESYSTEM_FACTORY_H +#define POSIX_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates POSIXFilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class POSIXFilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<POSIXFilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + POSIXFilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*POSIX_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp index ba1668a390..385bab833c 100644 --- a/backends/fs/posix/posix-fs.cpp +++ b/backends/fs/posix/posix-fs.cpp @@ -25,7 +25,6 @@ #if defined(UNIX) #include "common/stdafx.h" - #include "backends/fs/abstract-fs.h" #ifdef MACOSX @@ -37,33 +36,61 @@ #include <stdio.h> #include <unistd.h> -/* +/** * Implementation of the ScummVM file system API based on POSIX. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. */ - class POSIXFilesystemNode : public AbstractFilesystemNode { protected: String _displayName; + String _path; bool _isDirectory; bool _isValid; - String _path; public: + /** + * Creates a POSIXFilesystemNode with the root node as path. + */ POSIXFilesystemNode(); + + /** + * Creates a POSIXFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + * @param verify true if the isValid and isDirectory flags should be verified during the construction. + */ POSIXFilesystemNode(const String &path, bool verify); - - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } - virtual bool isValid() const { return _isValid; } + + virtual bool exists() const { return access(_path.c_str(), F_OK) == 0; } + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } - - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *child(const String &n) const; + virtual bool isReadable() const { return access(_path.c_str(), R_OK) == 0; } + virtual bool isWritable() const { return access(_path.c_str(), W_OK) == 0; } + + virtual AbstractFilesystemNode *getChild(const String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode, bool hidden) const; + virtual AbstractFilesystemNode *getParent() const; + +private: + /** + * Tests and sets the _isValid and _isDirectory flags, using the stat() function. + */ + virtual void setFlags(); }; - +/** + * Returns the last component of a given path. + * + * Examples: + * /foo/bar.txt would return /bar.txt + * /foo/bar/ would return /bar/ + * + * @param str String containing the path. + * @return Pointer to the first char of the last component inside str. + */ static const char *lastPathComponent(const Common::String &str) { const char *start = str.c_str(); const char *cur = start + str.size() - 2; @@ -75,18 +102,11 @@ static const char *lastPathComponent(const Common::String &str) { return cur + 1; } -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - char buf[MAXPATHLEN]; - getcwd(buf, MAXPATHLEN); - return new POSIXFilesystemNode(buf, true); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { - return new POSIXFilesystemNode(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new POSIXFilesystemNode(path, true); +void POSIXFilesystemNode::setFlags() { + struct stat st; + + _isValid = (0 == stat(_path.c_str(), &st)); + _isDirectory = _isValid ? S_ISDIR(st.st_mode) : false; } POSIXFilesystemNode::POSIXFilesystemNode() { @@ -123,30 +143,44 @@ POSIXFilesystemNode::POSIXFilesystemNode(const String &p, bool verify) { _path = p; _displayName = lastPathComponent(_path); - _isValid = true; - _isDirectory = true; if (verify) { - struct stat st; - _isValid = (0 == stat(_path.c_str(), &st)); - _isDirectory = _isValid ? S_ISDIR(st.st_mode) : false; + setFlags(); } } -bool POSIXFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { +AbstractFilesystemNode *POSIXFilesystemNode::getChild(const String &n) const { + // FIXME: Pretty lame implementation! We do no error checking to speak + // of, do not check if this is a special node, etc. assert(_isDirectory); - DIR *dirp = opendir(_path.c_str()); + + String newPath(_path); + if (_path.lastChar() != '/') + newPath += '/'; + newPath += n; + + return new POSIXFilesystemNode(newPath, true); +} +bool POSIXFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode, bool hidden) const { + assert(_isDirectory); + + DIR *dirp = opendir(_path.c_str()); struct dirent *dp; if (dirp == NULL) return false; - // ... loop over dir entries using readdir + // loop over dir entries using readdir while ((dp = readdir(dirp)) != NULL) { - // Skip 'invisible' files - if (dp->d_name[0] == '.') + // Skip 'invisible' files if necessary + if (dp->d_name[0] == '.' && !hidden) { + continue; + } + // Skip '.' and '..' to avoid cycles + if((dp->d_name[0] == '.' && dp->d_name[1] == 0) || (dp->d_name[0] == '.' && dp->d_name[1] == '.')) { continue; + } String newPath(_path); if (newPath.lastChar() != '/') @@ -156,18 +190,18 @@ bool POSIXFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { POSIXFilesystemNode entry(newPath, false); #if defined(SYSTEM_NOT_SUPPORTING_D_TYPE) - // TODO: d_type is not part of POSIX, so it might not be supported - // on some of our targets. For those systems where it isn't supported, - // add this #elif case, which tries to use stat() instead. - struct stat st; - entry._isValid = (0 == stat(entry._path.c_str(), &st)); - entry._isDirectory = entry._isValid ? S_ISDIR(st.st_mode) : false; + /* TODO: d_type is not part of POSIX, so it might not be supported + * on some of our targets. For those systems where it isn't supported, + * add this #elif case, which tries to use stat() instead. + * + * The d_type method is used to avoid costly recurrent stat() calls in big + * directories. + */ + entry.setFlags(); #else if (dp->d_type == DT_UNKNOWN) { // Fall back to stat() - struct stat st; - entry._isValid = (0 == stat(entry._path.c_str(), &st)); - entry._isDirectory = entry._isValid ? S_ISDIR(st.st_mode) : false; + entry.setFlags(); } else { entry._isValid = (dp->d_type == DT_DIR) || (dp->d_type == DT_REG) || (dp->d_type == DT_LNK); if (dp->d_type == DT_LNK) { @@ -194,35 +228,22 @@ bool POSIXFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { if (entry._isDirectory) entry._path += "/"; + myList.push_back(new POSIXFilesystemNode(entry)); } closedir(dirp); + return true; } -AbstractFilesystemNode *POSIXFilesystemNode::parent() const { +AbstractFilesystemNode *POSIXFilesystemNode::getParent() const { if (_path == "/") return 0; const char *start = _path.c_str(); const char *end = lastPathComponent(_path); - POSIXFilesystemNode *p = new POSIXFilesystemNode(String(start, end - start), false); - - return p; -} - -AbstractFilesystemNode *POSIXFilesystemNode::child(const String &n) const { - // FIXME: Pretty lame implementation! We do no error checking to speak - // of, do not check if this is a special node, etc. - assert(_isDirectory); - String newPath(_path); - if (_path.lastChar() != '/') - newPath += '/'; - newPath += n; - POSIXFilesystemNode *p = new POSIXFilesystemNode(newPath, true); - - return p; + return new POSIXFilesystemNode(String(start, end - start), false); } -#endif // defined(UNIX) +#endif //#if defined(UNIX) diff --git a/backends/fs/ps2/ps2-fs-factory.cpp b/backends/fs/ps2/ps2-fs-factory.cpp new file mode 100644 index 0000000000..5f10974501 --- /dev/null +++ b/backends/fs/ps2/ps2-fs-factory.cpp @@ -0,0 +1,16 @@ +#include "backends/fs/ps2/ps2-fs-factory.h" +#include "backends/fs/ps2/ps2-fs.cpp" + +DECLARE_SINGLETON(Ps2FilesystemFactory); + +AbstractFilesystemNode *Ps2FilesystemFactory::makeRootFileNode() const { + return new Ps2FilesystemNode(); +} + +AbstractFilesystemNode *Ps2FilesystemFactory::makeCurrentDirectoryFileNode() const { + return new Ps2FilesystemNode(); +} + +AbstractFilesystemNode *Ps2FilesystemFactory::makeFileNodePath(const String &path) const { + return new Ps2FilesystemNode(path); +} diff --git a/backends/fs/ps2/ps2-fs-factory.h b/backends/fs/ps2/ps2-fs-factory.h new file mode 100644 index 0000000000..6f0da114c5 --- /dev/null +++ b/backends/fs/ps2/ps2-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef PS2_FILESYSTEM_FACTORY_H +#define PS2_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates PS2FilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class Ps2FilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<Ps2FilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + Ps2FilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*PS2_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/ps2/ps2-fs.cpp b/backends/fs/ps2/ps2-fs.cpp index afe1842e43..9d8e360f64 100644 --- a/backends/fs/ps2/ps2-fs.cpp +++ b/backends/fs/ps2/ps2-fs.cpp @@ -32,44 +32,52 @@ extern AsyncFio fio; extern OSystem_PS2 *g_systemPs2; +/** + * Implementation of the ScummVM file system API based on the Ps2SDK. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. + */ class Ps2FilesystemNode : public AbstractFilesystemNode { protected: String _displayName; + String _path; bool _isDirectory; bool _isRoot; - String _path; public: - Ps2FilesystemNode(void); - Ps2FilesystemNode(const Ps2FilesystemNode *node); + /** + * Creates a PS2FilesystemNode with the root node as path. + */ + Ps2FilesystemNode(); + + /** + * Creates a PS2FilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + */ Ps2FilesystemNode(const String &path); + + /** + * Copy constructor. + */ + Ps2FilesystemNode(const Ps2FilesystemNode *node); - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } - virtual bool isValid() const { return !_isRoot; } + virtual bool exists() const { return true; } //FIXME: this is just a stub + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } + virtual bool isReadable() const { return true; } //FIXME: this is just a stub + virtual bool isValid() const { return !_isRoot; } + virtual bool isWritable() const { return true; } //FIXME: this is just a stub - //virtual FSList listDir(ListMode) const; - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *clone() const { return new Ps2FilesystemNode(this); } - virtual AbstractFilesystemNode *child(const String &n) const; + virtual AbstractFilesystemNode *getChild(const String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode) const; + virtual AbstractFilesystemNode *getParent() const; }; -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - return AbstractFilesystemNode::getRoot(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getRoot(void) { - return new Ps2FilesystemNode(); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new Ps2FilesystemNode(path); -} - -Ps2FilesystemNode::Ps2FilesystemNode(void) { +Ps2FilesystemNode::Ps2FilesystemNode() { _isDirectory = true; _isRoot = true; _displayName = "PlayStation 2"; @@ -108,7 +116,41 @@ Ps2FilesystemNode::Ps2FilesystemNode(const Ps2FilesystemNode *node) { _isRoot = node->_isRoot; } -bool Ps2FilesystemNode::listDir(AbstractFSList &list, ListMode mode) const { +AbstractFilesystemNode *Ps2FilesystemNode::getChild(const String &n) const { + if (!_isDirectory) + return NULL; + + char listDir[256]; + sprintf(listDir, "%s/", _path.c_str()); + int fd = fio.dopen(listDir); + + if (fd >= 0) { + iox_dirent_t dirent; + + while (fio.dread(fd, &dirent) > 0) { + if (strcmp(n.c_str(), dirent.name) == 0) { + Ps2FilesystemNode *dirEntry = new Ps2FilesystemNode(); + + dirEntry->_isDirectory = (bool)(dirent.stat.mode & FIO_S_IFDIR); + dirEntry->_isRoot = false; + + dirEntry->_path = _path; + dirEntry->_path += "/"; + dirEntry->_path += dirent.name; + + dirEntry->_displayName = dirent.name; + + fio.dclose(fd); + return dirEntry; + } + } + fio.dclose(fd); + } + + return NULL; +} + +bool Ps2FilesystemNode::getChildren(AbstractFSList &list, ListMode mode) const { if (!_isDirectory) return false; @@ -135,6 +177,7 @@ bool Ps2FilesystemNode::listDir(AbstractFSList &list, ListMode mode) const { } else { char listDir[256]; int fd; + if (_path.lastChar() == '/') fd = fio.dopen(_path.c_str()); else { @@ -173,7 +216,7 @@ bool Ps2FilesystemNode::listDir(AbstractFSList &list, ListMode mode) const { } } -AbstractFilesystemNode *Ps2FilesystemNode::parent() const { +AbstractFilesystemNode *Ps2FilesystemNode::getParent() const { if (_isRoot) return new Ps2FilesystemNode(this); @@ -191,36 +234,3 @@ AbstractFilesystemNode *Ps2FilesystemNode::parent() const { else return new Ps2FilesystemNode(); } - -AbstractFilesystemNode *Ps2FilesystemNode::child(const String &n) const { - if (!_isDirectory) - return NULL; - - char listDir[256]; - sprintf(listDir, "%s/", _path.c_str()); - int fd = fio.dopen(listDir); - - if (fd >= 0) { - iox_dirent_t dirent; - - while (fio.dread(fd, &dirent) > 0) { - if (strcmp(n.c_str(), dirent.name) == 0) { - Ps2FilesystemNode *dirEntry = new Ps2FilesystemNode(); - - dirEntry->_isDirectory = (bool)(dirent.stat.mode & FIO_S_IFDIR); - dirEntry->_isRoot = false; - - dirEntry->_path = _path; - dirEntry->_path += "/"; - dirEntry->_path += dirent.name; - - dirEntry->_displayName = dirent.name; - - fio.dclose(fd); - return dirEntry; - } - } - fio.dclose(fd); - } - return NULL; -} diff --git a/backends/fs/psp/psp-fs-factory.cpp b/backends/fs/psp/psp-fs-factory.cpp new file mode 100644 index 0000000000..6fc829baf1 --- /dev/null +++ b/backends/fs/psp/psp-fs-factory.cpp @@ -0,0 +1,16 @@ +#include "backends/fs/psp/psp-fs-factory.h" +#include "backends/fs/psp/psp_fs.cpp" + +DECLARE_SINGLETON(PSPFilesystemFactory); + +AbstractFilesystemNode *PSPFilesystemFactory::makeRootFileNode() const { + return new PSPFilesystemNode(); +} + +AbstractFilesystemNode *PSPFilesystemFactory::makeCurrentDirectoryFileNode() const { + return new PSPFilesystemNode(); +} + +AbstractFilesystemNode *PSPFilesystemFactory::makeFileNodePath(const String &path) const { + return new PSPFilesystemNode(path, true); +} diff --git a/backends/fs/psp/psp-fs-factory.h b/backends/fs/psp/psp-fs-factory.h new file mode 100644 index 0000000000..b1a44b90c4 --- /dev/null +++ b/backends/fs/psp/psp-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef PSP_FILESYSTEM_FACTORY_H +#define PSP_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates PSPFilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class PSPFilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<PSPFilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + PSPFilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*PSP_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/psp/psp_fs.cpp b/backends/fs/psp/psp_fs.cpp index 3f25a63f86..5b0faf3847 100644 --- a/backends/fs/psp/psp_fs.cpp +++ b/backends/fs/psp/psp_fs.cpp @@ -23,8 +23,8 @@ */ #ifdef __PSP__ -#include "engines/engine.h" +#include "engines/engine.h" #include "backends/fs/abstract-fs.h" #include <sys/stat.h> @@ -32,39 +32,65 @@ #define ROOT_PATH "ms0:/" - -/* +/** * Implementation of the ScummVM file system API based on PSPSDK API. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. */ - class PSPFilesystemNode : public AbstractFilesystemNode { protected: String _displayName; + String _path; bool _isDirectory; bool _isValid; - String _path; public: + /** + * Creates a PSPFilesystemNode with the root node as path. + */ PSPFilesystemNode(); + + /** + * Creates a PSPFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + * @param verify true if the isValid and isDirectory flags should be verified during the construction. + */ PSPFilesystemNode(const Common::String &p, bool verify); - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } - virtual bool isValid() const { return _isValid; } + virtual bool exists() const { return true; } //FIXME: this is just a stub + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } + virtual bool isReadable() const { return true; } //FIXME: this is just a stub + virtual bool isValid() const { return _isValid; } + virtual bool isWritable() const { return true; } //FIXME: this is just a stub - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *child(const String &n) const; + virtual AbstractFilesystemNode *getChild(const String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode) const; + virtual AbstractFilesystemNode *getParent() const; }; -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - return AbstractFilesystemNode::getRoot(); -} +/** + * Returns the last component of a given path. + * + * Examples: + * /foo/bar.txt would return /bar.txt + * /foo/bar/ would return /bar/ + * + * @param str String containing the path. + * @return Pointer to the first char of the last component inside str. + */ +static const char *lastPathComponent(const Common::String &str) { + const char *start = str.c_str(); + const char *cur = start + str.size() - 2; -AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { - return new PSPFilesystemNode(); + while (cur >= start && *cur != '/') { + --cur; + } + + return cur + 1; } PSPFilesystemNode::PSPFilesystemNode() { @@ -89,12 +115,20 @@ PSPFilesystemNode::PSPFilesystemNode(const Common::String &p, bool verify) { } } -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new PSPFilesystemNode(path, true); -} +AbstractFilesystemNode *PSPFilesystemNode::getChild(const String &n) const { + // FIXME: Pretty lame implementation! We do no error checking to speak + // of, do not check if this is a special node, etc. + assert(_isDirectory); + + String newPath(_path); + if (_path.lastChar() != '/') + newPath += '/'; + newPath += n; + return new PSPFilesystemNode(newPath, true); +} -bool PSPFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { +bool PSPFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode) const { assert(_isDirectory); int dfd = sceIoDopen(_path.c_str()); @@ -133,18 +167,7 @@ bool PSPFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { } } -static const char *lastPathComponent(const Common::String &str) { - const char *start = str.c_str(); - const char *cur = start + str.size() - 2; - - while (cur >= start && *cur != '/') { - --cur; - } - - return cur + 1; -} - -AbstractFilesystemNode *PSPFilesystemNode::parent() const { +AbstractFilesystemNode *PSPFilesystemNode::getParent() const { assert(_isValid); if (_path == ROOT_PATH) @@ -153,22 +176,7 @@ AbstractFilesystemNode *PSPFilesystemNode::parent() const { const char *start = _path.c_str(); const char *end = lastPathComponent(_path); - PSPFilesystemNode *p = new PSPFilesystemNode(String(start, end - start), false); - - return p; -} - -AbstractFilesystemNode *PSPFilesystemNode::child(const String &n) const { - // FIXME: Pretty lame implementation! We do no error checking to speak - // of, do not check if this is a special node, etc. - assert(_isDirectory); - String newPath(_path); - if (_path.lastChar() != '/') - newPath += '/'; - newPath += n; - PSPFilesystemNode *p = new PSPFilesystemNode(newPath, true); - - return p; + return new PSPFilesystemNode(String(start, end - start), false); } -#endif // PSP +#endif //#ifdef __PSP__ diff --git a/backends/fs/symbian/symbian-fs-factory.cpp b/backends/fs/symbian/symbian-fs-factory.cpp new file mode 100644 index 0000000000..87b1f0f05d --- /dev/null +++ b/backends/fs/symbian/symbian-fs-factory.cpp @@ -0,0 +1,18 @@ +#include "backends/fs/symbian/symbian-fs-factory.h" +#include "backends/fs/symbian/symbian-fs.cpp" + +DECLARE_SINGLETON(SymbianFilesystemFactory); + +AbstractFilesystemNode *SymbianFilesystemFactory::makeRootFileNode() const { + return new SymbianFilesystemNode(true); +} + +AbstractFilesystemNode *SymbianFilesystemFactory::makeCurrentDirectoryFileNode() const { + char path[MAXPATHLEN]; + getcwd(path, MAXPATHLEN); + return new SymbianFilesystemNode(path); +} + +AbstractFilesystemNode *SymbianFilesystemFactory::makeFileNodePath(const String &path) const { + return new SymbianFilesystemNode(path); +} diff --git a/backends/fs/symbian/symbian-fs-factory.h b/backends/fs/symbian/symbian-fs-factory.h new file mode 100644 index 0000000000..69749cbd7e --- /dev/null +++ b/backends/fs/symbian/symbian-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef SYMBIAN_FILESYSTEM_FACTORY_H +#define SYMBIAN_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates SymbianFilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class SymbianFilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<SymbianFilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + SymbianFilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*SYMBIAN_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/symbian/symbian-fs.cpp b/backends/fs/symbian/symbian-fs.cpp index 8a4c2abaf2..5c3dd74f5c 100644 --- a/backends/fs/symbian/symbian-fs.cpp +++ b/backends/fs/symbian/symbian-fs.cpp @@ -31,33 +31,58 @@ #include <f32file.h> #include <bautils.h> -/* +/** * Implementation of the ScummVM file system API based on POSIX. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. */ - class SymbianFilesystemNode : public AbstractFilesystemNode { protected: String _displayName; + String _path; bool _isDirectory; bool _isValid; - String _path; bool _isPseudoRoot; public: + /** + * Creates a SymbianFilesystemNode with the root node as path. + * + * @param aIsRoot true if the node will be a pseudo root, false otherwise. + */ SymbianFilesystemNode(bool aIsRoot); + + /** + * Creates a SymbianFilesystemNode for a given path. + * + * @param path String with the path the new node should point to. + */ SymbianFilesystemNode(const String &path); - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } - virtual bool isValid() const { return _isValid; } + + virtual bool exists() const { return true; } //FIXME: this is just a stub + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } + virtual bool isReadable() const { return true; } //FIXME: this is just a stub + virtual bool isValid() const { return _isValid; } + virtual bool isWritable() const { return true; } //FIXME: this is just a stub - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *child(const String &n) const; + virtual AbstractFilesystemNode *getChild(const String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode) const; + virtual AbstractFilesystemNode *getParent() const; }; - +/** + * Returns the last component of a given path. + * + * Examples: + * c:\foo\bar.txt would return "\bar.txt" + * c:\foo\bar\ would return "\bar\" + * + * @param str Path to obtain the last component from. + * @return Pointer to the first char of the last component inside str. + */ static const char *lastPathComponent(const Common::String &str) { const char *start = str.c_str(); const char *cur = start + str.size() - 2; @@ -69,6 +94,11 @@ static const char *lastPathComponent(const Common::String &str) { return cur + 1; } +/** + * Fixes the path by changing all slashes to backslashes. + * + * @param path String with the path to be fixed. + */ static void fixFilePath(Common::String& path) { TInt len = path.size(); @@ -79,20 +109,6 @@ static void fixFilePath(Common::String& path) { } } -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - char path[MAXPATHLEN]; - getcwd(path, MAXPATHLEN); - return new SymbianFilesystemNode(path); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { - return new SymbianFilesystemNode(true); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new SymbianFilesystemNode(path); -} - SymbianFilesystemNode::SymbianFilesystemNode(bool aIsRoot) { _path = ""; _isValid = true; @@ -128,7 +144,26 @@ SymbianFilesystemNode::SymbianFilesystemNode(const String &path) { } } -bool SymbianFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { +AbstractFilesystemNode *SymbianFilesystemNode::getChild(const String &n) const { + assert(_isDirectory); + String newPath(_path); + + if (_path.lastChar() != '\\') + newPath += '\\'; + newPath += n; + + TPtrC8 ptr((const unsigned char*) newPath.c_str(), newPath.size()); + TFileName fname; + fname.Copy(ptr); + TBool isFolder = EFalse; + BaflUtils::IsFolder(CEikonEnv::Static()->FsSession(), fname, isFolder); + if(!isFolder) + return 0; + + return new SymbianFilesystemNode(newPath); +} + +bool SymbianFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode) const { assert(_isDirectory); if (_isPseudoRoot) { @@ -199,18 +234,18 @@ bool SymbianFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const } CleanupStack::PopAndDestroy(dirPtr); } - } + return true; } -AbstractFilesystemNode *SymbianFilesystemNode::parent() const { +AbstractFilesystemNode *SymbianFilesystemNode::getParent() const { SymbianFilesystemNode *p =NULL; // Root node is its own parent. Still we can't just return this // as the GUI code will call delete on the old node. if (!_isPseudoRoot && _path.size() > 3) { - p=new SymbianFilesystemNode(false); + p = new SymbianFilesystemNode(false); const char *start = _path.c_str(); const char *end = lastPathComponent(_path); @@ -221,29 +256,10 @@ AbstractFilesystemNode *SymbianFilesystemNode::parent() const { } else { - p=new SymbianFilesystemNode(true); + p = new SymbianFilesystemNode(true); } + return p; } -AbstractFilesystemNode *SymbianFilesystemNode::child(const String &n) const { - assert(_isDirectory); - String newPath(_path); - - if (_path.lastChar() != '\\') - newPath += '\\'; - newPath += n; - - TPtrC8 ptr((const unsigned char*) newPath.c_str(), newPath.size()); - TFileName fname; - fname.Copy(ptr); - TBool isFolder = EFalse; - BaflUtils::IsFolder(CEikonEnv::Static()->FsSession(), fname, isFolder); - if(!isFolder) - return 0; - - SymbianFilesystemNode *p = new SymbianFilesystemNode(newPath); - return p; -} - -#endif // defined(__SYMBIAN32__) +#endif //#if defined (__SYMBIAN32__) diff --git a/backends/fs/windows/windows-fs-factory.cpp b/backends/fs/windows/windows-fs-factory.cpp new file mode 100644 index 0000000000..76b62e5deb --- /dev/null +++ b/backends/fs/windows/windows-fs-factory.cpp @@ -0,0 +1,16 @@ +#include "backends/fs/windows/windows-fs-factory.h" +#include "backends/fs/windows/windows-fs.cpp" + +DECLARE_SINGLETON(WindowsFilesystemFactory); + +AbstractFilesystemNode *WindowsFilesystemFactory::makeRootFileNode() const { + return new WindowsFilesystemNode(); +} + +AbstractFilesystemNode *WindowsFilesystemFactory::makeCurrentDirectoryFileNode() const { + return new WindowsFilesystemNode(NULL, true); +} + +AbstractFilesystemNode *WindowsFilesystemFactory::makeFileNodePath(const String &path) const { + return new WindowsFilesystemNode(path, false); +} diff --git a/backends/fs/windows/windows-fs-factory.h b/backends/fs/windows/windows-fs-factory.h new file mode 100644 index 0000000000..7d17802b52 --- /dev/null +++ b/backends/fs/windows/windows-fs-factory.h @@ -0,0 +1,27 @@ +#ifndef WINDOWS_FILESYSTEM_FACTORY_H +#define WINDOWS_FILESYSTEM_FACTORY_H + +#include "common/singleton.h" +#include "backends/fs/abstract-fs-factory.h" + +/** + * Creates WindowsFilesystemNode objects. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemFactory. + */ +class WindowsFilesystemFactory : public AbstractFilesystemFactory, public Common::Singleton<WindowsFilesystemFactory> { +public: + typedef Common::String String; + + virtual AbstractFilesystemNode *makeRootFileNode() const; + virtual AbstractFilesystemNode *makeCurrentDirectoryFileNode() const; + virtual AbstractFilesystemNode *makeFileNodePath(const String &path) const; + +protected: + WindowsFilesystemFactory() {}; + +private: + friend class Common::Singleton<SingletonBaseType>; +}; + +#endif /*WINDOWS_FILESYSTEM_FACTORY_H*/ diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp index 0e12c4a96a..5a9e1c65b6 100644 --- a/backends/fs/windows/windows-fs.cpp +++ b/backends/fs/windows/windows-fs.cpp @@ -29,6 +29,7 @@ #endif #include "common/stdafx.h" #include "backends/fs/abstract-fs.h" +#include <io.h> #include <stdio.h> #include <stdlib.h> #ifndef _WIN32_WCE @@ -36,39 +37,93 @@ #endif #include <tchar.h> -/* +/** * Implementation of the ScummVM file system API based on Windows API. + * + * Parts of this class are documented in the base interface class, AbstractFilesystemNode. */ - class WindowsFilesystemNode : public AbstractFilesystemNode { protected: String _displayName; + String _path; bool _isDirectory; - bool _isValid; bool _isPseudoRoot; - String _path; + bool _isValid; public: + /** + * Creates a WindowsFilesystemNode with the root node as path. + * + * In regular windows systems, a virtual root path is used "". + * In windows CE, the "\" root is used instead. + */ WindowsFilesystemNode(); - WindowsFilesystemNode(const String &path); - - virtual String displayName() const { return _displayName; } - virtual String name() const { return _displayName; } - virtual bool isValid() const { return _isValid; } + + /** + * Creates a WindowsFilesystemNode for a given path. + * + * Examples: + * path=c:\foo\bar.txt, currentDir=false -> c:\foo\bar.txt + * path=c:\foo\bar.txt, currentDir=true -> current directory + * path=NULL, currentDir=true -> current directory + * + * @param path String with the path the new node should point to. + * @param currentDir if true, the path parameter will be ignored and the resulting node will point to the current directory. + */ + WindowsFilesystemNode(const String &path, const bool currentDir); + + virtual bool exists() const { return _access(_path.c_str(), F_OK) == 0; } + virtual String getDisplayName() const { return _displayName; } + virtual String getName() const { return _displayName; } + virtual String getPath() const { return _path; } virtual bool isDirectory() const { return _isDirectory; } - virtual String path() const { return _path; } + virtual bool isReadable() const { return _access(_path.c_str(), R_OK) == 0; } + virtual bool isValid() const { return _isValid; } + virtual bool isWritable() const { return _access(_path.c_str(), W_OK) == 0; } - virtual bool listDir(AbstractFSList &list, ListMode mode) const; - virtual AbstractFilesystemNode *parent() const; - virtual AbstractFilesystemNode *child(const String &n) const; + virtual AbstractFilesystemNode *getChild(const String &n) const; + virtual bool getChildren(AbstractFSList &list, ListMode mode) const; + virtual AbstractFilesystemNode *getParent() const; private: - static char *toAscii(TCHAR *x); - static const TCHAR* toUnicode(const char *x); - static void addFile (AbstractFSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data); + /** + * Adds a single WindowsFilesystemNode to a given list. + * This method is used by getChildren() to populate the directory entries list. + * + * @param list List to put the file entry node in. + * @param mode Mode to use while adding the file entry to the list. + * @param base String with the directory being listed. + * @param find_data Describes a file that the FindFirstFile, FindFirstFileEx, or FindNextFile functions find. + */ + static void addFile(AbstractFSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data); + + /** + * Converts a Unicode string to Ascii format. + * + * @param str String to convert from Unicode to Ascii. + * @return str in Ascii format. + */ + static char *toAscii(TCHAR *str); + + /** + * Converts an Ascii string to Unicode format. + * + * @param str String to convert from Ascii to Unicode. + * @return str in Unicode format. + */ + static const TCHAR* toUnicode(const char *str); }; - +/** + * Returns the last component of a given path. + * + * Examples: + * c:\foo\bar.txt would return "\bar.txt" + * c:\foo\bar\ would return "\bar\" + * + * @param str Path to obtain the last component from. + * @return Pointer to the first char of the last component inside str. + */ static const char *lastPathComponent(const Common::String &str) { const char *start = str.c_str(); const char *cur = start + str.size() - 2; @@ -80,27 +135,6 @@ static const char *lastPathComponent(const Common::String &str) { return cur + 1; } -char* WindowsFilesystemNode::toAscii(TCHAR *x) { - -#ifndef UNICODE - return (char*)x; -#else - static char asciiString[MAX_PATH]; - WideCharToMultiByte(CP_ACP, 0, x, _tcslen(x) + 1, asciiString, sizeof(asciiString), NULL, NULL); - return asciiString; -#endif -} - -const TCHAR* WindowsFilesystemNode::toUnicode(const char *x) { -#ifndef UNICODE - return (const TCHAR *)x; -#else - static TCHAR unicodeString[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, x, strlen(x) + 1, unicodeString, sizeof(unicodeString) / sizeof(TCHAR)); - return unicodeString; -#endif -} - void WindowsFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data) { WindowsFilesystemNode entry; char *asciiName = toAscii(find_data->cFileName); @@ -128,25 +162,24 @@ void WindowsFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const c list.push_back(new WindowsFilesystemNode(entry)); } -AbstractFilesystemNode *AbstractFilesystemNode::getCurrentDirectory() { - char path[MAX_PATH]; - GetCurrentDirectory(MAX_PATH, path); - - // Add a trailing slash, if necessary. - if (path[0] != 0) { - if (path[strlen(path) - 1] != '\\') - strcat(path, "\\"); - } - - return new WindowsFilesystemNode(path); -} - -AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { - return new WindowsFilesystemNode(); +char* WindowsFilesystemNode::toAscii(TCHAR *str) { +#ifndef UNICODE + return (char*)str; +#else + static char asciiString[MAX_PATH]; + WideCharToMultiByte(CP_ACP, 0, str, _tcslen(str) + 1, asciiString, sizeof(asciiString), NULL, NULL); + return asciiString; +#endif } -AbstractFilesystemNode *AbstractFilesystemNode::getNodeForPath(const String &path) { - return new WindowsFilesystemNode(path); +const TCHAR* WindowsFilesystemNode::toUnicode(const char *str) { +#ifndef UNICODE + return (const TCHAR *)str; +#else + static TCHAR unicodeString[MAX_PATH]; + MultiByteToWideChar(CP_ACP, 0, str, strlen(str) + 1, unicodeString, sizeof(unicodeString) / sizeof(TCHAR)); + return unicodeString; +#endif } WindowsFilesystemNode::WindowsFilesystemNode() { @@ -165,26 +198,55 @@ WindowsFilesystemNode::WindowsFilesystemNode() { #endif } -WindowsFilesystemNode::WindowsFilesystemNode(const String &p) { - assert(p.size() > 0); +WindowsFilesystemNode::WindowsFilesystemNode(const String &p, const bool currentDir) { + if (currentDir) { + char path[MAX_PATH]; + GetCurrentDirectory(MAX_PATH, path); - _path = p; + // Add a trailing slash, if necessary. + if (path[0] != 0) { + if (path[strlen(path) - 1] != '\\') + strcat(path, "\\"); + } + _path = path; + } + else { + assert(p.size() > 0); + _path = p; + } + _displayName = lastPathComponent(_path); // Check whether it is a directory, and whether the file actually exists DWORD fileAttribs = GetFileAttributes(toUnicode(_path.c_str())); if (fileAttribs == INVALID_FILE_ATTRIBUTES) { - _isValid = false; _isDirectory = false; + _isValid = false; } else { - _isValid = true; _isDirectory = ((fileAttribs & FILE_ATTRIBUTE_DIRECTORY) != 0); + _isValid = true; } _isPseudoRoot = false; } -bool WindowsFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { +AbstractFilesystemNode *WindowsFilesystemNode::getChild(const String &n) const { + assert(_isDirectory); + + String newPath(_path); + if (_path.lastChar() != '\\') + newPath += '\\'; + newPath += n; + + // Check whether the directory actually exists + DWORD fileAttribs = GetFileAttributes(toUnicode(newPath.c_str())); + if (fileAttribs == INVALID_FILE_ATTRIBUTES) + return 0; + + return new WindowsFilesystemNode(newPath, false); +} + +bool WindowsFilesystemNode::getChildren(AbstractFSList &myList, ListMode mode) const { assert(_isDirectory); if (_isPseudoRoot) { @@ -218,9 +280,12 @@ bool WindowsFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const sprintf(searchPath, "%s*", _path.c_str()); handle = FindFirstFile(toUnicode(searchPath), &desc); + if (handle == INVALID_HANDLE_VALUE) return false; + addFile(myList, mode, _path.c_str(), &desc); + while (FindNextFile(handle, &desc)) addFile(myList, mode, _path.c_str(), &desc); @@ -230,10 +295,12 @@ bool WindowsFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const return true; } -AbstractFilesystemNode *WindowsFilesystemNode::parent() const { +AbstractFilesystemNode *WindowsFilesystemNode::getParent() const { assert(_isValid || _isPseudoRoot); + if (_isPseudoRoot) return 0; + WindowsFilesystemNode *p = new WindowsFilesystemNode(); if (_path.size() > 3) { const char *start = _path.c_str(); @@ -246,23 +313,8 @@ AbstractFilesystemNode *WindowsFilesystemNode::parent() const { p->_displayName = lastPathComponent(p->_path); p->_isPseudoRoot = false; } + return p; } -AbstractFilesystemNode *WindowsFilesystemNode::child(const String &n) const { - assert(_isDirectory); - String newPath(_path); - if (_path.lastChar() != '\\') - newPath += '\\'; - newPath += n; - - // Check whether the directory actually exists - DWORD fileAttribs = GetFileAttributes(toUnicode(newPath.c_str())); - if (fileAttribs == INVALID_FILE_ATTRIBUTES) - return 0; - - WindowsFilesystemNode *p = new WindowsFilesystemNode(newPath); - return p; -} - -#endif // WIN32 +#endif //#ifdef WIN32 diff --git a/backends/platform/PalmOS/Src/launcher/forms/formSelect.cpp b/backends/platform/PalmOS/Src/launcher/forms/formSelect.cpp index 641d646bb2..085fb2499a 100755 --- a/backends/platform/PalmOS/Src/launcher/forms/formSelect.cpp +++ b/backends/platform/PalmOS/Src/launcher/forms/formSelect.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/backends/platform/PalmOS/Src/launcher/forms/formSelect.cpp $ + * $Id:formSelect.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/backends/platform/ds/arm9/makefile.in b/backends/platform/ds/arm9/makefile.in deleted file mode 100644 index e7a7da4a59..0000000000 --- a/backends/platform/ds/arm9/makefile.in +++ /dev/null @@ -1,350 +0,0 @@ -#BUILD_PLUGINS = 1 -#libndsdir = $(DEVKITPRO)/libnds -libndsdir = /home/neil/devkitpro/libnds - -# Select the build you want by uncommenting one of the following lines: - -DS_BUILD_A = 1 -#DS_BUILD_B = 1 -#DS_BUILD_C = 1 -#DS_BUILD_D = 1 - -# Uncomment the following line to build in support for MP3 audio -# using libmad: -USE_MAD = 1 - -# Uncomment the following line to enable support for the -# ace DS Debugger (remembering to make the same change in the arm7 makefile): -#USE_DEBUGGER = 1 -# NOTE: The header and libs for the debugger is assumed to be in the libnds -# folder. - -VPATH = $(srcdir) - -# Command to build libmad is: -# ./configure --host=arm-elf --enable-speed --enable-sso -enable-fpm=arm CFLAGS='-specs=ds_arm9.specs -mthumb-interwork' - - -ifdef DS_BUILD_A - DEFINES = -DDS_SCUMM_BUILD -DDS_BUILD_A - LOGO = logoa.bmp - DISABLE_HE = 1 - #DISABLE_SCUMM = 1 - DISABLE_SCUMM_7_8 = 1 - DISABLE_AGOS = 1 - DISABLE_SKY = 1 - DISABLE_SWORD1 = 1 - DISABLE_SWORD2 = 1 - DISABLE_QUEEN = 1 - DISABLE_SAGA = 1 - DISABLE_KYRA = 1 - DISABLE_GOB = 1 - DISABLE_LURE = 1 - DISABLE_CINE = 1 - DISABLE_AGI = 1 - DISABLE_TOUCHE = 1 - DISABLE_PARALLACTION = 1 - BUILD=scummvm-A -endif - -ifdef DS_BUILD_B - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_B - LOGO = logob.bmp - DISABLE_HE = 1 - DISABLE_SCUMM = 1 - DISABLE_SCUMM_7_8 = 1 - DISABLE_AGOS = 1 - #DISABLE_SKY = 1 - DISABLE_SWORD1 = 1 - DISABLE_SWORD2 = 1 - #DISABLE_QUEEN = 1 - DISABLE_SAGA = 1 - DISABLE_KYRA = 1 - DISABLE_GOB = 1 - DISABLE_LURE = 1 - DISABLE_CINE = 1 - DISABLE_AGI = 1 - DISABLE_TOUCHE = 1 - DISABLE_PARALLACTION = 1 - BUILD=scummvm-B -endif - -ifdef DS_BUILD_C - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_C - LOGO = logoc.bmp - DISABLE_HE = 1 - DISABLE_SCUMM = 1 - DISABLE_SCUMM_7_8 = 1 - #DISABLE_AGOS = 1 - DISABLE_SKY = 1 - DISABLE_SWORD1 = 1 - DISABLE_SWORD2 = 1 - DISABLE_QUEEN = 1 - DISABLE_SAGA = 1 - #DISABLE_KYRA = 1 - #DISABLE_GOB = 1 - DISABLE_LURE = 1 - DISABLE_CINE = 1 - DISABLE_AGI = 1 - DISABLE_TOUCHE = 1 - DISABLE_PARALLACTION = 1 - BUILD=scummvm-C -endif - -ifdef DS_BUILD_D - DEFINES = -DDS_NON_SCUMM_BUILD -DDS_BUILD_D - LOGO = logoc.bmp - DISABLE_HE = 1 - DISABLE_SCUMM = 1 - DISABLE_SCUMM_7_8 = 1 - DISABLE_AGOS = 1 - DISABLE_SKY = 1 - DISABLE_SWORD1 = 1 - DISABLE_SWORD2 = 1 - DISABLE_QUEEN = 1 - DISABLE_SAGA = 1 - DISABLE_KYRA = 1 - DISABLE_GOB = 1 - DISABLE_LURE = 1 - #DISABLE_CINE = 1 - #DISABLE_AGI = 1 - DISABLE_TOUCHE = 1 - DISABLE_PARALLACTION = 1 - BUILD=scummvm-A -endif - - -ARM7BIN := -7 $(CURDIR)/../../arm7/arm7.bin -ICON := -b ../../../logo.bmp "ScummVM;By Neil Millstone;" - -CC = arm-eabi-gcc -CXX = arm-eabi-g++ - -CFLAGS = -Wno-multichar -Wall -Os\ - -Wno-multichar -mcpu=arm9tdmi -mtune=arm9tdmi \ - -mcpu=arm9tdmi -mtune=arm9tdmi -fomit-frame-pointer\ - -ffast-math -mthumb-interwork - -ifdef USE_DEBUGGER - DEFINES += -DUSE_DEBUGGER - CFLAGS += -g -endif - -CXXFLAGS= $(CFLAGS) -Wno-non-virtual-dtor -Wno-non-virtual-dtor \ - -fno-exceptions -fno-rtti - -ASFLAGS = -mcpu=arm9tdmi -mthumb-interwork -DEFINES += -D__DS__ -DNDS -DARM9 -DNONSTANDARD_PORT -DDISABLE_FANCY_THEMES -DDISABLE_DEFAULT_SAVEFILEMANAGER -ifdef USE_MAD - DEFINES += -DUSE_MAD -endif - - -LDFLAGS = -specs=ds_arm9.specs -mthumb-interwork -mno-fpu -Wl,-Map,map.txt - -INCLUDES= -I./ -I$(portdir)/$(BUILD) -I$(srcdir) -I$(srcdir)/common -I$(portdir)/source -I$(portdir)/source/compressor -I$(portdir)/source/fat \ - -I$(srcdir)/backends/fs -I$(srcdir)/backends/fs/ds -I$(portdir)/data -I$(libndsdir)/include -I$(portdir)/../commoninclude\ - -I$(srcdir)/scumm -I$(libndsdir)/include -I$(libndsdir)/include/nds -I$(srcdir)/engines -I$(portdir)/source/mad\ - -I$(portdir)/source/libcartreset - - -LIBS = -lm -L$(libndsdir)/lib -L$(portdir)/lib -lnds9 -ifdef USE_MAD - LIBS += -lmad -endif -ifdef USE_DEBUGGER - LIBS += -ldsdebugger -ldswifi9 -endif - -#-Lscumm -lscumm -Lbase -lbase -Lcommon -lcommon -Lgraphics -lgraphics -Lgui -lgui -Lsound -lsound -EXECUTABLE = scummvm.elf -PLUGIN_PREFIX = -PLUGIN_SUFFIX = .plg -PLUGIN_EXTRA_DEPS = plugin.x plugin.syms scummvm.elf -PLUGIN_LDFLAGS = -nostartfiles -Wl,-q,-Tplugin.x,--just-symbols,scummvm.elf,--retain-symbols-file,plugin.syms -L$(ronindir)/lib -MKDIR = mkdir -p -RM = rm -f -RM_REC = rm -rf -AR = arm-eabi-ar cru -RANLIB = arm-eabi-ranlib -OBJCOPY = arm-eabi-objcopy -AS = arm-eabi-as -HAVE_GCC3 = true -DISABLE_SCALERS = true - -ifdef BUILD_PLUGINS -DEFINES += -DDYNAMIC_MODULES -PRE_OBJS_FLAGS = -Wl,--whole-archive -POST_OBJS_FLAGS = -Wl,--no-whole-archive -endif - -PORT_OBJS := $(portdir)/source/blitters.o $(portdir)/source/cdaudio.o $(portdir)/source/dsmain.o \ - $(portdir)/../../../fs/ds/ds-fs.o $(portdir)/source/gbampsave.o $(portdir)/source/scummhelp.o\ - $(portdir)/source/osystem_ds.o $(portdir)/source/portdefs.o $(portdir)/source/ramsave.o\ - $(portdir)/source/scummconsole.o $(portdir)/source/touchkeyboard.o $(portdir)/source/zipreader.o\ - $(portdir)/source/dsoptions.o $(portdir)/source/keys.o - -DATA_OBJS := $(portdir)/data/icons.o $(portdir)/data/keyboard.o $(portdir)/data/keyboard_pal.o $(portdir)/data/default_font.o - - -COMPRESSOR_OBJS := $(portdir)/source/compressor/lz.o - -FAT_OBJS := $(portdir)/source/fat/disc_io.o $(portdir)/source/fat/gba_nds_fat.o\ - $(portdir)/source/fat/io_fcsr.o $(portdir)/source/fat/io_m3cf.o\ - $(portdir)/source/fat/io_mpcf.o $(portdir)/source/fat/io_sccf.o\ - $(portdir)/source/fat/io_m3sd.o\ - $(portdir)/source/fat/io_nmmc.o $(portdir)/source/fat/io_scsd.o \ - $(portdir)/source/fat/io_scsd_asm.o \ - $(portdir)/source/fat/io_njsd.o \ - $(portdir)/source/fat/io_mmcf.o \ - $(portdir)/source/fat/io_sd_common.o \ - $(portdir)/source/fat/io_m3_common.o \ - $(portdir)/source/fat/io_dldi.o \ - $(portdir)/source/fat/m3sd.o - - -# $(portdir)/source/fat/io_cf_common.o $(portdir)/source/fat/io_m3_common.o\ -# $(portdir)/source/fat/io_sd_common.o $(portdir)/source/fat/io_scsd_s.o \ -# $(portdir)/source/fat/io_sc_common.o $(portdir)/source/fat/io_sd_common.o - -LIBCARTRESET_OBJS := $(portdir)/source/libcartreset/cartreset.o - - - -OBJS := $(DATA_OBJS) $(LIBCARTRESET_OBJS) $(PORT_OBJS) $(COMPRESSOR_OBJS) $(FAT_OBJS) - - - -MODULE_DIRS += . - -ndsall: - @[ -d $(BUILD) ] || mkdir -p $(BUILD) - make -C ./$(BUILD) -f ../makefile scummvm.nds - -include $(srcdir)/Makefile.common - -clean: - $(RM) $(OBJS) $(EXECUTABLE) - rm -fr $(BUILD) - -plugin_dist : - find . -name '*.plg' | while read p; do \ - sh-elf-strip -g -o "`basename \"$$p\" | tr '[:lower:]' '[:upper:]'`" "$$p"; \ - done - -dist : SCUMMVM.BIN plugins plugin_dist - - -#--------------------------------------------------------------------------------- -# canned command sequence for binary data -#--------------------------------------------------------------------------------- -#define bin2o -# bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) -# echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_raw_end[];" > `(echo $(<F) | tr . _)`.h -# echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_raw[];" >> `(echo $(<F) | tr . _)`.h -# echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_raw_size";" >> `(echo $(<F) | tr . _)`.h -#endef - - -define bin2o - bin2s $< | $(AS) -mthumb -mthumb-interwork -o $(@) - echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(<F) | tr . _)`.h - echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(<F) | tr . _)`.h - echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(<F) | tr . _)`.h -endef - - -#define bin2o -# @echo $(*) -# cp $(<) $(*).tmp -# $(OBJCOPY) -I binary -O elf32-littlearm -B arm \ -# --rename-section .data=.rodata \ -# --redefine-sym _binary_$(subst .,_,$(subst /,_,$(*)))_tmp_start=$(notdir $*)\ -# --redefine-sym _binary_$(subst .,_,$(subst /,_,$(*)))_tmp_end=$(notdir $*)_end\ -# $(*).tmp $(@) -# echo "extern const u8" $(notdir $*)"[] __attribute__ ((aligned (4)));" > $(*).h -# echo "extern const u32" $(notdir $(*))_size[]";" >> $(*).h -# -# echo $(*).h -# rm $(*).tmp -#endef - -############## -# Replacement rule for the one in makefile.common -############## -ifndef HAVE_GCC3 -# If you use GCC, disable the above and enable this for intelligent -# dependency tracking. -.cpp.o: - $(MKDIR) $(*D)/$(DEPDIR) - $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d2" $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o -# $(ECHO) "$(*D)/" > $(*D)/$(DEPDIR)/$(*F).d - $(CAT) "$(*D)/$(DEPDIR)/$(*F).d2" >> "$(*D)/$(DEPDIR)/$(*F).d" - $(RM) "$(*D)/$(DEPDIR)/$(*F).d2" -else -# If you even have GCC 3.x, you can use this build rule, which is safer; the above -# rule can get you into a bad state if you Ctrl-C at the wrong moment. -# Also, with this GCC inserts additional dummy rules for the involved headers, -# which ensures a smooth compilation even if said headers become obsolete. -.cpp.o: - $(MKDIR) $(*D)/$(DEPDIR) -# $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o - $(CXX) -MMD -MF "$(*D)/$(DEPDIR)/$(*F).d" $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o -endif - - -#--------------------------------------------------------------------------------- - -#--------------------------------------------------------------------------------- -%.o : %.pcx -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- -%.o : %.bin -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- -%.o : %.raw -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- -%.o : %.pal -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- -%.o : %.map -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- -%.o : %.mdl -#--------------------------------------------------------------------------------- - @echo $(notdir $<) - @$(bin2o) - -#--------------------------------------------------------------------------------- -%.nds: %.bin - @echo ndstool -c $@ -9 scummvm.bin $(ARM7BIN) -b ../../$(LOGO) "$(shell basename $@);ScummVM @VERSION@;DS Port" - ndstool -c $@ -9 scummvm.bin $(ARM7BIN) -b ../../$(LOGO) "$(shell basename $@);ScummVM @VERSION@;DS Port" - dsbuild $@ -l ../ndsloader.bin - - padbin 16 $(basename $@).ds.gba - -#--------------------------------------------------------------------------------- -%.bin: %.elf - $(OBJCOPY) -S scummvm.elf scummvm-stripped.elf - $(OBJCOPY) -O binary scummvm-stripped.elf scummvm.bin - -#%.o: %.s -# $(MKDIR) $(*D)/$(DEPDIR) -# $(CXX) -Wp,-MMD,"$(*D)/$(DEPDIR)/$(*F).d",-MQ,"$@",-MP $(CXXFLAGS) $(CPPFLAGS) -c $(<) -o $*.o - diff --git a/backends/platform/symbian/res/scummvm.cer b/backends/platform/symbian/res/scummvm.cer deleted file mode 100644 index 70b765e6b4..0000000000 --- a/backends/platform/symbian/res/scummvm.cer +++ /dev/null @@ -1,21 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIDXTCCAxqgAwIBAgIBADALBgcqhkjOOAQDBQAwgZIxEDAOBgNVBAoTB1NjdW1t -Vk0xfjB8BgNVBAMTdVNjdW1tVk0gUzYwdjM3OThiOTk0MDg2OTFhZThlZWM2N2Zl -NGUxYmZjOTQ1YTI0YjRmYjZmMTlmMGJiNzE2N2FjYWEwYzBlNjc0OTM3MmEyY2Qw -YjNiMmY5MWRmMGQyNTQwZjdlYzc0YzllNzhhYWJlMzkwZTAeFw0wNzA2MTAxOTQ4 -NTJaFw0wODA2MDkxOTQ4NTJaMIGSMRAwDgYDVQQKEwdTY3VtbVZNMX4wfAYDVQQD -E3VTY3VtbVZNIFM2MHYzNzk4Yjk5NDA4NjkxYWU4ZWVjNjdmZTRlMWJmYzk0NWEy -NGI0ZmI2ZjE5ZjBiYjcxNjdhY2FhMGMwZTY3NDkzNzJhMmNkMGIzYjJmOTFkZjBk -MjU0MGY3ZWM3NGM5ZTc4YWFiZTM5MGUwggG3MIIBKwYHKoZIzjgEATCCAR4CgYEA -ydXBoDldKAiq3DmfGPwReY9qHEMEh4AyuK5N4M7PvCSYUWU6sWp9PQJ1DDXOm54o -k8IicM9/dmNdQVAGah2Oi5wizbaYV3HkFufLQOQdaOFg7uclJKp+4cnPsG8lz4DS -j6o9kRxANZ9vJgE7qxWG5HnEPNm/l0mDbyWbtbAT//sCFQDCZT2JjR+U+o2orfUL -tcojrwdLSQKBgGdx5eoIaGOxIXgP7ttNdL+7qOYMJD2wI93o5eRiLOaTme276pr3 -oYv3VVRZJa6UXD298b705ia/XQqO6KA9QJgPMjJnwD/8ydcZyZqmX6sNpv6dc7AN -y/6BJN6DO0xUc9BTkQr4cYBhfkc1mYTBzxOj7bi4aATBjcCXzDXXyT2bA4GFAAKB -gQCXsapLABnAVfz60pOQt+Kcl3x+/Rz+vXoItLg3O8cVjooi/q0uaaXF/AnO2njb -lLHbQX3zmv/+tvD2PSyFtgNgscyTf/EECqWMK94Lb0/Jw1rvdNO86eWzsW7UzArF -5KjJbUn64+PTSU8m7GTqGN4NFh6yFBk//Z2ljy+Zt0WZBDALBgcqhkjOOAQDBQAD -MAAwLQIUJUCWx57QyGsiPM5w5qvX3ZYF0/kCFQC47QWyrzi4dr2y2iDNWsln7La4 -Qw== ------END CERTIFICATE----- diff --git a/backends/platform/symbian/res/scummvm.key b/backends/platform/symbian/res/scummvm.key deleted file mode 100644 index 62e3d3858c..0000000000 --- a/backends/platform/symbian/res/scummvm.key +++ /dev/null @@ -1,15 +0,0 @@ ------BEGIN DSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,AA4358B4EE40C19C - -OyPKZgptp6jQoGEckxKO4fHS9IL72F0rHduv4qguYHdKeyjREgWDN6+/QhI3SQWu -9bch/oyo/mhO6ZcLjOukBVaygYNw8VTnuEUITmPPrLo7Hcrs12y5jr6MCJ1XBho8 -K0eBwJpqEYFlRZcGqLhJVcPbREEZAOY522MsnT4V3Sa2yerK0AWMSXSTjWRPVxlo -RdqB7vdU/zp3FZvV1gXp+aAOb0WoUbZZYo5r4JnHS+6DGHJfWtXucz4VhcrYxLa8 -xNE3WvTvnIyudG1Yc4J5pl0fpS7wBHQHFtqv2ncRWhY49r9RNR6bfMLZULZj8mwo -QRYkUeaAkdEkTiYlVl/KQ1i3Hh1qupaQwxF/WqCtfbvLA6KlzYLllTnGwsRHujid -f97fGt1z8uWGtzDWQzKW3nY0I2psAA/bCYwL88G1aOPEyp4Ql1lkyxRm4Tw7Zu5M -pF09dAgkFVvPH5Bn7o05ZS9ruNhF5K/5QNg3WTVDhZEqkqiXWRGXaEhc6ZfoK/+H -ne1d3+QfKEX8rxAtjX1hVNkNG1ivmIExpa45wUmSE2pOIj31ny0gK1tCv4mdgEDL -elR3M/oAw0BdxBn9LqmDaQ== ------END DSA PRIVATE KEY----- diff --git a/backends/platform/wince/README-WinCE.txt b/backends/platform/wince/README-WinCE.txt deleted file mode 100644 index 17371f9c57..0000000000 --- a/backends/platform/wince/README-WinCE.txt +++ /dev/null @@ -1,616 +0,0 @@ -ScummVM Windows CE FAQ -Last updated: $Date$ -Release version: 0.10.0 ------------------------------------------------------------------------- - -New in this version -------------------- - -0.10.0: -Major improvements have taken place in this version, mostly for behind- -the-scenes stuff. First, we have migrated to GCC for building the Windows -CE port. This helped take care of some obscure compiler bugs which were -in there for quite a long time. It has also lead to efficient code -generation due to GCC's advanced capabilities and consequently increased -runtime speed. The second important change was the overhaul of the SDL -library port. The benefits from this are twofold: The real-time code paths -have been optimized, including contributed ARM assembly code for critical -functions. Further, the screen display and mouse/keyboard input code has -been partially rewritten to allow for increased compatibility across all -devices. -Due to the update of keyboard handling code, the keycodes have changed -slightly. Running this version of ScummVM will overwrite your key bindings -with the new defaults. See the section on how to play on Smartphones and -Pocket PCs below for the new default keybindings. - ------------------------------------------------------------------------- - -This document is intended to give common answers to specific ScummVM -issues on Windows CE, in 3 sections - * "General questions" : browse this section to get started and see - general issues - * "Game specific questions" : lists some common game specific issues - * "Support and links" : how to get support if you're still puzzled - ------------------------------------------------------------------------- -General questions ------------------------------------------------------------------------- - -Which devices are supported ? ------------------------------ - -Official build --------------- - -The official build is based on the ARM architecture and should work with any -Pocket PC 2000, Pocket PC 2002, Pocket PC 2003, Pocket PC 2003 SE, Smartphone -2002, Smartphone 2003 or Windows Mobile based device. - -Support for old ARM architectures (Handheld PCs, Palm Size PCs) and other CPUs -(MIPS, SH3) is discontinued. Feel free to generate builds for these -architectures and contact us to include them on ScummVM website. - -Games supported ---------------- - -The Windows CE port of ScummVM supports all available game engines. - -ScummVM distinguishes devices based on two characteristics: Type and resolution. -Supported types of devices are Smartphones (usually no stylus) and Pocket PCs -(stylus). The supported resolutions are 176x220 (Smartphone), 240x240 (QVGA -square), 240x320 (QVGA), 320x240 (QVGA landscape), 480x640 (VGA). Devices with -resolutions larger than VGA should also be supported with automatic screen -centering. - -* Low resolution Smartphones (176x220) - -Support is only provided for all 320x200 or 320x240 games. The font can get -hard to read (you should prefer talkie games, or wear glasses :-P) -Games with 640x480 resolution such as COMI or BSWORD cannot be scaled down -to this resolution and still be playable. - -* QVGA square devices (240x240) - -Only 320x200 or 320x240 games are supported due to lack of downsampling scaler. - -* QVGA Pocket PCs or Smartphones (240x320 or 320x240) - -All games are playable in these devices. Landscape devices may not be able to -rotate the screen around. - -* VGA (640x480) or higher Pocket PCs - -All non VGA games should work properly on these devices. They can be resized -with different scalers. Moreover, VGA games will be displayed in true VGA mode. - -Partial / Discontinued support ------------------------------- - -Support for the following devices is not complete, not working properly or -discontinued because the device is now obsolete. Feel free to contribute and -improve the port for your favorite device, or use the last release built with -the previous port architecture (0.5.1) which was less resource hungry and -supported more exotic devices. - -* "Paletted" devices (non "true color") - -These devices will be supported through the GDI layer which will slow down the -games a lot. You can try to disable the music/sound effects to get a better -game experience. - -* "Mono" devices - -I don't even think anything will be displayed on these devices :) you can try -and report your success ... - -* MIPS/SH3 devices with QVGA resolution (240x320), "true color" - -Some devices may be a bit too slow, especially if direct screen access (GAPI) -is not supported on these devices. - -* ARM/MIPS/SH3 devices with VGA resolution (640x480) (Palm Size PC / Handheld - PC platform) - -True VGA games will probably be too slow to run properly on these devices even -if they can support them ... - -* ARM/MIPS/SH3 devices with desktop resolution (800x600) (Handheld PC platform) - -No, there will never be ANY scaler supporting 800x600 resolution, because -320x200 games CANNOT be resized to a 800x600 by a simple operation. - -And the device will probably be too slow to perform any kind of graphic -transform anyway :) - -How do I install ScummVM for Windows CE ? ------------------------------------------ - -Simple! Unpack the release package on your desktop pc, then copy all its contents -to a folder on your device. Typically, you should at least have scummvm.exe, -modern.ini and modern.zip in the same directory. Finally, upload your beloved games -and fire it up :-) - -Some devices (like Pocket PC 2000) require GAPI to be present. - -How do I install a game ? -------------------------- - -You'll at least need to copy all the data files from your game, in a -sub-directory of your game directory. - -You'll need to put the data files in a directory named after ScummVM game -name (see "Supported Games" section in ScummVM readme) for the games having -"generic" data files (.LFL files). Recent games can be put in any directory. - -You can compress the multimedia files (sound/video) as described in the -ScummVM readme. - -You can compress the audio tracks of Loom or Monkey Island 1 as described in -the ScummVM readme. If you are running these games on a slow device with Ogg -Vorbis compression, it's recommended to sample the files to 11 kHz (this sample -rate is not supported by other versions of ScummVM). - -If you need more details, you can check SirDave's mini-manual online available -at: http://forums.scummvm.org/viewtopic.php?t=936 -and at: http://www.pocketmatrix.com/forums/viewtopic.php?t=8606 - -How do I run a game ? ---------------------- - -If it's the first time you're running ScummVM for Windows CE, have installed or -removed games, you need to rescan your game directory. - * Select Add Game, tap the root directory of your games, and tap "Yes" to begin - an automatic scan of the installed games. - -Usually all games are detected and you can start playing right away. If your -game is not detected check its directory name and your data files. - -To play a game, tap on its name then tap the "Start" button or double tap its -name. - -How do I play a game on a Pocket PC or Handheld PC device ? ------------------------------------------------------------ - -The stylus is your mouse cursor, and a tap is a left mouse button click. - -As the Pocket PC lacks some keys, a toolbar is displayed at the bottom of the -screen to make the most common functions just a tap away - * The disk icon opens ScummVM options menu to save your game, or change your - current game settings (depends on the game) - * The movie icon skips a non interactive sequence, the current dialog or - behaves like the ESC key on a regular keyboard (depends on the game) - * The sound icon turns all sound effects and music off and on - * The key icon allow you to map a key action to a device button - * The monkey icon switches between portrait, landscape and inverse landscape - mode (depends on the display drivers) - -You can map additional actions on your device hardware buttons using the -"Options" / "Key" menu in the ScummVM options menu. To associate an action to -a key, tap the action, then the "Map" button and press the hardware key. -The following actions are available : - - * Pause : pause the game - * Save : open ScummVM option menu - * Quit : quit ScummVM (without saving, be careful when using it) - * Skip : skip a non interactive sequence, the current dialog or - behaves like the ESC key on a regular keyboard - * Hide : hide or display the toolbar - * Keyboard : hide or display the virtual keyboard - * Sound : turns all sound effects and music off and on - * Right click : acts as a right mouse button click - * Cursor : hide or display the mouse cursor - * Free look : go in or out of free-look mode. In this mode, you can tap - the screen to look for interesting locations without walking. - * Zoom up : magnify the upper part of the screen for 640x480 games - rendered on a QVGA device. - * Zoom down : magnify the lower part of the screen for 640x480 games - rendered on a QVGA device. - * Multi Function : this key performs a different function depending on the game - : Full Throttle -> win an action sequence (cheat) - : Fate of Atlantis -> sucker punch (cheat) - : Bargon -> F1 (start the game) - : All AGI games -> bring up the predictive input dialog - * Bind keys : map a key action to a device button - * Up,Down,Left : - Right, : emulate mouse/stylus behavior - Left Click : - -The default key bindings for Pocket PCs are (note that not all keys are mapped): - * Up, Down, Left, Right : (dpad) arrow keys - * Left Click : softkey A - -If you start a game when a Right click mapping is necessary, ScummVM will ask -you to map one of your hardware key to this action before playing. Just press -the key you want to map if you see this message. - -Notes: -- THE TOOLBAR CAN BE CYCLED BY DOUBLE TAPPING (SEE BELOW) -- YOU MUST HIDE THE TOOLBAR TO SCROLL THROUGH THE INVENTORY IN ZAK -- YOU MUST DISPLAY THE KEYBOARD TO FIGHT IN INDIANA JONES 3 -- YOU MUST MAP THE RIGHT CLICK ACTION TO PLAY SEVERAL GAMES - -How do I hide the toolbar ? ---------------------------- - -Note: THIS IS A VERY USEFUL AND SOMETIMES NECESSARY SHORTCUT - -Double tapping the stylus at the top of the screen will switch between a -visible toolbar panel, a virtual keyboard, and hiding panel. If any part of -the screen is obscured by the toolbar (like the load/save game dialogs) you can -use the invisible panel mode to get to it. For 320x200 games on QVGA Pocket -PCs, when the panel is hidden the game screen is resized to 320x240 (aspect -ratio correction) for better gaming experience. - -How do I play a game on a Smartphone device ? ---------------------------------------------- - -On non-stylus devices, the mouse cursor is emulated via a set of keys. -The cursor will move faster if you keep the key down. You can tweak this -behaviour in the configuration file described below. - -Here is -the list of available actions for Smartphones: - - * Up,Down,Left : - Right, : emulate mouse/stylus behavior - Left Click : - Right Click : - * Save : open ScummVM option menu - * Skip : skip a non interactive sequence, the current dialog or - behaves like the ESC key on a regular keyboard - * Zone : switch between the 3 different mouse zones - * Multi Function : this key performs a different function depending on the game - : Full Throttle -> win an action sequence (cheat) - : Fate of Atlantis -> sucker punch (cheat) - : Bargon -> F1 (start the game) - : All AGI games -> bring up the predictive input dialog - * Bind keys : map a key action to a device button - * Keyboard : hide or display the virtual keyboard - * Rotate : rotate the screen (also rotates dpad keys) - * Quit : quit ScummVM (without saving, be careful when using it) - -The "Zone" key is a *very* valuable addition allowing you to jump quickly -between three screen zones : the game zone, the verbs zone and the inventory -zone. When you switch to a zone the cursor will be reset to its former location -in this zone. - -The default key map for these actions is: - - * Up, Down, Left, Right : (dpad) arrow keys - * Left Click : softkey A - * Right Click : softkey B - * Save : call/talk - * Skip : back - * Zone : 9 - * Multi Function : 8 - * Bind keys : end call - * Keyboard : (dpad) enter - * Rotate : 5 - * Quit : 0 - -You can change the key mapping at any time by bringing up the key mapping menu -(Bind keys action). - -How do I tweak the configuration of ScummVM ? ---------------------------------------------- - -See the section regarding the configuration file (scummvm.ini) in ScummVM -README file - the same keywords apply. - -Some parameters are specific to this port : - -Game specific sections (f.e. [monkey2]) - performance options - - * high_sample_rate bool Desktop quality (22 kHz) sound output if set. - 11 kHz otherwise. The default is 11 kHz. - If you have a fast device, you can set this to - true to enjoy better sound effects and music. - * FM_high_quality bool Desktop quality FM synthesis if set. Lower - quality otherwise. The default is low quality. - You can change this if you have a fast device. - * sound_thread_priority int Set the priority of the sound thread (0, 1, 2). - Depending on the release, this is set to 1 - internally (above normal). If you get sound - stuttering try setting this to a higher value. - Set to 0 if your device is fast enough or if - you prefer better audio/video synchronization. - * Smush_force_redraw int Force a Smush frame redraw every X missed - frames. Mainly used for Full Throttle action - sequences. Setting it lower gives more - priority to screen redraws. Setting it higher - gives more priority to stylus/keyboard input. - The default is 30. - -Game specific sections (f.e. [monkey2]) - game options - - * landscape int 0: Portrait, 1: Landscape, 2: Inverse Landscape - You can also use this in the [scummvm] section - in QVGA Pocket PCs to display the launcher in - landscape, for example, at startup. - -[scummvm] section - keys definition - -You usually do not wish to modify these values directly, as they are set -by the option dialog, and are only given here for reference. - - * action_mapping_version int Mapping version linked to ScummVM version. - * action_mapping string Hex codes describing the key associated to - each different action. - * debuglevel int Debug Level 1 is used by the WinCE port - for reporting diagnostic output in the - scummvm_stdout.txt and scummvm.stderr.txt - files in the current working directory. - -[scummvm] section - mouse emulation tuning - -You can tweak these parameters to customize how the cursor is handled. - - * repeatTrigger int Number of milliseconds a key must be held to - consider being repeated. - * repeatX int Number of key repeat events before changing - horizontal cursor behaviour. - * stepX1 int Horizontal cursor offset value when the key is - not repeated. - * stepX2 int Horizontal cursor offset value when the key is - repeated less than repeatX. - * stepX3 int Horizontal cursor offset value when the key is - repeated more than repeatX. - * repeatY int Number of key repeat events before changing - vertical cursor behaviour. - * stepY1 int Vertical cursor offset value when the key is - not repeated. - * stepY2 int Horizontal cursor offset value when the key is - repeated less than repeatY. - * stepY3 int Vertical cursor offset value when the key is - repeated more than repeatY. - ------------------------------------------------------------------------- -Game specific questions ------------------------------------------------------------------------- - ---------------- --- All Games -- ---------------- - -I need to press a special key ------------------------------ - -Bring up the virtual keyboard. On Smartphones take a look at the Keyboard action above. -On Pocket PCs it's easier to double-tap at the top of the screen. - -The panel is obscuring the playfield area ------------------------------------------ - -Double tap at the top of the screen to hide it. As an aside, the aspect ratio -correction scaler will kick in if the game/device combo is appropriate. - -How do I name my save games ? ------------------------------ - -Use the virtual keyboard (Keyboard action). - -ScummVM is stuck for some reason --------------------------------- - -Bind and use the quit action to quit. - -I cannot rotate the screen to landscape/inverse landscape ---------------------------------------------------------- - -Depending on the video driver, ScummVM may opt to not provide such functionality. -In general, when ScummVM starts in normal "portrait" orientation, the device driver -reports better display characteristics and you should consider launching from portrait. - -I'm having problems. Is there diagnostic output available ? ------------------------------------------------------------ - -Insert a line in the [scummvm] section of scummvm.ini with the following: -debuglevel=1 -Run ScummVM. When it closes scummvm_stdout.txt and scummvm_stderr.txt files will be -available at the program directory (see section above). - -ScummVM crashes and returns to desktop --------------------------------------- - -File a bug report including diagnostic output (see previous question). - --------------------------- --- Beneath a Steel Sky -- --------------------------- - -Introduction movie is too slow or never ends ... -------------------------------------------------- - -Skip it :) - -How can I open the inventory in Beneath a Steel Sky ? ---------------------------------------------------- - -Tap the top of the screen. Check your stylus calibration if you still cannot -open it. - -How can I use an item in Beneath a Steel Sky ? ----------------------------------------------- - -You need to map the right click button (see the General Questions section). - ----------------------------- --- Curse of Monkey Island -- ----------------------------- - -How can I open the inventory in Curse of Monkey Island ? ------------------------------------------------------- - -You need to map the right click button (see the General Questions section). - -I'm experiencing random crashes ... ------------------------------------- - -This game has high memory requirements, and may crash sometimes on low -memory devices. Continue your game with the latest automatically saved -game and everything should be fine. -You can consider removing the music and voice files (VOXDISK.BUN, MUSDISK.BUN) -to lower these requirements. - -Sound synchronization is lost in Curse of Monkey Island videos --------------------------------------------------------------- - -Use a faster device :-( - --------------------- --- Full Throttle -- --------------------- - -I'm experiencing random crashes ... ------------------------------------- - -This game has high memory requirements, and may crash sometimes on low -memory devices. Continue your game with the latest automatically saved -game and everything should be fine. -You can consider removing the voice file (MONSTER.SOU) and disable the -music to lower these requirements. - ----------------------------------------- --- Indiana Jones and the Last Crusade -- ----------------------------------------- - -How can I fight in Indiana Jones and the Last Crusade ? ------------------------------------------------------ - -You need to map the keyboard button (see the General Questions section). - ---------------- --- Sam & Max -- ---------------- - -How can I change the current action ? -------------------------------------- - -You need to map the right click button (see the General Questions section). - -How can I exit a mini game ? ----------------------------- - -Use the skip toolbar icon (see the General Questions section). - -------------------- --- Simon 1 and 2 -- -------------------- - -How can I save or quit in Simon ? --------------------------------- - -"Use" (use the use verb :p) the postcard. The ScummVM option dialog is disabled -in Simon games. - -On Smartphone, you'll need to push the Action button (center of the pad) to -quit the game. - -------------- --- The Dig -- -------------- - -I'm experiencing random crashes ... ------------------------------------- - -This game has high memory requirements, and may crash sometimes on low -memory devices. Continue your game with the latest automatically saved -game and everything should be fine. -You can consider removing the music and voice files (VOXDISK.BUN, MUSDISK.BUN) -to lower these requirements. - --------------------- --- Zak Mc Kracken -- --------------------- - -How can I scroll through my inventory items in Zak Mc Kracken ? ---------------------------------------------------------------- - -You need to map the hide toolbar button (see the General Questions section) or -double tap at the top of the screen (from 0.8.0+) - ------------------------- --- Broken Sword 1 & 2 -- ------------------------- - -I've installed the movies pack but they are not playing/they are slow ---------------------------------------------------------------------- - -MPEG 2 playback takes too much memory in the current release, and may prevent -movies from playing in VGA mode. Consider changing to the DXA cutscene pack -which is many times faster. - ---------------- --- Gobliiins -- ---------------- - -How do I enter a code ? ------------------------ - -Use the virtual keyboard. - -------------------- --- Bargon Attack -- -------------------- - -How do I start the game (F1 : Game, F2 : Demo) ----------------------------------------------- - -Use the Multi Function action. - ----------------------- --- AGI engine games -- ----------------------- - -Do you expect me to play these games on keyboard less devices ? ---------------------------------------------------------------- - -Sure we do :-) -If you want to get some mileage on your stylus you can use the virtual keyboard. -There is a very useful alternative though, the AGI engine's predictive input dialog. -It requires a dictionary to be present. Just tap on the command line or use the -Multi Function action to bring it up. On Smartphones, when the dialog is shown -all key mapping is disabled temporarily (including mouse emulation). Input is -performed either by pressing the phone's numeric keypad keys and dpad enter to -close the dialog, or by navigating the buttons using the dpad arrows and pressing -with dpad enter. Check the main Readme file for more information on this. - ------------------------------------------------------------------------- -Support ------------------------------------------------------------------------- - -Help, I've read everything and ... ------------------------------------ - -Luckily, as there is a huge variety of Windows CE devices, a specific forum -is dedicated to this ScummVM port. You can ask your question on the WinCE -ScummVM forum available at http://forums.scummvm.org/viewforum.php?f=6 - -Some older questions and very nice tutorials are still available on the historic -PocketMatrix forum at http://www.pocketmatrix.com/forums/viewforum.php?f=20 -where the community is always glad to help and have dealt with all the bugs for -many years now :) - -I think I found a bug, ScummVM crashes in ... ---------------------------------------------- - -See the "Reporting Bugs" section in ScummVM readme. - -If you have a Pocket PC or Handheld PC, be sure to include its resolution (obtained -on the second dialog displayed on the "About" menu) in your bug report. - -If you cannot reproduce this bug on another ScummVM version, you can cross -post your bug report on ScummVM forums. - -I want to compile my own ScummVM for Windows CE ------------------------------------------------ - -Take a look at: -http://wiki.scummvm.org/index.php/Compiling_ScummVM/Windows_CE - - ------------------------------------------------------------------------- -Good Luck and Happy Adventuring! -The ScummVM team. -http://www.scummvm.org/ ------------------------------------------------------------------------- diff --git a/backends/plugins/dc/dc-provider.cpp b/backends/plugins/dc/dc-provider.cpp index 166852655b..db0242f7d8 100644 --- a/backends/plugins/dc/dc-provider.cpp +++ b/backends/plugins/dc/dc-provider.cpp @@ -114,14 +114,14 @@ PluginList DCPluginProvider::getPlugins() { // Scan for all plugins in this directory FilesystemNode dir(PLUGIN_DIRECTORY); FSList files; - if (!dir.listDir(files, FilesystemNode::kListFilesOnly)) { + if (!dir.getChildren(files, FilesystemNode::kListFilesOnly)) { error("Couldn't open plugin directory '%s'", PLUGIN_DIRECTORY); } for (FSList::const_iterator i = files.begin(); i != files.end(); ++i) { - Common::String name(i->name()); + Common::String name(i->getName()); if (name.hasPrefix(PLUGIN_PREFIX) && name.hasSuffix(PLUGIN_SUFFIX)) { - pl.push_back(new DCPlugin(i->path())); + pl.push_back(new DCPlugin(i->getPath())); } } diff --git a/backends/plugins/posix/posix-provider.cpp b/backends/plugins/posix/posix-provider.cpp index ce319840a4..03ee1c204f 100644 --- a/backends/plugins/posix/posix-provider.cpp +++ b/backends/plugins/posix/posix-provider.cpp @@ -107,14 +107,14 @@ PluginList POSIXPluginProvider::getPlugins() { // Scan for all plugins in this directory FilesystemNode dir(PLUGIN_DIRECTORY); FSList files; - if (!dir.listDir(files, FilesystemNode::kListFilesOnly)) { + if (!dir.getChildren(files, FilesystemNode::kListFilesOnly)) { error("Couldn't open plugin directory '%s'", PLUGIN_DIRECTORY); } for (FSList::const_iterator i = files.begin(); i != files.end(); ++i) { - Common::String name(i->name()); + Common::String name(i->getName()); if (name.hasPrefix(PLUGIN_PREFIX) && name.hasSuffix(PLUGIN_SUFFIX)) { - pl.push_back(new POSIXPlugin(i->path())); + pl.push_back(new POSIXPlugin(i->getPath())); } } diff --git a/backends/plugins/sdl/sdl-provider.cpp b/backends/plugins/sdl/sdl-provider.cpp index 0f67c9a691..cb09af20ca 100644 --- a/backends/plugins/sdl/sdl-provider.cpp +++ b/backends/plugins/sdl/sdl-provider.cpp @@ -107,14 +107,14 @@ PluginList SDLPluginProvider::getPlugins() { // Scan for all plugins in this directory FilesystemNode dir(PLUGIN_DIRECTORY); FSList files; - if (!dir.listDir(files, FilesystemNode::kListFilesOnly)) { + if (!dir.getChildren(files, FilesystemNode::kListFilesOnly)) { error("Couldn't open plugin directory '%s'", PLUGIN_DIRECTORY); } for (FSList::const_iterator i = files.begin(); i != files.end(); ++i) { - Common::String name(i->name()); + Common::String name(i->getName()); if (name.hasPrefix(PLUGIN_PREFIX) && name.hasSuffix(PLUGIN_SUFFIX)) { - pl.push_back(new SDLPlugin(i->path())); + pl.push_back(new SDLPlugin(i->getPath())); } } diff --git a/backends/plugins/win32/win32-provider.cpp b/backends/plugins/win32/win32-provider.cpp index eeea3b805c..b340c23709 100644 --- a/backends/plugins/win32/win32-provider.cpp +++ b/backends/plugins/win32/win32-provider.cpp @@ -110,14 +110,14 @@ PluginList Win32PluginProvider::getPlugins() { // Scan for all plugins in this directory FilesystemNode dir(PLUGIN_DIRECTORY); FSList files; - if (!dir.listDir(files, FilesystemNode::kListFilesOnly)) { + if (!dir.getChildren(files, FilesystemNode::kListFilesOnly)) { error("Couldn't open plugin directory '%s'", PLUGIN_DIRECTORY); } for (FSList::const_iterator i = files.begin(); i != files.end(); ++i) { - Common::String name(i->name()); + Common::String name(i->getName()); if (name.hasPrefix(PLUGIN_PREFIX) && name.hasSuffix(PLUGIN_SUFFIX)) { - pl.push_back(new Win32Plugin(i->path())); + pl.push_back(new Win32Plugin(i->getPath())); } } diff --git a/base/commandLine.cpp b/base/commandLine.cpp index 985ef8b3cb..20249e758b 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -32,6 +32,7 @@ #include "common/config-manager.h" #include "common/system.h" +#include "common/fs.h" #include "sound/mididrv.h" #include "sound/mixer.h" @@ -48,10 +49,6 @@ #define DETECTOR_TESTING_HACK -#ifdef DETECTOR_TESTING_HACK -#include "common/fs.h" -#endif - namespace Base { static const char USAGE_STRING[] = @@ -313,7 +310,7 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, char **ar for (int i = 1; i < argc; ++i) { s = argv[i]; s2 = (i < argc-1) ? argv[i+1] : 0; - + if (s[0] != '-') { // The argument doesn't start with a dash, so it's not an option. // Hence it must be the target name. We currently enforce that @@ -390,7 +387,12 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, char **ar END_OPTION DO_OPTION('p', "path") - // TODO: Verify whether the path is valid + FilesystemNode path(option); + if(!path.exists()) { + usage("Non-existent game path '%s'", option); + } else if(!path.isReadable()) { + usage("Non-readable game path '%s'", option); + } END_OPTION DO_OPTION('q', "language") @@ -428,7 +430,12 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, char **ar END_OPTION DO_LONG_OPTION("soundfont") - // TODO: Verify whether the path is valid + FilesystemNode path(option); + if(!path.exists()) { + usage("Non-existent soundfont path '%s'", option); + } else if(!path.isReadable()) { + usage("Non-readable soundfont path '%s'", option); + } END_OPTION DO_LONG_OPTION_BOOL("disable-sdl-parachute") @@ -453,7 +460,12 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, char **ar END_OPTION DO_LONG_OPTION("savepath") - // TODO: Verify whether the path is valid + FilesystemNode path(option); + if(!path.exists()) { + usage("Non-existent savegames path '%s'", option); + } else if(!path.isWritable()) { + usage("Non-writable savegames path '%s'", option); + } END_OPTION DO_LONG_OPTION_INT("talkspeed") @@ -466,7 +478,12 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, char **ar END_OPTION DO_LONG_OPTION("themepath") - // TODO: Verify whether the path is valid + FilesystemNode path(option); + if(!path.exists()) { + usage("Non-existent theme path '%s'", option); + } else if(!path.isReadable()) { + usage("Non-readable theme path '%s'", option); + } END_OPTION DO_LONG_OPTION("target-md5") @@ -562,7 +579,7 @@ static void runDetectorTest() { FilesystemNode dir(path); FSList files; - if (!dir.listDir(files, FilesystemNode::kListAll)) { + if (!dir.getChildren(files, FilesystemNode::kListAll)) { printf(" ... invalid path, skipping\n"); continue; } @@ -673,13 +690,18 @@ bool processSettings(Common::String &command, Common::StringMap &settings) { if (!settings.contains("savepath")) { const char *dir = getenv("SCUMMVM_SAVEPATH"); if (dir && *dir && strlen(dir) < MAXPATHLEN) { - // TODO: Verify whether the path is valid - settings["savepath"] = dir; + FilesystemNode saveDir(dir); + if(!saveDir.exists()) { + warning("Non-existent SCUMMVM_SAVEPATH save path. It will be ignored."); + } else if(!saveDir.isWritable()) { + warning("Non-writable SCUMMVM_SAVEPATH save path. It will be ignored."); + } else { + settings["savepath"] = dir; + } } } #endif - // Finally, store the command line settings into the config manager. for (Common::StringMap::const_iterator x = settings.begin(); x != settings.end(); ++x) { Common::String key(x->_key); diff --git a/common/advancedDetector.cpp b/common/advancedDetector.cpp index a342ed910a..f3e8671025 100644 --- a/common/advancedDetector.cpp +++ b/common/advancedDetector.cpp @@ -276,7 +276,7 @@ PluginError detectGameForEngineCreation( FSList fslist; FilesystemNode dir(ConfMan.get("path")); - if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) { + if (!dir.getChildren(fslist, FilesystemNode::kListFilesOnly)) { return kInvalidPathError; } @@ -345,7 +345,7 @@ static ADGameDescList detectGame(const FSList *fslist, const Common::ADParams &p // Get the information of the existing files for (FSList::const_iterator file = fslist->begin(); file != fslist->end(); ++file) { if (file->isDirectory()) continue; - tstr = file->name(); + tstr = file->getName(); tstr.toLowercase(); // Strip any trailing dot @@ -364,7 +364,7 @@ static ADGameDescList detectGame(const FSList *fslist, const Common::ADParams &p debug(3, "> %s: %s", tstr.c_str(), md5str); - if (testFile.open(file->path())) { + if (testFile.open(file->getPath())) { filesSize[tstr] = (int32)testFile.size(); testFile.close(); } diff --git a/common/file.cpp b/common/file.cpp index 2eba1bcb3d..238c3a4bb3 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -226,7 +226,7 @@ void File::addDefaultDirectoryRecursive(const FilesystemNode &dir, int level, co return; FSList fslist; - if (!dir.listDir(fslist, FilesystemNode::kListAll)) { + if (!dir.getChildren(fslist, FilesystemNode::kListAll)) { // Failed listing the contents of this node, so it is either not a // directory, or just doesn't exist at all. return; @@ -237,7 +237,7 @@ void File::addDefaultDirectoryRecursive(const FilesystemNode &dir, int level, co // Do not add directories multiple times, unless this time they are added // with a bigger depth. - const String &directory(dir.path()); + const String &directory(dir.getPath()); if (_defaultDirectories->contains(directory) && (*_defaultDirectories)[directory] >= level) return; (*_defaultDirectories)[directory] = level; @@ -247,13 +247,13 @@ void File::addDefaultDirectoryRecursive(const FilesystemNode &dir, int level, co for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { if (file->isDirectory()) { - addDefaultDirectoryRecursive(file->path(), level - 1, prefix + file->name() + "/"); + addDefaultDirectoryRecursive(file->getPath(), level - 1, prefix + file->getName() + "/"); } else { String lfn(prefix); - lfn += file->name(); + lfn += file->getName(); lfn.toLowercase(); if (!_filesMap->contains(lfn)) { - (*_filesMap)[lfn] = file->path(); + (*_filesMap)[lfn] = file->getPath(); } } } @@ -364,15 +364,21 @@ bool File::open(const String &filename, AccessMode mode) { bool File::open(const FilesystemNode &node, AccessMode mode) { assert(mode == kFileReadMode || mode == kFileWriteMode); - if (!node.isValid()) { - warning("File::open: Trying to open an invalid FilesystemNode object"); + if (!node.exists()) { + warning("File::open: Trying to open a FilesystemNode which does not exist"); return false; } else if (node.isDirectory()) { warning("File::open: Trying to open a FilesystemNode which is a directory"); return false; - } + } /*else if (!node.isReadable() && mode == kFileReadMode) { + warning("File::open: Trying to open an unreadable FilesystemNode object for reading"); + return false; + } else if (!node.isWritable() && mode == kFileWriteMode) { + warning("File::open: Trying to open an unwritable FilesystemNode object for writing"); + return false; + }*/ - String filename(node.name()); + String filename(node.getName()); if (_handle) { error("File::open: This file object already is opened (%s), won't open '%s'", _name.c_str(), filename.c_str()); @@ -383,7 +389,7 @@ bool File::open(const FilesystemNode &node, AccessMode mode) { const char *modeStr = (mode == kFileReadMode) ? "rb" : "wb"; - _handle = fopen(node.path().c_str(), modeStr); + _handle = fopen(node.getPath().c_str(), modeStr); if (_handle == NULL) { if (mode == kFileReadMode) @@ -409,7 +415,7 @@ bool File::exists(const String &filename) { // FIXME: can't use isValid() here since at the time of writing // FilesystemNode is to be unable to find for example files // added in extrapath - if (file.isDirectory()) + if (file.isDirectory() || !file.exists()) return false; // Next, try to locate the file by *opening* it in read mode. This has diff --git a/common/fs.cpp b/common/fs.cpp index c33fc42223..28f3e11f0b 100644 --- a/common/fs.cpp +++ b/common/fs.cpp @@ -23,14 +23,45 @@ */ #include "common/stdafx.h" - -#include "backends/fs/abstract-fs.h" #include "common/util.h" +#include "backends/fs/abstract-fs.h" +#include "backends/fs/fs-factory-maker.cpp" - -FilesystemNode::FilesystemNode(AbstractFilesystemNode *realNode) { - _realNode = realNode; - _refCount = new int(1); +/* + * Simple DOS-style pattern matching function (understands * and ? like used in DOS). + * Taken from exult/files/listfiles.cc + */ +static bool matchString(const char *str, const char *pat) { + const char *p = 0; + const char *q = 0; + + for (;;) { + switch (*pat) { + case '*': + p = ++pat; + q = str; + break; + + default: + if (*pat != *str) { + if (p) { + pat = p; + str = ++q; + if(!*str) + return !*pat; + break; + } + else + return false; + } + // fallthrough + case '?': + if(!*str) + return !*pat; + pat++; + str++; + } + } } FilesystemNode::FilesystemNode() { @@ -38,6 +69,11 @@ FilesystemNode::FilesystemNode() { _refCount = 0; } +FilesystemNode::FilesystemNode(AbstractFilesystemNode *realNode) { + _realNode = realNode; + _refCount = new int(1); +} + FilesystemNode::FilesystemNode(const FilesystemNode &node) { _realNode = node._realNode; _refCount = node._refCount; @@ -46,10 +82,12 @@ FilesystemNode::FilesystemNode(const FilesystemNode &node) { } FilesystemNode::FilesystemNode(const Common::String &p) { + AbstractFilesystemFactory *factory = FilesystemFactoryMaker::makeFactory(); + if (p.empty() || p == ".") - _realNode = AbstractFilesystemNode::getCurrentDirectory(); + _realNode = factory->makeCurrentDirectoryFileNode(); else - _realNode = AbstractFilesystemNode::getNodeForPath(p); + _realNode = factory->makeFileNodePath(p); _refCount = new int(1); } @@ -57,18 +95,7 @@ FilesystemNode::~FilesystemNode() { decRefCount(); } -void FilesystemNode::decRefCount() { - if (_refCount) { - assert(*_refCount > 0); - --(*_refCount); - if (*_refCount == 0) { - delete _refCount; - delete _realNode; - } - } -} - -FilesystemNode &FilesystemNode::operator =(const FilesystemNode &node) { +FilesystemNode &FilesystemNode::operator= (const FilesystemNode &node) { if (node._refCount) ++(*node._refCount); @@ -80,40 +107,48 @@ FilesystemNode &FilesystemNode::operator =(const FilesystemNode &node) { return *this; } -bool FilesystemNode::isValid() const { - if (_realNode == 0) +bool FilesystemNode::operator< (const FilesystemNode& node) const +{ + if (isDirectory() && !node.isDirectory()) + return true; + if (!isDirectory() && node.isDirectory()) return false; - return _realNode->isValid(); + return scumm_stricmp(getDisplayName().c_str(), node.getDisplayName().c_str()) < 0; } -FilesystemNode FilesystemNode::getParent() const { - if (_realNode == 0) - return *this; - - AbstractFilesystemNode *node = _realNode->parent(); - if (node == 0) { - return *this; - } else { - return FilesystemNode(node); +void FilesystemNode::decRefCount() { + if (_refCount) { + assert(*_refCount > 0); + --(*_refCount); + if (*_refCount == 0) { + delete _refCount; + delete _realNode; + } } } +bool FilesystemNode::exists() const { + if (_realNode == 0) + return false; + return _realNode->exists(); +} + FilesystemNode FilesystemNode::getChild(const Common::String &n) const { if (_realNode == 0) return *this; assert(_realNode->isDirectory()); - AbstractFilesystemNode *node = _realNode->child(n); + AbstractFilesystemNode *node = _realNode->getChild(n); return FilesystemNode(node); } -bool FilesystemNode::listDir(FSList &fslist, ListMode mode) const { +bool FilesystemNode::getChildren(FSList &fslist, ListMode mode, bool hidden) const { if (!_realNode || !_realNode->isDirectory()) return false; AbstractFSList tmp; - if (!_realNode->listDir(tmp, mode)) + if (!_realNode->getChildren(tmp, mode, hidden)) return false; fslist.clear(); @@ -124,33 +159,92 @@ bool FilesystemNode::listDir(FSList &fslist, ListMode mode) const { return true; } +Common::String FilesystemNode::getDisplayName() const { + assert(_realNode); + return _realNode->getDisplayName(); +} + +Common::String FilesystemNode::getName() const { + assert(_realNode); + return _realNode->getName(); +} + +FilesystemNode FilesystemNode::getParent() const { + if (_realNode == 0) + return *this; + + AbstractFilesystemNode *node = _realNode->getParent(); + if (node == 0) { + return *this; + } else { + return FilesystemNode(node); + } +} + +Common::String FilesystemNode::getPath() const { + assert(_realNode); + return _realNode->getPath(); +} + bool FilesystemNode::isDirectory() const { if (_realNode == 0) return false; return _realNode->isDirectory(); } -Common::String FilesystemNode::displayName() const { - assert(_realNode); - return _realNode->displayName(); +bool FilesystemNode::isReadable() const { + if (_realNode == 0) + return false; + return _realNode->isReadable(); } -Common::String FilesystemNode::name() const { - assert(_realNode); - return _realNode->name(); +bool FilesystemNode::isWritable() const { + if (_realNode == 0) + return false; + return _realNode->isWritable(); } -Common::String FilesystemNode::path() const { - assert(_realNode); - return _realNode->path(); +bool FilesystemNode::lookupFile(FSList &results, FSList &fslist, Common::String &filename, bool hidden, bool exhaustive) const +{ + for(FSList::iterator entry = fslist.begin(); entry != fslist.end(); ++entry) + { + if(entry->isDirectory()) { + lookupFileRec(results, *entry, filename, hidden, exhaustive); + } + } + + //TODO: we would return true even if no matches were found, if the initial results list isn't empty + return ((results.size() > 0) ? true : false); } +bool FilesystemNode::lookupFile(FSList &results, FilesystemNode &dir, Common::String &filename, bool hidden, bool exhaustive) const +{ + lookupFileRec(results, dir, filename, hidden, exhaustive); + + //TODO: we would return true even if no matches were found, if the initial results list isn't empty + return ((results.size() > 0) ? true : false); +} -bool FilesystemNode::operator< (const FilesystemNode& node) const +void FilesystemNode::lookupFileRec(FSList &results, FilesystemNode &dir, Common::String &filename, bool hidden, bool exhaustive) const { - if (isDirectory() && !node.isDirectory()) - return true; - if (!isDirectory() && node.isDirectory()) - return false; - return scumm_stricmp(displayName().c_str(), node.displayName().c_str()) < 0; + FSList entries; + dir.getChildren(entries, FilesystemNode::kListAll, hidden); + + for(FSList::iterator entry = entries.begin(); entry != entries.end(); ++entry) + { + if(entry->isDirectory()) { + lookupFileRec(results, *entry, filename, hidden, exhaustive); + } else { + //TODO: here we assume all backends implement the lastPathComponent method. It is currently static, + // so it might be a good idea to include it inside the backend class. This would enforce its + // implementation by all ports. + if(matchString(lastPathComponent(entry->getPath()), filename.c_str())) { + results.push_back(*entry); + + if(!exhaustive) { + break; + } + } + } + } } diff --git a/common/fs.h b/common/fs.h index 4c275b5b2a..6a2f049be1 100644 --- a/common/fs.h +++ b/common/fs.h @@ -33,7 +33,6 @@ class FilesystemNode; class AbstractFilesystemNode; - /** * List of multiple file system nodes. E.g. the contents of a given directory. * This is subclass instead of just a typedef so that we can use forward @@ -41,9 +40,8 @@ class AbstractFilesystemNode; */ class FSList : public Common::Array<FilesystemNode> {}; - /** - * FilesystemNode provides an abstraction for file pathes, allowing for portable + * FilesystemNode provides an abstraction for file paths, allowing for portable * file system browsing. To this ends, multiple or single roots have to be supported * (compare Unix with a single root, Windows with multiple roots C:, D:, ...). * @@ -67,9 +65,8 @@ class FSList : public Common::Array<FilesystemNode> {}; */ class FilesystemNode { private: - AbstractFilesystemNode *_realNode; int *_refCount; - + AbstractFilesystemNode *_realNode; FilesystemNode(AbstractFilesystemNode *realNode); public: @@ -113,51 +110,42 @@ public: /** * Copy operator. */ - FilesystemNode &operator =(const FilesystemNode &node); - + FilesystemNode &operator= (const FilesystemNode &node); + /** - * Checks if the FilesystemNode is valid for any usage + * Compare the name of this node to the name of another. Directories + * go before normal files. */ - bool isValid() const; + bool operator< (const FilesystemNode& node) const; - /** - * Get the parent node of this node. If this node has no parent node, - * then it returns a duplicate of this node. + /* + * Indicates whether the object refered by this path exists in the filesystem or not. */ - FilesystemNode getParent() const; + virtual bool exists() const; /** * Fetch a child node of this node, with the given name. Only valid for - * directory nodes (an assertion is triggered otherwise). If no no child - * node with the given name exists, an invalid node is returned. + * directory nodes (an assertion is triggered otherwise). + * If no child node with the given name exists, an invalid node is returned. */ FilesystemNode getChild(const Common::String &name) const; - + /** * Return a list of child nodes of this directory node. If called on a node * that does not represent a directory, false is returned. + * * @return true if succesful, false otherwise (e.g. when the directory does not exist). - * @todo Rename this to listChildren or getChildren. - */ - virtual bool listDir(FSList &fslist, ListMode mode = kListDirectoriesOnly) const; - - /** - * Is this node pointing to a directory? - * @todo Currently we assume that a valid node that is not a directory - * automatically is a file (ignoring things like symlinks). That might - * actually be OK... but we could still add an isFile method. Or even replace - * isValid and isDirectory by a getType() method that can return values like - * kDirNodeType, kFileNodeType, kInvalidNodeType. */ - virtual bool isDirectory() const; + virtual bool getChildren(FSList &fslist, ListMode mode = kListDirectoriesOnly, bool hidden = false) const; /** * Return a human readable string for this node, usable for display (e.g. * in the GUI code). Do *not* rely on it being usable for anything else, * like constructing paths! + * * @return the display name */ - virtual Common::String displayName() const; + virtual Common::String getDisplayName() const; /** * Return a string representation of the name of the file. This is can be @@ -167,7 +155,7 @@ public: * * @return the file name */ - virtual Common::String name() const; + virtual Common::String getName() const; /** * Return a string representation of the file which can be passed to fopen(), @@ -180,18 +168,80 @@ public: * * @return the 'path' represented by this filesystem node */ - virtual Common::String path() const; + virtual Common::String getPath() const; + + /** + * Get the parent node of this node. If this node has no parent node, + * then it returns a duplicate of this node. + */ + FilesystemNode getParent() const; /** - * Compare the name of this node to the name of another. Directories - * go before normal files. + * Indicates whether this path refers to a directory or not. + * + * @todo Currently we assume that a valid node that is not a directory + * automatically is a file (ignoring things like symlinks). That might + * actually be OK... but we could still add an isFile method. Or even replace + * isValid and isDirectory by a getType() method that can return values like + * kDirNodeType, kFileNodeType, kInvalidNodeType. */ - bool operator< (const FilesystemNode& node) const; + virtual bool isDirectory() const; + + /** + * Indicates whether this path can be read from or not. + */ + virtual bool isReadable() const; + + /** + * Indicates whether this path can be written to or not. + */ + virtual bool isWritable() const; + + /** + * Searches recursively for a filename inside the given directories. + * + * @param results List to put the matches in. + * @param fslist List of directories to search within. + * @param filename Name of the file to look for. + * @param hidden Whether to search hidden files or not. Default: false + * @param exhaustive Whether to continue searching after one match has been found. Default: false + * + * @return true if matches could be found, false otherwise. + */ + virtual bool lookupFile(FSList &results, FSList &fslist, Common::String &filename, bool hidden, bool exhaustive) const; + + /** + * Searches recursively for a filename inside the given directory. + * + * @param results List to put the matches in. + * @param FilesystemNode Directory to search within. + * @param filename Name of the file to look for. + * @param hidden Whether to search hidden files or not. Default: false + * @param exhaustive Whether to continue searching after one match has been found. Default: false + * + * @return true if matches could be found, false otherwise. + */ + virtual bool lookupFile(FSList &results, FilesystemNode &dir, Common::String &filename, bool hidden, bool exhaustive) const; protected: + /** + * Decreases the reference count to the FilesystemNode, and if necessary, + * deletes the corresponding underlying references. + */ void decRefCount(); + + /** + * Searches recursively for a filename inside the given directory. + * + * @param results List to put the matches in. + * @param FilesystemNode Directory to search within. + * @param filename Name of the file to look for. + * @param hidden Whether to search hidden files or not. + * @param exhaustive Whether to continue searching after one match has been found. + */ + void lookupFileRec(FSList &results, FilesystemNode &dir, Common::String &filename, bool hidden, bool exhaustive) const; }; //} // End of namespace Common -#endif +#endif //COMMON_FS_H diff --git a/common/iff_container.h b/common/iff_container.h index cc55970591..0d07b5bd57 100644 --- a/common/iff_container.h +++ b/common/iff_container.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/common/iff_container.h $ + * $Id:iff_container.h 26949 2007-05-26 20:23:24Z david_corrales $ */ #ifndef COMMON_IFF_CONTAINER_H diff --git a/common/keyboard.h b/common/keyboard.h deleted file mode 100644 index d0d0e43f00..0000000000 --- a/common/keyboard.h +++ /dev/null @@ -1,266 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef COMMON_KEYBOARD_H -#define COMMON_KEYBOARD_H - -#include "common/scummsys.h" - -namespace Common { - -enum KeyCode { - KEYCODE_INVALID = 0, - - KEYCODE_BACKSPACE = 8, - KEYCODE_TAB = 9, - KEYCODE_CLEAR = 12, - KEYCODE_RETURN = 13, - KEYCODE_PAUSE = 19, - KEYCODE_ESCAPE = 27, - KEYCODE_SPACE = 32, - KEYCODE_EXCLAIM = 33, - KEYCODE_QUOTEDBL = 34, - KEYCODE_HASH = 35, - KEYCODE_DOLLAR = 36, - KEYCODE_AMPERSAND = 38, - KEYCODE_QUOTE = 39, - KEYCODE_LEFTPAREN = 40, - KEYCODE_RIGHTPAREN = 41, - KEYCODE_ASTERISK = 42, - KEYCODE_PLUS = 43, - KEYCODE_COMMA = 44, - KEYCODE_MINUS = 45, - KEYCODE_PERIOD = 46, - KEYCODE_SLASH = 47, - KEYCODE_0 = 48, - KEYCODE_1 = 49, - KEYCODE_2 = 50, - KEYCODE_3 = 51, - KEYCODE_4 = 52, - KEYCODE_5 = 53, - KEYCODE_6 = 54, - KEYCODE_7 = 55, - KEYCODE_8 = 56, - KEYCODE_9 = 57, - KEYCODE_COLON = 58, - KEYCODE_SEMICOLON = 59, - KEYCODE_LESS = 60, - KEYCODE_EQUALS = 61, - KEYCODE_GREATER = 62, - KEYCODE_QUESTION = 63, - KEYCODE_AT = 64, - - KEYCODE_LEFTBRACKET = 91, - KEYCODE_BACKSLASH = 92, - KEYCODE_RIGHTBRACKET= 93, - KEYCODE_CARET = 94, - KEYCODE_UNDERSCORE = 95, - KEYCODE_BACKQUOTE = 96, - KEYCODE_a = 97, - KEYCODE_b = 98, - KEYCODE_c = 99, - KEYCODE_d = 100, - KEYCODE_e = 101, - KEYCODE_f = 102, - KEYCODE_g = 103, - KEYCODE_h = 104, - KEYCODE_i = 105, - KEYCODE_j = 106, - KEYCODE_k = 107, - KEYCODE_l = 108, - KEYCODE_m = 109, - KEYCODE_n = 110, - KEYCODE_o = 111, - KEYCODE_p = 112, - KEYCODE_q = 113, - KEYCODE_r = 114, - KEYCODE_s = 115, - KEYCODE_t = 116, - KEYCODE_u = 117, - KEYCODE_v = 118, - KEYCODE_w = 119, - KEYCODE_x = 120, - KEYCODE_y = 121, - KEYCODE_z = 122, - KEYCODE_DELETE = 127, - - // Numeric keypad - KEYCODE_KP0 = 256, - KEYCODE_KP1 = 257, - KEYCODE_KP2 = 258, - KEYCODE_KP3 = 259, - KEYCODE_KP4 = 260, - KEYCODE_KP5 = 261, - KEYCODE_KP6 = 262, - KEYCODE_KP7 = 263, - KEYCODE_KP8 = 264, - KEYCODE_KP9 = 265, - KEYCODE_KP_PERIOD = 266, - KEYCODE_KP_DIVIDE = 267, - KEYCODE_KP_MULTIPLY = 268, - KEYCODE_KP_MINUS = 269, - KEYCODE_KP_PLUS = 270, - KEYCODE_KP_ENTER = 271, - KEYCODE_KP_EQUALS = 272, - - // Arrows + Home/End pad - KEYCODE_UP = 273, - KEYCODE_DOWN = 274, - KEYCODE_RIGHT = 275, - KEYCODE_LEFT = 276, - KEYCODE_INSERT = 277, - KEYCODE_HOME = 278, - KEYCODE_END = 279, - KEYCODE_PAGEUP = 280, - KEYCODE_PAGEDOWN = 281, - - // Function keys - KEYCODE_F1 = 282, - KEYCODE_F2 = 283, - KEYCODE_F3 = 284, - KEYCODE_F4 = 285, - KEYCODE_F5 = 286, - KEYCODE_F6 = 287, - KEYCODE_F7 = 288, - KEYCODE_F8 = 289, - KEYCODE_F9 = 290, - KEYCODE_F10 = 291, - KEYCODE_F11 = 292, - KEYCODE_F12 = 293, - KEYCODE_F13 = 294, - KEYCODE_F14 = 295, - KEYCODE_F15 = 296, - - // Key state modifier keys - KEYCODE_NUMLOCK = 300, - KEYCODE_CAPSLOCK = 301, - KEYCODE_SCROLLOCK = 302, - KEYCODE_RSHIFT = 303, - KEYCODE_LSHIFT = 304, - KEYCODE_RCTRL = 305, - KEYCODE_LCTRL = 306, - KEYCODE_RALT = 307, - KEYCODE_LALT = 308, - KEYCODE_RMETA = 309, - KEYCODE_LMETA = 310, - KEYCODE_LSUPER = 311, // Left "Windows" key - KEYCODE_RSUPER = 312, // Right "Windows" key - KEYCODE_MODE = 313, // "Alt Gr" key - KEYCODE_COMPOSE = 314, // Multi-key compose key - - // Miscellaneous function keys - KEYCODE_HELP = 315, - KEYCODE_PRINT = 316, - KEYCODE_SYSREQ = 317, - KEYCODE_BREAK = 318, - KEYCODE_MENU = 319, - KEYCODE_POWER = 320, // Power Macintosh power key - KEYCODE_EURO = 321, // Some european keyboards - KEYCODE_UNDO = 322 // Atari keyboard has Undo -}; - -/** - * List of certan special and some fake 'ascii' values used in keyboard events. - * The values for the function keys listed here are based on what certain SCUMM - * games expect in their scripts. - * @todo Get rid of the function key values, and instead enforce that engines use - * the keycode value to handle these. - */ -enum { - ASCII_BACKSPACE = 8, - ASCII_TAB = 9, - ASCII_RETURN = 13, - ASCII_ESCAPE = 27, - ASCII_SPACE = 32, - - ASCII_F1 = 315, - ASCII_F2 = 316, - ASCII_F3 = 317, - ASCII_F4 = 318, - ASCII_F5 = 319, - ASCII_F6 = 320, - ASCII_F7 = 321, - ASCII_F8 = 322, - ASCII_F9 = 323, - ASCII_F10 = 324, - ASCII_F11 = 325, - ASCII_F12 = 326 -}; - -/** - * Keyboard modifier flags, used for Event::kbd::flags. - */ -enum { - KBD_CTRL = 1 << 0, - KBD_ALT = 1 << 1, - KBD_SHIFT = 1 << 2 -}; - -/** - * Keyboard status, as used in the Event struct. - */ -struct KeyState { - /** - * Abstract key code (will be the same for any given key regardless - * of modifiers being held at the same time. - * For example, this is the same for both 'A' and Shift-'A'. - * @todo Document which values are to be used for non-ASCII keys - * like F1-F10. For now, let's just say that our primary backend - * is the SDL one, and it uses the values SDL uses... so until - * we fix this, your best bet is to get a copy of SDL_keysym.h - * and look at that, if you want to find out a key code. - */ - KeyCode keycode; - - /** - * ASCII-value of the pressed key (if any). - * This depends on modifiers, i.e. pressing the 'A' key results in - * different values here depending on the status of shift, alt and - * caps lock. - */ - uint16 ascii; - - /** - * Status of the modifier keys. Bits are set in this for each - * pressed modifier - * @see KBD_CTRL, KBD_ALT, KBD_SHIFT - */ - byte flags; - - KeyState(KeyCode kc = KEYCODE_INVALID, uint16 asc = 0, byte f = 0) { - keycode = kc; - ascii = asc ? asc : (uint16)kc; - flags = f; - } - - void reset() { - keycode = KEYCODE_INVALID; - ascii = flags = 0; - } -}; - -} // End of namespace Common - -#endif diff --git a/common/md5.cpp b/common/md5.cpp index a48ecb4948..32acdc5b8c 100644 --- a/common/md5.cpp +++ b/common/md5.cpp @@ -246,15 +246,18 @@ void md5_finish(md5_context *ctx, uint8 digest[16]) { } bool md5_file(const FilesystemNode &file, uint8 digest[16], uint32 length) { - if (!file.isValid()) { - warning("md5_file: using an invalid FilesystemNode"); + if(!file.exists()) { + warning("md5_file: using an inexistent FilesystemNode"); + return false; + } else if (!file.isReadable()) { + warning("md5_file: using an unreadable FilesystemNode"); return false; } else if (file.isDirectory()) { - warning("md5_file: using a diretory FilesystemNode"); + warning("md5_file: using a directory FilesystemNode"); return false; } - return md5_file(file.path().c_str(), digest, length); + return md5_file(file.getPath().c_str(), digest, length); } bool md5_file(const char *name, uint8 digest[16], uint32 length) { diff --git a/dists/pred.dic b/dists/pred.dic deleted file mode 100644 index 131aeff9ef..0000000000 --- a/dists/pred.dic +++ /dev/null @@ -1,7986 +0,0 @@ -222 cab -2222243 cabbage -222243 cabbie -222253 babble -22229 cabby -2223 babe -2223537283 accelerate -22237 babes -222377 access -222378 accept -22243368 accident -2224336825 accidental -22246 cabin -2224638 cabinet -22246387 cabinets -222467 cabins -2225 back -2225224 backbag -22253 cable -22253667 backdoor -222537 cables -22257433 backside -22257666 backroom -222578243 backstage -222587 backup -2225877 backups -2226366 abandon -222636633 abandoned -222652337 accolades -22266 bacon -222665 acamol -222673466 accordion -222674669 cacophony -222678 accost -2226868 account -2226868268 accountant -22283742 bacteria -22284 cacti -222844 cactii -2228685283 accumulate -222887 cactus -2229 baby -22293655 babydoll -22297 babys -223 abe bad cad -2232837 cadaver -22328377 cadavers -2233 cafe -22333463 caffeine -223343 caddie -223383742 cafeteria -22343 badge -2234522 cadilac -22345522 cadillac -223666 badoom -2238 abet -223828466 abduction -22382867 abductor -223828677 abductors -224 bag cag -2243 acid cage -22433 caged -2243676547 acidopolis -22437 cages -2243837 acheter -2244243 baggage -224433 bagged -224443 baggie -2245 bail -2245489 ability -2245568 caillou -22455689 cailloux -22467 bains -2247 bags -2247473 bagpipe -224773 caisse -2247737 caisses -2248 bait -22483 bague -224833 baited -2248546 caitlin -2248596 caitlyn -2252623 balance -2252669 balcony -2252852867 calculator -2253 bake cake calf able -22536327 calendar -22536337 calender -22537 baker cakes -225379 bakery -2254226 caliban -22543 calif -2254367642 california -2255 ball call -2255268463 ballantine -2255464 calling -22557 balls calls -225576468 ballpoint -2256 calm -225837 calves -2258787233 balustrade -226 can -22624 bambi -22625 canal -226262 banana -2262627 bananas -226279 canary -2263 band cane -2263262 bandana -22632662 bandanna -22633 abode -2263352272 candelabra -2263423 candice -226348 bandit -2263487 bandits -22635 camel -226353 candle -2263532272 candleabra -226353465337 candleholder -2263534653377 candleholders -2263537 candles -22635378425 candlestick -226372 camera -2263727 cameras -22639 candy -2264 bang -226463 canine -22647837 banister canister -226478377 banisters canisters -2265 bank -226537 banker -22656683 banknote -226637 banner -2266377 banners -2266462253 abominable -226666 cannon -2266667 cannons -226679 canopy -2267 camp cans -22673473 campfire -22676 acorn -226767 acorns -22678 abort -226787 campus -226827 canvas -22683 above -2268336 canteen -226837 banter -22687842 acoustic -22688 about -226966 canyon -2269667 canyons -227 bar bas cap car -22722227 barabbas -22722232272 abracadabra -2272233 cascade -22722337 cascades -2272277 carcass -227227737 carcasses -227233 barbed -22723738867 carberettor -22724247 barchair -227242477 barchairs -2272426 abraham -22724267 abrahams -22727466 abrasion -2272826 caravan -2272873867 carburetor -22728738867 carburettor -2273 barf base cape card care case -22732255 baseball -22734625 cardinal -22736368 basement -22736574 bardolph -22737 cards cases -22737568 cardslot -227377 caress -227382537 caretaker -2274 bash cash -2274224 cashbag -2274246 bargain -22743 barge -2274347 casheir -2274437 cashier -22746 basin cargo -227464 casing -2274652 cashola -227466 casino -2274662842 cashomatic -2275 bark cask -2275337 barkeep -227533737 barkeeper -227538 basket casket -2275382255 basketball -2275387 baskets -227539 barley -227546 carlin -227567 carlos -22756884 carlotti -22757 casks -2275866 carlton -22758667 carltons -2276 barn -2276243 barmaid carnage -227625 carnal -227626 barman -227636 barmen -227648673 carnivore -2276486737 carnivores -22765 carol -227657 carols -22766 baron -227677 across -22769637 barowner -2277 bars bass cars -227735 barrel -2277355 barrell -2277357 barrels -227738 carpet -2277387 carpets -227742233 barricade -22774243 carriage -2277437 barrier carrier -22774373 barriere -22774377 barriers -2277678 carport -227768 carrot -2277687 carrots -2277853 capsule -22778537 capsules -22778665 barstool -227786657 barstools -22779 carry -2278 bart cart cast -2278246 captain -22782467 captains -2278273 bastard -22783 carte carve -227836337 bartender -227837 carter -2278464 carving -22784647 carvings -2278473 acquire -227847625 baptismal -2278478 baptist -227853 castle -2278537 castles -2278626 bartman -227866 carton -227867 captor -22787 carts -227874343 cartridge -2278743437 cartridges -2278873 capture -22797325 carwreck -228 act bat cat -228226627 catacombs -22824 catch -2282437 catcher -22824464 catching -2283 cave -228346 cavein -2283626 caveman -2283636 cavemen -22837 bates caves -228376 cavern -2284 bath -22843 bathe -228433725 cathedral -228466 action -22847 baths -22847666 bathroom -22848283 activate -228482867 activator -22848437 cavities -2284882 bathtub -228489 cavity -22853766 cauldron -228548837 catlitter -228626 batman -228627 catnap -228646466 batminion -22866 baton -228662453 batmobile -228667 batons -2287 bats cats -22873 abuse cause -228737 causer -228768733 abtsotree -2287842 acustic -22882457 cattails -2288283 actuate -22882867 actuator -228837437 batteries -2288379 battery -228853 battle cattle -2289255 catwalk -229 bay -2293667 baydoor -22936677 baydoors -2296638 bayonet -2297 bays -22977 abyss -23 cd be -23224 beach -232266 beacon -2322873 because -23237 beads -23242 adaga -23245 cecil -2325 beck -232537 beaker -2325377 beakers -23259 becky -2326 adam beam bean -232637 beamer -232663 become -23267 adams beams beans -232678255 beanstalk -2327 bear -23273 beard cease -232737 beards -2327464 bearing -23277 bears -23277546 bearskin -23278 beast -23278626 beastman -232787 beasts -2328 beat -232837 beaver -2328377 beavers -232884385 beautiful -232887 beatup -233 add bed bee -2332426237 bedchamber -233273 befare -2333 beef -23337263 bedframe -2334243 affiche -23347628483 affirmative -23348466 addition -23349 affix -2336 been -23366 addon -233667 addons -233673 before -2337 beds beep beer bees -23372273 beercase -233722737 beercases -2337377 address -233742 cedric -2337433 bedside -2337464 beeping -23376224463 beermachine -2337666 bedroom -23377 beeps -233777323 bedspread -233846836 beethoven -233853 beetle -234 beg -234284687 behaviour -234323 behead -23436684 behemoth -234366847 behemoths -23437483 adhesive -234427 beggar -2344277 beggars -234437 begger -2344377 beggers -23446 begin -234463 behind -2345464 ceiling -23454647 ceilings -23464 being -234647 beings -234653 behold -234663 begone -2349 afix -235 ael cel -23522368 adjacent -235327283 celebrate -235378425 celestial -235433 belief -235436 aelien -2355 bell cell -235527 cellar -23557 cells -235574663 cellphone -23558527 cellular -23559 belly -2356644647 belongings -23568 belov -23569 below -2358 belt -23587 belts -235878 adjust -2358786368 adjustment -236 bem ben -23624 bench -2362437 benches -236247 benchs -2363 bend -2363284 beneath -236368 cement -23638279 cemetary -23638379 cemetery -2364647837 administer -23646478728483 administrative -23648 admit -23652646 benjamin -23653 adolf -2365372368 adolescent -23664 benni -23668274 cenotaph -23669 benny -236697 bennys -2367 bems -23673 adore -236746 bensin -23676 adorn -236766 benson -2368 bent cent -236837 center -2368373653 centerfold -2368725 central -236873 centre -2368786 centrum -2368873 centure -237 cds -237225 cdrack -23723787 cerberus -2372642 ceramic -237325 cereal -2373257 cereals -237433 beside -23745263 bergland -2376 afro -23762736 bernardo -23764726 aerogram -237675263 aeroplane -237743 berrie -2377437 berries -23779 berry -2378246 certain -2378328 cerveau -23783553 cervelle -23784 berth -2378423 cervice -23784279 bestiary -23784342283 certificate -237843422837 certificates -237869 bestow -238 bet -238242 betcha -2382437 betcher -2382629 betamax -238368873 adventure -23837 after -23837243 beverage -2383759 beverly -238376666 afternoon -2383774283 aftershave -238378473 advertise -2383784736368 advertisement -23837847363687 advertisements -23837847464 advertising -238378476368 advertisment -2383784936368 advertizement -238423 advice -2389336 between -2423 chad -2424 bich -24246 again chain -242467 chains -24246729 chainsaw -2424678 against -24247 chair -242473 chaise -2424737 chaises -242477 chairs -24253 bible -242538 chalet -2425423 chalice -24255 chalk -2425525683 chalkcloud -2425526273 chalkboard -242623 chance -2426237 chamber -2426273 chambre -2426335437 chandelier -242643 change -2426433 changed -24264464 changing -2426625 channal -2426635 channel -24266357 channels -242672463 champagne -24268 chant -2427 chap char -242722837 character -24272625 charcoal -242727645 charbroil -24273 chase -242735 chapel -242743 charge -2427433 charged -2427437 charger -24274464 charging -2427468 chariot -24275363 charlene -2427537 charles -24275377 charless -2427539 charley -24276 charm chasm -242766 charon -242767 chasms -24277 chaps -24278 chart -2427837 charter -242787 charts -2428 chat -24287738837 chaussettes -242883 chauve -2428837 chatter -2429253 bicycle -24292537 bicycles -243 aid -24323 ahead -24325 check -2432576468 checkpoint -24327 cheap -24328 cheat -243287 cheats -2433 biff chef -243357 cheeks -24337 cheer chefs -243373 cheese -243373253874437 cheesebleurgher -243373287437 cheeseburger -24337532337 cheerleader -243375323377 cheerleaders -2435464 cieling -243546464 cielining -24364225 chemical -243642257 chemicals -24366 bidon -24368 agent -24373 biere -24377 chess -24377437 cherries -2437774323 chesspiece -243779 cherry -2437792662 cherrybomb -24377926627 cherrybombs -24378 chest -243787 chests -243795 cheryl -2439 chew -243933 chewed -2439464 chewing -244 agi big cig -244236 chicen -24425 chick -2442536 chicken -2442536534 chickenleg -24425367 chickens -244257 chicks -244268866 bigbottom -24427 cigar -24427324 bigbrech -244273883 cigarette -2442738837 cigarettes -244277 cigars -24433 chief -24436 chien -2444263 agigame -244437 bigger -244443 ciggie -2444437 ciggies -24449 ciggy -244497 ciggys -24453 child -244536 chiken -244537367 childrens -24455 chill -244554 chilli -2445546 chillin -2446 chin -24462 china -24463 chime -2446369 chimeny -2446373 chinese -24465 chink -2446639 chimney -24468 chiot -2447 chip cigs -244735 chisel -24476865 chipmunk -24477 chips -2448 chit -24482428 chitchat -2453 bike -24537 biker bikes -24537225 bikerack -245464 biking bikini -2455 bill -245526273 billboard -2455273 billard -24552737 billards -24553653 billfold -245542737 billiards -2455427382253 billiardtable -24557 bills -24559 billy -24568 bijou -246 aim bin -24626 bimbo -246265283 chocolate -246265283777323 chocolatespread -2463 bind -246337 cinder -2463464 binding -24634647 bindings -246362 cinema -24637 binds -24639 cindy -246423 choice -24658646372368 bioluminescent -246628527 binocular -2466285277 binoculars -24667 chomp -246673 choose -24667377 chompers -2467 bins chop -24673 chore -24677 chops -2467737 chopper -24677377 choppers -2469 chow -247 air -24724 birch -247253 circle -2472667737767 aircompressor -24727238 aircraft -2472848 circuit -247288426273 circutiboard -2473 bird -24732243 birdcage -24733333 birdfeed -247336368 agreement -247345837 airfilter -24736378 birdnest -24737 birds -24737333 birdseed -247373337 birdseeds -247376378 birdsnest -24739 birdy -2474 biri -24747 chris -247477 chriss -2474779 chrissy -247478 christ -24747867437 christopher -247478674377 christophers -24753 aisle -2475625 airlock -2476 biro -2476275 airmask -24775263 airplane -2477678 airport -2477867 airpump -2478265 airtank -2478376 cistern -24784 birth -24784329 birthday -248 bit -248229 chubby -24825 chuck -2482553 chuckle -248259 chucky -24828466 citation -2483 ague bite -24837 bites -2484 chug -2484946 citizin -24865 chunk -2487 bits -248724 church -24876 churn -248787 citrus -24883 chute -248837 bitter -2489 city -2492773 bizarre -2493 agwe -252 bla -2522 blab -25225 black -2522526273 blackboard -25225464 blacking -252255225 blackjack -2522576484 blacksmith -2522867 albator -25228767 albatros -25233 blade -2523337 bladder -25242 alaga -252466 albino -25252926 alakazam -2526 clam -2526237 clamber -2526437 clanger -2526465 alcohol -252646542 alcoholic -25265 blank -2526538 blanket -25265387 blankets -25267 clams -252674355 clamshell -252683 alcove -2527 clap -2527463 clarine -25274772 clarissa -252747727 clarissas -25275 clark -25276 alarm -25277 class -252776283 classmate -2527762837 classmates -252777666 classroom -25278 blast -2527837 blaster -25278377 blasters -2528342 claudia -25283427 claudias -2528437 clavier -25286 album -25287 claus -2528837 clatter -25289 blatz -2529 ajax claw clay -25293 blaze -25297 claws -2529768 claypot -253 ale cle -253224 bleach -25325 ckeck -25326 clean -2532633 cleaned -25326464 cleaning -2532673 cleanse -25327 clear -253272623 clearance -25327464 clearing -2532792837 clearwater -253283 cleave -2532837 cleaver -2533 clef -25338 cleft -25363 blend -2536337 blender -2537424 aldrich -253749626 clergyman -25375 clerk -25377 bless -253874437 bleurgher -2538744377 bleurghers -253926337 alexander -2539263377 alexanders -2539263768 alexandrov -254 ali -2542 alga -25423 algae -2542537 clicker -25427464 aliasing -25432 algea -25433 cliff -254337 cliffs -25436 alien -254367 aliens -25442867 aligator -254448 alight -25462 climb -25462464 climbing -25463 blind -254637 blinds -25465464 blinking -2547 clip -254726273 clipboard -25477 bliss clips -2547737 clipper -25477377 clippers -25477464 clipping -254774647 clippings -2548 clit -25486747 clitoris -25487378 algusest -255 all -25524 allah -25536 allen -25539 alley -255442867 alligator -2554428677 alligators -2556728787 allosaurus -2557 alls -25574448 allright -2559 ally -2562237 clobber -25622437 blobbies -256229 blobby -25625 block cloak clock -256257 blocks -2563 clod -256376 bjoern -2563767 bjoerns -25653 bloke -256537 blokes -25663 blond blood clone -256633 blonde -256637 cloner clones -25663782467 bloodstains -256639 bloody -25664 along -2566464 cloning -2566646 bloomin -25666464 blooming -256678 almost -2566927 bloozar -25673 close -2567359 closely -256738 closet -2567387 closets -2567766 blossom -25677667 blossoms -2568 blot -25683 cloud -256835263 cloudland -256837 clouds clover -25684 cloth -256843 clothe -2568437 clothes -256843737937 clothesdryer -25684375463 clothesline -25684437 clothier -25684464 clothing -25687 blots -256873 blouse -2568837 blotter -2569 blow -25693474 blowfish -2569562 blowjob -25696 clown -256962568437 clownclothes -25696688348 clownoutfit -256967848 clownsuit -25697 blows -256987 bloxur -2573239 already -25742238 alphabet -25742723 alphapad -2574448 alright -2582 club -25825 cluck -25827 altar -2583 blue -258323779 blueberry -25833 bluff -2583332 alteeda -25833327 alteedas -258337 bluffs -25834366 bludgeon -2583529 bluejay -25837 alter blues -258463837 altimeter -25868 blunt -25874 blush -25949 clxix -26 am an cm -262 boa bob cob -2622 coca -26224 coach -262246 cocain -2622463 cocaine -26225378663 cobblestone -262253786637 cobblestones -26229 bobby -26235436 coaelhen -26237 amber -262377 ambers -2624368 ancient -262467 anchor -2625 anal coal -26252866 cockatoo -262528667 cockatoos -26254653 coalhold -2625748 cockpit -262576224 cockroach -26258245 cocktail -2625973 analyse -2625993 analyze -2626 coco -2626688 coconut -26266887 coconuts -2626887 cocnuts -2627 boar bobs -26272 cobra -26273 board -262737 boards -262739255 boardwalk -26277 amass -26278 coast -2628 boat coat -2628426437 coathanger -2628465337 coatholder -262852623 ambulance -26285283 ambulate -2628626 boatman -26287 boats coats -2628762538 coatpocket -26287625387 coatpockets -262932 cobweb -2629327 cobwebs -2629464 amazing -263 and -2633 code -26332273 codecard -263333 coffee -263346 coffin -263353 coddle -263373 coffre -263437 bodies -2637233 andrade -263739 andrew -2637397 andrews -26374226 american -2637643 android -26384978 amethyst -2639 andy body -26392845337 bodybuilder -26397 bodys -264 ani bog -26435 angel -2643537 angeles -26443 angie -2645 boil coil -26453 angle -264537 boiler -2645464 boiling -26457 coils -2646 coin -264622 cognac -264625 animal -2646257 animals -264628466 animation -264637 cogner -26467 coins -26467388767568 coinreturnslot -26467568 coinslot -26479 angry -26483 boite -264837 boites -2649 coiw -265 bol -2652 boka cola -265232 colada -26527 colas -26527465 colargol -26529 colby -2653 coke cold -26537 cokes -2653767426 coldsorian -265527 collar -26553 ankle colle -2655328 collect -265532822537 collectables -2655328466 collection -2655328677 collectors -2655343 college -265537 ankles -2655467 collins -2656463 cologne -265662 coloma -26567 color -2656733 colored -26567385 colorful -265677 colors -265687 colour -2658 bolt -265866 column -2658667 columns -26587 bolts -266 ann boo com coo -2662 anna bomb boob comb -266228 combat -2662325 conceal -266232533 concealed -26624 conch -2662437 boobies -26624628466 combination -2662463 combine -26625 cnock -26626 combo -26627 bombs bonar boobs -26627383 concrete -2663 anne bond bone come cone -26632285283 confabulate -26633426 comedian -266337 confer -2663377 confess -2663448728466 configuration -266344873 configure -2663463 confine -2663473 bonfire -266348466 condition -266366 condom -2663667 condoms -266367 condor -2663678 comfort -266367837 comforter -26637 bonds bones -266382867 conductor -2663848 conduit -26638487 conduits -26639 comfy -2664 bong -26642 booga comic -266427 comics -266439 boogey -2664425283 annihalate -266443 boogie -2664437 boogier -2664445283 annihilate -266473428466 congregation -2665 bonk book cook cool -26652273 bookcase -266522737 bookcases -26652665 cookbook -266526657 cookbooks -266533 cooked -266537 cooker cooler -2665374663 cookerhood -2665379 cookery -266537988367457 cookeryutensils -266543 cookie -2665437 cookies -2665464 booking cooking cooling -2665464475263 cookingisland -266546462837425 cookingmaterial -266546472643 cookingrange -266546478683 cookingstove -266546488367457 cookingutensils -2665465 comlink -26657 books -26657243 bookpage -26657353 bookself -266574353 bookshelf -26657435837 bookshelves -26657666 bookroom -2666 ammo boom -26662559 anomally -2666259 anomaly -2666263 command -26662636368 commandment -266626363687 commandments -2666269 boombox -2666328 connect -2666328466 connection -2666372425 commercial -266638 bonnet -26664 among -266648 commit -266648833 committee -2666633 commode -266666 common -266686236368 announcement -2666862363687 announcements -26668642283 communicate -266686422867 communicator -266686489 community -26669464 annoying -2667 comp coop -2667228 compact -266722867 compactor -266724 bonsai -266724687 conscious -2667248733 bonsaitree -2667269 company -2667274766 comparison -2667277 compass -26672786368 compartment -266727863687 compartments -26673 coord -2667345 conseil -26673457 conseils -26673462837 coordinates -266737 coords -26673848466 competition -26674 boorh -26674337 consider -266752468 complaint -26675383 complete -2667539 complex -266765 consol -2667653 console -26676537 consoles -2667657 consols -2667678 compost -26676863 compound -26677 coors -2667737767 compressor -26678 boost -2667837 booster -2667858 consult -266785828466 consultation -2667863 compund consume -26678637 consumer -26678742867 constrictor -266787828 construct -266787828466 construction -2667878284667 constructions -26678837 computer -266788374263 computergame -266788377 computers -266788637 constumes -2668 boot -2668228 contact -266824637 container -2668246377 containers -2668363373 contendere -26683643623 convenience -26683662 anntenna -26683675283 contemplate -2668367528464 contemplating -26683687 contents -2668377283 conversate -266837728466 conversation -26683773 converse -2668378 contest -2668378377 converters -266837867 convertor -26683787 contests -26683937 conveyer -266839372358 conveyerbelt -26683967 conveyor -26684 booth -2668428 convict -2668437 another -26684683 continue -266847 booths -2668648466 ammunition -266868 amount -26687 boots -2668722378483 contraceptive -26687278466 contraption -2668742883 contribute -26687482623 contrivance -2668765 control -26687653 controle -266876537 controles -2668765474 bootpolish -2668765537 controller -26687655377 controllers -26687657 controls -26687657666 controlroom -26689 booty -26693 booze -267 amp cms cop -2672 corb -26725 coral -267263453 corcodile -26729 corby -2673 bore cord core -267335 bordel -2673355 bordell -26733556 bordello -267337 border -26737 cords -2674 borg -267437 copier copies -2675 cork -267526273 corkboard -267543437 amplifier -2676 corn -2676262 corncob -267634353 cornfield -2676352537 cornflakes -267637 corner -26766 bosom -267662 corona -2676637 coroner -267666288 cosmonaut -267667 bosoms cosmos -2677 boss cops corr -267725 corral -267737 copper -26774367 corridor -267743677 corridors -267766 bossom -2677667 bossoms -267767487 corrosius -267769 borrow -267773 corpse -2677737 corpses -267837 copter -26783883 corvette -26785283 copulate -2678863 costume -26788637 costumes -2679 copy -267937 answer copyer -267937464 answering -2679628 copymat -268 ant bot cnu cot -26824 couch -2682437 couches -26827326 antarean -2683 ante cove -26832426237 antechamber -2683276 antfarm -26836268 covenant -2683632 antenea -2683662 antenna -26837 cover -2683733 covered -26837464 covering -268377 covers -2684 both -268436 anthem -268437 bouger -26844 cough -268447 boughs -26845 anvil -2684669 anthony -2684783 antique -26847837 antiques -26853 could -2685337 boulder -26853377 boulders -268537 antler -2685377 antlers -268538 amulet -268623 bounce -2686237 bouncer -26863 bound -26863279 boundary -26868 count -26868362623 countenance -268683696 countdown -2686837 counter -268683722852 countdracula -26868373348 counterfeit -26868377278 counterpart -268683772787 counterparts -2686837867 countertop -2686879 country -268689 bounty -2687 ants anus cots -2687266 bourbon -26872687 couscous -268736368 amusement -268753 couple -2687538 couplet -268754647 couplings -268766 coupon -2687667 coupons -268773 course -268774766 antprison -26878 court -2687838 bouquet -2687846873 courthouse -268787666 courtroom -268789273 courtyard -2688243 cottage -268853 bottle -2688537 bottles -268853762538 bottlerocket -2688537625387 bottlerockets -268866 bottom bouton cotton -2688667 boutons -2688667433 bottomside -268887437 couturier -2689 antz -269 any bow box boy cow -269273 coward -26935 bowel -26937 boxer boxes -269374363 boyfriend -2693743637 boyfriends -2693774678 boxershort -2695 bowl -26957 bowls -269626 bowman -2696632666 bozoofamoo -26969 a6969 -2697 boxs boys cows -269929 anyway -2699297 anyways -26996 bozzo -2699673 anyword -27 as -272 ara bra -2722 crab -27223 brace -272232 arcada -272233 arcade -27223538 bracelet -27224643 arachnid -27225 crack -2722533 cracked -2722538 bracket -272257 cracks -272353 cradle -272363 ascend -272368 ascent -27238 craft -2724 arch brag crag -272437 arches -2724432687 archidamus -2724483 archive -27244837 archives -27246 brain -272467 brains -27247 archs -2724929 archway -27253 brake -272537 brakes -272624 branch -2726243 branche -27262437 branches -2726247 branchs -27262537 brambles -272626 braman -27263 brand crane -27263464 branding -272639 brandy -2726486 cranium -27265 crank -272657 cranks -2727 arcs bras crap -27273 arbre -272737 arbres -27274 crash -2727433 crashed -2727437 brasier -27277 brass -272774373 brassiere -272779 crappy -27278 apart -272786368 apartment -2727863687 apartments -27283 crate -272837 crater crates -27289778 bratwrst -272898778 bratwurst -27293673 crawford -2729437 brazier -27295 crawl -27295464 crawling -272966 crayon -27299 crazy -273 ape are -2732 area -273224 breach -27323 bread -27324 brech -27325 break -2732532623 breakdance -273253278 breakfast -273257 breaks -27326 cream -27327 areas -273278 breast -2732787 breasts -27327875283 breastplate -273283 create -273284 breath -2732843 breathe -27328437 breather -273284464 breathing -27328477729 breathspray -2732867 creator -27328873 creature -273288737 creatures -27333 breed -273337 breeds -273348 credit -2733487 credits -27335 creek -27337 creep -2733737 creeper -27337377 creepers -273379 creepy -273393 breeze -27362 arena -273624 brench -27362437 brenches -27363 creme -27368 brent -2737 apes -27377537 bressler -27378873 aperture -27382773 crevasse -2738423 crevice -27384237 crevices -2738473 crevise -2739 brew crew -2739626 crewman -2739636 crewmen -2739737766 crewperson -2739759 brewsky -274 ash -2742 crib -274226 ashcan -2742267 ashcans -27423 bribe -27425 brick -27425626 brickman -274257 bricks -274259675 brickwork -274277 briars -274325 bridal -27433 bride -274332273 briefcase -27433464 briefing -274343 bridge -2743437 bridges -27435 ariel -274353 bridle -27437 ashes cries -2744 brig -274448 bright -27444859 brightly -27463 crime -27464 bring -27464625 criminal -274646257 criminals -274678663 brimstone -2747453 ashpile -27476347422 aphrodisiac -2747753 cripple -2747825 cristal -27478257 cristals -274786853 aristotle -27483 argue -27486368 argument -2748729 ashtray -2748837 critter -27488377 critters -275 ark ask -27522688 askabout -27523 asjad -276 arm bro -2762 croc -2762263 armband -27623 broad -27623929 broadway -27624247 armchair -27624873 brochure -276248737 brochures -276263453 crocodile -2762634537 crocodiles -27626368 armament -27627 crocs -27645 broil -276536 broken -276556 apollo -276564437 apologies -276564473 apologise -276564493 apologize -2766 ason -276624 brooch -27663 crone -276637 cromer crones -2766377 cromers -276647 armoir -2766473 armoire -27665 brook crook -27665596 brooklyn -276657 crooks -27666 broom -2766678425 broomstick -27667 armor -276687 armour -2766879 armoury -2767 arms crop -27677 crops cross -2767737 crosses -276779255 crosswalk -276824 crouch -27684 broth -2768435 brothel -2768437 brother -27684377 brothers -276863 around -2769 army crow -27691227 crow_bar -2769227 crowbar -27692277 crowbars -27693 crowd -27696 brown crown -276963 browne -27696464 browning -27697 crows -276973 browse -276976378 crowsnest -277245 assail -2772643 arrange -277272887 apparatus -2772735 apparel -2772748466 apparition -27727746283 assassinate -2772858 assault -2773625 arsenal -27736253 assemble -27736259 assembly -277363243 appendage -2773632437 appendages -27737668 arseroot -277378 arrest -2773849464 appetizing -2774258 asphalt -27742858 asphault -2774466368 assignment -277478 assist -2774782623 assistance -277478268 assistant -2775283 applaud -27753 apple -277537 apples -27754228466 application -277542623 appliance -2775426237 appliances -27759 apply -2776468 appoint -27764686368 appointment -27766 apron -277667 aprons -27769 arrow -277697 arrows -277734363 apprehend -27776224 approach -27776825 approval -2778937 appuyer -278 art cpu cru -27823 bruce -27824349 crucifix -27824349466 crucifixion -2782627463 aquamarine -27827486 aquarium -2783 aque -278336336747 artedmedoris -27833828 aqueduct -27835 cruel -27836336747 artemedoris -27836436747 artemidoris -27837643 asteroid -278376437 asteroids -27842537 articles -2784285283 articulate -27843228 artifact -2784342425 artificial -27846 bruin -278462842 asthmatic -27846436747 artimidoris -2784645426 aquinilian -27846454267 aquinilians -278473 aquire cruise -2784737 cruiser -278487 arthur -27853 crule -27862 crumb -278624 crunch -278624437 crunchies -2786249 crunchy -2786253 crumble -278627 crumbs -2787 arts -278725 astral -27874 brush crush -2787437 crusher -278749663 brushwood -27876 astro -278766288 astronaut -278768873 astroturf -278825493 brutalize -2789675 artwork -27896757 artworks -279 cry -279464 crying -27978 crypt -2797825 crystal -27978257 crystals -279787 crypts -28 at -28222 bubba -282253 bubble -2822537 bubbles -28229 cubby -282294653 cubbyhole -2822946537 cubbyholes -2823 cube -2824253 cubicle -28249 cubix -2825 buck -282529643 buckazoid -2825296437 buckazoids -282538 bucket -282553 buckle -2825667 cuckoos -282566725625 cuckoosclock -28257 bucks -282827 avatar -283 bud cue -2833 buff cuff -2833256 buffalo -283333 cuffed -28334478 buddhist -283353 cuddle -28337 cuffs -28339 buddy -28343 budge -283435 cudgel -28343623 audience -2834867486 auditorium -283683 avenue -2837 cues -283934737 budweiser -284 bug -28453 build -2845337 builder -28453464 building -284534647 buildings -28453842 athletic -2847 bugs -2847463 cuisine -284746377 buisiness -2852 bulb -28527 bulbs -2853 cuke -2855 bull -2855364 bulldog -285538 bullet -28553846 bulletin -2855384626273 bulletinboard -285538467 bulletins -2855387 bullets -2855538 bulllet -28557 bulls -2858 cult -286 bum bun cum -28624 bunch -286353 bundle -28642569 bungalow -28643 avoid -28644653 bunghole -2865 bunk -2865233 bunkbed -28652337 bunkbeds -28657 bunks -28664546487 cunnilingus -2866493 atomize -2866774373 atmosphere -28669 bunny -2867 atop bump buns -286737 bumper -2867377 bumpers -286766 bunson -287 bus cup -2872 curb -28726273 cupboard -287262737 cupboards -2873 cure -287328 bureau -2873287 bureaus -2874 bush -287425 burial -28743 cupid -287433 buried -287437 burger bushes cupids -28743756468 burgerjoint -2874377 burgers -2874466 cushion -28744667 cushions -28745263 bushland -287453 burgle -28746377 business -2876 burn -287633 burned -287637 burner -2876464 burning -2877 burp cups cuss -28773629 currency -2877368 current -28773687 currents -2877464 burping -287769 burrow -28778 burst -2878 bust -2878246 curtain -28782467 curtains -2878246763 curtainrod -2878273 bustard custard -28783 curve -287847 curtis -2878477 curtiss -287863426 custodian -28786637 customer -287866377 customers -2879 bury -288 but ctu cut -288224 attach -288225 attack -2882437 butcher -288246 attain -288278 ctucru -2883 cute -288363268 attendant -2883678 attempt -288368466 attention -28842 attic -288467 author -288467489 authority -288473 attire -28848833 attitude -2885379 cutlery -2886 auto -2886628 autonav -288662842 automatic -28866284428466 autonavigation -288662866 automaton -2886662453 automobile -28866624537 automobiles -28867 autos -288674568 autopilot -2887 cuts -2887228466 attraction -2888 butt -288837 butter cutter -28883724876 butterchurn -28883734353 butterfield -28883735437 butterflies -288837359 butterfly -288837688 butternut -2888377 cutters -28884653 butthole -288866 button -2888667 buttons -288869 buttox -28887377 buttress -2888737737 buttresses -289 buy -28937 buyer -2899273 buzzard -28992737 buzzards -289937 buzzer -29 ax by -29253 cycle awake -292536 awaken -2925464 cycling -29256737 cyclopes -2925677 cyclops -292567737 cyclopses -2926 cyan -29273 award -292737 awards -2927426 azarian -2929 away -293 axe bye -293293 byebye -2937 axes -2947 axis -29546337 cylinder -295463377 cylinders -296464 awning -297663 awsome -2978263377 bystanders -322233 facade -3223 face -32237 faces -3224 each -322425 facial -3224548437 facilities -32245489 facility -322742 fabric -322742283 fabricate -3227427 fabrics -3228 fact -3228679 factory -323 dad -32337 fader -323377 faders -32339 daddy -323396 daddyo -323397 daddys -3237 dads -324 fbi dbg fag -3243553 echelle -324437 dagger -324468 faggot -32447 dbggr -32453 eagle -3246 echo -3247 fags -3247437 daisies fairies -32479 dairy daisy fairy -324797 fairys -32484 faith -324847 faiths -325 dak -3253 dale fake -3255 fall -32557 falls -32573 false -326 dam dan fan -32623 dance -3262335667 dancefloor -326237 dancer -3262377 dancers -326243 damage -3262464 dancing -3263 dame fame -3264 dang -326435 daniel -3264357 daniels -326437 danger -326437687 dangerous -326453 dangle -32645437 families -326459 family -3264597 familys -3266 damn -326633 damned -326648 dammit -3266669 economy -32669 danny -3267 fans -326735 damsel -326736 dampen -32682 fanta -327 ear far -32726 ecran -327267 ecrans -3273 fare fase -32737 farer -32739355 farewell -3274 dash -327426273 dashboard -327473 ecrire -3275 dark -32756377 darkness -32757666 darkroom -32759 early -3276 darn farm -327637 farmer -327646873 farmhouse -32765263 farmland -3277 ears -3277464 earring -32774647 earrings -3278 dart east fart fast -327826273 dartboard -327836 fasten -327836377 fasteners -327837 faster -3278378 fastest -32784 darth earth -3278459 earthly -3278482337 darthvader -327849676 earthworm -3278626 dartman -32787 darts -32788476937 dartthrower -3278867737 darttosser -328 eat fat -3282 data -32822265 databank -328238 faucet -3282387 faucets -328269 fatboy -328274663 dataphone -3283 date dave -32836 eaten -32836879 daventry -32837 eater -328373767 eavesdrop -3283737677464 eavesdropping -328377 eaters -32839 davey -32843 david davie -3284323 fathead -328437 father -32843766 davidson -3284377 fathers -32844837 daughter -328448377 daughters -328464 eating -32847 davis -32858 fault -328587 faults -32862 fauna -32867 favor -3287 eats -328837 fauves -32889 fatty -3289 davy -329 day -329233 daybed -3296 fawn -32967 fawns -3297 days -33 de ed ff -33225 fecal -3322728283 decapatate -3322748283 decapitate -332283 debate -3322848283 deactivate -3323 dead -33232733 deceased -3323537283 decelerate -33237 feces -33247437 decipher -33247466 decision -3325 deal deck -3325273 declare -332537 dealer -3325377 dealers -3325463 decline -3325464 dealing decking -3326 dean -3326337 decoder -332668264628466 decontamination -33267283 decorate -3326728466 decoration -3327 dear fear -33273273 decrease -332747 debris -33278 feast -3328 debt -33284 death debug -3328437 feather -33284377 feathers -33284729843 deathscythe -33284847328 deaththreat -3328873 feature -333223 deface efface -333253 feeble -3333 feed -33332283 defecate -333328 effect -3333464 feeding -3333673 defense -333463 fefine -3335 feel -3335283 deflate -3335464 feeling -3337 deep deer -3337379464 deepfrying -33377546 deerskin -3338 feet -3339 eddy -3343 edge -3343423 edifice -334733 degree -3347337 degrees -3348466 edition -33484667 editions -3349372833 dehydrated -33542283 delicate -335424687 delicious -335463 feline -3354837 deliver -33548379 delivery -33548737 delivrer -3355 dell -33552 fella -335527 fellas -33552846 fellatio -335569 fellow -3355697 fellows -335669 felony -335746742 delphoria -3358287 deltaur -336 den fem fen -3362 fenc -33623 fence -336237 fences -336253 female -3362537 females -3363873 fenetre -33638737 fenetres -33646463 feminine -336473 denise -336476 deniro -3366 demo femo -33663 femme -33665328527493 demolecularize -33665474 demolish -33666 demon -336667 demons -3369 deny -337 eds -3372363 descend -337236373 descendre -337237 fesces -33727478466 description -337278 depart -33727833 departed -3372786368 department -337363368 dependent -337378 desert -337446 design -33744628466 designation -337473 desire -337478 desist -3375 desk -33757 desks -3375867 desktop -3376 fern -337633 derned -337637 fermer -3376748 deposit -3377377 depress -3377377466 depression -3377425 derrick -33774257 derricks -33774373 derriere -337746437 derringer -337786 ferrum -33779 ferry -33779626 ferryman -3378 dept -33784 depth -3378453 fertile -337845493 fertilize -3378454937 fertilizer -337847 depths -33786238 dervocet -3378769 destroy -33787828 destruct -33787828466 destruction -337887 festus -337889 deputy -338224 detach -33822437 detacher -338228466 education -338245 detail -338278283 devastate -33832867 detector -338328677 detectors -33835673 develope -33835676368 development -33837 deter -338374368 detergent -338423 device -33845 devil -3384565 dethlok -33846283 detinate -338687 devour -33874887 detritus -339 dew -339273 edward -3392737 edwards -34 dg eh ei fi -3424667842 diagnostic -34246678427 diagnostics -3424726 diagram -34247267 diagrams -3425 dial dick -3425328 dialect -34254323 dickhead -34255377 dickless -34256483 dialogue -34257 dials dicks -342623 fiance -3426233 fiancee -34262337 fiancees -3426237 fiances -3426663 diamond -342666328 diconnect -34266637 diamonds -34273 fibre -342737 diaper -34274726 diaphram -34277432 diarrhea -34279 diary -3428466 fiction -343 did die -343337368 different -3433428589 difficulty -343353 fiddle -34353 field -343537 fields -34363 fiend -34379 fiery -34384 fifth -344 dig egg -34436 eigen -344378 digest -344378466 digestion -344437 digger -34448 eight fight -3444825 digital -3444837 fighter -344484 eighth -3447 eggs -344873 figure -3448737 figures -34487463 figurine -34524 filch -34526368 filament -3453 file -34532273 filecase -3453269 filebox -34536 dildo -34537 files -345484486 dilithium -3455 fill -34553 fille -345533 filled -34553883 fillette -3455464 filling -3456 film -345837 filter -34584 filth -346 dim din ego -346262425 financial -346262437 financier -34626483 dinamite -3463 dime dine find fine -34637 dimes diner -3464 ding -346437 finger -3464377 fingers -346464 dining -34646482253 diningtable -346464822537 diningtables -346474 finish -346478 finist -346543 dinkie -3466 egon -34662 dhooa -346637 dinner -34667287 dinosaur -34669787 dionysus -347 dip dir dis fir -3472 disc -3472253 disable -3472273 discard -3472376 discern -347242743 discharge -34726 disco -347262255 discoball -3472637 discoer -3472666328 disconnect -347268379 discovery -347268773 discourse -347276 disarm -347277327 disappear -3472776468464 disappointing -3472777683 disapprove -3472877 discuss -3472877466 discussion -3473 fire -34732625 firecock -3473273 disease -34732737 diseases -3473276 firearm -34732767 firearms -347328466 direction -34732867 director -347328679 directory -3473398464847437 fireextinguisher -34734673 firehose -34734766 fireiron -347362275 disembark -3473626935 disembowel -347364243 disengage -34737 fires -3473748 firepit -347375223 fireplace -34737584 fireplug -347376537 firepoker -34737828466 firestation -34739663 firewood -34739675 firework -347396757 fireworks -3474 dish fish -34742663 fishbone -347437 dishes fishes -347437626 fisherman -3474464 fishing -34744645463 fishingline -3474464763 fishingrod -34744647653 fishingpole -3474464822553 fishingtackle -3474666437 fishmonger -347468347283 disintegrate -34747663 fishpond -34748473 disguise -3474878 disgust -34749 fishy -347492 fishx2 -3474927437 dishwasher -3475 disk -34753883 diskette -347562283 dislocate -34756343 dislodge -3475662 diploma -34756627 diplomas -34762 firma -347626368 firmament -347626853 dismantle -347636237 dismember -34766868 dismount -34772824 dispatch -3477282437 dispatcher -347736253 dissemble -347736737 dispenser -347743 dipsie -347743368 dissident -34775223 displace -3477529 display -34775297 displays -3477623 disrobe -347767 fissop -34776725 disposal -34778 first -3477873 fissure -34778737 fissures -3477878 disrupt -347787837 disrupter -347787867 disruptor -34779 dipsy -3478 dirt -34782255 dirtball -34782623 distance -34784648474 distinguish -3478678466 distortion -347874288466 distribution -3478872 disturb -34789 dirty -34824 ditch -34826 divan -3483 dive five -348433 divide -34843464 dividing -34847466 division -34886 ditto -349 fix -34926 diwan -34933 fixed -3498873 fixture -34988737 fixtures -35 dj el -352285283 ejaculate -3524 flag -3524355283 flagellate -35245 flail -352463 elaine -35247 flags -35247653 flagpole -352478233 flagstaff -35253 flake -35263 flame -352637 flames -3526444 flamgig -3526464 flaming -3527 flap -35273 flare -35274 flash -3527437 flasher -35274464 flashing -3527454448 flashlight -35275 flask -352757 flasks -3527842 elastic -3528 flat -35287 flats -3528836 flatten -353 ele elf -35328 eject -3532872 electrc -35328742 electric -3532874225 electrical -35328742489 electricity -3532874289 electricty -3532876624 electromag -3532876642 electronic -35328766427 electronics -3532876763 electrorod -35328767763 electroprod -3533 flee -35337 elder -3533759 elderly -35362 elena -3536368279 elementary -35363687 elements -35374 flesh -35374268 elephant -35382867 elevator -353828677 elevators -353836 eleven -35387 fleur -353877 fleurs -35425 flick -3542537 flicker -3542537464 flickering -35437 flies -354448 flight -35464 fling -354646283 eliminate -35468 flint -3547 flip -35473567 flipflop -35478 flirt -35492 eliza -354922384 elizabeth -3549223847 elizabeths -354927 elizas -354947 elixir -355378 ekkert -35625 flock -35628 float -35628464 floating -356287 floats -3564 flog -35667 floor -3566726273 floorboard -35667262737 floorboards -3566726837464 floorcovering -35667464 flooring -35667628 floormat -356677 floors -3567 flop -35672 flora -356738 floret -3567387 florets -35674935 florizel -356779 floppy -35687 flour -3569 flow -356937 flower -3569377 flowers -356937768 flowerpot -358243283 elucidate -3583 flue -35833 elude fluff -35837 elves -35843 fluid -35874 flush -3587437 flusher -35883 flute -359 fly -35937 flyer -359464 flying -36 do fm -362 dna doc -36237 ember -362377 embers -362426837 enchanter -36245 email -3625 dock -3625464 docking -362567873 enclosure -36257 docks -3626 foam -3627 docs -3627223 embrace -36286368 document -362863687 documents -362867 doctor -3628677 doctors -362925673342 encyclopedia -363 dod doe end -3633 doff -363337 fodder -363337633 dodderned -36343 dodge -3636 dodo -363637 doener -3636437 enemies -3636469 enenimy -36369 enemy -3637253 emerald -36374362437 emergencies -363743629 emergency -36374473 energise -36374493 energize -363749 energy -364 dog fog -364243 engage -364443 doggie -364463 engine -36446337464 engineering -3644637 engines -36449 doggy -3645243 foilage -364636 eminem -36464 doing -3647 dogs -364723353 dogpaddle -364728464 engraving -364853 engulf -3652 fola -3652743 enlarge -3653 fold -365333 folded -365337 folder -3653377 folders -36537 folds -3653837 enlever -36539 dokey -3654243 foliage -3655 doll -365527 dollar -3655272455 dollarbill -3655277 dollars -365569 follow -36556937 follower -365569464 following -36557 dolls folks -36559 dolly -36569 enjoy -3657446 dolphin -36574467 dolphins -366 don doo -36618 don't -3662 emma -366243 doobie -366253 donald -366283 donate -3663 dome done fone food foof -366323 doodad -366353 fondle -366366 doodoo -36637 domes doner foods -366378833 foodstuff -3663788337 foodstuffs -3664 dong -36642453 domicile -366437 donger -366442539 doohickey -3665 fool -366539 donkey dooley -3665397 donkeys -3665474 foolish -366637 donner -36669 donny -3667 door -36672 door2 -36672355 doorbell -366723557 doorbells -3667539 doorkey -36675625 doorlock -3667626 doorman -3667628 doormat -36676287 doormats -36677 doors -36677837 doorstep -3667929 doorway -36679297 doorways -3668 dont font foot -36682255 football -366844 enough -36684455 foothill -366844557 foothills -36684667 emotions -3668562537 footlocker -36687284 footpath -36687837 footstep -366878377 footsteps -367 for -36723 force -3672334353 forcefield -367237 forces -3673 dope ford -36736253 ensemble -36737 doper -36737546 foreskin -367377 dopers -367378 forest -3674 dosh -36743 forge -367446 ensign -36746 ensin -3675 dork fork -367569 employ -36756933 employee -3675696368 employment -36757 forks -3676 dorm form -367628 format -367628466 formation -3676284667 formations -367648679 dormitory -36767 dorms forms -36767486 emporium -367735 dossel -3677626 forsman -3678 fort -36784 forth -3678473 enquire -36787 forts -36787377 fortress -3678737737 fortresses -3678863835537 fortuneteller -36789 empty -367893687 fortyfour -36789749 fortysix -36789896 fortytwo -3679273 forward -36792737 forwards -368 dot -368253 double -36828 doubt -36835673 envelope -36837 enter -3683782466368 entertainment -368423 entice -36844 dough -3684736668 enviremont -36847666368 environment -3685 foul -36868246 fountain -3687 four -368715323 four-leaf -36872457 entrails -36872623 entrance -368726237 entrances -36873 douse -368737 entrer -36875323 fourleaf -36878336 fourteen -368784 fourth -368789 fourty -3687893687 fourtyfour -368789749 fourtysix -368789896 fourtytwo -36879 entry -36879929 entryway -369 fox -3693 doze -36935 dowel -36936 dozen -36937 foyer -3695 fowl -3696 down -36964455 downhill -36965623 download -36967473 downpipe -369677688 downspout -3696782477 downstairs -36969273 downward -37 dr fs -372 f72 -372252867 escalator -372273 escape -37228466 fraction -3722852 dracula -37228873 fracture -372342283 eradicate -3724 drag -3724446 fraggin -37244464 fragging -37246 drain -37246243 drainage -37246368 fragment -372463687 fragments -3724637 drainer -372464653 drainhole -372466 dragon -372467 drains -372467473 drainpipe -37253 drake -372537 drakes -3726227 escobar -372624726 francisco -37263 frame -372633 framed -372637 frames -37265 frank -372653678346 frankenstein -372659 franky -37273 drape erase -372737 drapes eraser -3727379 drapery -3727486473 escritoire -3728 frat frau -3729 draw -372937 drawer -3729377 drawers -3729452867 frazilator -3729464 drawing -37294647 drawings -37325 freak -3732546 freakin -37325464 freaking -373257 freaks -37326 dream -37328466 erection -3733 epee fred free -373337425 frederick -37333745 frederik -373337457 frederiks -37337 freds -373378953 freestyle -3733929 freeway -373393 freeze -3733937 freezer -37339464 freezing -373444837 freighter -373624 french -3736925 frenzal -37377 dress -3737733 dressed -3737737 dresser -37377377 dressers -37378368 frequent -3742 eric -37422 frica -37433 dried -374343 fridge -374363 friend -3743637 friends -37437 fries -37438 drift -3744 frig -3744372867 frigerator -3744446 friggin -37444464 frigging -3745 erik -37455 drill -3745546486937 drillingtower -37455464869377 drillingtowers -37465 drink -3746537 drinker -37465377 drinkers -37465464 drinking -374656224463 drinkmachine -374657 drinks -3747 drip -37475 frisk -37477 drips -3748274 epitaph -37482747 epitaphs -37483 drive -3748346 drivein -374837 driver -3748377 drivers -37483929 driveway -374839297 driveways -3748464 driving -3748836 fritten -375466 eskimo -37546644678 eskimoghost -375466774748 eskimospirit -3764 frog -37643 droid -376437 droids -376542 frolic -3766 from fron -37663 frond -376637 fronds -37667 frons -37668 front -3767 drop -37672 erosa -376727 erosas -3767466 erosion -37675425 dropkick -3767633 dropoff -37677 drops -376774647 droppings -37678 frost -376789 frosty -3767967 dropzor -37683 drove -376936 frozen -37696464 drowning -3773623 essence -37767 error -3779 espy -378 fst -378225474 establish -37825 equal -3784 drug -37847 drugs equip -378476368 equipment -37848 fruit -37848464 fruiting -378487 fruits -3786 drum -37865 drunk -37865273 drunkard -37865379466 drunkerwion -378657 drunks -3786637 drummer -37867 drums -378678425 drumstick -3788279 estuary -379 dry fry -37937 dryer -379377 dryers -379464 drying frying -3798543 erzulie -38 et ft -382 eva -3822597887 eucalyptus -3823 dube -38233 evade -3824373 etagere -38243737 etageres -3825 duck fuck -382537 fucker -3825464 fucking -38257 ducks -3828 duct -38287 ducts -383 eve -3833 dude -38337 dudes -3833883 dudette -3835 fuel -383539 fudley -3836 even -3836464 evening -38368 event -3837 duds ever eves -3837625 eternal -38376489 eternity -38379 every -3837984464 everything -384 dui -38433623 evidence -3843742 etheria -3845 evil -3847237283 eviscerate -3855 full -385866 fulton -386 fun -3862 dumb -386224 funbag -3862247 funbags -38627837 dumbster -3862924837 dumbwaiter -3863 dune fund -3863464 funding -38637 dunes fumes funds -3864 dung -3864366 dungeon -38644 fungi -386444 fungii -386453 etoile -3864537 etoiles -386487 fungus -38659 funky -3866437 dummies -38669 dummy dunny funny -3867 dump -3867464 dumping -38677837 dumpster -387 ets fur -3872255 furball -3873 fuse -3873269 fusebox -38737 fuses -387542283 duplicate -3875422837 duplicates -3876223 furnace -3876474 furnish -3876474464 furnishing -38764744647 furnishings -387648873 furniture -387672 europa -38779 furry -3878 dust -3878246 dustbin -387825683 dustcloud -387837 duster -3878683 dustove -38866 futon -388872 futura -388873 future -3889 duty -3899 fuzz -39 dx ex -39228283 excavate -392372473 excercise -39242643 exchange -3925 eyal -3926463 examine -39264637 examiner -3926753 example -39273 dwarf -392737 dwarfs -3927383 excrete -3927837 dwarves -392873 excuse -393 dye eye -3932255 eyeball -39322557 eyeballs -393225584464 eyeballthing -3932255844647 eyeballthings -3932769 eyebrow -3932883 execute -3934653 eyehole -3935537 dweller -39355464 dwelling -3937 ewer eyes -39372473 exercise -39374323 eyepiece -393743237 eyepieces -39384464 eyething -393844647 eyethings -394 dwi -3942878 exhaust -39464 dying -39465437 dwinkies -39478 exist -394783623 existence -3948 exit -394863 exhume -39529 exlax -3953 dyke -39626483 dynamite -397267466 expansion -39732867283 expectorate -39735 expel -3973743623 experience -3973746368 experiment -397374636825 experimental -397374636828466 experimentation -397378 expert -397473 expire -3974733 expired -3975246 explain -3975648 exploit -3975673 explore -397567483 explosive -3975674837 explosives -3976863 expound -3977377 express -39836337 extender -398363377 extenders -3983636 extendo -39837467 exterior -39837625 external -39837646283 exterminate -3984648474 extinguish -398464847437 extinguisher -39872 extra -3987228 extract -3987283773787425 extraterrestrial -39872837737874257 extraterrestrials -4131 i.d. -4155 i'll -416 i'm -42 gb -422 gab hac -4224828 habitat -4225 hack -42272 haara -423 ice -4232374 iceberg -42323747 icebergs -42324378 icechest -423269 icebox -42337 hades -423438 gadget -4234387 gadgets -424 gag hag -4242842 hagatha -424453 haggle -4245 hail -4247 hags hair -42477 hairs -4247746 hairpin -42479 hairy -425 gal -42522867 galactor -42529437 galaxies -425299 galaxy -4253 gale half -42533278 halffast -4255 hall -425539 galley -42557 halls -4255929 hallway -4258 halt -42583 halve -426 h2o ham -426253 gamble -42625377 gamblers -426253874437 hambleurgher -42625464 gambling -426287437 hamburger -4263 game hand -4263269 gameboy -42632833 handcuff -4263283333 handcuffed -426328337 handcuffs -4263385 handful -426344 gandhi handig -4263486 handgun -42634867 handguns -426353 handle -426353724433 handkerchief -4263688 handout -42636887 handouts -42637 games hands -42637245 handrail -426372457 handrails -4263738 handset -4263742 ganesha -42637663 handsome -4264 gang hang -426437 hanger -4264464 hanging -42645866 hamilton -4264636237 gangmember -42646362377 gangmembers -426474 hamish -4265 hank -42652 ganja -426538 hamlet -42659 hanky -4265972659 hankypanky -4266225 hammack -426637 hammer -42663733 hammered -426637334323 hammeredhead -4266625 hammock -427 gap gas has -4272 garb hara -42722343 garbadge -4272243 garbage -4272243226 garbagecan -427242 garcia -427243 garage -4272433667 garagedoor -4272434283 garagegate -42725474 harakiri -427266 garcon -427266638 garconnet -427267 harbor -4272687 harbour -427277 harass -4273 gape hard hare -427336 garden -4273367 gardens -427346 gardin -42737 gases -42739273 hardware -4274 gash hash -4274474 hashish -427453 gargle -427539 harley -427568 harlot -4276 harm -4276368 garment -42763687 garments -427638 garmet -4276387 garmets -427653 harold -42765377 harmless -42765463 gasoline -4276669 harmony -4277 gaps gars gasp -427736 happen -42773633 happened -42774 harri -4277437 harpies -4277464 gasping -42777424673 harpsichord -42779 happy harpy harry -4278 harv -42783 haste -427837837 harvester -427839 harvey -42784 garth -4278537 hastler -428 hat -42824 hatch -4282438 hatchet -42824929 hatchway -4283 gate hate have -4283533737 gatekeeper -42837 gates -4283929 gateway -42843 gauge -428437 gather -428437464 gathering -4285 haul -42867 gator -4286833 haunted -4287 hats -4287225 hatrack -42877626 haussman -4288 haut -429 hay icy -429273 hazard -4293 gaze haze -429326 gazebo -42934353 hayfield -4295 gawk hawk -42978225 haystack -43 gd he id if -4323 head -432326273 headboard -43234327 headgear -432354448 headlight -4323562 headjob -4323627837 headmaster -43237 heads -432378278377 headquarters -432378663 headstone -4323786637 headstones -4325 heal -432537 healer -432553 heckle -432584 health -4325849 healthy -4327 gear heap hear -4327464 hearing -432774438 gearshift -43278 heart -432784 hearth -4328 heat -43283 heave -432836 heaven -4328367 heavens -432837 heater -43289 heavy -4332 idea -43343 hedge -433437 hedges -43343769 hedgerow -4335 geek -43368434228466 identification -43368439 identify -4338 heft -433937 geezer -4346 hein -43468 idiot -4347 heir -435 gel -43536 helen -4354 heli -4354267837 helicopter -4355 hell -435546863 hellhound -43556 hello -435638 helmet -4357 help -43571 help! -436 gem geo hen -4362336784 henceforth -43624626 henchman -43624636 henchmen -43633 geode -436337 geodes -4363725 general -43637283 generate -4363728387 generateur -436372867 generator -4363728677 generators -43637287423 generatrice -436374257 hendricks -4363782 genesta -436382542 genetalia -43643 genie -43648257 genitals -4365625 hemlock -4366234 gennadi -43662349 gennadiy -4366239 gennady -4367 gems gens henp -436734 geordi -436743 george -43678663 gemstone -4368 gent -436824 hentai -436853626 gentleman -436853636 gentlemen -437 her ids -4372 herb -4372378 herbert -43727 herbs -4373 here -4374237887 hephaestus -4376 hero -437626 german -437643 geroge -437646 heroin -43764663 hermione -437648 hermit -437648243 hermitage -4377 herr hers -43773 herpe -4377353 herself -4377464 herring -4378873 gesture -438 get het -438376 hetero -43876 hetro -4388464 getting -439 gey hey -4392 heya -439737 geyser -44 ii hh hi -44268 giant -44268377 giantess -4433 hide -44331688 hide-out -4433687 hideous -4433688 hideout -44339 hidey -4433946 hideyho -4434 hifi -4437645974427 hieroglyphics -4438 gift -443886 ghetto -4438862527837 ghettoblaster -444 iii -4444 high -444424247 highchair -44447533737 highsleeper -4444929 highway -444687466 ghinusion -4446874667 ghinusions -4452 hija -445225 hijack -4453 hike -4455 hill -44557 hills -446 gin him -4463 hind -44643 ginie -44643727323 gingerbread -446483 ignite -4464837 igniter -44648466 ignition -44663 gimme -446643 gimmie -4467353 himself -44678 ghost -446787 ghosts -4468 hint -44685 ghoul -446857 ghouls -44687 hints -447 hip his iis -4475 girl -447524 hislah -44753 girle -4475374363 girlfriend -44753743637 girlfriends -44757 girls -4477 hips hiss -4477437 hippies -447797 hippys -4478679 history -448 git hit -44824 hitch -448244453 hitchhike -4482444537 hitchhiker -44824464 hitching -4483 give hive -448437 hither -448464 giving -448537 hitler -4485377 hitlers -4492 hiya -44929 hiway -452623 glance -45273 glare -45277 glass -452772243 glasscage -452772273 glasscase -4527737 glasses -452779675 glasswork -45326 gleam -45326464 gleaming -453267 gleams -45433 glide -4546637 glimmer -4546637464 glimmering -45466377 glimmers -4546773 glimpse -45468 glint -4547836464 glistening -45478367 glistens -4548837 glitter -4548837464 glittering -45488377 glitters -455 ill -4553425 illegal -4558646283 illuminate -45623 globe -45683 glove -456837 gloves -4569 glow -4569464 glowing -45699 glowy -4583 glue -4584 glug -4588866 glutton -46 go hn ho im in -462248 hobbit -4622484653 hobbithole -46224846873 hobbithouse -462253 gobble -46226828466 incantation -4623673 incense -462423 imbibe -46243 image -462437 images -462462546 hobgoblin -4624625467 hobgoblins -4625 goal -462546 goblin -4625463 incline -4625467 goblins -4625833 include -4626 hobo -46269 inbox -46273273 increase -4628 goat -462833 goatee -46287 gnats hocus -4629 gnaw -463 god hoe -463268 infant -4633264 goddang -4633266 goddamn -463326633 goddamned -463348 hoddit -4633484653 hoddithole -46334846873 hoddithouse -4633626 hoffman -46336267 hoffmans -46337 infer -463373633623 independence -4633766 inferno -4634843825 individual -4635282253 inflatable -4635283 inflate -463583623 influence -4636 info -463668437 godmother -463676 inform -46367628466 information -4637 gods -4637228466 infraction -4638237 inducer -46387879 industry -464 hog -4642248268 inhabitant -46422482687 inhabitants -4642528466 inhalation -464253 inhale -464344 hohegh -464352 ingela -464378 ingest -464453 goggle -4644537 goggles -46464 going -4647 hogs -4647334368 ingredient -46473343687 ingredients -46478 hoist -464787 hoists -4648 init -4648425493 initialize -46484257 initials -4648473 inguire -465 ink -4652 hola -4653 gold hold hole -465327633 goldarned -465328 inject -46533474 goldfish -465336 golden -465337 holder -4653464 holding -4653468439255 holeinthewall -46536725 goldorak -46537 holer holes -4654329 holiday -46546842 golgotha -46552 holla -465537 holler -465569 hollow -4656 holm -4656345645 holodilnik -46564726 hologram -46564727442 holographic -4657837 holster -465873 injure -465879 injury -4659 holy -466 goo hoo inn -466237 gonads goober -4662737 innards -466283 inmate -4663 good home hood -46632 honda -4663238376666 goodafternoon -466329 goodby -4663293 goodbye -4663329 goodday -46633836464 goodevening -4663437 goodies -466346343353 hoodindiddle -46635377 homeless -4663626 goodman -466366 hoodoo -46636676464 goodmorning -46637 goner goods homer homes inner -46639 gomez goody honey -466392662 honeycomb -46639527 honeyjar -466396666 honeymoon -466464 homing -4665 hook -466533737 innkeeper -466537 hooker -4665377 hookers -46657 hooks -4666 goon homo -46662368 innocent -46663 gnome homme -46667 goons honor -466672253 honorable -466687 honour -4667 hoop -467 hop imp -467247 impair -46727423 inscribe -46727478466 inscription -467274784667 inscriptions -467278 impart -4673 gore hope hose -467328 insect -4673287 insects -46735 impel -46737 hoses -46737425 imperial -46737473 hosepipe -46737626 horesman -467378 insert -46743 gorge -467433 inside -46743687 gorgeous -467464 goring -4674667 gorgons -4674966 horizon -4674966825 horizontal -467536368 implement -4675363687 implements -4675467 hopkins -4676 horn -4676263493 gormandize -467638 hornet -4676387 hornets -467639 horney -46767 horns -467678268 important -46769 horny -4677 horq -46773 horse -4677328 inspect -467737 hopper horses -467743 horsie -467747 gossip -46774766 imprison -46774825 hospital -4678 host -4678255 install -4678268 instant -4678473 inquire -46784888466 institution -4678573 impulse -46787 horus -467872623 insurance -467878284667 instructions -4678786368 instrument -46787863687 instruments -468 got hot inv -4682337 invader -46835 hotel hovel -46836 inven -4683682473 inventaire -468368466 invention -46836867 inventor -468368679 inventory -46837 hover -46837228 interact -46837228483 interactive -46837268773 intercourse -4683727238 hovercraft -468373373 interfere -46837378 interest -4683742522842 intergalactic -46837467 interior -468376257 internals -46837638 internet -4683766368 government -468377328 intersect -468377328466 intersection -46837764283 interrogate -46837773837 interpreter -468377738464 interpreting -468377878 interrupt -468378 invest -46837833 inverted -46837844283 investigate -468378463 intestine -4683784637 intestines -468474245489 invisibility -468474253 invisible -4684828466 invitation -46848284667 invitations -4686 goto into -46863 hound -4686367 hounfor -46863687 hounfour -4686426 houngan -46869422833 intoxicated -4687 hour -46873 house -46873359 housefly -468734653 household -4687366943357 houseonwheels -468737 houses -4687464 housing -46876 intro -468843 hottie -468882 hottub -4689473 hotwire -469 how -46939 howdy -4696 gown -46967 gowns -4697 hows -47 is hq -4722 grab -47222 isaac -47233 grade -47233484 graffiti -472334847 graffitis -472334884 graffitti -47233489 graffity -4723484 grafiti -47234884 grafitti -4723489 grafity -472426 graham -47242617 graham's -4724267 grahams -47246 grain -472467 grains -47263 grand -472633 grande -47263328437 grandfather -47263374266 grandepiano -4726362 grandma -47263668437 grandmother -4726372 grandpa -4726374266 grandpiano -4726483 granite -472669 granny -47268 grant -4727 gras -472737 grapes -4727442 graphic -4727635 grapnel -47277 grasp grass -4727737 grasses -4727753 grapple -472775464 grappling -472779 grassy -4728 grav -47283 grate grave -47283344437 gravedigger -472835 gravel -472837 grates graves -472837483 gravesite -4728378663 gravestone -47283786637 gravestones -472839273 graveyard -4728392737 graveyards -4728464 grating -47284647 gratings -4728489 gravity -4729 gray -473273 grease -47328 great -47336 green -4733653222 greenkebab -4733653227 greenkebap -47338 greet -473384647 greetings -4736233 grenade -47362337 grenades -4739 grey -4743 grid -4743346 griffin -47433467 griffins -474467 grigor -4744674 grigori -47455 grill -47455243 grillage -474553 grille -4745537 grilles -4745539675 grillework -474557 grills -4746 grim grin -47463 grind -47466464 grinning -47467 grins -4746737 grimper -474677666 grinspoon -4747 grip -475263 island -4752637 islands -4753 isle -47537 isles -47538 islet -476237437 groceries -4762379 grocery -47646 groin -4766 iron -476683 groove -4766837 grooves -476689 groovy -47673 grope -476783783464 grostesteing -476863 ground -4768637 grounds -4768637533737 groundskeeper -47687 group -476886 grotto -4769 grow -476984 growth -4782 grub -4784687 isthmus -48 it iv -4817 it's -482 hub -4822 huba -482226653 guacamole -4826 ivan -48273 guard -482737 guards -482737245 guardrail -483 hue iud -483329 guffaw -4836 item -48367 items -48377 guess -48378 guest -483787 guests -484 4th hug huh -4843 huge -48433 guide -4845568463 guillotine -484589 guilty -48466377 guinness -484827 guitar -4848273 guitare -484827478 guitarist -48524 gulch -4853 gulf -48546 hulio -485467 hulios -4855 gull -485538 gullet -48557 gulls -4857 gulp -486 gum gun hum -4862358 gunbelt -48626 human -486267 humans -48629 gumby -486326 gundam -4863733 hundred -486479 hungry -4865 hunk -486637 hummer -4866464 humming -48664647 hummings -48667478 humorist -486687 humour -4867 gums guns hump hums -48674448 gunsight -4867467 gunshop -486769337 gunpowder -48678673 gunstore -48679 ivory -4868 hunt -486837 hunter -487 its -4872263 husband -48722637 husbands -487353 hurdle -4874 hush -4875 hurl -487742263 hurricane -48779 hurry hussy -4878 guru gust hurt -488 hut -48824 hutch -4882437 hutches -4882446766 hutchinson -488362374 gutenberg -4887 guts huts -488837 gutter -489 guy ivy -4897 guys -489953 guzzle -49 ix -4937268 hydrant -493728466 hydration -496 gym -496627486 gymnasium -49737 hyper -4973777333 hyperspeed -497379277 hyperwarp -4976 gyro -4976337642 hypodermic -4993466 gwydion -522 jab lab -522237 jabber -52234 laadi -52235 label -522357 labels -522466 labion -5225 jack -522522 laalaa -522538 jacket -5225387 jackets -5225426637 jackhammer -5225766 jackson -52257667 jacksons -5226728679 laboratory -5227664 jabroni -522867 labtop -5228994 jacuzzi -523 lad lae lcd -523337 ladder laffer -5233377 ladders -52343 ladie -523437 ladies -52353 ladle -5239 lady -524 jah -5243 laid -52437 jager lager -5245 jail -5245362374 kahlenberg -52453623747 kahlenbergs -524537 jailer -52457 jails -52458 lahku -524666 lagoon -5247 lair -5248546 kaitlin -5248596 kaitlyn -5253 jake lake -5254 kali -5257272 kalsarc -52572727 kalsarcs -526 jam lam -5262 jamb -52623 lance -526237 lancer -5263 jane land lane -52633455 landfill -5263464 landing -5263464723 landingpad -5263476 janeiro -52637 james -526372273 landscape -52645293 kamikaze -52648243 language -5264867 janitor -52648677 janitors -5267 lamp -526727 kansas -52673 lampe -52677 lamps -52677678 lamppost -526779673 lampsword -5268376 lantern -52683767 lanterns -527 jar las -52725 kasck -5272653 karaoke -5273 lard -527346 jardin -5273467 jardins -52737 lards laser -527372326 laserbeam -5273723267 laserbeams -52737266382867 laserconductor -52737486 lasergun -527377 lasers -52737932766 laserweapon -52743 large -5275 kask -52766 jason lasoo -5277 jars lars lass -52773 lasse -527737 jasper -52776 lasso -52779 larry -527797 larrys -5278 last -527845 kartik -527867 laptop -5278677 laptops -527882 kasuta -528 kat -5282 lava -52824 latch -528262 katana -5282867437 lavatories -52828679 lavatory -5283 late -52837 later -52837387466 laterfusion -52844 laugh -5284642 lavinia -528624 launch -52863373883 launderette -5286373883 laundrette -5286376628 laundromat -5286379 laundry -52872 laura -5287368 laurent -5287463 latrine -5288423 lattice -52884239675 latticework -529 jaw jay law lay -5292663 jawbone -52933 layed -5293629 lazenby -52936297 lazenbys -529464 laying -5296 lawn -529626 lawman -529666937 lawnmower -52967 lawns -5297 jaws lays -5299 jaxx -53 le -53222 kebab -53227 kebap -5323 lead leaf -53233424 jebediah -532337 leader -5323538 leaflet -53235387 leaflets -53237 leads -5325 leak -5326 lean -532639 keaney -53267 jeans -532686 leanto -5327 leap -53274 leash -53276464 learning -53283 leave -532837 leaves -5328376 lectern -5328437 leather -5328873 lecture -533 lee -53324 leech -5333 jeff -533337766 jefferson -53337 jeffs -5333739 jeffrey -5334 jedi -53343 ledge -533437 ledges -5335 keel -5336743 leforge -5337 jeep keep -533737 keeper -5338 left -53389 lefty -533897 leftys -534 keg leg -53422 legba -534229 legacy -5342663 legbone -5346824 jehovah -5347 kegs legs -5347873 leisure -53484 keith -53487227 lehtsaar -5348727 lehtsar -5355 kell -535539 kelley -53556 jello -53559 jelly -536 jen ken -536372 kendra -536484 length -5365 lenk -5365467 jenkins -5366 jenn -5366273 leonard -53662737 leonards -5366347837 kenmeister -53664 jenni -53664337 jennifer -536643377 jennifers -536647 jennis -53666233 lemonade -536662337 lemonades -53667 jenns -53669 jenny kenny -536697 jennys -5367 jens lens -5367273 leopard -53673 lense -5368 lent -537 jep -53737 leper -537466 lesion -5375 jerk -537648 kermit -537662 kerona -53766426 keronian -537666426 kernonian -53767363 kerosene -53769 leroy -5377 jess leps -5377324286 leprechaun -53773242867 leprechauns -5377422 jessica -537763 jerrod -537766 lesson -5377667 lessons -5377687 leprous -53779 jerry -53787 jesus -538 jet let -53835 level -53837 lever -538377 levers -538428426 leviathan -5384284267 leviathans -53848283 levitate -5387 jets lets -5387225 jetpack -538837 letter -538837269 letterbox -5388377 letters -538853 kettle -5388537 kettles -538868 levtov -539 key -5391 key1 -5392273 keycard -53922737568 keycardslot -53924246 keychain -53926273 keyboard -53935 jewel -53935379 jewelery -53935533 jewelled -539357 jewels -5393579 jewelry -5394653 keyhole -53946537 keyholes -5397 keys -5397225 keyrack -539723 keypad -5397464 keyring -5397568 keyslot -542233 libbed -5422623 licance -5423673 license -54236737 licenses -5423737 liberer -5425 kick lick -542537 kicker -54257 kicks -5427279 library -543 kid lid lie -5433 life -54332628 lifeboat -54333676 lifeform -543336767 lifeforms -543627737 kidnapper -5436277377 kidnappers -5436277464 kidnapping -5437 kids -5438 lift -54387 lifts -5438836268 lieutenant -544 jig -544278487 ligaruius -54448 light -544482852 lightbulb -5444837 lighter -54448377 lighters -54448464 lighting -544486464 lightning -544487 lights -5444877333 lightspeed -545 lil -5453 like -545437 lilies -5455 jill kill -545537 killer -545537626 killerman -5456 kiln -5459 lily -546 jim kim -5462 limb -54626 jimbo -5462656 lincoln -54626567 lincolns -54627 limbs -5463 kind line -54633 kinfe -54636 linen -54637 lines -54637539 lindsley -5463925537 linewalker -5464 king -54643743 lingerie -5464487 kinghts -54647 kings -54648 limit -5465 link -5466 lion -54667 lions -54669 jimmy -54675 kiosk -5468 lint -54696 jinwo -547 lip -5472 lisa -54723673 liscense -5473 lire -5474 kiri -5477 kiss lips -5477488 lippitt -54778425 lipstick -54779 lissy -5478 list -547836 listen -547836464 listening -547837 liquer -547843 liquid -547847 liquir -547867 liquor -5478687 liquour -548 kit lit -5482436 kitchen -548243672643 kitchenrange -5483 lite -54837 liver -5483728873 literature -548378625 livestock -548379 livery -548464 living -5487 kits -54873 livre -548737 livres -5487485 kitshuk -548785 kitsuk -548836 kitten -548837 litter -548837269 litterbox -548853 little -54889 kitty -54889548837 kittylitter -549 liz -549273 lizard -5492737 lizards -5497 lizs -5499 jizz -5533639 kleenex -5539367 llewdor -55464667 klingons -5547843 lliquid -5587 llur -562 job loa lob loc -56225 local -562257 locals -562283 locate -56228466 location -56229 lobby -5623 load loaf -562333 loaded -562337 loader -56234 loadi -56237 locer -5625 jock lock -562537 locker -5625377 lockers -562538 locket -562539 jockey -56257 locks -56257425 lockpick -56257425464 lockpicking -562578727 jockstrap -5626 loam loan loco -5627 loas -5627837 lobster -563 joe -56323 knead -5633 knee -56335 kneel -56343 lodge -5635 joel -5637 joes -5638 loft -5639 joey -56397 joeys -564 jog log -5642533 knicked -56426 johan -56426637 johannes -5642665 logbook -56433 knife -564337 knifes -564448 knight -564453 joggle -5646 john join logo -564625684 loincloth -564633 logoff -564669 johnny -56467 johns -56468 joint -564687 joints -564688 logout -5647 logs lois -564837 knives -56488464 knitting -565 lok lol -565296 kolayn -5653 joke -56537 jokes -5654 loki -56554767 lollipop -5656883 lolotte -5658 jolt -565962 kolyma -566 kon loo -5662 knob -566237 joober -56625 knock -5662537 knocker -56625377 knockers -56625464 knocking -56627 knobs -56637 jones -5664 long -5665 look -566533 looked -5665464 looking -5665688 lookout -56656887 lookouts -566587 lookup -5666 loom -56665 loook -56667 looms -56673 loose -566736 loosen -5668 knot loot -5668454 kontiki -56684547 kontikis -56684653 knothole -5669 know -566953343 knowledge -56696 known -567 los -5673 lord -567342765377 lordharmless -56737 loser -567377 losers -567463 josine -5674867 loritos -56752 korja -5677 loss -5677464 lopping -5678 korv lost -56782546 lostalim -56784 losti -56785246 lostlaim -568 lot lou -5683 loud love -568359 lovely -5683625464 lovemaking -56839 kotex -56843 louie -568466 lotion -56847 louis -568643 lounge -5687625 journal -56876257 journals -5687639 journey -5688379 lottery -569 kow low -56937 lower -56978425 joystick -57 jr kq -572324 kq2dbg -573 lpd lsd -57324 kqdbg -573324 kq3dbg -574324 kq4dbg -5747462 krishna -5747836 kristen -57478367 kristens -57493299766 krgzdaxzson -577 lss -5778 kprt -58 kt lt -582237 lubber -5822377 lubbers -5824337 lucifer -5824687 lucious -5827422833 lubricated -5829 lucy -58343 judge -58367 kudos -58374 jueri -584 jug lug -58423 juice -584236224463 juicemachine -584237 juicer -5844243 luggage -58444 luigi -584447 luigis -5847 jugs -5853 juke luke -5853269 jukebox -58543 julie -585437 julies -5855229 lullaby -5862 jumb -586237 lumber -5862375225 lumberjack -58624 lunch -58643 lunge -5864385 lungful -586453 jungle -5865 junk -58657453 junkpile -58659273 junkyard -5867 jump -586737 jumper -5867464 jumping -5873 lure -5874 juri -58749 juriy -587537 lurker -5875377 lurkers -5878 just -587846 justin -587846353824 justinfletch -5879 jury -5883 jute lute -5883269 jutebox -58836453 juvenile -593 lye -59454 kwiki -5974 jyri -59742 lyric -597427 lyrics -598866 lytton -599948 lxxxiv -62 ma mc -622 nab -6223 mace -6224 mach nach -622426476 machanism -6224383 machete -6224436 machien -6224463 machine -62244633 machined -62244637 machines -622446379 machinery -6225 mack -62277437 mbarrier -62287 occur -62287268 occupant -622872687 occupants -62297 nabys -623 oaf -6232 nada -62326 ocean -623263 madame -6233 made -62342 nadia -623663 mcfood -6236756933 mcemployee -6237 nads -6237437 mcfries -624 mag mai nah -62429463 magazine -624294637 magazines -6243 mage maid -624336 maiden -62442 magic -6244225 magical -62442426 magician -624443 maggie -62449 maggy -6245 mail nail -6245269 mailbox -624526937 mailboxes -6245626 mailman -62457 nails -6246 maim main -62462 magma -624626273 mainboard -624637263 mainframe -624638 magnet -62464269 mahogany -624643437 magnifier -6246439464 magnifying -62468362623 maintenance -624686 magnum -62468973 mcintyre -6247 mags -624766 maison -625 oak obj -6252656 malcolm -62526567 malcolms -6253 make male -625328 object -625328483 objective -6253287 objects -62533 naked -625336377 nakedness -6253566 malekom -6253688 makeout -62537 maker makes males -625377 makers -625387 makeup -625387548 makeupkit -625464 making -6254837283 obliterate -6255 mall -625538 mallet -625663 malone -626 mam man -62617 man's -6262 mama -626243 manage -6262437 manager -62624377 managers -62626 mambo -62626626 manannan -62627 mamas -6263 mame name -62637 names -62637253 mandrake -626375283 nameplate -62638837 maneuver -62643 mange -626437 manger -626453 mangle -6264653 manhole -6264785283 manipulate -62649 mangy -6266 mano -62662 mamma -626625 mammal -626637846 mannequin -626643 mannie -62667 manor -6267 mans -6267466 mansion -626825 manual -6268257 manuals -626835 mantel -62683574323 mantelpiece -626844387 mcnuggets -626853 mantle -62685373423 mantlepeice -62685374323 mantlepiece -626873 manure -6269 many -627 map mas nap -6272 marc narc -627253 marble -627256 napalm -62726 maran -627268 mascot -62726842 narcotic -627268427 narcotics -62728 mcrat -627292 naraza -6273426 mardian -62737828466 observation -6273783 observe -62737837 observer -6274 mash -62742 maria mcrib -62743 marge marie -62743426 obsidian -627448262 marihuana -627458262 marijuana -62747 mcrip oasis -6275 mark mask -62752676 marlboro -62753 maple -627533 marked -627537 marker -627538 market -627546 napkin -6275464 marking -62754647 markings -62757 marks -62758 markt -6276679 masonry -6277 maps mass -62772273 massacre -6277243 massage -62774 marsh -62774243 marriage -6277433 married -6277464 napping -6277483 massive -627769 narrow -62779 marry nappy -6278 mart mast -62782228 mastabat -627822283 mastabate -6278228 mastbat -62782283 mastbate -6278328 marteau -627837 master -6278372283 masterbate -62783774323 masterpiece -62784228 mastibat -627842283 mastibate masticate -6278426 martian -627846 martin marvin -6278464 martini -627847 maquis -6278487 martius -62785587 marullus -62787828 obstruct -62788228 mastubat -627882283 mastubate -6278872283 masturbate -627887228464 masturbating -62789 nasty -6279 mary -628 mat nav -62824 match -628242665 matchbook -62824269 matchbox -6282437 matches -628246 obtain -6282478425 matchstick -62824784257 matchsticks -6282667 navcomp -62826678837 navcomputer -6283 mate -62835 navel -6283647 obtenir -6283742 materia -62837425 material -62837487 materius -628374877 materiuss -6283883 navette -628424933 naugahyde -62844283 navigate -6284428466 navigation -628442846625 navigational -628466 nation -628483 native -6284837 natives -6285 maul -6286787 octopus -6287 oats -6287277 matrass -628765386 mausoleum -628766 matron -6288 matt -628837 matter -6288725 natural -628873 mature nature -62887377 mattress -629 maw max may nay -6293 maze -62934353 mayfield -6294 nazi -6294256763455483 maxiclorofillite -62943524 naziflag -629435247 naziflags -62946455466 maximillion -62947 nazis -62967 mayor -6297 maxs -6299355 maxwell -63 md me ne of -63222 mecca -632369 meadow -6323695263 meadowland -632377279 necessary -632377447 mebership -6324 mech -63242 mecha -632426427 mechanics -632426476 mechanism -6325 meal neal neck -63255223 necklace -63257 meals neals -6325843 necktie -6327 near -6327873 measure -632787464 measuring -6328 meat -632827 nectar -632832837 meateater -6328328377 meateaters -632852 nebula -6328523 nebulae -6328527 nebulas -633 off -6332255 oddball -63325 medal -633255466 medallion -6333 need -633353 needle -63337 offer -63337464 offering -633377 offers -6334225 medical -6334228466 medication -633423 office -6334237 officer -63342463 medicine -6334548 medikit -6334787 oedipus -63348283 meditate -6334828464 meditating -6334828466 meditation -633486 medium -6337 odds -63374668 offshoot -6338 meet -6338464 meeting -633872 medusa -6342 mega -63422527837 megablaster -63426 megan -63428483 negative -63444267 neighbor -634442687 neighbour -6344426877 neighbours -634443 meggie -634453 meggle -634684283 negotiate -6347 megs -635 mel -6352643 melanie -635362485 melenchuk -63547 nelis -635543 nekkid -635639 melody -635667 melons -636 mem men -636237 member -6362377 members -6362377447 membership -636243743 menagerie -6363 mend -6366 memo neon -63667 memos -6366726386 memorandum -63667425 memorial -636679 memory -6367 mens -6368 menu -63687 menus -6372 mesa -63723337 mercedes -637236279 mercenary -63724263473 merchandise -63724268 merchant -6373 nerd -63743 merge -637439 nephew -6376243 mermaid -6377 mess -6377243 message -637724326273 messageboard -63772437 messages -637769 merrow -63779 merry -6378 merv nest -63783 nerve -6378863 neptune -638 net -63825 metal -63825542 metallic -638257 metals -638367 meteor -6383673 meteore -638367483 meteorite -6383677 meteors -63837 meter never -638376463 nevermind -638463 method -63876 metro -6388464 netting -638873 mettre -639 new -6394226 mexican -6397 news -639772737 newspaper -6397727377 newspapers -6398 newt next -6399675 newyork -64 oh -642 mic -642253 nibble -6423 mice -6424235 michael -64243 niche -6424435 michiel -642487 nichts -6425 mick nick -642533 nicked -642535 nickel -6425357 nickels -642539 mickey -642567 mickos -64257 micks -64259 nicky -64276 micro -642762447 microchip -6427672673 microscope -6427674663 microphone -64276776237767 microprocessor -642769283 microwave -6427692836836 microwaveoven -643326 niddam -643353 middle -643438 midget -6435 niek -64357 niels -643643 nienie -643683 niente -64387 niets -64437 niger -644453 niggle -64448 night might -64448464253 nightingale -6444854448 nightlight -64448544487 nightlights -6444874233 nightshade -6444878233 nightstaff -6444878263 nightstand -64448782637 nightstands -6444878425 nightstick -645 oil -64515267 oil&lamp -6452568 oilblot -64525687 oilblots -6453 mike ogle -6453377425 oilderrick -64533774257 oilderricks -64535 mikel -64539 mikey -64548279 military -6455 milk mill -645574253 milkshake -64557663 millpond -6456267 oilmans -64576327 oilsmear -645768343 oilsmudge -6457683437 oilsmudges -6457768 oilspot -64578246 oilstain -645782467 oilstains -64586937 oiltower -645869377 oiltowers -646287 nimbus -6463 mind mine nine -64637 miner mines -6463725 mineral -64637257 minerals -646384 nineth -6464 mini -646428873 miniature -64647837 minister -6464887493 miniturize -64648874937 miniturizer -646488749464 miniturizing -64652 ninja -64652887853 ninjaturtle -64667 minor -64669462 minoxina -64678735 minstrel -6468 mint -64683636 nintendo -64686368 ointment -646883 minute -64688359 minutely -64689 minty -647 mir -6472632 miranda -64726847673 misanthrope -647273268 miscreant -6473 mire ogre -64733632667 misdemeanor -64737 miser -647377 ogress -64765 mirok -647654 miroki -647657 miroks -6477 miss -647747 missis -647753 nipple -6477537 nipples -647767 mirror -64776733 mirrored -6477677 mirrors -6478 mist -6478262 nirvana -647837 mister -647853863 mistletoe -64787 mists -64787377 mistress -64824 nitch -648246 mitain -648836 mitten -649 mix -64933 mixed -64937 mixer -649464 mixing -6498873 mixture -65 ok -6529 okay -653 old -65322867493 olfactorize -6533 olde -65337 older -6539 mkey okey -653936539 okeydokey -654387 olievr -65483 olive -65483645 oliveoil -654837 oliver -655 oll -65736 olsen -66 no on -662 mob -662245 nobail -6624 noah -662453 mobile -66245362758 mobilemarkt -66245374663 mobilephone -662632 omanda -662639 nobody -6628 moat -6629 moby -663 moe one -66314253 one-half -6633 mode -66335 model -663357 models -66337 onder -663439 modify -663538 omelet -6636 mofo -663853 module -6642 ooga -66473 noise -6647362537 noisemaker -66473625377 noisemakers -664737 noises -66478873 moisture -66527 molar -665277 molars -6653 moke mold -665333 molded -6653624677 mokenchops -665378 molest -665543 mollie -6656 mojo nolo -6656868 molotov -665836 molten -6659 only -666 mom non -666278379 monastery -66639 money -66639224 moneybag -666392547 moneyclip -6664 mong mooh -666437 monger -666437382736 mongeretardo -6664377382736 mongerretardo -6664626 mongman -6664735 mongrel -6664837 moniter -66648387 moniteur -666483877 moniteurs -6664867 monitor -66648677 monitors -6665 monk -666524 moolah -666539 monkey -666539626 monkeyman -6665397 monkeys -6665437 monkies -6666 moon -66662 momma -666643 moonie -66665484 monolith -66667 moons -66669 mommy moony -666697 mommys -6667 moms -66673 moose noose -666734323 moosehead -66673673 nonsense -6667837 monster -66678377 monsters -6667873 monstre -66678737 monstres -666837 monter -66684 month -66686368 monument -666863687 monuments -667 mop -6673 more nope nose -66733 moped -6674 nopi omri -667426 morgan -66743 norge -667536 moslem -667625 normal -6676464 morning -66766 moron -6677 moss -667737 mosses -66774 morph -667747 morris -66778486 mosquito -6678 most mort -667825 mortal -667827 mortar -66784 north -667843278 northeast -667849378 northwest -6678745 nostril -6678926833 mostwanted -667929 norway -667934426 norwegian -668 not -66824 notch -6683 move note -66832665 notebook -66835 motel novel -66836 movem -66836368 movement -66837 notes -6683723 notepad -6684 moth -668423 notice -66842326273 noticeboard -6684237 notices -66843 movie -668437 mother -6684377 mothers -6684377447 mothership -6684464 nothing -668464 moving -668466 motion -66847 moths -66853 mould -6686 onto -66863 mound -668637 mounds -66867 motor -6686729253 motorcycle -66867292537 motorcycles -66868 mount -66868246 mountain -668682467 mountains -668682467433 mountainside -668687 mounts -66873 mouse -66873723 mousepad -668747 mourir -6687474 nourish -668782243 moustache -6688246 moutain -66882467 moutains -66884 mouth -66884385 mouthful -669 now -6693 ooze -66937 mower -669464 mowing -669953 nozzle -6699537 nozzles -67 mr ms or -672 npc orb -672253 oracle -672437872 orchestra -672643 orange -6726437 oranges -6726763 osborne -6728 orat -673 ore -67337 order -673377 orders -6736 open -673633 opened -6736464 opening -6737283 operate -67372846482253 operatingtable -673728466 operation -67372867 operator -674 msg -67426 organ -67426476 organism -674264767 organisms -674264928466 organization -674267 organs -674276 orgasm -6743423 orifice -6746466 opinion -67486 orium -67626368 ornament -676263687 ornaments -677 mrs -67767483 opposite -6824 much -6825 muck -6825327 nuclear -683 mud -6832255 mudball -6833 muff nude -68339 muddy -68343 nudge -683489 nudity -6836 oven -6837 over -6837255 overall -68372557 overalls -683726273 overboard -68372628 overcoat -683726287 overcoats -6837328 overeat -68374264 overhang -68377277 overpass -6837768 mudspot -68377687 mudspots -684 mug oui -68437 other -684377 others -684438 nugget -6844387 nuggets -6847 mugs -6853 mule -685337 mulder -68537 mules -6855439 nullify -685848833 multitude -6858488337 multitudes -686 mum -686237 number -6862377 numbers -68624 munch -686253 mumble -6865337 munkees -68662 mumma -68669 mummy -687 mur -68725 mural -687253 muscle -687337 murder -687386 museum -6874 mush -68742 music -6874225 musical -68742269 musicbox -68742426 musician -687424267 musicians -68742752937 musicplayer -68747666 mushroom -687476667 mushrooms -687546 muslim -6877 murs -68773 nurse -6877379 nursery -687743 nursie -687749 murphy -68782243 mustache -6878873 nurture -688 mut muu nut out -688268 mutant -6882687 mutants -688348 outfit -6883487 outfits -68836677 outdoors -68837 outer -68845283 mutilate -68846873 outhouse -688538 outlet -6887 nuts outs -6887433 outside -688743687 nutrients -688747 ouvrir -6888 mutt -688866 mutton -689953 nuzzle -69 my nw ox -69263676 mycoform -692643 mycoid -6936 owen oxen -69367 owens -695667 nylons -696 own -69629 nyoby -69637 owner -697353 myself -697837 oyster -6978377 oysters -697842 mystic -6984 myth -699436 oxygen -72 pc r2 -722248 rabbit -722266 raccon -7222666 raccoon -7223 race -72237 saber -722435 rachel -7224357 rachels -7225 pack rack sack -7225243 package -72253 scale -722538 packet racket -7225464 scaling -72257 sacks scalp -7225735 scalpel -72257464 scalping -7225746456433 scalpingknife -7225753 scalple -722575464 scalpling -72257546456433 scalplingknife -72259 packy -7226 scan -7226637 scanner -72266377 scanners -72266464 scanning -722666 racoon -72268243 sabotage -722722 scarab -7227263686 sacramento -72273 scape scare scarf -722732769 scarecrow -722733 sacred -72274342425 sacrificial -72278 pabst -72279 scary -723 pad raf sad -7231 r2d1 -7232 r2d2 -72327 radar -7233 safe -7233464 padding -723353 paddle -7233766 saffron -723389 safety -72342623 radiance -72342867 radiator -72346 radio -72346564 radiolog -7234667 radioos -723467 radios -72346752937 radioplayer -7234692837 radiowaves -723478 sadist -7235625 padlock -72363 scene -7236379 scenery -72368 scent -7237 pads -7237873 sceptre -7238 raft -723837 rafter -7238377 rafters -724 rag -7243 page sage -724337 raider -72433853 schedule -724338537 schedules -7243623 science -724368478 scientist -7243684787 scientists -72437 pages -7243724446 ragfraggin -72437244464 ragfragging -7245 pail rail sail -72452628 sailboat -7245464 railing -72454647 railings -724566437 schlonger -724567 sailor -7245677 sailors -72457 rails -72457626 sailsman -7245796626 sailswoman -7246 pain rain -72462628 raincoat -724626287 raincoats -7246269 rainbow -7246368 raiment -724665 school -7246657 schools -72468 paint saint -7246824477 paintchips -724683 sainte -7246833 painted -72468464 painting -724684647 paintings -72468562 paintjob -7247 pair rags -72473 raise -724733 raised -724744 rairgh -7247467 raisins -7247767 scissor -72477677 scissors -72488737 pcitures -725 sal -725223 palace -7252237 palaces -72523 salad -725233 salade -7252337 salades -725237 salads -725269 salamy -7252837 palaver -7253 rake sale -72537 sales -7253725375 salesclerk -72537626 salesman -72537636 salesmen -7253784464 salesthing -7256 palm -725637 palmer -725666 saloon -72567 palms -72568733 palmtree -725687337 palmtrees -7258 raju salt -72588284667 salutations -725892837 saltwater -726 pan ram ran sam san sao -72622783 pancarte -7262437 rancher -726253 ramble -726262 panama -72628439 sanctify -7263 pane rand same sand -726325 sandal -7263257 sandals -726334 samedi -72634 sandi -72635 panel -726355464 panelling -726357 panels -7263672 pandora -726367217 pandora's -72636727 pandoras -72637 panes rands -726372 sandra -72639 sandy -72639424 sandwich -7264 sang -72642 panic -72643 range -726437 ranger -72648279 sanitary -726623 sconce -7266328 panneau -726637 panner -7266464 panning -72667 scoop -72668 scoot -7266837 scooter -72668377 scooters -72669 sammy -7267 pans ramp -726724 scorch -7267246275 scorchmark -72673 scope score -72674538 pamphlet -726745387 pamphlets -7267464 ramping -726753 sample -7267537 samples -7268 pant -72682 santa -726824 scotch -72682547 raotalis -726825477 raotaliss -7268437 panties -72686 santo -72687 pants scour -726879 pantry -72688 scott scout -727 pas pbr pcs rap sap sas -7272 papa -727224883 parachute -727235 parcel -72724 sarah -727246368 parchment -72725535 parallel -7272622 saranac -72726253 scramble -72726742487 sarcophagus -72727 papas scrap -727273 scrape -7272737 scrapes -7272738 parapet -72727483 parasite -727274837 parasites -727277 scraps -7272824 scratch -727282437 scratches -7273 rape -727326 scream -727326464 screaming -7273267 screams -727336 screen -7273367 screens -727368 parent -7273687 parents -72737 paper papes -727372547 paperclip -727377 papers -727379675 paperwork -72739 screw -7273933 screwed -72739374837 screwdriver -727393748377 screwdrivers -72739464 screwing -727397 screws -7274 pash raph -7274235 raphael -72743 sarge -727433 rapide -727436 sarien -7274367 sariens -727437 rapids -7275 park -727537 parker parler -7275387 parleur -7275464 parking -727567 parlor -727655 scroll -7276557 scrolls -7277 pass -72772273 passcard -72772377437 raspberries -727723779 raspberry -7277243 passage -7277243929 passageway -7277273552 sasparella -727737 parser -72774473 sapphire -727746628359 passionately -7277539 parsley -727768 parrot -7277687 parrots -72777678 passport -72779673 password -7278 part past -72782 scrub -7278253 partake -72783 paste -727848466 partition -7278637 partner -727867 pastor -7278673 pastore -72787 parts -727879 pastry -7278846473 scrutinise -7278846493 scrutinize -7278873 pasture -72788737 pastures -72789 party -728 pat rat -72822 scuba -728237 saucer -72824 patch -72826 satan -7283 save rate -7283548833474 satelittedish -728355483 satellite -7283554837 satellites -72836 raven -72836368 pavement -728363687 pavements -728367 ravens -7284 path -72843842 pathetic -72846 patio -728463 ravine -7284637 ravines -728464 saving -7284647 savings -728466 ration -7284667 rations -72847 paths -7284929 pathway -7285 paul saul -72855379 scullery -728559 scully -72857 sauls -728578873 sculpture -72858 sault -7286 scum -7287 rats -7287243 sausage -72872437 sausages -72873 pause -728765 patrol -7287652568 patrolalot -7287655464 patrolling -728765626 patrolman -728766 patron -7287667 patrons -728797 patsys -72883427337 sauvegarder -7288376 pattern -72883767 patterns -728853 rattle -7288537 rattler -72885376253 rattlesnake -72889 patty -72897 satyr -729 paw pay ray saw sax say -72924325 paycheck -72937 payer -7294433 rawhide -72946773 sawhorse -729486 raygun -7294867 rayguns -7296 pawn -7296368 payment -7296455 sawmill -729674663 saxophone -72967466478 saxophonist -7297 rays -72974663 payphone -729843 scythe -73 rd se sf -732 pda pea sea -73223 peace -73224 peach reach -732253 pebble -7322537 pebbles -7322625 peacock -73226257 peacocks -73228466 reaction -7322867 reactor -7323 read -73231688 read-out -732316887 read-outs -7323222 rebecca -7323446 rebegin -7323464 reading -7323478 receipt -7323483 receive -73234837 receiver -73235 rebel -732357 rebels -732368 recent -7323688 readout -73236887 readouts -732377 recess -7323782253 receptacle -7323784225 receptical -732378466 reception -732378466478 receptionist -73239 ready -73243837 reciever -73246773 seahorse -732473 recipe -7324737 recipes -732483 recite -7324855 seagull -73248557 seagulls -7325 peak peal peck seal -732537 pecker -732559 really -73257 peaks -7326 sean -732626 seaman -732663 second -73266664837 reconnoiter -732668 reboot -732673 record -73267337 recorder -732673464 recording -732673752937 recordplayer -7326787377 seamstress -732688 peanut -7326887 peanuts -7327 pear peas rear -732724 search -7327263 seasame -7327268 peasant -73272687 peasants -7327328437 rebreather -7327363 rearend -732737 reaper -732738 secret -732738279 secretary -7327387 secrets -73274355 seashell -73274673 seashore -73275 pearl -732766 reason -7328 peat seat -73282358 seatbelt -732833 seated -7328466 section -732867 sector -73287 seats -732873 secure -7328748437 securities -73287489 security -732925464 recycling -73292837 seawater -7329333 seaweed -733 see red pee -73326 sedan -7333 reed seed -733336 redeem -733337 reefer -733353 peddle -73337 reeds seeds -73337825 pedestal -733378257 pedestals -733378665 pedestool -7335 peek peel reel seek -7335328 reflect -7335328466 reflection -7335328483 reflective -733532867 reflector -7336 redo seem -733626 redman -7337 peep peer -73373746368 refreshment -733737463687 refreshments -7337434372867 refridgerator -733744372867 refrigerator -73374653 peephole -733823 reduce seduce -73383537 refueler -733873 refuse -734 peg -73425 regal -73426273 pegboard -73427337 regarder -734453 peggle -734466 region -73447837 register -734478728466 registration -73467 reins -7347 pegs -734738 regret -7348527 regular -734852867 regulator -734874482867 regurgitator -73493 seize -735283 relate -73528464 relating -73528466 relation -735284667 relations -73529 relax -7353 self -7353273 release -735328 reject select -735328466 selection -7354226 pelican -735433 relief -7354383 relieve -73544466 religion -735444687 religious -7355 sell -735537 seller -735538 pellet -7355387 pellets -7355464 selling -7356 relm -73562283 relocate -735623 reload -7358 pelt -735842 pelvic -735847 pelvis -736 pen -736245 pencil -7362457 pencils -736246 remain -7362467 remains -736275 remark -7363 send -7363268 pendant -7363398687 rendezvous -73638586 pendulum -736387283 penetrate -73638728466 penetration -7364 seng -73647 penis -7366 peon reno -73662687 remnants -7366437 pennies -736683 remote remove -73669 penny -7367 pens -73673 sense -736753 people -7367537 peoples -736767 sensor -7367677 sensors -7368 rent sent -73684368 sentient -736843687 sentients -73684635 sentinel -736846357 sentinels -736846873 penthouse -7368486 pentium -73687437 sentries -736879 sentry -736886 pentum -737 pep -73723483 perceive -73724 perch -737247 repair -737263 sesame -73727283 separate -737278 repast -737283 rescue -7372837 rescuer -73728377 rescuers -73729 percy -73732724 research -7373642 serenia -73736728466 perforation -7373676 perform -737367637 performer -7373676377 performers -73737828466 reservation -7373783 reserve -737378647 reservoir -73738 reset -7373863 perfume -737425 serial -73743268 sergeant -737433623 residence -73743368 resident -737446 resign -7374634225 periodical -73746342257 periodicals -7374687 serious -7375223 replace -73752236368 replacement -737542283 replicate -7375422837 replicates -73754228464 replicating -7375422867 replicator -73759 reply -7376 repo -7376748466 reposition -737678 report -7377 pepp -7377328 respect -7377368 serpent -737737 pepper -73773736828466 representation -73773736828483 representative -7377376468 peppermint -7377377 peppers -73774 pepsi -7377426 persian -737747 pepsis -7377472867 respirator -737766 person -73776625 personal -7377667 persons -73776674245489 responsibility -73776674253 responsible -737774728466 perspiration -73777473 perspire -73779 peppy -737797 peppys -7378 pest rest sert -7378268 servant -7378278 restart -7378287268 restaurant -737828737 restaurer -73783 serve -737837 server -7378378 pervert request -7378423 service -73784237 services -7378453 reptile -7378464 resting -737852437 sepulcher -737853 pestle -7378673 restore -73787 pests -7378724637 restrainer -737872466368 restrainment -737872468 restraint -737873 peruse -73787666 restroom -737877328 resurrect -737877328466 resurrection -7378872868 resturaunt -738 pet set -73825 petal -738257 petals -738273 retard -7382736 retardo -7383 pete -738325 reveal -73833 setee -73835 revel -73836 seven -738368336 seventeen -7383684 seventh -73837 peter petes sever -738373 severe -7383733 severed -73837363 reverend -7384367 reviens -738456 revilo -7384656 reviolo -738473 retire -738483 revive -7386583 revolve -73865837 revolver -738658377 revolvers -7387 petr -7387328 retreat -738743825 retrieval -73874383 retrieve -73879 retry -738833 settee -738837 petter -73883733738837 peuterdepeuter -7388536368 settlement -738863 retune -738876 return -73887637 returner -738876464 returning -7388767568 returnslot -739 pew sex -739273 reward -73937 sewer -739464 sewing -7397 pews -7397483 rewrite -739825 sexual -7398268 sextant -7399 sexy -74 pg -742 pic rib sic -7422243 ribcage -742229 shabby -742233 ribbed -74225 shack -7422553 shackle -74225537 shackles -742257 shacks -742266 ribbon -7423 rice -74233 shade -742337 shades -742369 shadow -7423697 shadows -74238 shaft -7424 rich shag -7424273 richard -74244 shagg -7425 pick sick -7425229 sickbay -742529 pickax -7425293 pickaxe -74253 shake -74253773273 shakespeare -742538 picket -74253837 picketer -742538377 picketers -742553 pickle -742587 pickup -74263 shame -74266 piano -7426766 shampoo -742689 shanty -7427 pics ribs -7427264 pharaoh -74273 phase shape shard share -742737 phaser -7427374438 shapeshift -7427377 phasers -74275 shark -742757 sharks -742767 phasor -74277 sharp -7427736 sharpen -742773633 sharpened -74283 shave -7428464 shaving -742846427326 shavingcream -74286 shaun -742869 shauny -7428837 shatter -7428873 picture -74288737 pictures -742926 shazam -74293 phaze -742937 phazer -742967 phazor -743 pie rid she -74323 piece -74323278 shebeast -743237 pieces -74327 shear -743277 shears -743284 sheath -7433 ride shed side -743328767 sideburns -743337825 piedestal -743353 piddle -74337 sheep sides -74338 sheet -743387 sheets -74339255 sidewalk -743392557 sidewalks -7433946337 sidewinder -74343 ridge -74345 sheik -743453 sheild -743464 riding -74353 rifle shelf -743537 rifles shelfs -74355 shell -743557 shells -743583 shelve -7435837 shelter shelves -74358464 shelving -7436 rien -7437 pier pies -7437433 sheriff -74374337 sheriffs -743772 sierra -743773 pierre -7437766 pierson -743782 siesta -7438 rift -744 pig rig -74435 pihel -744352 shiela -744353 shield -744366 pigeon -7443664653 pigeonhole -74436646537 pigeonholes -74438 shift -744443 piggie -7444464 rigging -74448 right sight -74448464 sighting -744487 rights -7445 phil -744538 piglet -744547 philip -74454773 philippe -7445535244 shillelagh -7445547 phillip -74455473 phillipe -74455477 phillips -74456767437 philosopher -744587 philup -7446 shin sign -744625 signal -744628873 signature -74463 shine -744637 shines -7446453 shingle -74464537 shingles -7446464 shining -7446637 shimmer -7446637464 shimmering -74466377 shimmers -74467 signs -74467678 signpost -74469 shiny -7447 rigs ship -74476368 shipment -744763687 shipments -74477 ships -74478 shirt -744797325 shipwreck -7447973257 shipwrecks -744873 sigurd -7448737 sigurds -7453 pike pile -745337 pilfer -7453623 silence -74536859 silently -745464 piling -7454746 pilgrim -7455 pill silk -745527 pillar -7455277 pillars -745569 pillow -7455697 pillows -74557 pills -74566437 shlonger -74568 pilot -745687 pilots -7458 silt -745837 silver -746 pin rio -7462 pina -74624 pinch -74625 shock -7463 pine shoe -74637 shoes -746374463 shoeshine -7463765474 shoepolish -74639 rhody -7464 ring sing -74643 singe -746437 ringer singer singes -7464377 singers -7464464 ringing -7464527 similar -74647 rings -7465 pink sink -74657 sinks -74658 pinku -746586 pinkun -74662 rhomb -74662253 pinnacle -74663 phone -746632273 phonecard -746632427437 phonecharger -746632665 phonebook -7466326684 phonebooth -746632686837 phonecounter -746636862377 phonenumbers -746637 phones -74667 simms -74668 shoot -7466837 shooter -74668377 shooters -7467 pimp shop -74673 rinse shore -746753 simple -7467533737 shopkeeper -74677 shops -746773 shoppe -7467737 shopper -74677464 shopping -74678 short -746787 shorts -7468 shot -74683 shove -746835 shovel -7468357 shovels -746845277 shotglass -7468486 shotgun -74686 photo -74686267437 photocopier -7468647274 photograph -74686472747 photographs -746867 photos -74688 shout -7469 show -74693 rinze -746937 shower -746937435 showergel -7469377 showers -747 rip sip sir -747283 pirate -7472837 pirates -7473 pipe rise -74735463 pipeline -747354637 pipelines -74736 siren -747367 sirens -74737 pipes -7474 pipi -747426 sirian -7474267 sirians -747435 shriek -747435464 shrieking -7474357 shrieks -74746 pipin -747463 shrine -747464 piping -747465 shrink -747466 siphon -747467 shrimp -7474677 shrimps -7474679 shrimpy -747666 shroom -7476667 shrooms -747683 shroud -7477 piss shsr -747733 pissed ripped -74774 pippi -74782 shrub -74782237437 shrubberies -747822379 shrubbery -747827 shrubs -747837 sister -7478377 sisters -747865 pistol -7478657 pistols -747866 piston -7478667 pistons -7478672683 ristorante -748 pit sgt sit -7482272 rhubarb -74824 pitch -7482437 pitcher -74824377 pitchers -7483 site -74833 shuff -74837 river -748372265 riverbank -748377 rivers -74866637 pitonner -7488 shut -7488283 situate -74883696 shutdown -7488837 shutter -74888377 shutters -7488853 shuttle -74888537 shuttles -7488853763 shuttlepod -749 six -7493 size -74943 pixie -74963 rhyme -74974225 physical -749742426 physician -7497427 physics -7498336 sixteen -74984 sixth -749846 rhythm -749893433 sixtyfife -749893483 sixtyfive -749896463 sixtynine -74992 pizza -74992488 pizzahut -74993742 pizzeria -75 pj rl -7522 slab -7522273 placard -75222737 placards -75223 place -7522326 placebo -752237 placer places -752257 slacks -75243 plaid -75246 plain -752467 plains -7526 plan slam -75263 plane -752638 planet -75263827486 planetarium -7526387 planets -75265 plank -752657 planks -7526637 slammer -75268 plant -7526837 planter -75268377 planters -752687 plants -7527 plas slap -75274 slash -7527437 slashes -752762 plasma -752783 plaque -7527837 plaques -7527842 plastic -7528 slat -75283 plate slave -7528328 plateau -75283676 platform -752837 plates skater slaves -752844837 slaughter -75286 plato -75287 slats -7528837 platter -75288377 platters -75288676 platvorm -7529 play slay -75292 plaza -752937 player -7529377 players -75294475 playgirl -7529464 playing -7529476863 playground -752962537 playmaker -75323 plead -753273 please -75327873 pleasure -753299 sleazy -7533 sled -753343 sledge -753343426637 sledgehammer -75337 sleep -75337464 sleeping -75353866 skeleton -753538667 skeletons -753824 sketch -754 ski -75423 slice -75433 slide -7543464 sliding -75437 skies -7545538 skillet -75455387 skillets -7546 skim skin -754627326 skincream -75463 slime -75464 pling sling -754647468 slingshot -75465 slink -7546637 skimmer -754684 plinth -7547 skip slip -7547737 skipper slipper -75477377 slippers -75478 skirt -7548 slit -75488437 skivvies -7566437 plonger -75673 slope -756737 slopes -7568 plot slot -756844 plough slough -75687 pjotr plots slots -7569 plow slow -756937 slower -756959 slowly -75825 pluck -758343 sludge -7584 plug slug -75847 slugs -7585 rlul -75855 skull -758557 skulls -7586 plum -7586237 slumber -75862464 plumbing -758643 plunge -7586437 plunger -75865 plunk -7587 plus -75877 slurp -7588 slut -759 sky -75954448 skylight -7595463 skyline -7597272737 skyscraper -75972727377 skyscrapers -76 so -762 rob -762237 robber -7622372255 soccerball -7622379 robbery -76224 roach snach -76225 smack snack -762257 snacks -7623 road robe -762325625 roadblock -76237 roads robes sober -762378 robert -7623929 roadway -7624 snag -762425 social -76243 poche roche -762437 rocher roches -7624389 society -76245 snail -76246 robin -7625 rock soak sock -76253 snake -762537 rocker snakes -762537546 snakeskin -762538 pocket rocket socket -7625382665 pocketbook -7625387 pockets rockets -7625464 rocking -76255 small -7625537 smaller -76257 rocks socks -76257453 rockpile -7626 roam -76268 robot -7626842 robotic -7626848273 robotguard -762687 robots -7627 snap soap -76272837 socrates -76273 snare -76274 smash -76274389 sobriety -76277 soaps -76278 roast -762824 snatch -76287 pocus -763 pod rod sod -7632 soda sofa -76325 sneak -7632537 sneaker -76325377 sneakers -76327 smear sofas -7632767 sodapop -763277 smears -763368 rodent -76336862 rodentmc -763368626844387 rodentmcnuggets -763393 sneeze -76344464 smegging -76347 rmdir -763486 podium -76355 smell -763559 smelly -7636 poem -76366493 sodomize -7637 pods rods -7638 soft -76383637 softener -763837465 softdrink -7638374657 softdrinks -763862842 pneumatic -763879 poetry -76389 softy -76389273 software -7642 soga -76433 sniff -76437 roger -7643837 snifter -7645 soil -76453 smile -764533 soiled -764543 smilie -7645464 smiling -76459 smily -76468 point -764689 pointy -76473 snipe -764737 sniper -76475 smirk -764766 poison -76476633 poisoned -76477 snips -7647737 snipper -76477377 snippers -76483 rogue smite -764837 rogues -76484 smith -764849 smithy -765 rol -76527 solar -7653 poke pole -7653437 soldier -76534377 soldiers -7653626 poleman -7653666 pokemon -76536662655328466 pokemoncollection -76537 poker poles -765423 police -765423626 policeman -765423636 policemen -7654248 solicit -76543 solid -765474 polish -765484225 political -76548427 politics -7655 roll -765533 rolled -765536 pollen -765537 roller -76553726837 rollercover -7655464 rolling -7655867 rolltop -765588466 pollution -76567 rojos -765722 solrac -76583 solve -76588466 solution -766 poo ron son -76624 pooch -766253 ronald -7662623 romance -76627376 sombrero -7663 pond poof roof some -7663464 roofing -76637 roofs -7663837 poofter -766384464 something -7663867 rooftop -7664 pooh song -76642 sonia sonic -76642327 poohbear -76647 songs -7665 pool -76653 smoke -766533 smoked -766537 smoker smokes -7665378225 smokestack -766574275 poolshark -7665742757 poolsharks -7665752937 poolplayer -76657529377 poolplayers -766578425 poolstick -766582253 pooltable -7666 room smoo soon -766624 smooch -766637 pommes -7666537 snooker -76667 rooms snoop -766684 smooth -76669 sonny -766693 snooze -7667 poop poor romp sons -766738358 roosevelt -76678 snort -7667837 rooster -7668 root soot -76682337 rootbeer -766823377 rootbeers -766843 soothe -76687 roots -76687453 sootpile -7669 pony snow -7669227853 snowcastle -766926273 snowboard -766926273464 snowboarding -766935253 snowflake -76694668377 snowhooters -766946873 snowhouse -7669626 snowman -76697266837 snowscooter -766972668377 snowscooters -76697827 snowstar -766978277 snowstars -767 pop pos -76723737 sorcerer -7672379 sorcery -76724 porch -767279 rosary -7672873 porcure -7673 rope rose sore -7673523337 ropeladder -7673552 rosella -76736279 rosemary -76737 ropes roses -767377 posess -7673882 rosetta -76748466 position -7675 pork -767674342 soporific -76773 posse -7677377 possess -76773774667 possessions -76774253 possible -76774343 porridge -7677437 poppies -76776473 porpoise -76779 poppy sorry -7678 port post sort -76782253 portable -767825 portal -7678257 portals -7678269 postbox -7678285547 portcullis -76783 porte -767837 porter portes poster -7678377 posters -7678426 portico -7678437 portier -76784653 porthole -767846537 portholes -767847 sortir -7678626 postman -76786275 postmark -7678627837 postmaster -7678633423 postoffice -76787 ports posts -76787248 portrait -767872487 portraits -7678786 rostrum -768 pot -76824 pouch -7682437 pouches -768283 rotate -768286 potato -7682863 potatoe -76828637 potatoes -768328 poteau -76833 snuff -768343 smudge -7683437 smudges -7684 snug -7684323 pothead -76844 rough -76844288 roughcut -7684453 snuggle -768466 potion -7685 soul -7685879 poultry -76863 pound round sound -768632527837 soundblaster -768637 rounds sounds -76867 rotor -7687 pots pour soup sous -768723 source -76873 rouse smurf soupe -768747 souris -76883 route -768833 rotted -768836 rotten -768837 potter routes -76884 south -768843278 southeast -768849378 southwest -76889 potty -769 row roy -7692628 rowboat -76926287 rowboats -769337 powder -76933733 powdered -769337346437 powderfinger -7693379 powdery -76937 power -769377 powers -772 spa -77223 space -772232665437 spacecookies -7722327238 spacecraft -77223626 spaceman -772237447 spaceship -772237488853 spaceshuttle -77223762538 spacerocket -772237848 spacesuit -7722378487 spacesuits -7722425 spacial -77228423 practice -772324 sq2dbg -77233 spade -7724 pr24 -772473 praise -7724743 prairie -77247437 prairies -77256 psalm -7725623 psalm23 -772567 psalms -77256723 psalms23 -7726 pram -7726474 spanish -77265 spank -7726637 spanner -77273 spare -77275 spark -7727553 sparkle -77275537 sparkles -772755464 sparkling -7727559 sparkly -772757 sparks -7727599263 sparkywand -7727769 sparrow -7727842 spastic -7728425 spatial -77284253 spatiale -7728852 spatula -7729 pray spaz -77296 prawn -77299 spazz -772992 spazza -773 sq3 -773224 preach -77322437 preacher -773233464 preceding -77324 pqdbg -7732425 special -77324626 speciman -77324636 specimen -773246367 specimens -77324687 precious -773247423 precipice -77325 speak -7732537 speaker -77325377 speakers -77327 spear -773276468 spearmint -773277 spears -773282253 spectacle -77328225345277 spectacleglass -7732822537 spectacles -7732837 specter -77328377 specters -7732873 spectre -77333 speed -773339 speedy -77355 spell -773552665 spellbook -773557 spells -77363 spend -7736373 prendre -7737273 prepare -773727478466 prescription -7737368 present -773736828466 presentation -773743368 president -7737433687 presidents -77376 sperm -77377 press -773772273 presscard -773773 presse -77377873 pressure -7738 pret -77384687 previous -7738735 pretsel -7738745 pretsil -7738753 pretsle -773889 pretty -7739 spew -774 pri -77423 price spice -774237 spices -774237225 spicerack -77424686 sphagnum -77425 prick -774337 spider -7743372248 spiderbait -7743377 spiders -774337932 spiderweb -774373 sphere -774378 priest -774378377 priestess -7743787 priests -774468 spigot -774469 sphinx -77453 spike -774537 spikes -77455 spill -77459 spiky -7746 spin -774623 prince -7746237 princes -77462377 princess -774624725 principal -774625 spinal -77463 spine -77467489 priority -77468 print -7746837 printer -77468464 printing -774725 spiral -77473 spire -774748 spirit -7747487 spirits -77476 prism -774766 prison -77476637 prisoner -7747667 prisons -7748 spit -7748283 private -7748853 spittle -77493 prize -77496 prizm -775274 splash -775433 spliff -77548 split -77622253 probable -77623 probe -7762333 proceed -7762377 process -776237737 processes -7762377464 processing -776237767 processor -7762536 problem -7762873 procure -7763 prod rsoe -7763337 proffer -776348 profit -7763823 produce -77638237 producer -7764726 program -7764726633 programmed -7764726637 programmer -77647267 programs -77647377 progress -7765328466 projection -77653284667 projections -776625 promak -77663 spoof -776636233 promenade -7766384387 prometheus -776643 sponge -77665 spook spool -776657 spooks -776659 spooky -77666 spoon -77666385 spoonful -776663857 spoonfuls -776667 spoons -77673 prose spore -776732327464 sporebearing -776735 propel -776735537 propeller -7767355377 propellers -776737 spores -77673789 property -7767438 prophet -776749522842 prophylactic -7767495228427 prophylactics -77676725 proposal -7767673 propose -77676748466 proposition -776784 prosti -7767848883 prostitute -77678488837 prostitutes -776787 sports -776787283 prostrate -7768 spot -7768328466 protection -7768328483 protective -7768378 protest -776837837 protester -7768378377 protesters -7768433 provide -7768474667 provisions -77687 spots -77688 spout -77729 spray -777323 spread -77736437 sprenger -77744 sprig -777464 spring -77746553 sprinkle -777465537 sprinkler -7774655377 sprinklers -777465537797836 sprinklersystem -777468 sprint -777483 sprite -7774837 sprites -777688 sprout -777823 spruce -778273 square -778274 squash -77828 squat -7783393 squeeze -77843 squid -778437 squids -778474 squish -77847735 squirrel -778477357 squirrels -778478 squirt -778499 squizz -77877435 squrriel -779 pry spy -779227 prybar -77945277 spyglass -7794653 spyhole -78 st sv -782 pub rub -7822 stab -78223 stace -782237 rubber -7822377 rubbers -78223775268 rubberplant -782239 stacey -7822397 staceys -7822474 rubbish -78225 stack -782253 rubble stable -78229 stacy -782297 stacys -7823 quad rube -78233 staff -78237 pubes -7823726453 quadrangle -7823745283725 quadrilateral -7824 such -78242 pubic -78243 stage -7824326224 stagecoach -78245 quail -78246 stain -7824633 stained -78246473 quagmire -782467 stains -78247 stair -782472273 staircase -782477 stairs -782477837 stairstep -7824778377 stairsteps -78247929 stairway -782479355 stairwell -7825228483 stalactite -78252284837 stalactites -7825246483 stalagmite -78252464837 stalagmites -78252484837 stalagtites -78253 stake -782537 stakes -782542 public -782542493 publicize -782547437 publisher -7825474464 publishing -7825489 quality -78255 stalk stall -782553 suckle -782557 stalls -78263 stand -78263273 standard -78263377 standers -78263464 standing -782637 stands -78263743 submerge -78263773 submerse -782648 submit -7826539 stanley -78267 stamp -782692 stanza -7827 star -78272273 starbase -782727238 starcraft -78273 stare -78273474 starfish -78274 stash -78276362 subpoena -782763627 subpoenas -78277 stars -78277447 starship -78278 start -782782623 substance -7827833 started -7827837 quarter -78278372225 quarterback -78278377 quarters -782784888466 substitution -7828 stat -78283 state -782836368 statement -7828363687 statements -7828466 station -78284667 stations -7828478427 statistics -78287 stats -782883 statue -7828837 statues -782883883 statuette -782887 status -7829 ruby stay -782929 subway -78325 steak steal -783257 steaks -78326 steam -7832637 steamer -783267447 steamship -7832674477 steamships -78327464 stearing -7833 puff rude -783326 stefan -783336 sudden -783337 rudder -78335 steel -783353 puddle ruffle -7833537 puddles -78336 queen -78337 queer steer -78337464 steering -7833753 steeple -783377 steers -78339 puffy -783522844 stelbaugh -7836 stem sven -783624 quench stench -7836633 stemmed -78367 stems -7837 step suer -78372322895 pteradactyl -783727287 pterasaur -783736 stereo -783736797836 stereosystem -78374 steph -783742643 stephanie -783745493 sterilize -7837523337 stepladder -7837643 steroid -78376437 steroids -783767287 pterosaur -78377 steps -78377464 stepping -78378 quest -78378466 question -78379 query -78383 steve -783836 steven -7839 stew -7839728 stewrat -784 rug -7842433 suicide -78425 quick stick -7842537 sticker -78425377 stickers -78425378 quickest -784254 quicki -7842543 quickie -7842559 quickly -784257 sticks -784257263 quicksand -784259 sticky -78427 sugar -78433 stiff -78433356 stiefeln -784334 stiffi -7843343 stiffie -784337 stiffs -784339 stiffy -78438 quiet -7844378466 suggestion -78454 quiki -78455 still quill -78458 quilt -784587 quilts -7846 ruin -78465 stink -7846546 stinkin -78465464 stinking -784659 stinky -78466 quinn -78467 ruins -7847 rugs stir -7847737 stirrer -78477377 stirrers -7848 puit quit suit -78482273 suitcase -784824 stitch -78483 quite suite -78487 puits suits -7848837 quitter -7853 puke rule -78533 puked -78535463925537 pukelinewalker -78537 ruler rules -785387 sulfur -7855 pull rull -78552673 pullcord -785539 pulley -78573 pulse -78573729 pulseray -785737297 pulserays -7857374353 pulserifle -78573743537 pulserifles -785748 pulpit -786 rum run sun -7862284464 sunbathing -7862326 sunbeam -78624 punch -78625 stock -786253 rumble -7862537 rumbles -78625463 sunblind -7862546337 sunblinder -78625464 stocking -786254647 stockings -78625625 sunblock -786257453 stockpile -786257666 stockroom -78628873 puncture -786337 sunder -7864 rung sung -7864527737 sunglasses -78647 rungs -7864746368 punishment -7865 punk -786536 stolen -786537 punker -7866224 stomach -7866243 rummage -78663 stone -786631 stone' -786635 pummel -786637 stones summer -786639675 stonework -78665 stool -786657 stools -78667 stomp -78669 sunny -7867 pump stop suns -78672 stop2 -7867243 storage -78672437666 storageroom -78673 store -78673533737 storekeeper -786735784587546 rumpelstiltskin -786737 stores -786737666 storeroom -786738 sunset -7867464 pumping storing -7867473 sunrise -786753784587546 rumplestiltskin -78676 storm -786767 storms -78677 pumps -7867737 stopper -78679 story -7868 punt -786826 suntan -7868266464 suntanning -78683 stove -78683867 stovetop -7869 stow -787 7up pup sup -78724273 purchase -787242737 purchaser -78724448 straight -7872444836 straighten -787246 strain -787248 strait -787248522538 straitjacket -7872643 strange -78727 strap -78729 straw -78729626 strawman -7873 sure -7873223 surface -787326 stream -78733 puree -787338 street -78733832623 streetdance -78733854448 streetlight -787338544487 streetlights -7873387 streets -78733874663 streetphone -7873389327 streetwear -78736484 strength -78737 super -787373278 superfast -787374583 superglue -7873747277 supergrass -787377527 superplas -7873784767 supervisor -7873824 stretch -7874 push -787428679 purgatory -78743437 purifier -787437 pusher -7874377 pushers -7874464 pushing -78745 pupil -787453 strike -787457 pupils -787464 string -7874647 strings -78747 strip -787473 stripe -7874733 striped -7874737 stripes -7874746 pushpin -787477 strips -78747732724 stripsearch -78749 strix -787653 stroke -787655 stroll -787664 strong -787664269 strongbox -7877 russ -78773 purse -7877328 suspect -78773287 suspects -7877363 suspend -787736337 surrender -787738 puppet -7877426 russian -787743 puppie -787753 purple -78775437 supplies -7877587 surplus -787759 supply -7877673 purpose -7877678 support -787767837 supporter -78776787 supports -787768634647 surroundings -78777473 surprise -78779 puppy pussy -78779228 pussycat -7878 rust -7878246 sustain -787828873 structure -7878288737 structures -787834552623 surveillance -787839 survey -78784825 survival -78786738 strumpet -78788 strut -7878873 rupture -78789 rusty -788 put -7883 stud -78833 stuff -78833464 stuffing -7883368 student -78833687 students -788346 studio -78839 study -7886 stun -78867 stump -788677 stumps -788743 putrid stupid -788837 sutter -7888377 sutters -789 sux -789953 puzzle -79 sw -7925569 swallow -7926 ryan swan -79267 swamp swans -792679 swampy -7927 swap -79276 swarm -79276464 swarming -79278422 swastica -792784223524 swasticaflag -7927842235247 swasticaflags -7928 swat -7929 sway -793 rye -79327323 ryebread -79328 sweat -79337 sweep -7933737 sweeper -79338 sweet -7944 swig -79455 swill -7946 swim -79464 swing -794647 swings -79464738 swingset -79466437 swimmies -79466464 swimming -79467848 swimsuit -794687687377 swimtrousers -79473 swipe -79477 swiss -794824 switch -79482425233 switchblade -794824269 switchbox -79482437 switches -795 syl -796265 symbol -7962657 symbols -79673 sword -796737 swords -796737626 swordsman -7967376267 swordsmans -79684 synth -79684374937 synthesizer -796843842 synthetic -79687 pyotr -7972643 pyramid -7973 pyre -797836 system -79787 syrup -797877 syrups -798466 python -799764912 sw9764912 -82 ta u2 -822 tab vac -82227226 tabascco -82235 tabel -8225 tack -82253 table -822537 tables -822538 tablet -8225387 tablets -822553 tackle -8226 taco -8227 tabs -823 tad -82337 vader -8238 taft -824 tag tai -824462 vagina -824484 tahiti -8245 tail -824567 tailor -82457223 tailrace -8246 vain -8247268 vagrant -82477328 vaisseau -8252 ucla -82526423 valanice -8253 take tale -825464 taking -825473 valise -82547626 talisman -8255 talk tall -825539 valley -825543 talkie -825586463 valjumine -8257 takr -82583 value valve -825837 valves -826 tan van -8263 tame vane -826325473 vandalise -826325493 vandalize -82647 tamir -826489 vanity -8265 tank -82657 tanks -8266464 tanning -8267473 vampire -82674737 vampires -826766 tampon -827 tap var vcr -82726 taran -8273 tape vase -8273554 taselli -82737 taper vases -8273787437 tapestries -82737879 tapestry -82742253 variable -827438 target -8274387 targets -82767493 vaporize -827677 vapors -8277 taps -82783 taste -8279 tarx -828 vat -82822 ucucc -82837 tater -828376 tavern -828377 taters -82858 vault -828866 tattoo -829 tax -8294 taxi -8294222 taxicab -83 ve -832 tea -8322437 teacher -83224464 teaching -832287 teacup -8324642426 technician -83246424267 technicians -8324647837 techniques -8324665649 technology -8326 team -83267 teams -8327 tear -83277 tears -833 ted -83339 teddy -833392327 teddybear -8336 teen -83362437 teenager -833833 teevee -83384 teeth -834382253 vegetable -8343822537 vegetables -8343828466 vegetation -8344235 vehicel -8344253 vehicle -83442537 vehicles -8344437 veggies -8345 veil -8346 vein -835246 telbin -8353 tele -835372673 telescope -8353726735367 telescopelens -83537267353673 telescopelense -8353726742 telescopic -835374663 telephone -8353746632273 telephonecard -83537466326684 telephonebooth -8353746636862377 telephonenumbers -8353746637 telephones -83537466464 telephoning -83537678 teleport -8353767828466 teleportation -8353767837 teleporter -8353847466 television -83538474667 televisions -8353847466738 televisionset -8353882243 teletubbie -83538822437 teletubbies -835388229 teletubby -8353882297 teletubbys -8355 tell -835537 teller -835543 tellie -8355437 tellies -83559 telly -836 ten ufo -83633629 tendency -836337 tender vender -8363387 vendeur -8363464 vending -83634646224463 vendingmachine -83648258466 venitaltion -836637 tenner -836647 tennis -83666 venom -836753 temple -83676 tempo -83676725 temporal -83678 tempt -8368 tent vent -83682253 tentacle -836822537 tentacles -83682528466 ventalation -83684 tenth -83684258466 ventialtion -83684528387 ventilateur -83684528464 ventilating -83684528464724238 ventilatingschaft -83684528466 ventilation -8368452846674238 ventilationshaft -836845284667473 ventilationpipe -8368452846674737 ventilationpipes -836845284668823 ventilationtube -8368452846688237 ventilationtubes -8368452867 ventilator -83687 tents vents -837 ver -837225493 verbalize -8372632 veranda -837268766 vercotron -8375 tesk -837638536 vermeulen -837646 vermin -83764625 terminal -837646257 terminals -837646283 terminate -83772 terra -8377223 terrace -8377246 terrain -83773 verse -837735 vessel -8377466 version -837767 terror -837778 tessst -8378 test vest -83783272 vertebra -837832723 vertebrae -837837 tester -83784253 testicle -837842537 testicles -837842853 vestibule -8378452 tequila -83784552 tequilla -8379 very -838 vdu -8383 veve -8387 vdus -838747 tetris -8398 text -8398453 textile -83987 texts -84 uh vi -842 thc vic -84225 tical -84246489 vicinity -8425 tick vial -842538 ticket -8425387 tickets -842553 tickle -84257 vials -8426 than -84265 thank -842657 thanks -84272 tiara -8428 that -8428227 tictacs -842846 victim -8428463 victime -84284637 victimes -842867 victor -84288257 victuals -843 the tie -8432837 theater -8432873 theatre -8433 thee -84336 video -8433673267337 videorecorder -843368273 videotape -84338 theft -8434263 vidgame -84347 their -8436 them then -8436735837 themselves -843679 theory -84373 there these -8437368337844 vierenveertig -8439 tidy view -8439464 viewing -8439727336 viewscreen -84397273367 viewscreens -84397678 viewport -843976787 viewports -844 vii -84425 thick -8442538 thicket -84433 thief -84437 tiger -844383 thieve -8444 viii -84444 thigh -844447 thighs -84448 tight -8444859 tightly -8446 thin -8446253 thimble -8446253385 thimbleful -84462537 thimbles -84463 thine -84464 thing -84464262544 thingamajig -844647 things -844649 thingy -84465 think -84465464 thinking -8447 this -84473 third -84478336 thirteen -844789 thirty -84484 uhhuh -8448437 thither -84529 vijay -8453 tile vile -84537 tiles -84539675 tilework -8454 tiki -84547 tikis -8455 till -8455243 village -84553 ville -8459 ugly -846 tin vin -846237 timber -8462377 timbers -846246489 vincinity -8463 time vine -846337 tinder -8463427 vinegar -84637 timer times vines -846374323 timepiece -846382253 timetable -8463822537 timetables -846437 tinier -846464 timing -846472 viogra -8465283 violate -8465368 violent -846538 violet -846543 tinkie -846543946543 tinkiewinkie -846546 violin -846553 tinkle -84659 tinky -8465994659 tinkywinky -846627 thomas -84664 thong -84668 timov -8467 thor -846729463 thorazine -84673 those -84676 thorn -846767 thorns -8468 thou -846844 though -8468448 thought -84684487 thoughts -84687263 thousand -8469 tiny -847 tip -847243 visage -847274 thrash -8473 tire -847323 thread -8473237 threads -847328 threat -84733 three tired -847337 tireds -84737 tires viper -8474 virh -8474253 visible -847446 virgin -847468 vishnu -84748 visit -8474867 visitor -84748677 visitors -847628 throat -847647 tiroir -847663 throne -847664 throng -8476844 through -84768853 throttle -84769 throw -8476937 thrower -84769464 throwing -8477 tips -847739 tippex -847783 tissue -8477837 tissues -8478 thru -847825493 visualize -84786 thrum -847863 tiptoe -847866464 thrumming -8478664647 thrummings -847867 thrums -84787 virus -8478737 viruses -847878 thrust -84787837 thruster -847878377 thrusters -848 tit -84826 titan -8482642 titanic -84826427 titanics -8484 uhuh -848437 tities -84847 thugs -84853 title -848537 titles -84862 thumb -8486337 thunder -84867 thump -8487 tits -84875464 titsling -8488437 titties -84889 titty -849 thy -8494225 thwhack -84963 thyme -8497353 thyself -853623 ulence -8539 ukey -85872 ultra -858723278 ultrafast -86 to -8622226 tobacco -86225493 vocalize -8623 toad -862378665 toadstool -8623786657 toadstools -8624246 unchain -8625684 uncloth -86256843 unclothe -862568433 unclothed -862658 unbolt -8626837 uncover -86273552 umbrella -86278 toast -8627837 toaster -86282553 unbuckle -862833 uncuff -863 toe -86327836 unfasten -8632784 unearth -86329 today -863297 todays -863323 undead -8633537 toddler -86337 under -8633725684464 underclothing -8633726837 undercover -8633727874 underbrush -86337476863 underground -8633763284 underneath -863376678 undermost -8633772687 underpants -8633778263464 understanding -8633792837 underwater -863379327 underwear -8633796753 underworld -86338837 unfetter -86352 vodka -8636 todo undo -863653 unfold -863737 undres -8637377 undress -863737733 undressed -8639 undy -86423 voice -864237 voices -8642676 unicorn -864285 vohaul -8642857 vohauls -8643 void -864336843433 unidentified -8643676 uniform -86436767 uniforms -86438437 together -864453 toggle -8644824 unhitch -8645283 toilate -864538 toilet -86453835874 toiletflush -8645387 toilets -86453872737 toiletpaper -8645387328 toiletseat -864657837 unholster -86466 union -864665 unhook -8648 unit -86483 unite -864831 unite! -864837725 universal -86483773 universe -8648377489 university -86487 units -8652266 volcano -8652824 unlatch -86529385 unlawful -8653 toke -86536 token -865367 tokens -8654448 unlight -86548 unlit -865623 unload -865625 unlock -8656696 unknown -865669619673 unknown.word -8658243 voltage -865863 volume -8658637 volumes -866 tom too -8662 tomb -86624295 tomahawk -86627 tombs -866278663 tombstone -8662786637 tombstones -866286 tomato -8663 tome tone -866366 voodoo -86637 tomes tones -86642 tonic -86648 vomit -866483 tongue -8665 tool -8665269 toolbox -86657 tools -86657433 toolshed -86667769 tomorrow -8667837 vonster -86678377 vonsters -8668 toot -86684 tooth -8668433 toothed -8669 tony -86697 tonys -867 top vms -86724 torch -8672437 torches -86725426 vorakian -8672726253 unscramble -8672739 unscrew -86732873 unsecure -86733 topee -86746283 unrinate -867584 unplug -8676 torn -8676236 tornado -8676336426 tormeenian -86763364267 tormeenians -867655 unroll -8676678 topmost -8677 tops toss -867737 tosser -86774 topsg -86776 torso -8677645 topsoil -867839 vortex -86784552 tortilla -8678873 torture -868 tnt -8682 v6ta -86824 touch -868243 touche -8682437 touches voucher -86824464 touching -86825 total -8682559 totally -86826453 untangle -868345 unveil -86836 totem -86843 untie -86845 until -86873 toupe -868732 toupea -868733 toupee -8689 unty -869 tow toy -869243 voyage -869273 toward -8692737 towards -86935 towel -869353883 towelette -869357 towels -86937 tower -869377 towers -86946 toxin -8695263 toyland -8696 town -86966873 toymouse -86967 towns -86967447 township -8697 toys vows -87 tp ts up us vs -87223 trace -87225 track -87225464 tracking -87233 trade -8723342 traffic -87245 trail -8724537 trailer -872457 trails -87246 train -87246377 trainers -872467 trains -8724825 upchuck -8726 tram -87267 tramp -87267337 transfer -872674368 transient -8726748 transit -872675283 translate -8726752837 translater -87267528464 translating -87267528466 translation -8726752867 translator -87267648 transmit -87267648837 transmitter -87267766337 transponder -872677678 transport -87267767828466 transportation -87267767837 transporter -872677678464 transporting -8727 trap -87273667 trapdoor -87274 trash -87274226 trashcan -872742267 trashcans -87274227538 trashbasket -87274246 trashbin -872742467 trashbins -872773 trappe -872835 travel -87283537 traveler -872835464 traveling -872835537 traveller -87283773 traverse -87286582 travolta -8729 tray -873 use -87323 tread -873236455 treadmill -873237 treads -87327873 treasure -87327879 treasury -87328 treat -8733 tree used -873346873 treehouse -8733626 treeman -8733636 treemen -87337 trees -8735377 useless -873624 trench -8736242628 trenchcoat -87364 tseng -8737 user -87386378433356 tretoestiefeln -874 uri -87423 tribe -87425 trick -8742863 tribune -87429253 tricycle -8743368 trident -874368 urgent -8744437 trigger -874478 tshirt -8746 trio -874625 urinal -8746283 urinate -87463 urine -87464 using -87465387 trinkets -8746637 trimmer -8747 trip -8747233 upgrade -87543837 uplifter -876 urn -876225 trobak -87627 urmas -8763 trod -8764563983 troglodyte -87655 troll -876557 trolls -87658738 usoltsev -8766 upon -87666 vroom -876666 vrooom -87667 troop -8766737 trooper -87667377 troopers -8767 urns -87674437 trophies -876749 trophy -8768 trou -8768253 trouble -876844 trough -87687 trous -87687377 trousers -876935 trowel -87695 trowl -87737 upper -877376678 uppermost -877433 upside -877658738 ussoltsev -87782477 upstairs -87825 truck usual -8783 true -87832 truda -878524272 tsukahara -87859 truly -8786353 trundle -87865 trunk -878657 trunks -8786738 trumpet -879 try -88 tv -881 tv. -882 tub -882243 tubbie -8822437 tubbies -8823 tube -88237 tubes -882537 tucker -8836745 utensil -88367457 utensils -8838 tuft -88387 tufts -884 tug -8842628 tugboat -8845473 utilise -88454737 utiliser -8845489 utility -8845493 utilize -88547 tulip -885477 tulips -8858873 vulture -88588737 vultures -886253 tumble -8863 tune -88637 tunes -886464 tuning -886635 tunnel -8866357 tunnels -88669 tummy -887 tvs -88726 turbo -8873 turd turf -887336 tureen -88738 tvset -88746 turin -8875 turk -887539 turkey -8875397 turkeys -8876 turn -887682253 turntable -887738 turret -887828466 tvstation -887853 turtle -88837 utter -89325 tweak -893583 twelve -893689 twenty -8943353 twiddle -8944 twig -89447 twigs -8946 twin -89463 twine -8946543 twinkie -8946553 twinkle -89465537 twinkles -894655464 twinkling -89467 twins -89475 twirl -89478 twist -89537 tyler -896 two -8962656733 twocolored -89626568733 twocoloured -8973 type -911 911 -92 wc ya -922 waa zac -922237 yabber -9224379 zachery -9225379 zackery -9233 wade -923464 wading -924 wag yah -92437 wager -9245 wail -9245464 wailing -92457 wails -92466 wagon -924667 wagons -92478 waist -924782263 waistband -9248 wait -924837 waiter -9248464 waiting -92487377 waitress -924934 yahweh -925 yak -925268 walbot -9253 wake -92536 waken -9255 walk wall -9255268 wallbot -92552687 wallbots -925538 wallet -925543 walkie -925546 walkin -9255464 walking -925567 wallop -925569277 wallowars -92557 walls -925572737 wallpaper -92558476844 walkthrough -9255929 walkway -925688 walnut -9256887 walnuts -9263 wand -926337 wander -9264 wang -9265 wank yank -926537 wanker -9268 want -926833 wanted -92687 wants -9269 yaow -927 war yap zap -9273 ware yard -9273273 warfare -927346873 warehouse -9273468737 warehouses -92737 wares yards -92737623 wardrobe -927376237 wardrobes -927378425 yardstick -9274 wash -927422746 washbasin -927425684 washcloth -927426 zarian -92742695 washbowl -92742876 washburn -927437 washer -9274377 washers -9274464 washing -92744646224463 washingmachine -9274464866 washington -9275625 warlock -9276 warm yarn -9276464 warning -9277 warp wars wasp -9277268 warrant -9277467 warrior -92774677 warriors -92777 wasps -927777333 warpspeed -9277978425 zappystick -92783 waste -92783226 wastecan -92783227538 wastebasket -92783246 wastebin -9278372737 wastepaper -92824 watch -9282437 watcher -9282486937 watchtower -9283 wave -92837 water waver waves -9283722746 waterbasin -92837266537 watercooler -928373255 waterfall -9283732557 waterfalls -9283737668 waterfront -928374653 waterhole -928377 waters -92837737378647 waterreservoir -928377473 waterpipe -9283774737 waterpipes -92837929 waterway -9284 xavi -928766 watson -929 wax way -92937 waxer -93 we ye -932 web yea -9324 yeah -932568 zealot -9327 wear webs year -93272 zebra -9327357 weasels -932766 weapon -9327667 weapons -93283 weave -9328437 weather -9328437627 weathermap -933 wed wee -9333 weed -933332837 weedeater -9333464 wedding -93337 weeds -93339422537 weedwhacker -9335 week -9337 weep -9337464 weeping -93378 weest -93444 weigh -934448 weight -9344487 weights -93473 weird -934736 weirdo -934737 weiser -9352663 welcome -93532 zelda -9355 well yell -9355464 yelling -935569 yellow -93556933 yellowed -93557 yells -935827 zeltar -9358277 zeltars -93582771 zeltars) -93624 wench -93666 xenon -9368 went -937 yep yes -9373 werd -9378 west -937837329 yesterday -938 wet -9384 yeti -9387 zeus -9387848 wetsuit -94 xi -94225 whack -9422537 whacker -94253 whale -9425317 whale's -94273 wharf -9428 what -942824262225548 whatchamacallit -942827392 whatareya -94287 whats -94328 wheat -9433 wide wife -94335 wheel -94335227769 wheelbarrow -943357 wheels -94336 widen -94337 wifes -943438 widget -94353 wield -9436 when -94373 where -94373226887 whereabouts -943737 wheres -944 wig xii zig -94433 whiff -9444 xiii -94449 ziggy -944497 ziggys -94453 while -9447 whip whir zigs -9447539 whiskey -944757665 whirlpool -944759 whisky -94477 whirs -9447737 whisper -9447853 whistle -94483 white -944836377 whiteness -944839 whitey -94485267 whitlams -94499 whizz -945 wil -9452378 wilbert -9452478 wilbirt -94526 wilco -9453 wild -9453356937 wildflower -94533569377 wildflowers -9453376377 wilderness -94535433 wildlife -9455 will -9455387 willets -9455426 william -94554267 williams -945543 willie -94559 willy -945597 willys -945766 wilson -946 who -946264 whoami -9463 wind wine zine -946369 window -9463697 windows -9463697263 windowpane -94636972637 windowpanes -9463697455 windowsill -94636974557 windowsills -9463744353 windshield -946387 windup -9464 wing -946433 winged -94647 wings -9465 wink -94653 whole -946543 winkie -94659 winky -9466 wino -946637 winner -946643 winnie -9466464 winning -946674 whoosh -9466743 whoopie -9466948 whoozit -9467 wimp -94673 whore -946737 whores -9467866 winston -946837 winter -9473 wipe wire wise -94735377 wireless -947366 wisdom -94737 wires -9474 wish -947437 wishes -947464 wiring -94779 zippy -948 xiv -94824 witch -9482437 witches -94837 wives -9484 with -94843729 withdraw -94843729464 withdrawing -948437295 withdrawl -948446 within -9484688 without -9486377 witness -949 why wiz -949273 wizard -9499 wizz -9596223 zkxoabd -96 yo -962 yob -9626 yobo -9629 yoaw -9632 yoda -9643 woid -9653 wolf -9653626 wolfman -9653726 wolfram -965638 zoloft -96624 zombi -966243 zombie -9662437 zombies -966247 zombis -96626 woman -966267 womans -9663 wood zone -9663288837 woodcutter -96632888377 woodcutters -966336 wooden -966337 wonder -96635263 woodland -96636 women -966367 womens -96637 woods -96637433 woodshed -966378683 woodstove -96639 woody -96639273 woodward -9665 wool -9666 zoom -9666464 zooming -96666 zooom -9673 word -96737 words -9675 work york -967523624 workbench -96753 world -967537 worker -9675377 workers -96757 works -9675867 worktop -9676 worm worn -9676684486 zornothium -9677447 worship -96774477377 worshippers -967845377 worthless -968 you zot -96853 would -96863 wound -96864 young -968647837 youngster -9687 your -96873 youre youse -96877 yours -96877353 yourself -96884 youth -96884385 youthful -972484 wraith -9724847 wraiths -9727 wrap -9729 xray -97297 xrays -97325 wreck -97325243 wreckage -9732533 wrecked -973257 wrecks -973624 wrench -97362437 wrenches -9737853 wrestle -97478 wrist -9747892824 wristwatch -97483 write -974837 writer -9748464 writing -974846462837425 writingmaterial -97484647 writings -974846482253 writingtable -9748464822537 writingtables -97664 wrong -97683 wrote -98 xv -98222 yucca -982227256 yuccapalm -9846 yugo -987 wus yup -98992 wuzza -99 xx xy zz -99464 xwing -998 xxv -99867 zztop -999 xxx -99999 xyzzy diff --git a/dists/slackware/scummvm.SlackBuild.in b/dists/slackware/scummvm.SlackBuild.in deleted file mode 100755 index 84ac94d7e9..0000000000 --- a/dists/slackware/scummvm.SlackBuild.in +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh -# ScummVM Slackware 9(.1) Package Creation Script -# by Jay Lanagan - roni@parodius.com - -CWD=`pwd` -if [ "$TMP" = "" ]; then - TMP=/tmp -fi -PKG=$TMP/package-scummvm - -VERSION=@VERSION@ -ARCH=i486 -BUILD=1 - -if [ ! -d $TMP ]; then - mkdir -p $TMP -fi -if [ ! -d $PKG ]; then - mkdir -p $PKG -fi - -cd $TMP -# tar xzvf scummvm-$VERSION.tgz -tar xzvf scummvm-$VERSION.tar.gz -# cd scummvm-$VERSION -cd scummvm -chown -R root.root . -CXXFLAGS="-O2 -march=i486 -mcpu=i686" \ -./configure -make -strip scummvm -chmod 755 scummvm -mkdir -p $PKG/usr/bin -cp scummvm $PKG/usr/bin -chown -R root:bin $PKG/usr/bin -gzip -9 dists/scummvm.6 -mkdir -p $PKG/usr/man/man6 -cp dists/scummvm.6.gz $PKG/usr/man/man6 -mkdir -p $PKG/usr/doc/scummvm-$VERSION -cp -a AUTHORS COPYING COPYRIGHT ChangeLog NEWS README TODO \ - $PKG/usr/doc/scummvm-$VERSION -chmod 644 $PKG/usr/doc/scummvm-$VERSION -mkdir -p $PKG/install -cat $CWD/slack-desc > $PKG/install/slack-desc -mkdir -p $PKG/usr/share/pixmaps -cp -a icons/scummvm.ico icons/scummvm.xpm \ - $PKG/usr/share/pixmaps -mkdir -p $PKG/usr/share/applications -cp -a dists/scummvm.desktop \ - $PKG/usr/share/applications - -cd $PKG -makepkg -l y -c n $TMP/scummvm-$VERSION-$ARCH-$BUILD.tgz - -if [ "$1" = "--cleanup" ]; then - rm -rf $TMP/scummvm-$VERSION - rm -rf $PKG -fi diff --git a/engines/agi/agi_v3.cpp b/engines/agi/agi_v3.cpp index 1e0baeaa81..69a8698ecb 100644 --- a/engines/agi/agi_v3.cpp +++ b/engines/agi/agi_v3.cpp @@ -52,14 +52,14 @@ int AgiLoader_v3::detectGame() { FSList fslist; FilesystemNode dir(ConfMan.get("path")); - if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) { - warning("AgiEngine: invalid game path '%s'", dir.path().c_str()); + if (!dir.getChildren(fslist, FilesystemNode::kListFilesOnly)) { + warning("AgiEngine: invalid game path '%s'", dir.getPath().c_str()); return errInvalidAGIFile; } for (FSList::const_iterator file = fslist.begin(); file != fslist.end() && !found; ++file) { - Common::String f = file->name(); + Common::String f = file->getName(); f.toLowercase(); if (f.hasSuffix("vol.0")) { diff --git a/engines/agi/detection.cpp b/engines/agi/detection.cpp index 29b5bb726a..1ab59c0806 100644 --- a/engines/agi/detection.cpp +++ b/engines/agi/detection.cpp @@ -1876,13 +1876,13 @@ Common::EncapsulatedADGameDesc fallbackDetector(const FSList *fslist) { // First grab all filenames and at the same time count the number of *.wag files for (FSList::const_iterator file = fslist->begin(); file != fslist->end(); ++file) { if (file->isDirectory()) continue; - Common::String filename = file->name(); + Common::String filename = file->getName(); filename.toLowercase(); allFiles[filename] = true; // Save the filename in a hash table if (filename.hasSuffix(".wag")) { // Save latest found *.wag file's path (Can be used to open the file, the name can't) - wagFilePath = file->path(); + wagFilePath = file->getPath(); wagFileCount++; // Count found *.wag files } } diff --git a/engines/agi/wagparser.cpp b/engines/agi/wagparser.cpp deleted file mode 100644 index bac4a34454..0000000000 --- a/engines/agi/wagparser.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "common/stdafx.h" - -#include "common/file.h" -#include "common/util.h" - -#include "agi/wagparser.h" - -namespace Agi { - -WagProperty::WagProperty() { - setDefaults(); -} - -WagProperty::~WagProperty() { - deleteData(); -} - -WagProperty::WagProperty(const WagProperty &other) { - deepCopy(other); -} - -WagProperty &WagProperty::operator=(const WagProperty &other) { - if (&other != this) deepCopy(other); // Don't do self-assignment - return *this; -} - -void WagProperty::deepCopy(const WagProperty &other) { - _readOk = other._readOk; - _propCode = other._propCode; - _propType = other._propType; - _propNum = other._propNum; - _propSize = other._propSize; - - deleteData(); // Delete old data (If any) and set _propData to NULL - if (other._propData != NULL) { - _propData = new char[other._propSize + 1UL]; // Allocate space for property's data plus trailing zero - memcpy(_propData, other._propData, other._propSize + 1UL); // Copy the whole thing - } -} - -bool WagProperty::read(Common::SeekableReadStream &stream) { - // First read the property's header - _propCode = (enum WagPropertyCode) stream.readByte(); - _propType = (enum WagPropertyType) stream.readByte(); - _propNum = stream.readByte(); - _propSize = stream.readUint16LE(); - - if (stream.ioFailed()) { // Check that we got the whole header - _readOk = false; - return _readOk; - } - - // Then read the property's data - deleteData(); // Delete old data (If any) - _propData = new char[_propSize + 1UL]; // Allocate space for property's data plus trailing zero - uint32 readBytes = stream.read(_propData, _propSize); // Read the data in - _propData[_propSize] = 0; // Set the trailing zero for easy C-style string access - - _readOk = (_propData != NULL && readBytes == _propSize); // Check that we got the whole data - return _readOk; -} - -void WagProperty::clear() { - deleteData(); - setDefaults(); -} - -void WagProperty::setDefaults() { - _readOk = false; - _propCode = PC_UNDEFINED; - _propType = PT_UNDEFINED; - _propNum = 0; - _propSize = 0; - _propData = NULL; -} - -void WagProperty::deleteData() { - if (_propData != NULL) { - delete _propData; - _propData = NULL; - } -} - -WagFileParser::WagFileParser() : - _parsedOk(false) { -} - -WagFileParser::~WagFileParser() { -} - -bool WagFileParser::checkAgiVersionProperty(const WagProperty &version) const { - if (version.getCode() == WagProperty::PC_INTVERSION && // Must be AGI interpreter version property - version.getSize() >= 3 && // Need at least three characters for a version number like "X.Y" - isdigit(version.getData()[0]) && // And the first character must be a digit - (version.getData()[1] == ',' || version.getData()[1] == '.')) { // And the second a comma or a period - - for (int i = 2; i < version.getSize(); i++) // And the rest must all be digits - if (!isdigit(version.getData()[i])) - return false; // Bail out if found a non-digit after the decimal point - - return true; - } else // Didn't pass the preliminary test so fails - return false; -} - -uint16 WagFileParser::convertToAgiVersionNumber(const WagProperty &version) { - // Examples of the conversion: "2.44" -> 0x2440, "2.917" -> 0x2917, "3.002086" -> 0x3086. - if (checkAgiVersionProperty(version)) { // Check that the string is a valid AGI interpreter version string - // Convert first ascii digit to an integer and put it in the fourth nibble (Bits 12...15) of the version number - // and at the same time set all other nibbles to zero. - uint16 agiVerNum = ((uint16) (version.getData()[0] - '0')) << (3 * 4); - - // Convert at most three least significant digits of the version number's minor part - // (i.e. the part after the decimal point) and put them in order to the third, second - // and the first nibble of the version number. Just to clarify version.getSize() - 2 - // is the number of digits after the decimal point. - int32 digitCount = MIN<int32>(3, ((int32) version.getSize()) - 2); // How many digits left to convert - for (int i = 0; i < digitCount; i++) - agiVerNum |= ((uint16) (version.getData()[version.getSize() - digitCount + i] - '0')) << ((2 - i) * 4); - - debug(3, "WagFileParser: Converted AGI version from string %s to number 0x%x", version.getData(), agiVerNum); - return agiVerNum; - } else // Not a valid AGI interpreter version string - return 0; // Can't convert, so failure -} - -bool WagFileParser::checkWagVersion(Common::SeekableReadStream &stream) { - if (stream.size() >= WINAGI_VERSION_LENGTH) { // Stream has space to contain the WinAGI version string - // Read the last WINAGI_VERSION_LENGTH bytes of the stream and make a string out of it - char str[WINAGI_VERSION_LENGTH+1]; // Allocate space for the trailing zero also - uint32 oldStreamPos = stream.pos(); // Save the old stream position - stream.seek(stream.size() - WINAGI_VERSION_LENGTH); - uint32 readBytes = stream.read(str, WINAGI_VERSION_LENGTH); - stream.seek(oldStreamPos); // Seek back to the old stream position - str[readBytes] = 0; // Set the trailing zero to finish the C-style string - if (readBytes != WINAGI_VERSION_LENGTH) { // Check that we got the whole version string - debug(3, "WagFileParser::checkWagVersion: Error reading WAG file version from stream"); - return false; - } - debug(3, "WagFileParser::checkWagVersion: Read WinAGI version string (\"%s\")", str); - - // Check that the WinAGI version string is one of the two version strings - // WinAGI 1.1.21 recognizes as acceptable in the end of a *.wag file. - // Note that they are all of length 16 and are padded with spaces to be that long. - return scumm_stricmp(str, "WINAGI v1.0 ") == 0 || - scumm_stricmp(str, "1.0 BETA ") == 0; - } else { // Stream is too small to contain the WinAGI version string - debug(3, "WagFileParser::checkWagVersion: Stream is too small to contain a valid WAG file"); - return false; - } -} - -bool WagFileParser::parse(const char *filename) { - Common::File file; - WagProperty property; // Temporary property used for reading - Common::MemoryReadStream *stream = NULL; // The file is to be read fully into memory and handled using this - - _parsedOk = false; // We haven't parsed the file yet - - if (file.open(filename)) { // Open the file - stream = file.readStream(file.size()); // Read the file into memory - if (stream != NULL && stream->size() == file.size()) { // Check that the whole file was read into memory - if (checkWagVersion(*stream)) { // Check that WinAGI version string is valid - // It seems we've got a valid *.wag file so let's parse its properties from the start. - stream->seek(0); // Rewind the stream - if (!_propList.empty()) _propList.clear(); // Clear out old properties (If any) - - do { // Parse the properties - if (property.read(*stream)) { // Read the property and check it was read ok - _propList.push_back(property); // Add read property to properties list - debug(4, "WagFileParser::parse: Read property with code %d, type %d, number %d, size %d, data \"%s\"", - property.getCode(), property.getType(), property.getNumber(), property.getSize(), property.getData()); - } else // Reading failed, let's bail out - break; - } while (!endOfProperties(*stream)); // Loop until the end of properties - - // File was parsed successfully only if we got to the end of properties - // and all the properties were read successfully (Also the last). - _parsedOk = endOfProperties(*stream) && property.readOk(); - - if (!_parsedOk) // Error parsing stream - warning("Error parsing WAG file (%s). WAG file ignored", filename); - } else // Invalid WinAGI version string or it couldn't be read - warning("Invalid WAG file (%s) version or error reading it. WAG file ignored", filename); - } else // Couldn't fully read file into memory - warning("Error reading WAG file (%s) into memory. WAG file ignored", filename); - } else // Couldn't open file - warning("Couldn't open WAG file (%s). WAG file ignored", filename); - - if (stream != NULL) delete stream; // If file was read into memory, deallocate that buffer - return _parsedOk; -} - -const WagProperty *WagFileParser::getProperty(const WagProperty::WagPropertyCode code) const { - for (PropertyList::const_iterator iter = _propList.begin(); iter != _propList.end(); iter++) - if (iter->getCode() == code) return iter; - return NULL; -} - -bool WagFileParser::endOfProperties(const Common::SeekableReadStream &stream) const { - return stream.pos() >= (stream.size() - WINAGI_VERSION_LENGTH); -} - -} // End of namespace Agi diff --git a/engines/agi/wagparser.h b/engines/agi/wagparser.h deleted file mode 100644 index 1fc554d522..0000000000 --- a/engines/agi/wagparser.h +++ /dev/null @@ -1,288 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -namespace Agi { - -/** - * WagProperty represents a single property from WinAGI's *.wag file. - * A property consists of a header and of data. - * The header consists of the following: - * - Property code (Integer/Enumeration, 1 byte) - * - Property type (Integer/Enumeration, 1 byte) - * - Property number (Integer, 1 byte) - * - Property size (Little endian integer, 2 bytes) - * And then there's the data with as many bytes as defined in the header's property size variable. - */ -class WagProperty { -// Constants, enumerations etc -public: - /** - * Property codes taken from WinAGI 1.1.21's source code file WinAGI/AGIObjects.bas. - */ - enum WagPropertyCode { - PC_GAMEDESC = 129, ///< Game description (WinAGI 1.1.21 limits these to 4096 bytes) - PC_GAMEAUTHOR, ///< Game author (WinAGI 1.1.21 limits these to 256 bytes) - PC_GAMEID, ///< Game ID - PC_INTVERSION, ///< Interpreter version (WinAGI 1.1.21 defaults to version 2.917) - PC_GAMELAST, ///< Last edit date - PC_GAMEVERSION, ///< Game version (WinAGI 1.1.21 limits these to 256 bytes) - PC_GAMEABOUT, ///< About game (WinAGI 1.1.21 limits these to 4096 bytes) - PC_GAMEEXEC, ///< Game executable - PC_RESDIR, ///< Resource directory name - PC_DEFSYNTAX, ///< Default syntax - PC_INVOBJDESC = 144, - PC_VOCABWORDDESC = 160, - PC_PALETTE = 172, - PC_USERESNAMES = 180, - PC_LOGIC = 192, - PC_PICTURE = 208, - PC_SOUND = 224, - PC_VIEW = 240, - PC_UNDEFINED = 0x100 ///< An undefined property code (Added for ScummVM). - }; - - /** - * Property types taken from WinAGI 1.1.21's source code file WinAGI/AGIObjects.bas. - * At the moment these aren't really at all needed by ScummVM. Just here if anyone decides to use them. - */ - enum WagPropertyType { - PT_ID, - PT_DESC, - PT_SYNTAX, - PT_CRC32, - PT_KEY, - PT_INST0, - PT_INST1, - PT_INST2, - PT_MUTE0, - PT_MUTE1, - PT_MUTE2, - PT_MUTE3, - PT_TPQN, - PT_ROOM, - PT_VIS0, - PT_VIS1, - PT_VIS2, - PT_VIS3, - PT_ALL = 0xff, - PT_UNDEFINED = 0x100 ///< An undefined property type (Added for ScummVM). - }; - -// Constructors, destructors, operators etc -public: - /** - * Creates an empty WagProperty object. - * No property header or property data in it. - */ - WagProperty(); - - /** - * Destructor. Releases allocated memory if any etc. The usual. - */ - ~WagProperty(); - - /** - * Copy constructor. Deep copies the variables. - */ - WagProperty(const WagProperty &other); - - /** - * Assignment operator. Deep copies the variables. - */ - WagProperty &operator=(const WagProperty &other); - -// Non-public helper methods -protected: - /** - * Sets the default values for member variables. - */ - void setDefaults(); - - /** - * Delete's the property's data from memory if we have it, otherwise does nothing. - */ - void deleteData(); - - /** - * Deep copies the parameter object to this object. - * @param other The object to be deep copied to this object. - */ - void deepCopy(const WagProperty &other); - -// Public methods that have side-effects -public: - /** - * Read in a property (Header and data). - * @return True if reading was a success, false otherwise. - */ - bool read(Common::SeekableReadStream &stream); - - /** - * Clears the property. - * After this the property is empty. No header or data. - */ - void clear(); - -// Public access functions -public: - /** - * Was the property read ok from the source stream? - */ - bool readOk() const { return _readOk; }; - - /** - * Return the property's code. - * @return The property's code if readOk(), PC_UNDEFINED otherwise. - */ - enum WagPropertyCode getCode() const { return _propCode; }; - - /** - * Return the property's type. - * @return The property's type if readOk(), PT_UNDEFINED otherwise. - */ - enum WagPropertyType getType() const { return _propType; }; - - /** - * Return the property's number. - * @return The property's number if readOk(), 0 otherwise. - */ - byte getNumber() const { return _propNum; }; - - /** - * Return the property's data's length. - * @return The property's data's length if readOk(), 0 otherwise. - */ - uint16 getSize() const { return _propSize; } - - /** - * Return property's data. Constant access version. - * Can be used as a C-style string (i.e. this is guaranteed to have a trailing zero). - * @return The property's data if readOk(), NULL otherwise. - */ - const char *getData() const { return _propData; }; - -// Member variables -protected: - bool _readOk; ///< Was the property read ok from the source stream? - enum WagPropertyCode _propCode; ///< Property code (Part of the property's header) - enum WagPropertyType _propType; ///< Property type (Part of the property's header) - byte _propNum; ///< Property number (Part of the property's header) - uint16 _propSize; ///< Property's size (Part of the property's header) - char *_propData; ///< The property's data (Plus a trailing zero for C-style string access) -}; - - -/** - * Class for parsing *.wag files created by WinAGI. - * Using this class you can get information about fanmade AGI games if they have provided a *.wag file with them. - */ -class WagFileParser { -// Constants, type definitions, enumerations etc. -public: - static const uint WINAGI_VERSION_LENGTH = 16; ///< WinAGI's version string's length (Always 16) - typedef Common::Array<WagProperty> PropertyList; ///< A type definition for an array of *.wag file properties - -public: - /** - * Constructor. Creates a WagFileParser object in a default state. - */ - WagFileParser(); - - /** - * Destructor. - */ - ~WagFileParser(); - - /** - * Loads a *.wag file and parses it. - * @note After this you can access the loaded properties using getProperty() and getProperties() etc. - * @param filename Name of the file to be parsed. - * @return True if parsed successfully, false otherwise. - */ - bool parse(const char *filename); - - /** - * Get list of the loaded properties. - * @note Use only after a call to parse() first. - * @return The list of loaded properties. - */ - const PropertyList &getProperties() const { return _propList; }; - - /** - * Get property with the given property code. - * @note Use only after a call to parse() first. - * @return Pointer to the property if its found in memory, NULL otherwise. - * - * TODO/FIXME: Handle cases where several properties with the given property code are found. - * At the moment we don't need this functionality because the properties we use - * for fallback detection probably don't have multiples in the WAG-file. - * TODO: Make this faster than linear time if desired/needed. - */ - const WagProperty *getProperty(const WagProperty::WagPropertyCode code) const; - - /** - * Tests if the given property contains a valid AGI interpreter version string. - * A valid AGI interpreter version string is of the form "X.Y" or "X,Y" where - * X is a single decimal digit and Y is a string of decimal digits (At least one digit). - * @param version The property to be tested. - * @return True if the given property contains a valid AGI interpreter version string, false otherwise. - */ - bool checkAgiVersionProperty(const WagProperty &version) const; - - /** - * Convert property's data to an AGI interpreter version number. - * @param version The property to be converted (Property code should be PC_INTVERSION). - * @return AGI interpreter version number if successful, 0 otherwise. - */ - uint16 convertToAgiVersionNumber(const WagProperty &version); - - /** - * Was the file parsed successfully? - * @return True if file was parsed successfully, false otherwise. - */ - bool parsedOk() const { return _parsedOk; }; - -protected: - /** - * Checks if stream has a valid WinAGI version string in its end. - * @param stream The stream to be checked. - * @return True if reading was successful and stream contains a valid WinAGI version string, false otherwise. - */ - bool checkWagVersion(Common::SeekableReadStream &stream); - - /** - * Checks if we're at or past the end of the properties stored in the stream. - * @param stream The stream whose seeking position is to be checked. - * @return True if stream's seeking position is at or past the end of the properties, false otherwise. - */ - bool endOfProperties(const Common::SeekableReadStream &stream) const; - -// Member variables -protected: - PropertyList _propList; ///< List of loaded properties from the file. - bool _parsedOk; ///< Did the parsing of the file go ok? -}; - -} // End of namespace Agi diff --git a/engines/agos/detection.cpp b/engines/agos/detection.cpp index f16224dacd..0f5aa2768a 100644 --- a/engines/agos/detection.cpp +++ b/engines/agos/detection.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/agos/detection.cpp $ + * $Id:detection.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/agos/detection_tables.h b/engines/agos/detection_tables.h index 6e499d2724..cb6123dc54 100644 --- a/engines/agos/detection_tables.h +++ b/engines/agos/detection_tables.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/agos/detection_tables.h $ + * $Id:detection_tables.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cine/sound.cpp b/engines/cine/sound.cpp index 4ba083a653..4746e87a66 100644 --- a/engines/cine/sound.cpp +++ b/engines/cine/sound.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cine/sound.cpp $ + * $Id:sound.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cine/sound.h b/engines/cine/sound.h index 719f37f151..4ebda2c236 100644 --- a/engines/cine/sound.h +++ b/engines/cine/sound.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cine/sound.h $ + * $Id:sound.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/actor.cpp b/engines/cruise/actor.cpp index 44b0c9c92d..dd38e15838 100644 --- a/engines/cruise/actor.cpp +++ b/engines/cruise/actor.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/actor.cpp $ + * $Id:actor.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/actor.h b/engines/cruise/actor.h index 43b9b03e87..072eef9581 100644 --- a/engines/cruise/actor.h +++ b/engines/cruise/actor.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/actor.h $ + * $Id:actor.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/background.cpp b/engines/cruise/background.cpp index c375b37b1b..ebf0b78934 100644 --- a/engines/cruise/background.cpp +++ b/engines/cruise/background.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/background.cpp $ + * $Id:background.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/background.h b/engines/cruise/background.h index d506d1663e..b8b9e623c6 100644 --- a/engines/cruise/background.h +++ b/engines/cruise/background.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/background.h $ + * $Id:background.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/backgroundIncrust.cpp b/engines/cruise/backgroundIncrust.cpp index 25713394d9..edaa68b490 100644 --- a/engines/cruise/backgroundIncrust.cpp +++ b/engines/cruise/backgroundIncrust.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/backgroundIncrust.cpp $ + * $Id:backgroundIncrust.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/backgroundIncrust.h b/engines/cruise/backgroundIncrust.h index 6de30978fd..3f61faadae 100644 --- a/engines/cruise/backgroundIncrust.h +++ b/engines/cruise/backgroundIncrust.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/backgroundIncrust.h $ + * $Id:backgroundIncrust.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/cell.cpp b/engines/cruise/cell.cpp index d4b5aaed66..8a7b524a7b 100644 --- a/engines/cruise/cell.cpp +++ b/engines/cruise/cell.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/cell.cpp $ + * $Id:cell.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/cell.h b/engines/cruise/cell.h index c10ab93541..ea2fb7e777 100644 --- a/engines/cruise/cell.h +++ b/engines/cruise/cell.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/cell.h $ + * $Id:cell.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/cruise.cpp b/engines/cruise/cruise.cpp index 9693fb7d03..b427498c6f 100644 --- a/engines/cruise/cruise.cpp +++ b/engines/cruise/cruise.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/cruise.cpp $ + * $Id:cruise.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/cruise.h b/engines/cruise/cruise.h index 73de46c599..cf768d8d57 100644 --- a/engines/cruise/cruise.h +++ b/engines/cruise/cruise.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/cruise.h $ + * $Id:cruise.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/cruise_main.cpp b/engines/cruise/cruise_main.cpp index bd6f341d24..79a699433f 100644 --- a/engines/cruise/cruise_main.cpp +++ b/engines/cruise/cruise_main.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/cruise_main.cpp $ + * $Id:cruise_main.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/cruise_main.h b/engines/cruise/cruise_main.h index c42650a007..324d99f024 100644 --- a/engines/cruise/cruise_main.h +++ b/engines/cruise/cruise_main.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/cruise_main.h $ + * $Id:cruise_main.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/ctp.cpp b/engines/cruise/ctp.cpp index 84e510a53f..07df6029b2 100644 --- a/engines/cruise/ctp.cpp +++ b/engines/cruise/ctp.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/ctp.cpp $ + * $Id:ctp.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/ctp.h b/engines/cruise/ctp.h index 2ea47ce62e..b35523a3a7 100644 --- a/engines/cruise/ctp.h +++ b/engines/cruise/ctp.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/ctp.h $ + * $Id:ctp.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/dataLoader.cpp b/engines/cruise/dataLoader.cpp index 54a0e97732..2212a3bde2 100644 --- a/engines/cruise/dataLoader.cpp +++ b/engines/cruise/dataLoader.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/dataLoader.cpp $ + * $Id:dataLoader.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/dataLoader.h b/engines/cruise/dataLoader.h index 46e4ef447f..6b6bf52cf6 100644 --- a/engines/cruise/dataLoader.h +++ b/engines/cruise/dataLoader.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/dataLoader.h $ + * $Id:dataLoader.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/decompiler.cpp b/engines/cruise/decompiler.cpp index 7adfd00f3e..68beab0846 100644 --- a/engines/cruise/decompiler.cpp +++ b/engines/cruise/decompiler.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/decompiler.cpp $ + * $Id:decompiler.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/delphine-unpack.cpp b/engines/cruise/delphine-unpack.cpp index b1cdc13148..db4188fbfe 100644 --- a/engines/cruise/delphine-unpack.cpp +++ b/engines/cruise/delphine-unpack.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/delphine-unpack.cpp $ + * $Id:delphine-unpack.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp index 2ca83f4046..fc1d864a56 100644 --- a/engines/cruise/detection.cpp +++ b/engines/cruise/detection.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/detection.cpp $ + * $Id:detection.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/font.cpp b/engines/cruise/font.cpp index c94bbc8f82..92064acc53 100644 --- a/engines/cruise/font.cpp +++ b/engines/cruise/font.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/font.cpp $ + * $Id:font.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/font.h b/engines/cruise/font.h index b74482962d..2a75cf28dd 100644 --- a/engines/cruise/font.h +++ b/engines/cruise/font.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/font.h $ + * $Id:font.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/fontCharacterTable.cpp b/engines/cruise/fontCharacterTable.cpp index 2c2dddc479..ce0bec0f0f 100644 --- a/engines/cruise/fontCharacterTable.cpp +++ b/engines/cruise/fontCharacterTable.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/fontCharacterTable.cpp $ + * $Id:fontCharacterTable.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/fontCharacterTable.h b/engines/cruise/fontCharacterTable.h index 0bfe78641a..f7956968ec 100644 --- a/engines/cruise/fontCharacterTable.h +++ b/engines/cruise/fontCharacterTable.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/fontCharacterTable.h $ + * $Id:fontCharacterTable.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/function.cpp b/engines/cruise/function.cpp index 7841a5e4ce..092425bfc7 100644 --- a/engines/cruise/function.cpp +++ b/engines/cruise/function.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/function.cpp $ + * $Id:function.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/function.h b/engines/cruise/function.h index 13eb21ea1f..76100e41ba 100644 --- a/engines/cruise/function.h +++ b/engines/cruise/function.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/function.h $ + * $Id:function.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/gfxModule.cpp b/engines/cruise/gfxModule.cpp index 881bf1d3ca..119f99739e 100644 --- a/engines/cruise/gfxModule.cpp +++ b/engines/cruise/gfxModule.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/gfxModule.cpp $ + * $Id:gfxModule.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/gfxModule.h b/engines/cruise/gfxModule.h index e63b26e29f..7339113f4c 100644 --- a/engines/cruise/gfxModule.h +++ b/engines/cruise/gfxModule.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/gfxModule.h $ + * $Id:gfxModule.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/linker.cpp b/engines/cruise/linker.cpp index 6cd28062d3..0057625e81 100644 --- a/engines/cruise/linker.cpp +++ b/engines/cruise/linker.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/linker.cpp $ + * $Id:linker.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/linker.h b/engines/cruise/linker.h index 808ace75e0..975ed0f322 100644 --- a/engines/cruise/linker.h +++ b/engines/cruise/linker.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/linker.h $ + * $Id:linker.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/mainDraw.cpp b/engines/cruise/mainDraw.cpp index 95142e9edf..3d409d0ba5 100644 --- a/engines/cruise/mainDraw.cpp +++ b/engines/cruise/mainDraw.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/mainDraw.cpp $ + * $Id:mainDraw.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/mainDraw.h b/engines/cruise/mainDraw.h index ad10bcddc6..7ff6ffdc8f 100644 --- a/engines/cruise/mainDraw.h +++ b/engines/cruise/mainDraw.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/mainDraw.h $ + * $Id:mainDraw.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/menu.cpp b/engines/cruise/menu.cpp index 2ea8c4ff8c..e30542cc1b 100644 --- a/engines/cruise/menu.cpp +++ b/engines/cruise/menu.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/menu.cpp $ + * $Id:menu.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/menu.h b/engines/cruise/menu.h index 4e15d15cf1..9a33545224 100644 --- a/engines/cruise/menu.h +++ b/engines/cruise/menu.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/menu.h $ + * $Id:menu.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/mouse.cpp b/engines/cruise/mouse.cpp index a918e0536f..c9cec8f72a 100644 --- a/engines/cruise/mouse.cpp +++ b/engines/cruise/mouse.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/mouse.cpp $ + * $Id:mouse.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/mouse.h b/engines/cruise/mouse.h index a6911ce27e..c7ef2a69c5 100644 --- a/engines/cruise/mouse.h +++ b/engines/cruise/mouse.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/mouse.h $ + * $Id:mouse.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/object.cpp b/engines/cruise/object.cpp index 22e81dea90..ce4de2a12b 100644 --- a/engines/cruise/object.cpp +++ b/engines/cruise/object.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/object.cpp $ + * $Id:object.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/object.h b/engines/cruise/object.h index 546d2bc440..feec666687 100644 --- a/engines/cruise/object.h +++ b/engines/cruise/object.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/object.h $ + * $Id:object.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/overlay.cpp b/engines/cruise/overlay.cpp index 2b83e0f2b2..c1b35f61f6 100644 --- a/engines/cruise/overlay.cpp +++ b/engines/cruise/overlay.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/overlay.cpp $ + * $Id:overlay.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/overlay.h b/engines/cruise/overlay.h index 5d2e4e890e..03db06fada 100644 --- a/engines/cruise/overlay.h +++ b/engines/cruise/overlay.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/overlay.h $ + * $Id:overlay.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/perso.cpp b/engines/cruise/perso.cpp index e0cd85f2fe..a95607a2f1 100644 --- a/engines/cruise/perso.cpp +++ b/engines/cruise/perso.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/perso.cpp $ + * $Id:perso.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/perso.h b/engines/cruise/perso.h index aa9f59a1a3..0d5676a4c8 100644 --- a/engines/cruise/perso.h +++ b/engines/cruise/perso.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/perso.h $ + * $Id:perso.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/polys.cpp b/engines/cruise/polys.cpp index a2eea8a9a7..83192b0dda 100644 --- a/engines/cruise/polys.cpp +++ b/engines/cruise/polys.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/polys.cpp $ + * $Id:polys.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/polys.h b/engines/cruise/polys.h index 53ce4672cd..b5da8dd241 100644 --- a/engines/cruise/polys.h +++ b/engines/cruise/polys.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/polys.h $ + * $Id:polys.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/saveload.cpp b/engines/cruise/saveload.cpp index b5ec064d4b..d6b2c9ec93 100644 --- a/engines/cruise/saveload.cpp +++ b/engines/cruise/saveload.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/saveload.cpp $ + * $Id:saveload.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/saveload.h b/engines/cruise/saveload.h index 5a719066c5..de97f24b64 100644 --- a/engines/cruise/saveload.h +++ b/engines/cruise/saveload.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/saveload.h $ + * $Id:saveload.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/script.cpp b/engines/cruise/script.cpp index d3d88a8b5f..dc1b12f736 100644 --- a/engines/cruise/script.cpp +++ b/engines/cruise/script.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/script.cpp $ + * $Id:script.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/script.h b/engines/cruise/script.h index e5d21b1ba0..ca7d812836 100644 --- a/engines/cruise/script.h +++ b/engines/cruise/script.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/script.h $ + * $Id:script.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/stack.cpp b/engines/cruise/stack.cpp index 1639ba3942..7622564503 100644 --- a/engines/cruise/stack.cpp +++ b/engines/cruise/stack.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/stack.cpp $ + * $Id:stack.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/stack.h b/engines/cruise/stack.h index 831c07e217..1adb3540cb 100644 --- a/engines/cruise/stack.h +++ b/engines/cruise/stack.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/stack.h $ + * $Id:stack.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/stringSupport.cpp b/engines/cruise/stringSupport.cpp index 791f203d9b..54747104ff 100644 --- a/engines/cruise/stringSupport.cpp +++ b/engines/cruise/stringSupport.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/stringSupport.cpp $ + * $Id:stringSupport.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/stringSupport.h b/engines/cruise/stringSupport.h index 841e2dd496..531fe56aca 100644 --- a/engines/cruise/stringSupport.h +++ b/engines/cruise/stringSupport.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/stringSupport.h $ + * $Id:stringSupport.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/various.cpp b/engines/cruise/various.cpp index 5c6134c374..e4c908af5f 100644 --- a/engines/cruise/various.cpp +++ b/engines/cruise/various.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/various.cpp $ + * $Id:various.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/various.h b/engines/cruise/various.h index fe18e5abd6..f6e07e00e7 100644 --- a/engines/cruise/various.h +++ b/engines/cruise/various.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/various.h $ + * $Id:various.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/vars.cpp b/engines/cruise/vars.cpp index 094680f0bb..1a3d5f0a27 100644 --- a/engines/cruise/vars.cpp +++ b/engines/cruise/vars.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/vars.cpp $ + * $Id:vars.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/vars.h b/engines/cruise/vars.h index dbace8bdf3..63a15f24e4 100644 --- a/engines/cruise/vars.h +++ b/engines/cruise/vars.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/vars.h $ + * $Id:vars.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/volume.cpp b/engines/cruise/volume.cpp index b32ffb0ccd..901ac4a7a5 100644 --- a/engines/cruise/volume.cpp +++ b/engines/cruise/volume.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/volume.cpp $ + * $Id:volume.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/cruise/volume.h b/engines/cruise/volume.h index 0f9e489236..7881f6c872 100644 --- a/engines/cruise/volume.h +++ b/engines/cruise/volume.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/cruise/volume.h $ + * $Id:volume.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/gob/init_v3.cpp b/engines/gob/init_v3.cpp index 61e7fb61d0..6f1af258ca 100644 --- a/engines/gob/init_v3.cpp +++ b/engines/gob/init_v3.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/gob/init_v3.cpp $ + * $Id:init_v3.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/kyra/detection.cpp b/engines/kyra/detection.cpp index 46bcc1e85f..e1b5a2b7c3 100644 --- a/engines/kyra/detection.cpp +++ b/engines/kyra/detection.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/kyra/detection.cpp $ + * $Id:detection.cpp 26949 2007-05-26 20:23:24Z david_corrales $ */ #include "kyra/kyra.h" diff --git a/engines/kyra/kyra_v1.cpp b/engines/kyra/kyra_v1.cpp index 3246e0f426..7fc13a6c38 100644 --- a/engines/kyra/kyra_v1.cpp +++ b/engines/kyra/kyra_v1.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/kyra/kyra_v1.cpp $ + * $Id:kyra_v1.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/kyra/kyra_v1.h b/engines/kyra/kyra_v1.h index 5afa248981..e103086dc4 100644 --- a/engines/kyra/kyra_v1.h +++ b/engines/kyra/kyra_v1.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/kyra/kyra_v1.h $ + * $Id:kyra_v1.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp index 03d1f8e27e..6857b3ac09 100644 --- a/engines/kyra/kyra_v2.cpp +++ b/engines/kyra/kyra_v2.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/kyra/kyra_v2.cpp $ + * $Id:kyra_v2.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/kyra/kyra_v2.h b/engines/kyra/kyra_v2.h index e3dac3f0d5..a002baec19 100644 --- a/engines/kyra/kyra_v2.h +++ b/engines/kyra/kyra_v2.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/kyra/kyra_v2.h $ + * $Id:kyra_v2.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/kyra/kyra_v3.cpp b/engines/kyra/kyra_v3.cpp index f035158892..eee901598e 100644 --- a/engines/kyra/kyra_v3.cpp +++ b/engines/kyra/kyra_v3.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/kyra/kyra_v3.cpp $ + * $Id:kyra_v3.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/kyra/kyra_v3.h b/engines/kyra/kyra_v3.h index 5616fcbf0e..eda382d89a 100644 --- a/engines/kyra/kyra_v3.h +++ b/engines/kyra/kyra_v3.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/kyra/kyra_v3.h $ + * $Id:kyra_v3.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/kyra/resource.cpp b/engines/kyra/resource.cpp index 7c15cee2f9..319845c22c 100644 --- a/engines/kyra/resource.cpp +++ b/engines/kyra/resource.cpp @@ -82,8 +82,8 @@ Resource::Resource(KyraEngine *vm) { FSList fslist; FilesystemNode dir(ConfMan.get("path")); - if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) - error("invalid game path '%s'", dir.path().c_str()); + if (!dir.getChildren(fslist, FilesystemNode::kListFilesOnly)) + error("invalid game path '%s'", dir.getPath().c_str()); if (_vm->game() == GI_KYRA1 && _vm->gameFlags().isTalkie) { static const char *list[] = { @@ -96,7 +96,7 @@ Resource::Resource(KyraEngine *vm) { Common::for_each(_pakfiles.begin(), _pakfiles.end(), Common::bind2nd(Common::mem_fun(&ResourceFile::protect), true)); } else { for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { - Common::String filename = file->name(); + Common::String filename = file->getName(); filename.toUppercase(); // No real PAK file! @@ -104,8 +104,8 @@ Resource::Resource(KyraEngine *vm) { continue; if (filename.hasSuffix("PAK") || filename.hasSuffix("APK")) { - if (!loadPakFile(file->name())) - error("couldn't open pakfile '%s'", file->name().c_str()); + if (!loadPakFile(file->getName())) + error("couldn't open pakfile '%s'", file->getName().c_str()); } } diff --git a/engines/lure/detection.cpp b/engines/lure/detection.cpp index b4a69bfd43..d072a009d5 100644 --- a/engines/lure/detection.cpp +++ b/engines/lure/detection.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/lure/detection.cpp $ + * $Id:detection.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/lure/fights.cpp b/engines/lure/fights.cpp deleted file mode 100644 index 4c478bbc17..0000000000 --- a/engines/lure/fights.cpp +++ /dev/null @@ -1,583 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2005-2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "lure/fights.h" -#include "lure/luredefs.h" -#include "lure/game.h" -#include "lure/res.h" -#include "lure/room.h" -#include "lure/sound.h" - -namespace Lure { - -// Three records containing initial states for player, pig, and Skorl -FighterRecord fighterList[3] = { - {0x23C, 0x440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0}, - {0, 0x441, 0x1092, 0, 3, 0, 0, 0, 0xB94, 8, 0xA34, 0x8D4, 0xD06, 0, - 0, 0, 0, 0, 0xDDC, PLAYER_ID}, - {0, 0x446, 0x1092, 0, 3, 0, 0, 0, 0xB94, 8, 0xA34, 0x8D4, 0xD06, 0, - 0, 0, 0, 0, 0xDDC, PLAYER_ID} -}; - -FightsManager *int_fights = NULL; - -FightsManager::FightsManager() { - int_fights = this; - _fightData = NULL; - _mouseFlags = 0; -} - -FightsManager::~FightsManager() { - if (_fightData != NULL) - // Release the fight data - delete _fightData; -} - -FightsManager &FightsManager::getReference() { - return *int_fights; -} - -FighterRecord &FightsManager::getDetails(uint16 hotspotId) { - if (hotspotId == PLAYER_ID) return fighterList[0]; - else if (hotspotId == PIG_ID) return fighterList[1]; - else if (hotspotId == SKORL_FIGHTER_ID) return fighterList[2]; - error("Unknown NPC %d attempted to fight", hotspotId); -} - -// Sets up the data for the pig fight in the cave - -void FightsManager::setupPigFight() { - Resources &res = Resources::getReference(); - Hotspot *player = res.getActiveHotspot(PLAYER_ID); - player->setSkipFlag(false); - player->resource()->colourOffset = 16; - player->setTickProc(PLAYER_FIGHT_TICK_PROC_ID); - player->setSize(48, 53); - player->setAnimation(PLAYER_FIGHT_ANIM_ID); - player->resource()->width = 48; - player->resource()->height = 53; - - player->setOccupied(false); - player->setPosition(262, 94); - FighterRecord &rec = getDetails(PLAYER_ID); - rec.fwhits = 0; - rec.fwtrue_x = 262; - rec.fwtrue_y = 53; - rec.fwseq_ad = FIGHT_PLAYER_INIT; - rec.fwenemy_ad = PIG_ID; -} - -void FightsManager::setupSkorlFight() { - Resources &res = Resources::getReference(); - Hotspot *player = res.getActiveHotspot(PLAYER_ID); - FighterRecord &rec = getDetails(PLAYER_ID); - - setupPigFight(); - - rec.fwenemy_ad = SKORL_FIGHTER_ID; - rec.fwweapon = 0x445; - rec.fwtrue_x = 282; - rec.fwtrue_y = 136; - player->setPosition(282, 136); - player->resource()->colourOffset = 96; -} - -bool FightsManager::isFighting() { - FighterRecord &rec = getDetails(PLAYER_ID); - return rec.fwhits == 0; -} - -void FightsManager::fightLoop() { - Resources &res = Resources::getReference(); - Events &events = Events::getReference(); - FighterRecord &playerFight = getDetails(PLAYER_ID); - - // Loop for the duration of the battle - while (!events.quitFlag && (playerFight.fwhits != GENERAL_MAGIC_ID)) { - checkEvents(); - - Game::getReference().tick(); - Room::getReference().update(); - res.delayList().tick(); - Screen::getReference().update(); - - g_system->delayMillis(20); - } -} - -void FightsManager::saveToStream(Common::WriteStream *stream) { - for (int fighterCtr = 0; fighterCtr < 3; ++fighterCtr) { - FighterRecord &rec = fighterList[fighterCtr]; - - stream->writeUint16LE(rec.fwseq_no); - stream->writeUint16LE(rec.fwseq_ad); - stream->writeUint16LE(rec.fwdist); - stream->writeUint16LE(rec.fwwalk_roll); - stream->writeUint16LE(rec.fwmove_number); - stream->writeUint16LE(rec.fwhits); - } -} - -void FightsManager::loadFromStream(Common::ReadStream *stream) { - for (int fighterCtr = 0; fighterCtr < 3; ++fighterCtr) { - FighterRecord &rec = fighterList[fighterCtr]; - - rec.fwseq_no = stream->readUint16LE(); - rec.fwseq_ad = stream->readUint16LE(); - rec.fwdist = stream->readUint16LE(); - rec.fwwalk_roll = stream->readUint16LE(); - rec.fwmove_number = stream->readUint16LE(); - rec.fwhits = stream->readUint16LE(); - } -} - -const CursorType moveList[] = {CURSOR_LEFT_ARROW, CURSOR_FIGHT_UPPER, - CURSOR_FIGHT_MIDDLE, CURSOR_FIGHT_LOWER, CURSOR_RIGHT_ARROW}; - -struct KeyMapping { - Common::KeyCode keycode; - uint8 moveNumber; -}; - -const KeyMapping keyList[] = { - {Common::KEYCODE_LEFT, 10}, {Common::KEYCODE_RIGHT, 14}, {Common::KEYCODE_7, 11}, {Common::KEYCODE_4, 12}, - {Common::KEYCODE_1, 13}, {Common::KEYCODE_9, 6}, {Common::KEYCODE_6, 7}, {Common::KEYCODE_3, 8}, {Common::KEYCODE_INVALID, 0}}; - -void FightsManager::checkEvents() { - Events &events = Events::getReference(); - if (!events.pollEvent()) return; - FighterRecord &rec = getDetails(PLAYER_ID); - Hotspot *player = Resources::getReference().getActiveHotspot(PLAYER_ID); - Mouse &mouse = Mouse::getReference(); - - int moveNumber = 0; - - if (events.type() == Common::EVENT_KEYDOWN) { - switch (events.event().kbd.keycode) { - case Common::KEYCODE_ESCAPE: - events.quitFlag = true; - break; - - default: - // Scan through the mapping list for a move for the keypress - const KeyMapping *keyPtr = &keyList[0]; - while ((keyPtr->keycode != Common::KEYCODE_INVALID) && - (keyPtr->keycode != events.event().kbd.keycode)) - ++keyPtr; - if (keyPtr->keycode != Common::KEYCODE_INVALID) - moveNumber = keyPtr->moveNumber; - } - } - - if (events.type() == Common::EVENT_MOUSEMOVE) { - Point mPos = events.event().mouse; - if (mPos.x < rec.fwtrue_x - 12) - mouse.setCursorNum(CURSOR_LEFT_ARROW); - else if (mPos.x > rec.fwtrue_x + player->width()) - mouse.setCursorNum(CURSOR_RIGHT_ARROW); - else if (mPos.y < player->y() + 4) - mouse.setCursorNum(CURSOR_FIGHT_UPPER); - else if (mPos.y < player->y() + 38) - mouse.setCursorNum(CURSOR_FIGHT_MIDDLE); - else - mouse.setCursorNum(CURSOR_FIGHT_LOWER); - } - - if ((events.type() == Common::EVENT_LBUTTONDOWN) || - (events.type() == Common::EVENT_RBUTTONDOWN) || - (events.type() == Common::EVENT_LBUTTONUP) || - (events.type() == Common::EVENT_RBUTTONUP)) { - _mouseFlags = 0; - if (events.type() == Common::EVENT_LBUTTONDOWN) ++_mouseFlags; - if (events.type() == Common::EVENT_RBUTTONDOWN) _mouseFlags += 2; - } - - // Get the correct base index for the move - while ((moveNumber < 5) && (moveList[moveNumber] != mouse.getCursorNum())) - ++moveNumber; - if (moveNumber < 5) { - if (_mouseFlags == 1) - // Left mouse - moveNumber += 10; - else if (_mouseFlags == 2) - // Right mouse - moveNumber += 5; - } - - rec.fwmove_number = moveNumber; - - if (rec.fwmove_number >= 5) - debugC(ERROR_INTERMEDIATE, kLureDebugFights, - "Player fight move number=%d", rec.fwmove_number); -} - -void FightsManager::fighterAnimHandler(Hotspot &h) { - FighterRecord &fighter = getDetails(h.hotspotId()); - FighterRecord &opponent = getDetails(fighter.fwenemy_ad); - FighterRecord &player = getDetails(PLAYER_ID); - - fetchFighterDistance(fighter, opponent); - - if (fighter.fwseq_ad) { - fightHandler(h, fighter.fwseq_ad); - return; - } - - uint16 seqNum = 0; - if (fighter.fwdist != FIGHT_DISTANCE) { - seqNum = getFighterMove(fighter, fighter.fwnot_near); - } else { - uint16 offset = (fighter.fwhits * fighter.fwdef_len) + fighter.fwdefend_adds + 4; - - // Scan for the given sequence - uint16 v = getWord(offset); - while ((v != 0) && (v != player.fwseq_no)) { - offset += 4; - v = getWord(offset); - } - - if (v == 0) { - // No sequence match found - seqNum = getFighterMove(fighter, fighter.fwattack_table); - } else { - v = getWord(offset + 2); - seqNum = getFighterMove(fighter, fighter.fwdefend_table); - - if (seqNum == 0) - seqNum = getFighterMove(fighter, fighter.fwattack_table); - else if (seqNum == 0xff) - seqNum = v; - } - } - - // Set the sequence and pass onto the fight handler - fighter.fwseq_no = seqNum; - fighter.fwseq_ad = getWord(FIGHT_TBL_1 + (seqNum << 1)); -} - -void FightsManager::playerAnimHandler(Hotspot &h) { - FighterRecord &fighter = getDetails(h.hotspotId()); - fightHandler(h, fighter.fwseq_ad); -} - -void FightsManager::fightHandler(Hotspot &h, uint16 moveOffset) { - Resources &res = Resources::getReference(); - FighterRecord &fighter = getDetails(h.hotspotId()); - FighterRecord &opponent = getDetails(fighter.fwenemy_ad); - - uint16 v1, v2; - bool breakFlag = false; - - while (!breakFlag) { - if (moveOffset == 0) { - // Player is doing nothing, so check the move number - moveOffset = getWord(FIGHT_PLAYER_MOVE_TABLE + (fighter.fwmove_number << 1)); - - debugC(ERROR_DETAILED, kLureDebugFights, - "Hotspot %xh fight move=%d, new offset=%xh", - h.hotspotId(), fighter.fwmove_number, moveOffset); - - if (moveOffset == 0) - return; - - fighter.fwseq_no = fighter.fwmove_number; - fighter.fwseq_ad = moveOffset; - } - - uint16 moveValue = getWord(moveOffset); - debugC(ERROR_DETAILED, kLureDebugFights, - "Hotspot %xh script offset=%xh value=%xh", - h.hotspotId(), moveOffset, moveValue); - moveOffset += sizeof(uint16); - - if ((moveValue & 0x8000) == 0) { - // Set frame to specified number - h.setFrameNumber(moveValue); - - // Set the new fighter position - int16 newX, newY; - newX = h.x() + (int16)getWord(moveOffset); - if (newX < 32) newX = 32; - if (newX > 240) newX = 240; - newY = h.y() + (int16)getWord(moveOffset + 2); - h.setPosition(newX, newY); - - if (fighter.fwweapon != 0) { - Hotspot *weaponHotspot = res.getActiveHotspot(fighter.fwweapon); - assert(weaponHotspot); - weaponHotspot->setFrameNumber(getWord(moveOffset + 4)); - weaponHotspot->setPosition(weaponHotspot->x() + - (int16)getWord(moveOffset + 6), - weaponHotspot->y() + getWord(moveOffset + 8)); - } - - moveOffset += 5 * sizeof(uint16); - fighter.fwseq_ad = moveOffset; - return; - } - - switch (moveValue) - { - case 0xFFFA: - // Walk left - if ((fighter.fwmove_number == 5) || (fighter.fwmove_number == 10)) { - if (h.x() < 32) { - breakFlag = true; - } else { - h.setPosition(h.x() - 4, h.y()); - fighter.fwtrue_x = h.x(); - if (fetchFighterDistance(fighter, opponent) < FIGHT_DISTANCE) { - h.setPosition(h.x() + 4, h.y()); - fighter.fwtrue_x += 4; - breakFlag = true; - } else { - removeWeapon(fighter.fwweapon); - fighter.fwtrue_x = h.x(); - fighter.fwtrue_y = h.y(); - - uint16 frameNum = (fighter.fwwalk_roll == 7) ? 0 : - fighter.fwwalk_roll + 1; - fighter.fwwalk_roll = frameNum; - fighter.fwseq_ad = moveOffset; - h.setFrameNumber(frameNum); - return; - } - } - } else { - // Signal to start a new action - moveOffset = 0; - } - break; - - case 0xFFF9: - // Walk right - if ((fighter.fwmove_number == 9) || (fighter.fwmove_number == 14)) { - if (h.x() >= 240) { - breakFlag = true; - } else { - removeWeapon(fighter.fwweapon); - h.setPosition(h.x() + 4, h.y()); - fighter.fwtrue_x = h.x(); - fighter.fwtrue_y = h.y(); - - fighter.fwwalk_roll = (fighter.fwwalk_roll == 0) ? 7 : - fighter.fwwalk_roll - 1; - fighter.fwseq_ad = moveOffset; - h.setFrameNumber(fighter.fwwalk_roll); - return; - } - - } else { - // Signal to start a new action - moveOffset = 0; - } - break; - - case 0xFFEB: - // Enemy right - removeWeapon(fighter.fwweapon); - h.setPosition(h.x() + 4, h.y()); - fighter.fwtrue_x = h.x(); - - if (fetchFighterDistance(fighter, opponent) < FIGHT_DISTANCE) { - h.setPosition(h.x() - 4, h.y()); - fighter.fwtrue_x -= 4; - fighter.fwseq_ad = 0; - h.setFrameNumber(8); - } else { - h.setFrameNumber(getWord(moveOffset)); - moveOffset += sizeof(uint16); - fighter.fwseq_ad = moveOffset; - } - return; - - case 0xFFFB: - // End of sequence - breakFlag = true; - break; - - case 0xFFF8: - // Set fight address - moveOffset = getWord(moveOffset); - break; - - case 0xFFFF: - case 0xFFFE: - if (moveValue == 0xffff) - // Set the animation record - h.setAnimation(getWord(moveOffset)); - else - // New set animation record - h.setAnimation(getWord(fighter.fwheader_list + (getWord(moveOffset) << 1))); - h.setFrameNumber(0); - moveOffset += sizeof(uint16); - break; - - case 0xFFF7: - // On hold - if (getWord(moveOffset) == fighter.fwmove_number) - moveOffset = getWord(moveOffset + 2); - else - moveOffset += 2 * sizeof(uint16); - break; - - case 0xFFF6: - // Not hold - if (getWord(moveOffset) == fighter.fwmove_number) - moveOffset += 2 * sizeof(uint16); - else - moveOffset = getWord(moveOffset + 2); - break; - - case 0xFFF4: - // End sequence - fighter.fwseq_no = 0; - break; - - case 0xFFF2: - // Set defend - fighter.fwblocking = getWord(moveOffset); - moveOffset += sizeof(uint16); - break; - - case 0xFFF1: - // If blocking - v1 = getWord(moveOffset); - v2 = getWord(moveOffset + 2); - moveOffset += 2 * sizeof(uint16); - - if (v1 == opponent.fwblocking) { - Sound.playSound(42); - moveOffset = v2; - } - break; - - case 0xFFF0: - // Check hit - v1 = getWord(moveOffset); - moveOffset += sizeof(uint16); - if (fighter.fwdist <= FIGHT_DISTANCE) { - if (h.hotspotId() == PLAYER_ID) { - // Player hits opponent - Sound.playSound(52); - - if (opponent.fwhits != 5) { - opponent.fwseq_ad = v1; - if (++opponent.fwhit_value != opponent.fwhit_rate) { - opponent.fwhit_value = 0; - if (++opponent.fwhits == 5) - opponent.fwseq_ad = opponent.fwdie_seq; - } - } - } else { - // Opponent hit player - Sound.playSound(37); - opponent.fwseq_ad = v1; - if (++opponent.fwhits == 10) { - // Player has been killed - fighter.fwhits = 10; - opponent.fwseq_ad = FIGHT_PLAYER_DIES; - Sound.playSound(36); - } - } - } - break; - - case 0xFFEF: - // Save co-ordinates - fighter.fwtrue_x = h.x(); - fighter.fwtrue_y = h.y(); - break; - - case 0xFFEE: - // Restore co-ordinates - h.setPosition(fighter.fwtrue_x, fighter.fwtrue_y); - break; - - case 0xFFED: - // End of game - getDetails(PLAYER_ID).fwhits = GENERAL_MAGIC_ID; - Game::getReference().setState(GS_RESTORE_RESTART); - return; - - case 0xFFEC: - // Enemy has been killed - enemyKilled(); - break; - - case 0xFFEA: - // Fight sound - Sound.playSound(getWord(moveOffset)); - moveOffset += sizeof(uint16); - break; - - default: - error("Unknown fight command %xh", moveValue); - } - } - - fighter.fwseq_no = 0; - fighter.fwseq_ad = 0; - if (h.hotspotId() == PLAYER_ID) - _mouseFlags = 0; -} - -uint16 FightsManager::fetchFighterDistance(FighterRecord &f1, FighterRecord &f2) { - f1.fwdist = ABS(f1.fwtrue_x - f2.fwtrue_x) & 0xFFF8; - return f1.fwdist; -} - -void FightsManager::enemyKilled() { - Resources &res = Resources::getReference(); - Hotspot *playerHotspot = res.getActiveHotspot(PLAYER_ID); - FighterRecord &playerRec = getDetails(PLAYER_ID); - - playerHotspot->setTickProc(PLAYER_TICK_PROC_ID); - playerRec.fwhits = GENERAL_MAGIC_ID; - playerHotspot->resource()->colourOffset = 128; - playerHotspot->setSize(32, 48); - playerHotspot->resource()->width = 32; - playerHotspot->resource()->height = 48; - playerHotspot->setAnimation(PLAYER_ANIM_ID); - playerHotspot->setPosition(playerHotspot->x(), playerHotspot->y() + 5); - playerHotspot->setDirection(LEFT); - - if (playerHotspot->roomNumber() == 6) { - Dialog::show(0xc9f); - HotspotData *axeHotspot = res.getHotspot(0x2738); - axeHotspot->roomNumber = PLAYER_ID; - axeHotspot->flags |= HOTSPOTFLAG_FOUND; - } -} - -// Makes sure the given weapon is off-screen -void FightsManager::removeWeapon(uint16 weaponId) { - Hotspot *weaponHotspot = Resources::getReference().getActiveHotspot(weaponId); - weaponHotspot->setPosition(-32, -32); -} - -uint16 FightsManager::getFighterMove(FighterRecord &rec, uint16 baseOffset) { - int actionIndex = _rnd.getRandomNumber(31); - return getByte(baseOffset + (rec.fwhits << 5) + actionIndex); -} - -} // end of namespace Lure diff --git a/engines/lure/fights.h b/engines/lure/fights.h deleted file mode 100644 index 048949f2b6..0000000000 --- a/engines/lure/fights.h +++ /dev/null @@ -1,111 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2005-2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef LURE_FIGHT_H -#define LURE_FIGHT_H - -#include "lure/luredefs.h" -#include "lure/hotspots.h" -#include "lure/palette.h" -#include "common/singleton.h" -#include "common/endian.h" - -namespace Lure { - -struct FighterRecord { - uint16 fwheader_list; - uint16 fwweapon; - uint16 fwdie_seq; - uint16 fwhit_value; - uint16 fwhit_rate; - int16 fwtrue_x; - int16 fwtrue_y; - uint16 fwblocking; - uint16 fwattack_table; - uint16 fwdef_len; - uint16 fwdefend_table; - uint16 fwnot_near; - uint16 fwdefend_adds; - uint16 fwseq_no; - uint16 fwdist; - uint16 fwwalk_roll; - uint16 fwmove_number; - uint16 fwhits; - uint16 fwseq_ad; - uint16 fwenemy_ad; -}; - -// Constant references into the fight data -#define FIGHT_TBL_1 0x8b8 -#define FIGHT_PLAYER_MOVE_TABLE 0xDAA -#define FIGHT_PLAYER_INIT 0xDC8 -#define FIGHT_PLAYER_DIES 0xF46 - -#define FIGHT_DISTANCE 32 - -class FightsManager { -private: - MemoryBlock *_fightData; - Common::RandomSource _rnd; - uint8 _mouseFlags; - - FighterRecord &getDetails(uint16 hotspotId); - uint16 fetchFighterDistance(FighterRecord &f1, FighterRecord &f2); - void removeWeapon(uint16 weaponId); - void enemyKilled(); - uint16 getFighterMove(FighterRecord &rec, uint16 baseOffset); - void checkEvents(); - void fightHandler(Hotspot &h, uint16 moveOffset); - - inline uint16 getWord(uint16 offset) { - if (!_fightData) - _fightData = Disk::getReference().getEntry(FIGHT_DATA_RESOURCE_ID); - if (offset >= _fightData->size() - 1) error("Invalid fight data index"); - return READ_LE_UINT16(_fightData->data() + offset); - } - inline uint8 getByte(uint16 offset) { - if (!_fightData) - _fightData = Disk::getReference().getEntry(FIGHT_DATA_RESOURCE_ID); - if (offset >= _fightData->size()) error("Invalid fight data index"); - return _fightData->data()[offset]; - } -public: - FightsManager(); - ~FightsManager(); - static FightsManager &getReference(); - - void setupPigFight(); - void setupSkorlFight(); - bool isFighting(); - void fightLoop(); - void saveToStream(Common::WriteStream *stream); - void loadFromStream(Common::ReadStream *stream); - - void fighterAnimHandler(Hotspot &h); - void playerAnimHandler(Hotspot &h); -}; - -#define Fights FightsManager::getReference() - -} // End of namespace Lure - -#endif diff --git a/engines/lure/sound.cpp b/engines/lure/sound.cpp deleted file mode 100644 index 6961e4c7cc..0000000000 --- a/engines/lure/sound.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2005-2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#include "lure/sound.h" - -DECLARE_SINGLETON(Lure::SoundManager); - -namespace Lure { - -void SoundManager::killSounds() { - -} - -void SoundManager::playSound(uint16 soundId) { - -} - -} // end of namespace Lure diff --git a/engines/lure/sound.h b/engines/lure/sound.h deleted file mode 100644 index 4a7422d77f..0000000000 --- a/engines/lure/sound.h +++ /dev/null @@ -1,41 +0,0 @@ -/* ScummVM - Scumm Interpreter - * Copyright (C) 2005-2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -#ifndef LURE_SOUND_H -#define LURE_SOUND_H - -#include "lure/luredefs.h" -#include "common/singleton.h" - -namespace Lure { - -class SoundManager: public Common::Singleton<SoundManager> { -public: - static void killSounds(); - static void playSound(uint16 soundId); -}; - -} // End of namespace Lure - -#define Sound (::Lure::SoundManager::instance()) - -#endif diff --git a/engines/parallaction/font.cpp b/engines/parallaction/font.cpp index 3bc7835888..56c26b7b4f 100644 --- a/engines/parallaction/font.cpp +++ b/engines/parallaction/font.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/parallaction/font.cpp $ + * $Id:font.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/parallaction/sound.cpp b/engines/parallaction/sound.cpp index 9976ec13a8..13b989e202 100644 --- a/engines/parallaction/sound.cpp +++ b/engines/parallaction/sound.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/parallaction/sound.cpp $ + * $Id:sound.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/parallaction/sound.h b/engines/parallaction/sound.h index 920a804226..f244bd4070 100644 --- a/engines/parallaction/sound.h +++ b/engines/parallaction/sound.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/parallaction/sound.h $ + * $Id:sound.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp index bbb186d0ae..c1e909ffdb 100644 --- a/engines/queen/queen.cpp +++ b/engines/queen/queen.cpp @@ -73,7 +73,7 @@ GameList Engine_QUEEN_detectGames(const FSList &fslist) { if (file->isDirectory()) { continue; } - if (file->name().equalsIgnoreCase("queen.1") || file->name().equalsIgnoreCase("queen.1c")) { + if (file->getName().equalsIgnoreCase("queen.1") || file->getName().equalsIgnoreCase("queen.1c")) { Common::File dataFile; if (!dataFile.open(*file)) { continue; diff --git a/engines/saga/detection.cpp b/engines/saga/detection.cpp index 2096ca9af1..9b9a0ca872 100644 --- a/engines/saga/detection.cpp +++ b/engines/saga/detection.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/saga/detection.cpp $ + * $Id:detection.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/saga/detection_tables.h b/engines/saga/detection_tables.h index 8cef19d37f..631a1a4e83 100644 --- a/engines/saga/detection_tables.h +++ b/engines/saga/detection_tables.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/saga/detection_tables.h $ + * $Id:detection_tables.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/saga/displayinfo.h b/engines/saga/displayinfo.h index 3e1845abba..83bc536959 100644 --- a/engines/saga/displayinfo.h +++ b/engines/saga/displayinfo.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/saga/displayinfo.h $ + * $Id:displayinfo.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/scumm/detection.cpp b/engines/scumm/detection.cpp index 2d260a9908..8624f80fe7 100644 --- a/engines/scumm/detection.cpp +++ b/engines/scumm/detection.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/scumm/detection.cpp $ + * $Id:detection.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ @@ -194,7 +194,7 @@ static bool testGame(const GameSettings *g, const DescMap &fileMD5Map, const Com // the first match is used. static bool searchFSNode(const FSList &fslist, const Common::String &name, FilesystemNode &result) { for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { - if (!scumm_stricmp(file->name().c_str(), name.c_str())) { + if (!scumm_stricmp(file->getName().c_str(), name.c_str())) { result = *file; return true; } @@ -220,7 +220,7 @@ static Common::Language detectLanguage(const FSList &fslist, byte id) { FSList tmpList; if (searchFSNode(fslist, "RESOURCE", resDir) && resDir.isDirectory() - && resDir.listDir(tmpList, FilesystemNode::kListFilesOnly) + && resDir.getChildren(tmpList, FilesystemNode::kListFilesOnly) && searchFSNode(tmpList, filename, langFile)) { tmp.open(langFile); } @@ -317,7 +317,7 @@ static void detectGames(const FSList &fslist, Common::List<DetectorResult> &resu DetectorDesc d; d.node = *file; d.md5Entry = 0; - fileMD5Map[file->name()] = d; + fileMD5Map[file->getName()] = d; } } @@ -444,7 +444,7 @@ static bool testGame(const GameSettings *g, const DescMap &fileMD5Map, const Com Common::File tmp; if (!tmp.open(d.node)) { - warning("SCUMM detectGames: failed to open '%s' for read access", d.node.path().c_str()); + warning("SCUMM detectGames: failed to open '%s' for read access", d.node.getPath().c_str()); return false; } @@ -748,7 +748,7 @@ PluginError Engine_SCUMM_create(OSystem *syst, Engine **engine) { // Fetch the list of files in the current directory FSList fslist; FilesystemNode dir(ConfMan.get("path")); - if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) { + if (!dir.getChildren(fslist, FilesystemNode::kListFilesOnly)) { return kInvalidPathError; } diff --git a/engines/scumm/detection.h b/engines/scumm/detection.h index bc67aafb7e..d0fefe3a29 100644 --- a/engines/scumm/detection.h +++ b/engines/scumm/detection.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/scumm/detection.h $ + * $Id:detection.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/scumm/detection_tables.h b/engines/scumm/detection_tables.h index 0c72951fb2..246126611e 100644 --- a/engines/scumm/detection_tables.h +++ b/engines/scumm/detection_tables.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/scumm/detection_tables.h $ + * $Id:detection_tables.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/engines/sky/sky.cpp b/engines/sky/sky.cpp index 79c1f0cb7d..1ff23dbd07 100644 --- a/engines/sky/sky.cpp +++ b/engines/sky/sky.cpp @@ -124,11 +124,11 @@ GameList Engine_SKY_detectGames(const FSList &fslist) { // Iterate over all files in the given directory for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { if (!file->isDirectory()) { - const char *fileName = file->name().c_str(); + const char *fileName = file->getName().c_str(); if (0 == scumm_stricmp("sky.dsk", fileName)) { Common::File dataDisk; - if (dataDisk.open(file->path())) { + if (dataDisk.open(file->getPath())) { hasSkyDsk = true; dataDiskSize = dataDisk.size(); } @@ -136,7 +136,7 @@ GameList Engine_SKY_detectGames(const FSList &fslist) { if (0 == scumm_stricmp("sky.dnr", fileName)) { Common::File dinner; - if (dinner.open(file->path())) { + if (dinner.open(file->getPath())) { hasSkyDnr = true; dinnerTableEntries = dinner.readUint32LE(); } diff --git a/engines/sword1/sword1.cpp b/engines/sword1/sword1.cpp index 3c8abd0953..d899d25df5 100644 --- a/engines/sword1/sword1.cpp +++ b/engines/sword1/sword1.cpp @@ -107,15 +107,15 @@ GameDescriptor Engine_SWORD1_findGameID(const char *gameid) { void Sword1CheckDirectory(const FSList &fslist, bool *filesFound) { for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { if (!file->isDirectory()) { - const char *fileName = file->name().c_str(); + const char *fileName = file->getName().c_str(); for (int cnt = 0; cnt < NUM_FILES_TO_CHECK; cnt++) if (scumm_stricmp(fileName, g_filesToCheck[cnt]) == 0) filesFound[cnt] = true; } else { for (int cnt = 0; cnt < ARRAYSIZE(g_dirNames); cnt++) - if (scumm_stricmp(file->name().c_str(), g_dirNames[cnt]) == 0) { + if (scumm_stricmp(file->getName().c_str(), g_dirNames[cnt]) == 0) { FSList fslist2; - if (file->listDir(fslist2, FilesystemNode::kListFilesOnly)) + if (file->getChildren(fslist2, FilesystemNode::kListFilesOnly)) Sword1CheckDirectory(fslist2, filesFound); } } diff --git a/engines/sword2/sword2.cpp b/engines/sword2/sword2.cpp index 8bf3467b86..6bbd58ff3c 100644 --- a/engines/sword2/sword2.cpp +++ b/engines/sword2/sword2.cpp @@ -101,7 +101,7 @@ GameList Engine_SWORD2_detectGames(const FSList &fslist) { // Iterate over all files in the given directory for (file = fslist.begin(); file != fslist.end(); ++file) { if (!file->isDirectory()) { - const char *fileName = file->name().c_str(); + const char *fileName = file->getName().c_str(); if (0 == scumm_stricmp(g->detectname, fileName)) { // Match found, add to list of candidates, then abort inner loop. @@ -118,11 +118,11 @@ GameList Engine_SWORD2_detectGames(const FSList &fslist) { // present e.g. if the user copied the data straight from CD. for (file = fslist.begin(); file != fslist.end(); ++file) { if (file->isDirectory()) { - const char *fileName = file->name().c_str(); + const char *fileName = file->getName().c_str(); if (0 == scumm_stricmp("clusters", fileName)) { FSList recList; - if (file->listDir(recList, FilesystemNode::kListAll)) { + if (file->getChildren(recList, FilesystemNode::kListAll)) { GameList recGames(Engine_SWORD2_detectGames(recList)); if (!recGames.empty()) { detectedGames.push_back(recGames); @@ -144,7 +144,7 @@ PluginError Engine_SWORD2_create(OSystem *syst, Engine **engine) { FSList fslist; FilesystemNode dir(ConfMan.get("path")); - if (!dir.listDir(fslist, FilesystemNode::kListAll)) { + if (!dir.getChildren(fslist, FilesystemNode::kListAll)) { return kInvalidPathError; } diff --git a/engines/touche/detection.cpp b/engines/touche/detection.cpp index 8e8de71e9c..2860d832dd 100644 --- a/engines/touche/detection.cpp +++ b/engines/touche/detection.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/engines/touche/detection.cpp $ + * $Id:detection.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/graphics/iff.cpp b/graphics/iff.cpp index ac51531eee..f9f324b1d5 100644 --- a/graphics/iff.cpp +++ b/graphics/iff.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/graphics/iff.cpp $ + * $Id:iff.cpp 26949 2007-05-26 20:23:24Z david_corrales $ */ #include "graphics/iff.h" diff --git a/graphics/iff.h b/graphics/iff.h index 148a145a1d..50877dbd6f 100644 --- a/graphics/iff.h +++ b/graphics/iff.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/graphics/iff.h $ + * $Id:iff.h 26949 2007-05-26 20:23:24Z david_corrales $ */ diff --git a/gui/browser.cpp b/gui/browser.cpp index b0367fa1dc..ebe4aef0c4 100644 --- a/gui/browser.cpp +++ b/gui/browser.cpp @@ -28,7 +28,6 @@ #include "gui/ListWidget.h" #include "common/config-manager.h" -#include "common/fs.h" #include "common/system.h" #include "common/algorithm.h" @@ -223,15 +222,15 @@ void BrowserDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data void BrowserDialog::updateListing() { // Update the path display - _currentPath->setLabel(_node.path()); + _currentPath->setLabel(_node.getPath()); // We memorize the last visited path. - ConfMan.set("browser_lastpath", _node.path()); + ConfMan.set("browser_lastpath", _node.getPath()); // Read in the data from the file system FilesystemNode::ListMode listMode = _isDirBrowser ? FilesystemNode::kListDirectoriesOnly : FilesystemNode::kListAll; - if (!_node.listDir(_nodeContent, listMode)) { + if (!_node.getChildren(_nodeContent, listMode)) { _nodeContent.clear(); } else { Common::sort(_nodeContent.begin(), _nodeContent.end()); @@ -241,9 +240,9 @@ void BrowserDialog::updateListing() { Common::StringList list; for (FSList::iterator i = _nodeContent.begin(); i != _nodeContent.end(); ++i) { if (!_isDirBrowser && i->isDirectory()) - list.push_back(i->displayName() + "/"); + list.push_back(i->getDisplayName() + "/"); else - list.push_back(i->displayName()); + list.push_back(i->getDisplayName()); } _fileList->setList(list); _fileList->scrollTo(0); diff --git a/gui/launcher.cpp b/gui/launcher.cpp index 705665dc2a..995a0cf78a 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -394,9 +394,9 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat if (browser.runModal() > 0) { // User made this choice... FilesystemNode file(browser.getResult()); - _soundFont->setLabel(file.path()); + _soundFont->setLabel(file.getPath()); - if (!file.path().empty() && (file.path() != "None")) + if (!file.getPath().empty() && (file.getPath() != "None")) _soundFontClearButton->setEnabled(true); else _soundFontClearButton->setEnabled(false); @@ -417,7 +417,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat // done with optional specific gameid to pluginmgr detectgames? // FSList files = dir.listDir(FilesystemNode::kListFilesOnly); - _gamePathWidget->setLabel(dir.path()); + _gamePathWidget->setLabel(dir.getPath()); draw(); } draw(); @@ -430,7 +430,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat if (browser.runModal() > 0) { // User made his choice... FilesystemNode dir(browser.getResult()); - _extraPathWidget->setLabel(dir.path()); + _extraPathWidget->setLabel(dir.getPath()); draw(); } draw(); @@ -442,7 +442,7 @@ void EditGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 dat if (browser.runModal() > 0) { // User made his choice... FilesystemNode dir(browser.getResult()); - _savePathWidget->setLabel(dir.path()); + _savePathWidget->setLabel(dir.getPath()); draw(); } draw(); @@ -645,9 +645,9 @@ void LauncherDialog::addGame() { // User made his choice... FilesystemNode dir(_browser->getResult()); FSList files; - if (!dir.listDir(files, FilesystemNode::kListAll)) { + if (!dir.getChildren(files, FilesystemNode::kListAll)) { error("browser returned a node that is not a directory: '%s'", - dir.path().c_str()); + dir.getPath().c_str()); } // ...so let's determine a list of candidates, games that @@ -677,7 +677,7 @@ void LauncherDialog::addGame() { GameDescriptor result = candidates[idx]; // TODO: Change the detectors to set "path" ! - result["path"] = dir.path(); + result["path"] = dir.getPath(); Common::String domain = addGameToConf(result); diff --git a/gui/massadd.cpp b/gui/massadd.cpp index 802f1cf084..987a92efb5 100644 --- a/gui/massadd.cpp +++ b/gui/massadd.cpp @@ -128,9 +128,9 @@ void MassAddDialog::handleTickle() { FilesystemNode dir = _scanStack.pop(); FSList files; - if (!dir.listDir(files, FilesystemNode::kListAll)) { + if (!dir.getChildren(files, FilesystemNode::kListAll)) { error("browser returned a node that is not a directory: '%s'", - dir.path().c_str()); + dir.getPath().c_str()); } // Run the detector on the dir @@ -142,7 +142,7 @@ void MassAddDialog::handleTickle() { // e.g. ask the user which one to pick (make sure to display the // path, too). GameDescriptor result = candidates[0]; - result["path"] = dir.path(); + result["path"] = dir.getPath(); _games.push_back(result); } diff --git a/gui/options.cpp b/gui/options.cpp index a29a5cb56e..6d588b6b44 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -27,12 +27,13 @@ #include "gui/themebrowser.h" #include "gui/chooser.h" #include "gui/eval.h" +#include "gui/message.h" #include "gui/newgui.h" #include "gui/options.h" #include "gui/PopUpWidget.h" #include "gui/TabWidget.h" -#include "common/fs.h" +//#include "common/fs.h" #include "common/config-manager.h" #include "common/system.h" @@ -813,9 +814,15 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 if (browser.runModal() > 0) { // User made his choice... FilesystemNode dir(browser.getResult()); - _savePath->setLabel(dir.path()); + if(dir.isWritable()) + { + _savePath->setLabel(dir.getPath()); + } else { + MessageDialog error("The chosen directory cannot be written to. Please select another one."); + error.runModal(); + return; + } draw(); - // TODO - we should check if the directory is writeable before accepting it } break; } @@ -824,7 +831,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 if (browser.runModal() > 0) { // User made his choice... FilesystemNode dir(browser.getResult()); - _themePath->setLabel(dir.path()); + _themePath->setLabel(dir.getPath()); draw(); } break; @@ -834,7 +841,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 if (browser.runModal() > 0) { // User made his choice... FilesystemNode dir(browser.getResult()); - _extraPath->setLabel(dir.path()); + _extraPath->setLabel(dir.getPath()); draw(); } break; @@ -844,9 +851,9 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 if (browser.runModal() > 0) { // User made his choice... FilesystemNode file(browser.getResult()); - _soundFont->setLabel(file.path()); + _soundFont->setLabel(file.getPath()); - if (!file.path().empty() && (file.path() != "None")) + if (!file.getPath().empty() && (file.getPath() != "None")) _soundFontClearButton->setEnabled(true); else _soundFontClearButton->setEnabled(false); diff --git a/gui/themebrowser.cpp b/gui/themebrowser.cpp index 234e0ed2b9..75fe5404c4 100644 --- a/gui/themebrowser.cpp +++ b/gui/themebrowser.cpp @@ -27,7 +27,6 @@ #include "gui/ListWidget.h" #include "gui/widget.h" #include "gui/theme.h" -#include "common/fs.h" #ifdef MACOSX #include "CoreFoundation/CoreFoundation.h" @@ -145,16 +144,16 @@ void ThemeBrowser::addDir(ThList &list, const Common::String &dir, int level) { FilesystemNode node(dir); - if (!node.isValid()) + if (!node.exists() || !node.isReadable()) return; FSList fslist; - if (!node.listDir(fslist, FilesystemNode::kListAll)) + if (!node.getChildren(fslist, FilesystemNode::kListAll)) return; for (FSList::const_iterator i = fslist.begin(); i != fslist.end(); ++i) { if (i->isDirectory()) { - addDir(list, i->path(), level-1); + addDir(list, i->getPath(), level-1); } else { Entry th; if (isTheme(*i, th)) { @@ -177,7 +176,7 @@ bool ThemeBrowser::isTheme(const FilesystemNode &node, Entry &out) { Common::ConfigFile cfg; Common::String type; - out.file = node.name(); + out.file = node.getName(); for (int i = out.file.size()-1; out.file[i] != '.' && i > 0; --i) { out.file.deleteLastChar(); } diff --git a/sound/iff.cpp b/sound/iff.cpp index 7b6b38acb7..b7cab4e01a 100644 --- a/sound/iff.cpp +++ b/sound/iff.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/sound/iff.cpp $ + * $Id:iff.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/sound/iff.h b/sound/iff.h index 44831fe863..f9b1f11ff7 100644 --- a/sound/iff.h +++ b/sound/iff.h @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/sound/iff.h $ + * $Id:iff.h 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/sound/mods/soundfx.cpp b/sound/mods/soundfx.cpp index c9cb1f007c..06104f4838 100644 --- a/sound/mods/soundfx.cpp +++ b/sound/mods/soundfx.cpp @@ -18,8 +18,8 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * - * $URL$ - * $Id$ + * $URL:https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/branches/gsoc2007-fsnode/sound/mods/soundfx.cpp $ + * $Id:soundfx.cpp 26949 2007-05-26 20:23:24Z david_corrales $ * */ diff --git a/sound/rate_arm.cpp b/sound/rate_arm.cpp deleted file mode 100644 index 694e213dce..0000000000 --- a/sound/rate_arm.cpp +++ /dev/null @@ -1,431 +0,0 @@ -/* ScummVM - Graphic Adventure Engine - * - * ScummVM is the legal property of its developers, whose names - * are too numerous to list here. Please refer to the COPYRIGHT - * file distributed with this source distribution. - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * $URL$ - * $Id$ - * - */ - -/* - * The code in this file, together with the rate_arm_asm.s file offers - * an ARM optimised version of the code in rate.cpp. The operation of this - * code should be identical to that of rate.cpp, but faster. The heavy - * lifting is done in the assembler file. - * - * To be as portable as possible we implement the core routines with C - * linkage in assembly, and implement the C++ routines that call into - * the C here. The C++ symbol mangling varies wildly between compilers, - * so this is the simplest way to ensure that the C/C++ combination should - * work on as many ARM based platforms as possible. - * - * Essentially the algorithm herein is the same as that in rate.cpp, so - * anyone seeking to understand this should attempt to understand that - * first. That code was based in turn on code with Copyright 1998 Fabrice - * Bellard - part of SoX (http://sox.sourceforge.net). - * Max Horn adapted that code to the needs of ScummVM and partially rewrote - * it, in the process removing any use of floating point arithmetic. Various - * other improvments over the original code were made. - */ - -#include "common/stdafx.h" -#include "sound/audiostream.h" -#include "sound/rate.h" -#include "sound/mixer.h" -#include "common/util.h" - -namespace Audio { - -/** - * The precision of the fractional computations used by the rate converter. - * Normally you should never have to modify this value. - */ -#define FRAC_BITS 16 - -/** - * The size of the intermediate input cache. Bigger values may increase - * performance, but only until some point (depends largely on cache size, - * target processor and various other factors), at which it will decrease - * again. - */ -#define INTERMEDIATE_BUFFER_SIZE 512 - - -/** - * Audio rate converter based on simple resampling. Used when no - * interpolation is required. - * - * Limited to sampling frequency <= 65535 Hz. - */ -typedef struct { - const st_sample_t *inPtr; - int inLen; - - /** position of how far output is ahead of input */ - /** Holds what would have been opos-ipos */ - long opos; - - /** fractional position increment in the output stream */ - long opos_inc; - - st_sample_t inBuf[INTERMEDIATE_BUFFER_SIZE]; -} SimpleRateDetails; - -template<bool stereo, bool reverseStereo> -class SimpleRateConverter : public RateConverter { -protected: - SimpleRateDetails sr; -public: - SimpleRateConverter(st_rate_t inrate, st_rate_t outrate); - int flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r); - int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol) { - return (ST_SUCCESS); - } -}; - - -/* - * Prepare processing. - */ -template<bool stereo, bool reverseStereo> -SimpleRateConverter<stereo, reverseStereo>::SimpleRateConverter(st_rate_t inrate, st_rate_t outrate) { - if (inrate == outrate) { - error("Input and Output rates must be different to use rate effect"); - } - - if ((inrate % outrate) != 0) { - error("Input rate must be a multiple of Output rate to use rate effect"); - } - - if (inrate >= 65536 || outrate >= 65536) { - error("rate effect can only handle rates < 65536"); - } - - sr.opos = 1; - - /* increment */ - sr.opos_inc = inrate / outrate; - - sr.inLen = 0; -} - -extern "C" void ARM_SimpleRate_M(AudioStream &input, - int (*fn)(Audio::AudioStream&,int16*,int), - SimpleRateDetails *sr, - st_sample_t *obuf, - st_size_t osamp, - st_volume_t vol_l, - st_volume_t vol_r); - -extern "C" void ARM_SimpleRate_S(AudioStream &input, - int (*fn)(Audio::AudioStream&,int16*,int), - SimpleRateDetails *sr, - st_sample_t *obuf, - st_size_t osamp, - st_volume_t vol_l, - st_volume_t vol_r); - -extern "C" void ARM_SimpleRate_R(AudioStream &input, - int (*fn)(Audio::AudioStream&,int16*,int), - SimpleRateDetails *sr, - st_sample_t *obuf, - st_size_t osamp, - st_volume_t vol_l, - st_volume_t vol_r); - -extern "C" int SimpleRate_readFudge(Audio::AudioStream &input, - int16 *a, int b) -{ - return input.readBuffer(a, b); -} - -template<bool stereo, bool reverseStereo> -int SimpleRateConverter<stereo, reverseStereo>::flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r) { - -#ifdef DEBUG_RATECONV -fprintf(stderr, "Simple st=%d rev=%d\n", stereo, reverseStereo); -fflush(stderr); -#endif - if (!stereo) { - ARM_SimpleRate_M(input, - &SimpleRate_readFudge, - &sr, - obuf, osamp, vol_l, vol_r); - } else if (reverseStereo) { - ARM_SimpleRate_R(input, - &SimpleRate_readFudge, - &sr, - obuf, osamp, vol_l, vol_r); - } else { - ARM_SimpleRate_S(input, - &SimpleRate_readFudge, - &sr, - obuf, osamp, vol_l, vol_r); - } - return (ST_SUCCESS); -} - -/** - * Audio rate converter based on simple linear Interpolation. - * - * The use of fractional increment allows us to use no buffer. It - * avoid the problems at the end of the buffer we had with the old - * method which stored a possibly big buffer of size - * lcm(in_rate,out_rate). - * - * Limited to sampling frequency <= 65535 Hz. - */ - -typedef struct { - const st_sample_t *inPtr; - int inLen; - - /** position of how far output is ahead of input */ - /** Holds what would have been opos-ipos */ - long opos; - - /** integer position increment in the output stream */ - long opos_inc; - - /** current sample(s) in the input stream (left/right channel) */ - st_sample_t icur[2]; - /** last sample(s) in the input stream (left/right channel) */ - st_sample_t ilast[2]; - - /** fractional position in the output stream */ - long opos_frac; - - /** fractional position increment in the output stream */ - long opos_inc_frac; - - st_sample_t inBuf[INTERMEDIATE_BUFFER_SIZE]; -} LinearRateDetails; - -extern "C" void ARM_LinearRate_M(AudioStream &input, - int (*fn)(Audio::AudioStream&,int16*,int), - LinearRateDetails *lr, - st_sample_t *obuf, - st_size_t osamp, - st_volume_t vol_l, - st_volume_t vol_r); - -extern "C" void ARM_LinearRate_S(AudioStream &input, - int (*fn)(Audio::AudioStream&,int16*,int), - LinearRateDetails *lr, - st_sample_t *obuf, - st_size_t osamp, - st_volume_t vol_l, - st_volume_t vol_r); - -extern "C" void ARM_LinearRate_R(AudioStream &input, - int (*fn)(Audio::AudioStream&,int16*,int), - LinearRateDetails *lr, - st_sample_t *obuf, - st_size_t osamp, - st_volume_t vol_l, - st_volume_t vol_r); - -template<bool stereo, bool reverseStereo> -class LinearRateConverter : public RateConverter { -protected: - LinearRateDetails lr; - -public: - LinearRateConverter(st_rate_t inrate, st_rate_t outrate); - int flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r); - int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol) { - return (ST_SUCCESS); - } -}; - - -/* - * Prepare processing. - */ -template<bool stereo, bool reverseStereo> -LinearRateConverter<stereo, reverseStereo>::LinearRateConverter(st_rate_t inrate, st_rate_t outrate) { - unsigned long incr; - - if (inrate == outrate) { - error("Input and Output rates must be different to use rate effect"); - } - - if (inrate >= 65536 || outrate >= 65536) { - error("rate effect can only handle rates < 65536"); - } - - lr.opos_frac = 0; - lr.opos = 1; - - /* increment */ - incr = (inrate << FRAC_BITS) / outrate; - - lr.opos_inc_frac = incr & ((1UL << FRAC_BITS) - 1); - lr.opos_inc = incr >> FRAC_BITS; - - lr.ilast[0] = lr.ilast[1] = 0; - lr.icur[0] = lr.icur[1] = 0; - - lr.inLen = 0; -} - -/* - * Processed signed long samples from ibuf to obuf. - * Return number of samples processed. - */ -template<bool stereo, bool reverseStereo> -int LinearRateConverter<stereo, reverseStereo>::flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r) { - -#ifdef DEBUG_RATECONV -fprintf(stderr, "Linear st=%d rev=%d\n", stereo, reverseStereo); -fflush(stderr); -#endif - if (!stereo) { - ARM_LinearRate_M(input, - &SimpleRate_readFudge, - &lr, - obuf, osamp, vol_l, vol_r); - } else if (reverseStereo) { - ARM_LinearRate_R(input, - &SimpleRate_readFudge, - &lr, - obuf, osamp, vol_l, vol_r); - } else { - ARM_LinearRate_S(input, - &SimpleRate_readFudge, - &lr, - obuf, osamp, vol_l, vol_r); - } - return (ST_SUCCESS); -} - - -#pragma mark - - - -/** - * Simple audio rate converter for the case that the inrate equals the outrate. - */ -extern "C" void ARM_CopyRate_M(st_size_t len, - st_sample_t *obuf, - st_volume_t vol_l, - st_volume_t vol_r, - st_sample_t *_buffer); - -extern "C" void ARM_CopyRate_S(st_size_t len, - st_sample_t *obuf, - st_volume_t vol_l, - st_volume_t vol_r, - st_sample_t *_buffer); - -extern "C" void ARM_CopyRate_R(st_size_t len, - st_sample_t *obuf, - st_volume_t vol_l, - st_volume_t vol_r, - st_sample_t *_buffer); - - -template<bool stereo, bool reverseStereo> -class CopyRateConverter : public RateConverter { - st_sample_t *_buffer; - st_size_t _bufferSize; -public: - CopyRateConverter() : _buffer(0), _bufferSize(0) {} - ~CopyRateConverter() { - free(_buffer); - } - - virtual int flow(AudioStream &input, st_sample_t *obuf, st_size_t osamp, st_volume_t vol_l, st_volume_t vol_r) { - assert(input.isStereo() == stereo); - -#ifdef DEBUG_RATECONV -fprintf(stderr, "Copy st=%d rev=%d\n", stereo, reverseStereo); -fflush(stderr); -#endif - st_sample_t *ptr; - st_size_t len; - - if (stereo) - osamp *= 2; - - // Reallocate temp buffer, if necessary - if (osamp > _bufferSize) { - free(_buffer); - _buffer = (st_sample_t *)malloc(osamp * 2); - _bufferSize = osamp; - } - - // Read up to 'osamp' samples into our temporary buffer - len = input.readBuffer(_buffer, osamp); - if (len <= 0) - return (ST_SUCCESS); - - // Mix the data into the output buffer - if (stereo && reverseStereo) - ARM_CopyRate_R(len, obuf, vol_l, vol_r, _buffer); - else if (stereo) - ARM_CopyRate_S(len, obuf, vol_l, vol_r, _buffer); - else - ARM_CopyRate_M(len, obuf, vol_l, vol_r, _buffer); - - return (ST_SUCCESS); - } - virtual int drain(st_sample_t *obuf, st_size_t osamp, st_volume_t vol) { - return (ST_SUCCESS); - } -}; - - -#pragma mark - - - -/** - * Create and return a RateConverter object for the specified input and output rates. - */ -RateConverter *makeRateConverter(st_rate_t inrate, st_rate_t outrate, bool stereo, bool reverseStereo) { - if (inrate != outrate) { - if ((inrate % outrate) == 0) { - if (stereo) { - if (reverseStereo) - return new SimpleRateConverter<true, true>(inrate, outrate); - else - return new SimpleRateConverter<true, false>(inrate, outrate); - } else - return new SimpleRateConverter<false, false>(inrate, outrate); - } else { - if (stereo) { - if (reverseStereo) - return new LinearRateConverter<true, true>(inrate, outrate); - else - return new LinearRateConverter<true, false>(inrate, outrate); - } else - return new LinearRateConverter<false, false>(inrate, outrate); - } - } else { - if (stereo) { - if (reverseStereo) - return new CopyRateConverter<true, true>(); - else - return new CopyRateConverter<true, false>(); - } else - return new CopyRateConverter<false, false>(); - } -} - -} // End of namespace Audio diff --git a/sound/rate_arm_asm.s b/sound/rate_arm_asm.s deleted file mode 100644 index 709d343c6c..0000000000 --- a/sound/rate_arm_asm.s +++ /dev/null @@ -1,692 +0,0 @@ -@ ScummVM - Graphic Adventure Engine -@ -@ ScummVM is the legal property of its developers, whose names -@ are too numerous to list here. Please refer to the COPYRIGHT -@ file distributed with this source distribution. -@ -@ 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -@ -@ $URL$ -@ $Id$ -@ -@ @author Robin Watts (robin@wss.co.uk) -@ -@ This file, together with rate_arm.cpp, provides an ARM optimised version -@ of rate.cpp. The algorithm is essentially the same as that within rate.cpp -@ so to understand this file you should understand rate.cpp first. - - .text - - .global ARM_CopyRate_M - .global ARM_CopyRate_S - .global ARM_CopyRate_R - .global ARM_SimpleRate_M - .global ARM_SimpleRate_S - .global ARM_SimpleRate_R - .global ARM_LinearRate_M - .global ARM_LinearRate_S - .global ARM_LinearRate_R - -ARM_CopyRate_M: - @ r0 = len - @ r1 = obuf - @ r2 = vol_l - @ r3 = vol_r - @ <> = ptr - LDR r12,[r13] - STMFD r13!,{r4-r7,r14} - - MOV r14,#0 @ r14= 0 - ORR r2, r2, r2, LSL #8 @ r2 = vol_l as 16 bits - ORR r3, r3, r3, LSL #8 @ r3 = vol_r as 16 bits -CopyRate_M_loop: - LDRSH r5, [r12], #2 @ r5 = tmp0 = tmp1 = *ptr++ - LDRSH r6, [r1] @ r6 = obuf[0] - LDRSH r7, [r1, #2] @ r7 = obuf[1] - MUL r4, r2, r5 @ r4 = tmp0*vol_l - MUL r5, r3, r5 @ r5 = tmp1*vol_r - - ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l - RSCVS r6, r14,#1<<31 @ Clamp r6 - ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r - RSCVS r7, r14,#1<<31 @ Clamp r7 - - MOV r6, r6, LSR #16 @ Shift back to halfword - MOV r7, r7, LSR #16 @ Shift back to halfword - - STRH r6, [r1], #2 @ Store output value - STRH r7, [r1], #2 @ Store output value - - SUBS r0,r0,#1 @ len-- - BGT CopyRate_M_loop @ and loop - - LDMFD r13!,{r4-r7,PC} - -ARM_CopyRate_S: - @ r0 = len - @ r1 = obuf - @ r2 = vol_l - @ r3 = vol_r - @ <> = ptr - LDR r12,[r13] - STMFD r13!,{r4-r7,r14} - - MOV r14,#0 @ r14= 0 - ORR r2, r2, r2, LSL #8 @ r2 = vol_l as 16 bits - ORR r3, r3, r3, LSL #8 @ r3 = vol_r as 16 bits -CopyRate_S_loop: - LDRSH r4, [r12],#2 @ r4 = tmp0 = *ptr++ - LDRSH r5, [r12],#2 @ r5 = tmp1 = *ptr++ - LDRSH r6, [r1] @ r6 = obuf[0] - LDRSH r7, [r1,#2] @ r7 = obuf[1] - MUL r4, r2, r4 @ r5 = tmp0*vol_l - MUL r5, r3, r5 @ r6 = tmp1*vol_r - - ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l - RSCVS r6, r14,#1<<31 @ Clamp r6 - ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r - RSCVS r7, r14,#1<<31 @ Clamp r7 - - MOV r6, r6, LSR #16 @ Shift back to halfword - MOV r7, r7, LSR #16 @ Shift back to halfword - - STRH r6, [r1],#2 @ Store output value - STRH r7, [r1],#2 @ Store output value - - SUBS r0,r0,#2 @ len -= 2 - BGT CopyRate_S_loop @ and loop - - LDMFD r13!,{r4-r7,PC} - -ARM_CopyRate_R: - @ r0 = len - @ r1 = obuf - @ r2 = vol_l - @ r3 = vol_r - @ <> = ptr - LDR r12,[r13] - STMFD r13!,{r4-r7,r14} - - MOV r14,#0 @ r14= 0 - ORR r2, r2, r2, LSL #8 @ r2 = vol_l as 16 bits - ORR r3, r3, r3, LSL #8 @ r3 = vol_r as 16 bits -CopyRate_R_loop: - LDRSH r5, [r12],#2 @ r5 = tmp1 = *ptr++ - LDRSH r4, [r12],#2 @ r4 = tmp0 = *ptr++ - LDRSH r6, [r1] @ r6 = obuf[0] - LDRSH r7, [r1,#2] @ r7 = obuf[1] - MUL r4, r2, r4 @ r4 = tmp0*vol_l - MUL r5, r3, r5 @ r5 = tmp1*vol_r - - ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l - RSCVS r6, r14,#1<<31 @ Clamp r6 - ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r - RSCVS r7, r14,#1<<31 @ Clamp r7 - - MOV r6, r6, LSR #16 @ Shift back to halfword - MOV r7, r7, LSR #16 @ Shift back to halfword - - STRH r6, [r1],#2 @ Store output value - STRH r7, [r1],#2 @ Store output value - - SUBS r0,r0,#2 @ len -= 2 - BGT CopyRate_R_loop @ and loop - - LDMFD r13!,{r4-r7,PC} - -ARM_SimpleRate_M: - @ r0 = AudioStream &input - @ r1 = input.readBuffer - @ r2 = input->sr - @ r3 = obuf - @ <> = osamp - @ <> = vol_l - @ <> = vol_r - MOV r12,r13 - STMFD r13!,{r0-r2,r4-r8,r10-r11,r14} - LDMFD r12,{r11,r12,r14} @ r11= osamp - @ r12= vol_l - @ r14= vol_r - LDMIA r2,{r0,r1,r2,r8} @ r0 = inPtr - @ r1 = inLen - @ r2 = opos - @ r8 = opos_inc - CMP r11,#0 @ if (osamp <= 0) - BLE SimpleRate_M_end @ bale - MOV r10,#0 - ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits - ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits -SimpleRate_M_loop: - SUBS r1, r1, #1 @ r1 = inLen -= 1 - BLT SimpleRate_M_read - SUBS r2, r2, #1 @ r2 = opos-- - ADDGE r0, r0, #2 @ if (r2 >= 0) { sr.inPtr++ - BGE SimpleRate_M_loop @ and loop } -SimpleRate_M_read_return: - LDRSH r5, [r0],#2 @ r5 = tmp1 = *inPtr++ - LDRSH r6, [r3] @ r6 = obuf[0] - LDRSH r7, [r3,#2] @ r7 = obuf[1] - ADD r2, r2, r8 @ r2 = opos += opos_inc - MUL r4, r12,r5 @ r4 = tmp0*vol_l - MUL r5, r14,r5 @ r5 = tmp1*vol_r - - ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l - RSCVS r6, r10,#1<<31 @ Clamp r6 - ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r - RSCVS r7, r10,#1<<31 @ Clamp r7 - - MOV r6, r6, LSR #16 @ Shift back to halfword - MOV r7, r7, LSR #16 @ Shift back to halfword - - STRH r6, [r3],#2 @ Store output value - STRH r7, [r3],#2 @ Store output value - - SUBS r11,r11,#1 @ len-- - BGT SimpleRate_M_loop @ and loop -SimpleRate_M_end: - LDR r14,[r13,#8] @ r14 = sr - ADD r13,r13,#12 @ Skip over r0-r2 on stack - STMIA r14,{r0,r1,r2} @ Store back updated values - LDMFD r13!,{r4-r8,r10-r11,PC} -SimpleRate_M_read: - LDR r0, [r13,#4*2] @ r0 = sr - ADD r0, r0, #16 @ r0 = inPtr = inBuf - STMFD r13!,{r0,r2-r3,r12,r14} - - MOV r1, r0 @ r1 = inBuf - LDR r0, [r13,#4*5] @ r0 = AudioStream & input - MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) - - @ Calling back into C++ here. WinCE is fairly easy about such things - @ but other OS are more awkward. r9 is preserved for Symbian, and - @ we have 3+8+5 = 16 things on the stack (an even number). - MOV r14,PC - LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) - SUBS r1, r0, #1 @ r1 = inLen-1 - LDMFD r13!,{r0,r2-r3,r12,r14} - BLT SimpleRate_M_end - SUBS r2, r2, #1 @ r2 = opos-- - ADDGE r0, r0, #2 @ if (r2 >= 0) { sr.inPtr++ - BGE SimpleRate_M_loop @ and loop } - B SimpleRate_M_read_return - - -ARM_SimpleRate_S: - @ r0 = AudioStream &input - @ r1 = input.readBuffer - @ r2 = input->sr - @ r3 = obuf - @ <> = osamp - @ <> = vol_l - @ <> = vol_r - MOV r12,r13 - STMFD r13!,{r0-r2,r4-r8,r10-r11,r14} - LDMFD r12,{r11,r12,r14} @ r11= osamp - @ r12= vol_l - @ r14= vol_r - LDMIA r2,{r0,r1,r2,r8} @ r0 = inPtr - @ r1 = inLen - @ r2 = opos - @ r8 = opos_inc - CMP r11,#0 @ if (osamp <= 0) - BLE SimpleRate_S_end @ bale - MOV r10,#0 - ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits - ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits -SimpleRate_S_loop: - SUBS r1, r1, #2 @ r1 = inLen -= 2 - BLT SimpleRate_S_read - SUBS r2, r2, #1 @ r2 = opos-- - ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 - BGE SimpleRate_S_loop @ and loop } -SimpleRate_S_read_return: - LDRSH r4, [r0],#2 @ r4 = tmp0 = *inPtr++ - LDRSH r5, [r0],#2 @ r5 = tmp1 = *inPtr++ - LDRSH r6, [r3] @ r6 = obuf[0] - LDRSH r7, [r3,#2] @ r7 = obuf[1] - ADD r2, r2, r8 @ r2 = opos += opos_inc - MUL r4, r12,r4 @ r5 = tmp0*vol_l - MUL r5, r14,r5 @ r6 = tmp1*vol_r - - ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l - RSCVS r6, r10,#1<<31 @ Clamp r6 - ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r - RSCVS r7, r10,#1<<31 @ Clamp r7 - - MOV r6, r6, LSR #16 @ Shift back to halfword - MOV r7, r7, LSR #16 @ Shift back to halfword - - STRH r6, [r3],#2 @ Store output value - STRH r7, [r3],#2 @ Store output value - - SUBS r11,r11,#1 @ osamp-- - BGT SimpleRate_S_loop @ and loop -SimpleRate_S_end: - LDR r14,[r13,#8] @ r14 = sr - ADD r13,r13,#12 @ skip over r0-r2 on stack - STMIA r14,{r0,r1,r2} @ store back updated values - LDMFD r13!,{r4-r8,r10-r11,PC} -SimpleRate_S_read: - LDR r0, [r13,#4*2] @ r0 = sr - ADD r0, r0, #16 @ r0 = inPtr = inBuf - STMFD r13!,{r0,r2-r3,r12,r14} - - MOV r1, r0 @ r1 = inBuf - LDR r0, [r13,#4*5] @ r0 = AudioStream & input - MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) - - @ Calling back into C++ here. WinCE is fairly easy about such things - @ but other OS are more awkward. r9 is preserved for Symbian, and - @ we have 3+8+5 = 16 things on the stack (an even number). - MOV r14,PC - LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) - SUBS r1, r0, #2 @ r1 = inLen-2 - LDMFD r13!,{r0,r2-r3,r12,r14} - BLT SimpleRate_S_end - SUBS r2, r2, #1 @ r2 = opos-- - ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 - BGE SimpleRate_S_loop @ and loop } - B SimpleRate_S_read_return - - - -ARM_SimpleRate_R: - @ r0 = AudioStream &input - @ r1 = input.readBuffer - @ r2 = input->sr - @ r3 = obuf - @ <> = osamp - @ <> = vol_l - @ <> = vol_r - MOV r12,r13 - STMFD r13!,{r0-r2,r4-r8,r10-r11,r14} - LDMFD r12,{r11,r12,r14} @ r11= osamp - @ r12= vol_l - @ r14= vol_r - LDMIA r2,{r0,r1,r2,r8} @ r0 = inPtr - @ r1 = inLen - @ r2 = opos - @ r8 = opos_inc - CMP r11,#0 @ if (osamp <= 0) - BLE SimpleRate_R_end @ bale - MOV r10,#0 - ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits - ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits -SimpleRate_R_loop: - SUBS r1, r1, #2 @ r1 = inLen -= 2 - BLT SimpleRate_R_read - SUBS r2, r2, #1 @ r2 = opos-- - ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 - BGE SimpleRate_R_loop @ and loop } -SimpleRate_R_read_return: - LDRSH r5, [r0],#2 @ r5 = tmp0 = *inPtr++ - LDRSH r4, [r0],#2 @ r4 = tmp1 = *inPtr++ - LDRSH r6, [r3] @ r6 = obuf[0] - LDRSH r7, [r3,#2] @ r7 = obuf[1] - ADD r2, r2, r8 @ r2 = opos += opos_inc - MUL r4, r12,r4 @ r5 = tmp0*vol_l - MUL r5, r14,r5 @ r6 = tmp1*vol_r - - ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l - RSCVS r6, r10,#1<<31 @ Clamp r6 - ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r - RSCVS r7, r10,#1<<31 @ Clamp r7 - - MOV r6, r6, LSR #16 @ Shift back to halfword - MOV r7, r7, LSR #16 @ Shift back to halfword - - STRH r6, [r3],#2 @ Store output value - STRH r7, [r3],#2 @ Store output value - - SUBS r11,r11,#1 @ osamp-- - BGT SimpleRate_R_loop @ and loop -SimpleRate_R_end: - LDR r14,[r13,#8] @ r14 = sr - ADD r13,r13,#12 @ Skip over r0-r2 on stack - STMIA r14,{r0,r1,r2} @ Store back updated values - LDMFD r13!,{r4-r8,r10-r11,PC} -SimpleRate_R_read: - LDR r0, [r13,#4*2] @ r0 = sr - ADD r0, r0, #16 @ r0 = inPtr = inBuf - STMFD r13!,{r0,r2-r3,r12,r14} - - MOV r1, r0 @ r1 = inBuf - LDR r0, [r13,#4*5] @ r0 = AudioStream & input - MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) - - @ Calling back into C++ here. WinCE is fairly easy about such things - @ but other OS are more awkward. r9 is preserved for Symbian, and - @ we have 3+8+5 = 16 things on the stack (an even number). - MOV r14,PC - LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) - SUBS r1, r0, #2 @ r1 = inLen-2 - LDMFD r13!,{r0,r2-r3,r12,r14} - BLT SimpleRate_R_end - SUBS r2, r2, #1 @ r2 = opos-- - ADDGE r0, r0, #4 @ if (r2 >= 0) { sr.inPtr += 2 - BGE SimpleRate_R_loop @ and loop } - B SimpleRate_R_read_return - - -ARM_LinearRate_M: - @ r0 = AudioStream &input - @ r1 = input.readBuffer - @ r2 = input->sr - @ r3 = obuf - @ <> = osamp - @ <> = vol_l - @ <> = vol_r - MOV r12,r13 - STMFD r13!,{r0-r1,r4-r11,r14} - LDMFD r12,{r11,r12,r14} @ r11= osamp - @ r12= vol_l - @ r14= vol_r - LDMIA r2,{r0,r1,r8} @ r0 = inPtr - @ r1 = inLen - @ r8 = opos - CMP r11,#0 @ if (osamp <= 0) - BLE LinearRate_M_end @ bale - ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits - ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits - CMP r1,#0 - BGT LinearRate_M_part2 - - @ part1 - read input samples -LinearRate_M_loop: - SUBS r1, r1, #1 @ r1 = inLen -= 1 - BLT LinearRate_M_read -LinearRate_M_read_return: - LDR r10,[r2, #16] @ r10= icur[0,1] - LDRSH r5, [r0],#2 @ r5 = tmp1 = *inPtr++ - SUBS r8, r8, #1 @ r8 = opos-- - STR r10,[r2,#20] @ ilast[0,1] = icur[0,1] - STRH r5, [r2,#16] @ icur[0] = tmp1 - BGE LinearRate_M_loop - - @ part2 - form output samples -LinearRate_M_part2: - @ We are guaranteed that opos < 0 here - LDRSH r6, [r2,#20] @ r6 = ilast[0] - LDRSH r5, [r2,#16] @ r5 = icur[0] - LDRH r4, [r2,#24] @ r4 = opos_frac - LDR r10,[r2,#28] @ r10= opos_frac_inc - MOV r6, r6, LSL #16 @ r6 = ilast[0]<<16 - SUB r5, r5, r6, ASR #16 @ r5 = icur[0] - ilast[0] - ADD r6, r6, #1<<15 @ r6 = ilast[0]+1<<(FRAC_BITS-1) - MLA r6, r4, r5, r6 @ r6 = (icur[0]-ilast[0])*opos_frac+ilast[0] - - ADD r4, r4, r10 @ r4 = tmp = opos_frac+opos_inc_frac - STRH r4,[r2,#24] @ opos_frac &= 65535 - ADD r8, r8, r4, LSR #16 @ opos += (tmp>>FRAC_BITS) - - LDRSH r4, [r3] @ r4 = obuf[0] - LDRSH r5, [r3,#2] @ r5 = obuf[1] - MOV r6, r6, ASR #16 @ r6 = tmp0 = tmp1 >>= 16 - MUL r7, r12,r6 @ r7 = tmp0*vol_l - MUL r6, r14,r6 @ r6 = tmp1*vol_r - - ADDS r7, r7, r4, LSL #16 @ r7 = obuf[0]<<16 + tmp0*vol_l - MOV r4, #0 - RSCVS r7, r4, #1<<31 @ Clamp r7 - ADDS r6, r6, r5, LSL #16 @ r6 = obuf[1]<<16 + tmp1*vol_r - RSCVS r6, r4, #1<<31 @ Clamp r6 - - MOV r7, r7, LSR #16 @ Shift back to halfword - MOV r6, r6, LSR #16 @ Shift back to halfword - - LDR r5, [r2,#12] @ r5 = opos_inc - STRH r7, [r3],#2 @ Store output value - STRH r6, [r3],#2 @ Store output value - SUBS r11, r11,#1 @ opos-- - BLE LinearRate_M_end @ end if needed - - ADDS r8, r8, r5 @ r8 = opos += opos_inc - BLT LinearRate_M_part2 - B LinearRate_M_loop -LinearRate_M_end: - ADD r13,r13,#8 - STMIA r2,{r0,r1,r8} - LDMFD r13!,{r4-r11,PC} -LinearRate_M_read: - ADD r0, r2, #32 @ r0 = inPtr = inBuf - STMFD r13!,{r0,r2-r3,r12,r14} - - MOV r1, r0 @ r1 = inBuf - LDR r0, [r13,#4*5] @ r0 = AudioStream & input - MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) - - @ Calling back into C++ here. WinCE is fairly easy about such things - @ but other OS are more awkward. r9 is preserved for Symbian, and - @ we have 2+9+5 = 16 things on the stack (an even number). - MOV r14,PC - LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) - SUBS r1, r0, #1 @ r1 = inLen-1 - LDMFD r13!,{r0,r2-r3,r12,r14} - BLT LinearRate_M_end - B LinearRate_M_read_return - -ARM_LinearRate_S: - @ r0 = AudioStream &input - @ r1 = input.readBuffer - @ r2 = input->sr - @ r3 = obuf - @ <> = osamp - @ <> = vol_l - @ <> = vol_r - MOV r12,r13 - STMFD r13!,{r0-r1,r4-r11,r14} - LDMFD r12,{r11,r12,r14} @ r11= osamp - @ r12= vol_l - @ r14= vol_r - LDMIA r2,{r0,r1,r8} @ r0 = inPtr - @ r1 = inLen - @ r8 = opos - CMP r11,#0 @ if (osamp <= 0) - BLE LinearRate_S_end @ bale - ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits - ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits - CMP r1,#0 - BGT LinearRate_S_part2 - - @ part1 - read input samples -LinearRate_S_loop: - SUBS r1, r1, #2 @ r1 = inLen -= 2 - BLT LinearRate_S_read -LinearRate_S_read_return: - LDR r10,[r2, #16] @ r10= icur[0,1] - LDRSH r5, [r0],#2 @ r5 = tmp0 = *inPtr++ - LDRSH r6, [r0],#2 @ r5 = tmp1 = *inPtr++ - SUBS r8, r8, #1 @ r8 = opos-- - STR r10,[r2,#20] @ ilast[0,1] = icur[0,1] - STRH r5, [r2,#16] @ icur[0] = tmp0 - STRH r6, [r2,#16] @ icur[1] = tmp1 - BGE LinearRate_S_loop - - @ part2 - form output samples -LinearRate_S_part2: - @ We are guaranteed that opos < 0 here - LDRSH r6, [r2,#20] @ r6 = ilast[0] - LDRSH r5, [r2,#16] @ r5 = icur[0] - LDRH r4, [r2,#24] @ r4 = opos_frac - MOV r6, r6, LSL #16 @ r6 = ilast[0]<<16 - SUB r5, r5, r6, ASR #16 @ r5 = icur[0] - ilast[0] - ADD r6, r6, #1<<15 @ r6 = ilast[0]+1<<(FRAC_BITS-1) - MLA r6, r4, r5, r6 @ r6 = (icur[0]-ilast[0])*opos_frac+ilast[0] - - LDRSH r7, [r2,#22] @ r6 = ilast[1] - LDRSH r5, [r2,#18] @ r5 = icur[1] - LDR r10,[r2,#28] @ r10= opos_frac_inc - MOV r7, r7, LSL #16 @ r7 = ilast[1]<<16 - SUB r5, r5, r7, ASR #16 @ r5 = icur[1] - ilast[1] - ADD r7, r7, #1<<15 @ r6 = ilast[1]+1<<(FRAC_BITS-1) - MLA r7, r4, r5, r7 @ r6 = (icur[1]-ilast[1])*opos_frac+ilast[1] - - ADD r4, r4, r10 @ r4 = tmp = opos_frac+opos_inc_frac - STRH r4,[r2,#24] @ opos_frac &= 65535 - ADD r8, r8, r4, LSR #16 @ opos += (tmp>>FRAC_BITS) - - LDRSH r4, [r3] @ r4 = obuf[0] - LDRSH r5, [r3,#2] @ r5 = obuf[1] - MOV r7, r7, ASR #16 @ r7 = tmp0 >>= 16 - MOV r6, r6, ASR #16 @ r6 = tmp1 >>= 16 - MUL r7, r12,r7 @ r7 = tmp0*vol_l - MUL r6, r14,r6 @ r6 = tmp1*vol_r - - ADDS r7, r7, r4, LSL #16 @ r7 = obuf[0]<<16 + tmp0*vol_l - MOV r4, #0 - RSCVS r7, r4, #1<<31 @ Clamp r7 - ADDS r6, r6, r5, LSL #16 @ r6 = obuf[1]<<16 + tmp1*vol_r - RSCVS r6, r4, #1<<31 @ Clamp r6 - - MOV r7, r7, LSR #16 @ Shift back to halfword - MOV r6, r6, LSR #16 @ Shift back to halfword - - LDR r5, [r2,#12] @ r5 = opos_inc - STRH r7, [r3],#2 @ Store output value - STRH r6, [r3],#2 @ Store output value - SUBS r11, r11,#1 @ opos-- - BLE LinearRate_S_end @ and loop - - ADDS r8, r8, r5 @ r8 = opos += opos_inc - BLT LinearRate_S_part2 - B LinearRate_S_loop -LinearRate_S_end: - ADD r13,r13,#8 - STMIA r2,{r0,r1,r8} - LDMFD r13!,{r4-r11,PC} -LinearRate_S_read: - ADD r0, r2, #32 @ r0 = inPtr = inBuf - STMFD r13!,{r0,r2-r3,r12,r14} - - MOV r1, r0 @ r1 = inBuf - LDR r0, [r13,#4*5] @ r0 = AudioStream & input - MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) - - @ Calling back into C++ here. WinCE is fairly easy about such things - @ but other OS are more awkward. r9 is preserved for Symbian, and - @ we have 2+9+5 = 16 things on the stack (an even number). - MOV r14,PC - LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) - SUBS r1, r0, #2 @ r1 = inLen-2 - LDMFD r13!,{r0,r2-r3,r12,r14} - BLT LinearRate_S_end - B LinearRate_S_read_return - -ARM_LinearRate_R: - @ r0 = AudioStream &input - @ r1 = input.readBuffer - @ r2 = input->sr - @ r3 = obuf - @ <> = osamp - @ <> = vol_l - @ <> = vol_r - MOV r12,r13 - STMFD r13!,{r0-r1,r4-r11,r14} - LDMFD r12,{r11,r12,r14} @ r11= osamp - @ r12= vol_l - @ r14= vol_r - LDMIA r2,{r0,r1,r8} @ r0 = inPtr - @ r1 = inLen - @ r8 = opos - CMP r11,#0 @ if (osamp <= 0) - BLE LinearRate_R_end @ bale - ORR r12,r12,r12,LSL #8 @ r12= vol_l as 16 bits - ORR r14,r14,r14,LSL #8 @ r14= vol_r as 16 bits - CMP r1,#0 - BGT LinearRate_R_part2 - - @ part1 - read input samples -LinearRate_R_loop: - SUBS r1, r1, #2 @ r1 = inLen -= 2 - BLT LinearRate_R_read -LinearRate_R_read_return: - LDR r10,[r2, #16] @ r10= icur[0,1] - LDRSH r5, [r0],#2 @ r5 = tmp0 = *inPtr++ - LDRSH r6, [r0],#2 @ r5 = tmp1 = *inPtr++ - SUBS r8, r8, #1 @ r8 = opos-- - STR r10,[r2,#20] @ ilast[0,1] = icur[0,1] - STRH r5, [r2,#16] @ icur[0] = tmp0 - STRH r6, [r2,#16] @ icur[1] = tmp1 - BGE LinearRate_R_loop - - @ part2 - form output samples -LinearRate_R_part2: - @ We are guaranteed that opos < 0 here - LDRSH r6, [r2,#20] @ r6 = ilast[0] - LDRSH r5, [r2,#16] @ r5 = icur[0] - LDRH r4, [r2,#24] @ r4 = opos_frac - MOV r6, r6, LSL #16 @ r6 = ilast[0]<<16 - SUB r5, r5, r6, ASR #16 @ r5 = icur[0] - ilast[0] - ADD r6, r6, #1<<15 @ r6 = ilast[0]+1<<(FRAC_BITS-1) - MLA r6, r4, r5, r6 @ r6 = (icur[0]-ilast[0])*opos_frac+ilast[0] - - LDRSH r7, [r2,#22] @ r6 = ilast[1] - LDRSH r5, [r2,#18] @ r5 = icur[1] - LDR r10,[r2,#28] @ r10= opos_frac_inc - MOV r7, r7, LSL #16 @ r7 = ilast[1]<<16 - SUB r5, r5, r7, ASR #16 @ r5 = icur[1] - ilast[1] - ADD r7, r7, #1<<15 @ r6 = ilast[1]+1<<(FRAC_BITS-1) - MLA r7, r4, r5, r7 @ r6 = (icur[1]-ilast[1])*opos_frac+ilast[1] - - ADD r4, r4, r10 @ r4 = tmp = opos_frac+opos_inc_frac - STRH r4,[r2,#24] @ opos_frac &= 65535 - ADD r8, r8, r4, LSR #16 @ opos += (tmp>>FRAC_BITS) - - LDRSH r4, [r3] @ r4 = obuf[0] - LDRSH r5, [r3,#2] @ r5 = obuf[1] - MOV r7, r7, ASR #16 @ r7 = tmp0 >>= 16 - MOV r6, r6, ASR #16 @ r6 = tmp1 >>= 16 - MUL r7, r12,r7 @ r7 = tmp0*vol_l - MUL r6, r14,r6 @ r6 = tmp1*vol_r - - ADDS r7, r7, r4, LSL #16 @ r7 = obuf[0]<<16 + tmp0*vol_l - MOV r4, #0 - RSCVS r7, r4, #1<<31 @ Clamp r7 - ADDS r6, r6, r5, LSL #16 @ r6 = obuf[1]<<16 + tmp1*vol_r - RSCVS r6, r4, #1<<31 @ Clamp r6 - - MOV r7, r7, LSR #16 @ Shift back to halfword - MOV r6, r6, LSR #16 @ Shift back to halfword - - LDR r5, [r2,#12] @ r5 = opos_inc - STRH r6, [r3],#2 @ Store output value - STRH r7, [r3],#2 @ Store output value - SUBS r11, r11,#1 @ opos-- - BLE LinearRate_R_end @ and loop - - ADDS r8, r8, r5 @ r8 = opos += opos_inc - BLT LinearRate_R_part2 - B LinearRate_R_loop -LinearRate_R_end: - ADD r13,r13,#8 - STMIA r2,{r0,r1,r8} - LDMFD r13!,{r4-r11,PC} -LinearRate_R_read: - ADD r0, r2, #32 @ r0 = inPtr = inBuf - STMFD r13!,{r0,r2-r3,r12,r14} - - MOV r1, r0 @ r1 = inBuf - LDR r0, [r13,#4*5] @ r0 = AudioStream & input - MOV r2, #512 @ r2 = ARRAYSIZE(inBuf) - - @ Calling back into C++ here. WinCE is fairly easy about such things - @ but other OS are more awkward. r9 is preserved for Symbian, and - @ we have 2+9+5 = 16 things on the stack (an even number). - MOV r14,PC - LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512) - SUBS r1, r0, #2 @ r1 = inLen-2 - LDMFD r13!,{r0,r2-r3,r12,r14} - BLT LinearRate_R_end - B LinearRate_R_read_return |