Fix map delete on windows (concatenate paths correctly with / or \ depending on OS)
authorPerttu Ahola <celeron55@gmail.com>
Sun, 16 Oct 2011 13:16:47 +0000 (16:16 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 16 Oct 2011 13:16:47 +0000 (16:16 +0300)
src/filesys.cpp
src/filesys.h
src/game.cpp
src/main.cpp
src/map.cpp
src/porting.cpp
src/servermain.cpp
src/tile.cpp

index 8aa10ba585408730bacc72e53e7cae96dd1dad88..99a0a6ef882b710a43b9f6cf1215fd8706e6810b 100644 (file)
@@ -279,7 +279,7 @@ bool RecursiveDeleteContent(std::string path)
        {
                if(trim(list[i].name) == "." || trim(list[i].name) == "..")
                        continue;
-               std::string childpath = path + "/" + list[i].name;
+               std::string childpath = path + DIR_DELIM + list[i].name;
                bool r = RecursiveDelete(childpath);
                if(r == false)
                {
@@ -299,7 +299,7 @@ bool CreateAllDirs(std::string path)
        while(!PathExists(basepath))
        {
                tocreate.push_back(basepath);
-               pos = basepath.rfind('/');
+               pos = basepath.rfind(DIR_DELIM_C);
                if(pos == std::string::npos)
                        return false;
                basepath = basepath.substr(0,pos);
index b74b34f3da6cc41f272959ca06fa44552b65f29c..8bf43c3faf3de62a6eeb861216890f904659c373 100644 (file)
@@ -24,6 +24,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <vector>
 #include "exceptions.h"
 
+#ifdef _WIN32 // WINDOWS
+#define DIR_DELIM "\\"
+#define DIR_DELIM_C '\\'
+#else // POSIX
+#define DIR_DELIM "/"
+#define DIR_DELIM_C '/'
+#endif
+
 namespace fs
 {
 
index 414a37759d9063ab915d4bd73c49a8b0c3c71129..c415db1e31f593ee11bc93e1c8130bdf9343cfa1 100644 (file)
@@ -42,6 +42,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mainmenumanager.h"
 #include "gettext.h"
 #include "log.h"
+#include "filesys.h"
 
 /*
        TODO: Move content-aware stuff to separate file by adding properties
@@ -1281,7 +1282,7 @@ void the_game(
                        irr::video::IImage* const image = driver->createScreenShot(); 
                        if (image) { 
                                irr::c8 filename[256]; 
-                               snprintf(filename, 256, "%s/screenshot_%u.png", 
+                               snprintf(filename, 256, "%s" DIR_DELIM "screenshot_%u.png", 
                                                 g_settings->get("screenshot_path").c_str(),
                                                 device->getTimer()->getRealTime()); 
                                if (driver->writeImageToFile(image, filename)) {
index 02cae0317858310073f7aed49e4186b583403ba0..80daf744937f763088606081dd47ae6a8502e511 100644 (file)
@@ -1186,13 +1186,13 @@ int main(int argc, char *argv[])
        // Create user data directory
        fs::CreateDir(porting::path_userdata);
 
-       init_gettext((porting::path_data+"/../locale").c_str());
+       init_gettext((porting::path_data+DIR_DELIM+".."+DIR_DELIM+"locale").c_str());
        
        // Initialize debug streams
 #ifdef RUN_IN_PLACE
        std::string debugfile = DEBUGFILE;
 #else
-       std::string debugfile = porting::path_userdata+"/"+DEBUGFILE;
+       std::string debugfile = porting::path_userdata+DIR_DELIM+DEBUGFILE;
 #endif
        debugstreams_init(disable_stderr, debugfile.c_str());
        // Initialize debug stacks
@@ -1244,9 +1244,11 @@ int main(int argc, char *argv[])
        else
        {
                core::array<std::string> filenames;
-               filenames.push_back(porting::path_userdata + "/minetest.conf");
+               filenames.push_back(porting::path_userdata +
+                               DIR_DELIM + "minetest.conf");
 #ifdef RUN_IN_PLACE
-               filenames.push_back(porting::path_userdata + "/../minetest.conf");
+               filenames.push_back(porting::path_userdata +
+                               DIR_DELIM + ".." + DIR_DELIM + "minetest.conf");
 #endif
 
                for(u32 i=0; i<filenames.size(); i++)
@@ -1308,7 +1310,7 @@ int main(int argc, char *argv[])
                port = 30000;
        
        // Map directory
-       std::string map_dir = porting::path_userdata+"/world";
+       std::string map_dir = porting::path_userdata+DIR_DELIM+"world";
        if(cmd_args.exists("map-dir"))
                map_dir = cmd_args.get("map-dir");
        else if(g_settings->exists("map-dir"))
index 4c79c0ac45eaa170c4ecb9ea26bcd22b3d32bb34..2d661a52213d002023e96619f3cdc771dc54b069 100644 (file)
@@ -2820,7 +2820,7 @@ void ServerMap::verifyDatabase() {
                return;
        
        {
-               std::string dbp = m_savedir + "/map.sqlite";
+               std::string dbp = m_savedir + DIR_DELIM + "map.sqlite";
                bool needs_create = false;
                int d;
                
@@ -2859,7 +2859,7 @@ void ServerMap::verifyDatabase() {
 }
 
 bool ServerMap::loadFromFolders() {
-       if(!m_database && !fs::PathExists(m_savedir + "/map.sqlite"))
+       if(!m_database && !fs::PathExists(m_savedir + DIR_DELIM + "map.sqlite"))
                return true;
        return false;
 }
@@ -2889,13 +2889,13 @@ std::string ServerMap::getSectorDir(v2s16 pos, int layout)
                                (unsigned int)pos.X&0xffff,
                                (unsigned int)pos.Y&0xffff);
 
-                       return m_savedir + "/sectors/" + cc;
+                       return m_savedir + DIR_DELIM + "sectors" + DIR_DELIM + cc;
                case 2:
-                       snprintf(cc, 9, "%.3x/%.3x",
+                       snprintf(cc, 9, "%.3x" DIR_DELIM "%.3x",
                                (unsigned int)pos.X&0xfff,
                                (unsigned int)pos.Y&0xfff);
 
-                       return m_savedir + "/sectors2/" + cc;
+                       return m_savedir + DIR_DELIM + "sectors2" + DIR_DELIM + cc;
                default:
                        assert(false);
        }
@@ -2905,7 +2905,7 @@ v2s16 ServerMap::getSectorPos(std::string dirname)
 {
        unsigned int x, y;
        int r;
-       size_t spos = dirname.rfind('/') + 1;
+       size_t spos = dirname.rfind(DIR_DELIM_C) + 1;
        assert(spos != std::string::npos);
        if(dirname.size() - spos == 8)
        {
@@ -2915,7 +2915,7 @@ v2s16 ServerMap::getSectorPos(std::string dirname)
        else if(dirname.size() - spos == 3)
        {
                // New layout
-               r = sscanf(dirname.substr(spos-4).c_str(), "%3x/%3x", &x, &y);
+               r = sscanf(dirname.substr(spos-4).c_str(), "%3x" DIR_DELIM "%3x", &x, &y);
                // Sign-extend the 12 bit values up to 16 bits...
                if(x&0x800) x|=0xF000;
                if(y&0x800) y|=0xF000;
@@ -3036,7 +3036,7 @@ void ServerMap::saveMapMeta()
 
        createDirs(m_savedir);
        
-       std::string fullpath = m_savedir + "/map_meta.txt";
+       std::string fullpath = m_savedir + DIR_DELIM + "map_meta.txt";
        std::ofstream os(fullpath.c_str(), std::ios_base::binary);
        if(os.good() == false)
        {
@@ -3062,7 +3062,7 @@ void ServerMap::loadMapMeta()
        infostream<<"ServerMap::loadMapMeta(): Loading map metadata"
                        <<std::endl;
 
-       std::string fullpath = m_savedir + "/map_meta.txt";
+       std::string fullpath = m_savedir + DIR_DELIM + "map_meta.txt";
        std::ifstream is(fullpath.c_str(), std::ios_base::binary);
        if(is.good() == false)
        {
@@ -3101,7 +3101,7 @@ void ServerMap::saveSectorMeta(ServerMapSector *sector)
        std::string dir = getSectorDir(pos);
        createDirs(dir);
        
-       std::string fullpath = dir + "/meta";
+       std::string fullpath = dir + DIR_DELIM + "meta";
        std::ofstream o(fullpath.c_str(), std::ios_base::binary);
        if(o.good() == false)
                throw FileNotGoodException("Cannot open sector metafile");
@@ -3119,7 +3119,7 @@ MapSector* ServerMap::loadSectorMeta(std::string sectordir, bool save_after_load
 
        ServerMapSector *sector = NULL;
 
-       std::string fullpath = sectordir + "/meta";
+       std::string fullpath = sectordir + DIR_DELIM + "meta";
        std::ifstream is(fullpath.c_str(), std::ios_base::binary);
        if(is.good() == false)
        {
@@ -3305,7 +3305,7 @@ void ServerMap::saveBlock(MapBlock *block)
 
        createDirs(sectordir);
 
-       std::string fullpath = sectordir+"/"+getBlockFilename(p3d);
+       std::string fullpath = sectordir+DIR_DELIM+getBlockFilename(p3d);
        std::ofstream o(fullpath.c_str(), std::ios_base::binary);
        if(o.good() == false)
                throw FileNotGoodException("Cannot open block data");
@@ -3351,7 +3351,7 @@ void ServerMap::loadBlock(std::string sectordir, std::string blockfile, MapSecto
 {
        DSTACK(__FUNCTION_NAME);
 
-       std::string fullpath = sectordir+"/"+blockfile;
+       std::string fullpath = sectordir+DIR_DELIM+blockfile;
        try{
 
                std::ifstream is(fullpath.c_str(), std::ios_base::binary);
@@ -3577,7 +3577,7 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos)
        */
 
        std::string blockfilename = getBlockFilename(blockpos);
-       if(fs::PathExists(sectordir+"/"+blockfilename) == false)
+       if(fs::PathExists(sectordir+DIR_DELIM+blockfilename) == false)
                return NULL;
 
        /*
index 39b2c570587d2f083c2c9752935931321b43640d..217f0926e129b3be02d0fc589b152159944a50e3 100644 (file)
@@ -87,8 +87,8 @@ void signal_handler_init(void)
        Path mangler
 */
 
-std::string path_data = "../data";
-std::string path_userdata = "../";
+std::string path_data = ".." DIR_DELIM "data";
+std::string path_userdata = "..";
 
 void pathRemoveFile(char *path, char delim)
 {
@@ -127,10 +127,10 @@ void initializePaths()
        pathRemoveFile(buf, '\\');
 
        // Use "./bin/../data"
-       path_data = std::string(buf) + "/../data";
+       path_data = std::string(buf) + DIR_DELIM ".." DIR_DELIM "data";
                
        // Use "./bin/../"
-       path_userdata = std::string(buf) + "/../";
+       path_userdata = std::string(buf) + DIR_DELIM ".." DIR_DELIM;
 
        /*
                Linux
@@ -188,13 +188,13 @@ void initializePaths()
        pathRemoveFile(buf, '\\');
        
        // Use "./bin/../data"
-       path_data = std::string(buf) + "/../data";
+       path_data = std::string(buf) + DIR_DELIM ".." DIR_DELIM "data";
        //path_data = std::string(buf) + "/../share/" + PROJECT_NAME;
                
        // Use "C:\Documents and Settings\user\Application Data\<PROJECT_NAME>"
        len = GetEnvironmentVariable("APPDATA", buf, buflen);
        assert(len < buflen);
-       path_userdata = std::string(buf) + "/" + PROJECT_NAME;
+       path_userdata = std::string(buf) + DIR_DELIM + PROJECT_NAME;
 
        /*
                Linux
index 6227901e77785846633daa7df071b78ebca14252..f3111c42d470af5d33f0572c3fb91221286a66db 100644 (file)
@@ -175,7 +175,7 @@ int main(int argc, char *argv[])
 #ifdef RUN_IN_PLACE
        std::string debugfile = DEBUGFILE;
 #else
-       std::string debugfile = porting::path_userdata+"/"+DEBUGFILE;
+       std::string debugfile = porting::path_userdata+DIR_DELIM+DEBUGFILE;
 #endif
        debugstreams_init(disable_stderr, debugfile.c_str());
        // Initialize debug stacks
@@ -279,9 +279,11 @@ int main(int argc, char *argv[])
        else
        {
                core::array<std::string> filenames;
-               filenames.push_back(porting::path_userdata + "/minetest.conf");
+               filenames.push_back(porting::path_userdata +
+                               DIR_DELIM + "minetest.conf");
 #ifdef RUN_IN_PLACE
-               filenames.push_back(porting::path_userdata + "/../minetest.conf");
+               filenames.push_back(porting::path_userdata +
+                               DIR_DELIM + ".." + DIR_DELIM + "minetest.conf");
 #endif
 
                for(u32 i=0; i<filenames.size(); i++)
@@ -347,7 +349,7 @@ int main(int argc, char *argv[])
        }
        
        // Figure out path to map
-       std::string map_dir = porting::path_userdata+"/world";
+       std::string map_dir = porting::path_userdata+DIR_DELIM+"world";
        if(cmd_args.exists("map-dir"))
                map_dir = cmd_args.get("map-dir");
        else if(g_settings->exists("map-dir"))
index 3fa3635473cdf6b3490cfbc56f63503cca7f2f1a..4e441329ab335c4e9ec9dc0b70777a68640fbbce 100644 (file)
@@ -118,7 +118,7 @@ std::string getTexturePath(const std::string &filename)
        std::string texture_path = g_settings->get("texture_path");
        if(texture_path != "")
        {
-               std::string testpath = texture_path + '/' + filename;
+               std::string testpath = texture_path + DIR_DELIM + filename;
                // Check all filename extensions. Returns "" if not found.
                fullpath = getImagePath(testpath);
        }