3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
6 * \author Angus Leeming
8 * Full author contact details are available in file CREDITS.
13 #include "support/filename.h"
14 #include "support/filetools.h"
15 #include "support/lstrings.h"
16 #include "support/os.h"
18 #include <boost/assert.hpp>
33 : save_abs_path_(true)
37 FileName::FileName(string const & abs_filename, bool save_abs)
38 : name_(abs_filename), save_abs_path_(save_abs)
40 BOOST_ASSERT(AbsolutePath(name_));
44 void FileName::set(string const & name, string const & buffer_path)
46 save_abs_path_ = AbsolutePath(name);
47 name_ = save_abs_path_ ? name : MakeAbsPath(name, buffer_path);
51 void FileName::erase()
57 string const FileName::relFilename(string const & path) const
59 return MakeRelPath(name_, path);
63 string const FileName::outputFilename(string const & path) const
65 return save_abs_path_ ? name_ : MakeRelPath(name_, path);
69 string const FileName::mangledFilename() const
71 // We need to make sure that every FileName instance for a given
72 // filename returns the same mangled name.
73 typedef map<string, string> MangledMap;
74 static MangledMap mangledNames;
75 MangledMap::const_iterator const it = mangledNames.find(name_);
76 if (it != mangledNames.end())
80 string mname = os::internal_path(name_);
81 // Remove the extension.
82 mname = ChangeExtension(name_, string());
83 // Replace '/' in the file name with '_'
84 mname = subst(mname, "/", "_");
85 // Replace '.' in the file name with '_'
86 mname = subst(mname, ".", "_");
87 // Replace ' ' in the file name with '_'
88 mname = subst(mname, " ", "_");
89 // Add the extension back on
90 mname = ChangeExtension(mname, GetExtension(name_));
92 #if defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(_WIN32)
93 // Mangle the drive letter in a Windows-style path.
94 if (mname.size() >= 2 && mname[1] == ':')
98 // Prepend a counter to the filename. This is necessary to make
99 // the mangled name unique.
100 static int counter = 0;
101 std::ostringstream s;
103 mname = s.str() + mname;
104 mangledNames[name_] = mname;
109 bool FileName::isZipped() const
111 return zippedFile(name_);
115 string const FileName::unzippedFilename() const
117 return unzippedFileName(name_);
121 bool operator==(FileName const & lhs, FileName const & rhs)
123 return lhs.absFilename() == rhs.absFilename() &&
124 lhs.saveAbsPath() == rhs.saveAbsPath();
128 bool operator!=(FileName const & lhs, FileName const & rhs)
130 return !(lhs == rhs);
133 } // namespace support