From f1466408343b8f0de060d80abca75d859a0fca07 Mon Sep 17 00:00:00 2001 From: Angus Leeming Date: Thu, 11 Mar 2004 11:45:08 +0000 Subject: [PATCH] Georg's mangling patch. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8485 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/support/ChangeLog | 5 +++++ src/support/filename.C | 23 ++++++++++++++++++++++- src/support/filename.h | 4 ++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/support/ChangeLog b/src/support/ChangeLog index afa4bc3153..5a25694d3e 100644 --- a/src/support/ChangeLog +++ b/src/support/ChangeLog @@ -1,3 +1,8 @@ +2004-03-09 Georg Baum + + * filename.[Ch] (mangledFilename): make sure that mangled names are + unique + 2004-02-21 Georg Baum * filetools.[Ch] (CreateBufferTmpDir): rename to createBufferTmpDir, diff --git a/src/support/filename.C b/src/support/filename.C index 337f9cbdb2..db6dd86f72 100644 --- a/src/support/filename.C +++ b/src/support/filename.C @@ -18,7 +18,11 @@ #include +#include +#include + +using std::map; using std::string; @@ -65,6 +69,15 @@ string const FileName::outputFilename(string const & path) const string const FileName::mangledFilename() const { + // We need to make sure that every FileName instance for a given + // filename returns the same mangled name. + typedef map MangledMap; + static MangledMap mangledNames; + MangledMap::const_iterator const it = mangledNames.find(name_); + if (it != mangledNames.end()) + return (*it).second; + + // Now the real work string mname = os::slashify_path(name_); // Remove the extension. mname = ChangeExtension(name_, string()); @@ -73,7 +86,15 @@ string const FileName::mangledFilename() const // Replace '.' in the file name with '_' mname = subst(mname, ".", "_"); // Add the extension back on - return ChangeExtension(mname, GetExtension(name_)); + mname = ChangeExtension(mname, GetExtension(name_)); + // Prepend a counter to the filename. This is necessary to make + // the mangled name unique. + static int counter = 0; + std::ostringstream s; + s << counter++; + mname = s.str() + mname; + mangledNames[name_] = mname; + return mname; } diff --git a/src/support/filename.h b/src/support/filename.h index f019fde922..06b164c2e4 100644 --- a/src/support/filename.h +++ b/src/support/filename.h @@ -46,6 +46,10 @@ public: /** \return a mangled version of the absolute file name, * suitable for use in the temp dir when, for example, converting * an image file to another format. + * It is guaranteed that + * - two different filenames have different mangled names + * - two FileName instances with the same filename have identical + * mangled names */ std::string const mangledFilename() const;