Ticket #8727: getName (POSIX).patch

File getName (POSIX).patch, 2.6 KB (added by SF/david_corrales, 17 years ago)

Preview patch for the lazy instantiation

  • home/david/Projects/scummvm/backends/fs/posix/posix-fs.cpp

     
    4646        String _path;
    4747        bool _isDirectory;
    4848        bool _isValid;
    49 
     49       
    5050public:
    5151        /**
    5252         * Creates a POSIXFilesystemNode with the root node as path.
     
    6262        POSIXFilesystemNode(const String &path, bool verify);
    6363       
    6464        virtual bool exists() const { return access(_path.c_str(), F_OK) == 0; }
    65         virtual String getDisplayName() const { return _displayName; }
    66         virtual String getName() const { return _displayName; }
     65        virtual String getDisplayName() const { return getName(); }
     66        virtual String getName() const;
    6767        virtual String getPath() const { return _path; }
    6868        virtual bool isDirectory() const { return _isDirectory; }
    6969        virtual bool isReadable() const { return access(_path.c_str(), R_OK) == 0; }
     
    8080        virtual void setFlags();
    8181};
    8282
    83 /**
    84  * Returns the last component of a given path.
    85  *
    86  * Examples:
    87  *                      /foo/bar.txt would return /bar.txt
    88  *                      /foo/bar/    would return /bar/
    89  * 
    90  * @param str String containing the path.
    91  * @return Pointer to the first char of the last component inside str.
    92  */
    93 const char *lastPathComponent(const Common::String &str) {
    94         const char *start = str.c_str();
    95         const char *cur = start + str.size() - 2;
    96 
    97         while (cur >= start && *cur != '/') {
    98                 --cur;
    99         }
    100 
    101         return cur + 1;
    102 }
    103 
    10483void POSIXFilesystemNode::setFlags() {
    10584        struct stat st;
    10685       
     
    141120        assert(p.size() > 0);
    142121
    143122        _path = p;
    144         _displayName = lastPathComponent(_path);
     123        _displayName = getName();
    145124
    146125        if (verify) {
    147126                setFlags();
     
    235214        return true;
    236215}
    237216
     217/**
     218 * Returns the last component of _path.
     219 *
     220 * Examples:
     221 *                      /foo/bar.txt would return /bar.txt
     222 *                      /foo/bar/    would return /bar/
     223 */
     224Common::String POSIXFilesystemNode::getName() const {
     225        if (_path == "")
     226                return "";
     227       
     228        if (_displayName == "") {
     229                const char *start = _path.c_str();
     230                const char *cur = start + _path.size() - 2;
     231       
     232                while (cur >= start && *cur != '/') {
     233                        --cur;
     234                }
     235               
     236                return String(cur + 1);
     237        } else {
     238                return _displayName;
     239        }
     240}
     241
    238242AbstractFilesystemNode *POSIXFilesystemNode::getParent() const {
    239243        if (_path == "/")
    240244                return 0;
     
    240244                return 0;
    241245
    242246        const char *start = _path.c_str();
    243         const char *end = lastPathComponent(_path);
     247        const char *end = getName().c_str();
    244248
    245249        return new POSIXFilesystemNode(String(start, end - start), true);
    246250}