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::slashify_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 // Add the extension back on
88 mname = ChangeExtension(mname, GetExtension(name_));
90 #if defined(__CYGWIN__) || defined(__CYGWIN32__) || defined(_WIN32)
91 // Mangle the drive letter in a Windows-style path.
92 if (mname.size() >= 2 && mname[1] == ':')
96 // Prepend a counter to the filename. This is necessary to make
97 // the mangled name unique.
98 static int counter = 0;
101 mname = s.str() + mname;
102 mangledNames[name_] = mname;
107 bool FileName::isZipped() const
109 return zippedFile(name_);
113 string const FileName::unzippedFilename() const
115 return unzippedFileName(name_);
119 bool operator==(FileName const & lhs, FileName const & rhs)
121 return lhs.absFilename() == rhs.absFilename() &&
122 lhs.saveAbsPath() == rhs.saveAbsPath();
126 bool operator!=(FileName const & lhs, FileName const & rhs)
128 return !(lhs == rhs);
131 } // namespace support