X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Ffile_system.cpp;h=be39082e7d0c9bd2e93a0aca2417c2a3ddc94cf2;hb=3d0fc88a41d3774bbbcaee76efdb996bbacc6c45;hp=826d4b75326b5b74f24e433a4a53a7edd0abd01e;hpb=eb40ead9684fd22440c6deeaaf5c3408eead208a;p=supertux.git diff --git a/src/file_system.cpp b/src/file_system.cpp index 826d4b753..be39082e7 100644 --- a/src/file_system.cpp +++ b/src/file_system.cpp @@ -1,10 +1,29 @@ +// $Id$ +// +// SuperTux +// Copyright (C) 2006 Matthias Braun +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #include +#include "log.hpp" #include "file_system.hpp" #include #include -#include #include namespace FileSystem @@ -13,9 +32,11 @@ namespace FileSystem std::string dirname(const std::string& filename) { std::string::size_type p = filename.find_last_of('/'); - if(p == std::string::npos) - return ""; - + if(p == std::string::npos) + p = filename.find_last_of('\\'); + if(p == std::string::npos) + return "./"; + return filename.substr(0, p+1); } @@ -23,9 +44,20 @@ std::string basename(const std::string& filename) { std::string::size_type p = filename.find_last_of('/'); if(p == std::string::npos) + p = filename.find_last_of('\\'); + if(p == std::string::npos) return filename; - return filename.substr(p, filename.size()-p); + return filename.substr(p+1, filename.size()-p-1); +} + +std::string strip_extension(const std::string& filename) +{ + std::string::size_type p = filename.find_last_of('.'); + if(p == std::string::npos) + return filename; + + return filename.substr(0, p); } std::string normalize(const std::string& filename) @@ -35,28 +67,29 @@ std::string normalize(const std::string& filename) const char* p = filename.c_str(); while(true) { - while(*p == '/') { + while(*p == '/' || *p == '\\') { p++; continue; } const char* pstart = p; - while(*p != '/' && *p != 0) { + while(*p != '/' && *p != '\\' && *p != 0) { ++p; } size_t len = p - pstart; if(len == 0) break; - + std::string pathelem(pstart, p-pstart); if(pathelem == ".") continue; - + if(pathelem == "..") { if(path_stack.empty()) { - std::cout << "Invalid '..' in path '" << filename << "'.\n"; - // push it into the result path so that the users sees his error... + + log_warning << "Invalid '..' in path '" << filename << "'" << std::endl; + // push it into the result path so that the user sees his error... path_stack.push_back(pathelem); } else { path_stack.pop_back(); @@ -79,4 +112,3 @@ std::string normalize(const std::string& filename) } } -