From 67a6bc4ab5be607c4a9f9a349dee629e864c2d42 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sun, 16 Oct 2011 16:16:47 +0300 Subject: [PATCH] Fix map delete on windows (concatenate paths correctly with / or \ depending on OS) --- src/filesys.cpp | 4 ++-- src/filesys.h | 8 ++++++++ src/game.cpp | 3 ++- src/main.cpp | 12 +++++++----- src/map.cpp | 28 ++++++++++++++-------------- src/porting.cpp | 12 ++++++------ src/servermain.cpp | 10 ++++++---- src/tile.cpp | 2 +- 8 files changed, 46 insertions(+), 33 deletions(-) diff --git a/src/filesys.cpp b/src/filesys.cpp index 8aa10ba58..99a0a6ef8 100644 --- a/src/filesys.cpp +++ b/src/filesys.cpp @@ -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); diff --git a/src/filesys.h b/src/filesys.h index b74b34f3d..8bf43c3fa 100644 --- a/src/filesys.h +++ b/src/filesys.h @@ -24,6 +24,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #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 { diff --git a/src/game.cpp b/src/game.cpp index 414a37759..c415db1e3 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -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)) { diff --git a/src/main.cpp b/src/main.cpp index 02cae0317..80daf7449 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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 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; iexists("map-dir")) diff --git a/src/map.cpp b/src/map.cpp index 4c79c0ac4..2d661a522 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -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" <" 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 diff --git a/src/servermain.cpp b/src/servermain.cpp index 6227901e7..f3111c42d 100644 --- a/src/servermain.cpp +++ b/src/servermain.cpp @@ -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 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; iexists("map-dir")) diff --git a/src/tile.cpp b/src/tile.cpp index 3fa363547..4e441329a 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -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); } -- 2.25.1