summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/files.cc
diff options
context:
space:
mode:
authordshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-04-19 23:13:26 +0000
committerdshaligram <dshaligram@c06c8d41-db1a-0410-9941-cceddc491573>2008-04-19 23:13:26 +0000
commit9ba57ee3a6f72308ff01263dfe143cf23c1cf321 (patch)
tree968cb123684f700f4a612804f8670b0e8e049a93 /crawl-ref/source/files.cc
parent003c3dc779fbd0ba44bc4fafadafb45db537fda7 (diff)
downloadcrawl-ref-9ba57ee3a6f72308ff01263dfe143cf23c1cf321.tar.gz
crawl-ref-9ba57ee3a6f72308ff01263dfe143cf23c1cf321.zip
Fixes to compile with Visual C++. Moved direct.cc and direct.h to directn.* to avoid conflict with VC++ direct.h header.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@4390 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/files.cc')
-rw-r--r--crawl-ref/source/files.cc42
1 files changed, 34 insertions, 8 deletions
diff --git a/crawl-ref/source/files.cc b/crawl-ref/source/files.cc
index 7b7211adce..7d04269590 100644
--- a/crawl-ref/source/files.cc
+++ b/crawl-ref/source/files.cc
@@ -52,20 +52,13 @@
#include <sys/types.h>
#include <sys/stat.h>
-#if _MSC_VER
-// # include <direct.h> conflicts with crawl's header. Yes this sucks
-# include <c:/Program Files/Microsoft Visual Studio 8/VC/include/direct.h>
-#else
-#include <dirent.h>
-#endif
-
#include "externs.h"
#include "chardump.h"
#include "cloud.h"
#include "clua.h"
#include "debug.h"
-#include "direct.h"
+#include "directn.h"
#include "dungeon.h"
#include "effects.h"
#include "ghost.h"
@@ -100,6 +93,14 @@
#include "view.h"
#include "xom.h"
+#if _MSC_VER
+#include <direct.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#else
+#include <dirent.h>
+#endif
+
#ifndef HAVE_STAT
#if defined(UNIX) || defined(__MINGW32__) || defined(DOS)
#define HAVE_STAT
@@ -225,12 +226,30 @@ player_save_info read_character_info(const std::string &savefile)
return fromfile;
}
+static bool _is_good_filename(const std::string &s)
+{
+ return (s != "." && s != "..");
+}
+
// Returns the names of all files in the given directory. Note that the
// filenames returned are relative to the directory.
std::vector<std::string> get_dir_files(const std::string &dirname)
{
std::vector<std::string> files;
+#ifdef _MSC_VER
+ WIN32_FIND_DATA lData;
+ HANDLE hFind = FindFirstFile(dirname.c_str(), &lData);
+ if (hFind != INVALID_HANDLE_VALUE)
+ {
+ if (_is_good_filename(lData.cFileName))
+ files.push_back(lData.cFileName);
+ while (FindNextFile(hFind, &lData))
+ files.push_back(lData.cFileName);
+ FindClose(hFind);
+ }
+#else // non-MS VC++ compilers
+
DIR *dir = opendir(dirname.c_str());
if (!dir)
return (files);
@@ -244,6 +263,7 @@ std::vector<std::string> get_dir_files(const std::string &dirname)
files.push_back(name);
}
closedir(dir);
+#endif
return (files);
}
@@ -323,12 +343,18 @@ static bool file_exists(const std::string &name)
// Low-tech existence check.
static bool dir_exists(const std::string &dir)
{
+#ifdef _MSC_VER
+ DWORD lAttr = GetFileAttributes(dir.c_str());
+ return (lAttr != INVALID_FILE_ATTRIBUTES
+ && (lAttr & FILE_ATTRIBUTE_DIRECTORY));
+#else
DIR *d = opendir(dir.c_str());
const bool exists = !!d;
if (d)
closedir(d);
return (exists);
+#endif
}
static int create_directory(const char *dir)