summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/files.cc
diff options
context:
space:
mode:
authorj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-07-17 07:19:04 +0000
committerj-p-e-g <j-p-e-g@c06c8d41-db1a-0410-9941-cceddc491573>2008-07-17 07:19:04 +0000
commitae735f39601423c88be471340dfe88dc3d3d103d (patch)
tree6c70a5c28e9bb8202846737217ede5c0eaed2c13 /crawl-ref/source/files.cc
parentdf2a542d658cebfc151aff61d42abafd82de60c2 (diff)
downloadcrawl-ref-ae735f39601423c88be471340dfe88dc3d3d103d.tar.gz
crawl-ref-ae735f39601423c88be471340dfe88dc3d3d103d.zip
Fix 2017893: long file names not working on DOS. Crawl now takes a
shot at abbreviating them, and only fails if it can't find that file either. Handles all files included by default in /settings and /docs except changes.stone_soup which is not strictly necessary for the version information. Tested artificially by manually mutilating the file names; not actually tested on DOS. git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/branches/stone_soup-0.4@6578 c06c8d41-db1a-0410-9941-cceddc491573
Diffstat (limited to 'crawl-ref/source/files.cc')
-rw-r--r--crawl-ref/source/files.cc24
1 files changed, 24 insertions, 0 deletions
diff --git a/crawl-ref/source/files.cc b/crawl-ref/source/files.cc
index 4e9a019817..2dbce76869 100644
--- a/crawl-ref/source/files.cc
+++ b/crawl-ref/source/files.cc
@@ -213,6 +213,30 @@ static inline bool _is_good_filename(const std::string &s)
return (s != "." && s != "..");
}
+#if defined(DOS)
+// Abbreviates a given file name to DOS style "xxxxxx~1.txt".
+// Does not take into account files with differing suffixes or files
+// with a prepended path with more than one separator.
+// (It does handle all files included with the distribution except
+// changes.stone_soup.)
+bool get_dos_compatible_file_name(std::string *fname)
+{
+ std::string::size_type pos1 = fname->find("\\");
+ if (pos1 == std::string::npos)
+ pos1 = 0;
+
+ const std::string::size_type pos2 = fname->find(".txt");
+ // Name already fits DOS requirements, nothing to be done.
+ if (fname->substr(pos1, pos2).length() <= 8)
+ return (false);
+
+ *fname = fname->substr(0,pos1) + fname->substr(pos1, pos1 + 6) + "~1.txt";
+
+ return (true);
+}
+#endif
+
+
// 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)