summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Slice/.depend14
-rw-r--r--cpp/src/Slice/CPlusPlusUtil.cpp71
-rw-r--r--cpp/src/Slice/Parser.cpp13
-rwxr-xr-xcpp/src/Slice/Preprocessor.cpp28
-rw-r--r--cpp/src/Slice/PythonUtil.cpp46
-rw-r--r--cpp/src/Slice/RubyUtil.cpp46
-rw-r--r--cpp/src/Slice/Util.cpp147
-rw-r--r--cpp/src/Slice/Util.h24
-rwxr-xr-xcpp/src/slice2cpp/Gen.cpp10
-rw-r--r--cpp/src/slice2cppe/Gen.cpp6
-rw-r--r--cpp/src/slice2freeze/Main.cpp6
11 files changed, 149 insertions, 262 deletions
diff --git a/cpp/src/Slice/.depend b/cpp/src/Slice/.depend
index b57f6a16b7e..39c2278df2d 100644
--- a/cpp/src/Slice/.depend
+++ b/cpp/src/Slice/.depend
@@ -1,15 +1,15 @@
Scanner$(OBJEXT): Scanner.cpp $(includedir)/IceUtil/Config.h ../Slice/GrammarUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h ../Slice/Grammar.h $(includedir)/IceUtil/InputUtil.h
-Grammar$(OBJEXT): Grammar.cpp ../Slice/GrammarUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/UUID.h
-Parser$(OBJEXT): Parser.cpp $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/InputUtil.h $(includedir)/IceUtil/StringUtil.h $(includedir)/IceUtil/Unicode.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h ../Slice/GrammarUtil.h ../Slice/Util.h
-CPlusPlusUtil$(OBJEXT): CPlusPlusUtil.cpp $(includedir)/Slice/CPlusPlusUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/OutputUtil.h ../Slice/Util.h
+Grammar$(OBJEXT): ../Slice/Grammar.cpp ../Slice/GrammarUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/UUID.h
+Parser$(OBJEXT): Parser.cpp $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/InputUtil.h $(includedir)/IceUtil/StringUtil.h $(includedir)/IceUtil/Unicode.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h ../Slice/GrammarUtil.h $(includedir)/Slice/Util.h
+CPlusPlusUtil$(OBJEXT): CPlusPlusUtil.cpp $(includedir)/Slice/CPlusPlusUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/Util.h
CsUtil$(OBJEXT): CsUtil.cpp $(includedir)/Slice/CsUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/DotNetNames.h $(includedir)/IceUtil/Functional.h
JavaUtil$(OBJEXT): JavaUtil.cpp $(includedir)/Slice/JavaUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/SignalHandler.h $(includedir)/IceUtil/Functional.h
-Preprocessor$(OBJEXT): Preprocessor.cpp $(includedir)/IceUtil/DisableWarnings.h $(includedir)/Slice/Preprocessor.h $(includedir)/IceUtil/Config.h ../Slice/Util.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Slice/SignalHandler.h $(includedir)/IceUtil/StringUtil.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h
+Preprocessor$(OBJEXT): Preprocessor.cpp $(includedir)/IceUtil/DisableWarnings.h $(includedir)/Slice/Preprocessor.h $(includedir)/IceUtil/Config.h $(includedir)/Slice/Util.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/Slice/SignalHandler.h $(includedir)/IceUtil/StringUtil.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h
Checksum$(OBJEXT): Checksum.cpp $(includedir)/Slice/Checksum.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h ../Slice/MD5.h
-PythonUtil$(OBJEXT): PythonUtil.cpp $(includedir)/Slice/PythonUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/Checksum.h ../Slice/Util.h $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/IceUtil/StringUtil.h $(includedir)/IceUtil/InputUtil.h
+PythonUtil$(OBJEXT): PythonUtil.cpp $(includedir)/Slice/PythonUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/Checksum.h $(includedir)/Slice/Util.h $(includedir)/IceUtil/IceUtil.h $(includedir)/IceUtil/AbstractMutex.h $(includedir)/IceUtil/Lock.h $(includedir)/IceUtil/ThreadException.h $(includedir)/IceUtil/Time.h $(includedir)/IceUtil/Cache.h $(includedir)/IceUtil/Mutex.h $(includedir)/IceUtil/CountDownLatch.h $(includedir)/IceUtil/Cond.h $(includedir)/IceUtil/CtrlCHandler.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/Monitor.h $(includedir)/IceUtil/RWRecMutex.h $(includedir)/IceUtil/Thread.h $(includedir)/IceUtil/RecMutex.h $(includedir)/IceUtil/StaticMutex.h $(includedir)/IceUtil/Timer.h $(includedir)/IceUtil/UUID.h $(includedir)/IceUtil/Unicode.h $(includedir)/IceUtil/StringUtil.h $(includedir)/IceUtil/InputUtil.h
DotNetNames$(OBJEXT): DotNetNames.cpp $(includedir)/Slice/DotNetNames.h
-RubyUtil$(OBJEXT): RubyUtil.cpp $(includedir)/Slice/RubyUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/Checksum.h ../Slice/Util.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/InputUtil.h
-Util$(OBJEXT): Util.cpp ../Slice/Util.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Unicode.h
+RubyUtil$(OBJEXT): RubyUtil.cpp $(includedir)/Slice/RubyUtil.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/OutputUtil.h $(includedir)/Slice/Checksum.h $(includedir)/Slice/Util.h $(includedir)/IceUtil/Functional.h $(includedir)/IceUtil/InputUtil.h
+Util$(OBJEXT): Util.cpp $(includedir)/Slice/Util.h $(includedir)/Slice/Parser.h $(includedir)/IceUtil/Shared.h $(includedir)/IceUtil/Config.h $(includedir)/IceUtil/Handle.h $(includedir)/IceUtil/Exception.h $(includedir)/IceUtil/Unicode.h
MD5$(OBJEXT): MD5.cpp ../Slice/MD5.h $(includedir)/IceUtil/Config.h ../Slice/MD5I.h
MD5I$(OBJEXT): MD5I.cpp ../Slice/MD5I.h
SignalHandler$(OBJEXT): SignalHandler.cpp $(includedir)/IceUtil/DisableWarnings.h $(includedir)/Slice/SignalHandler.h $(includedir)/IceUtil/Config.h
diff --git a/cpp/src/Slice/CPlusPlusUtil.cpp b/cpp/src/Slice/CPlusPlusUtil.cpp
index fe2cf463b3a..bb6e5db83b4 100644
--- a/cpp/src/Slice/CPlusPlusUtil.cpp
+++ b/cpp/src/Slice/CPlusPlusUtil.cpp
@@ -35,77 +35,6 @@ Slice::ToIfdef::operator()(char c)
}
}
-string
-Slice::changeInclude(const string& orig, const vector<string>& includePaths)
-{
- string::size_type pos;
- string cwd = getCwd();
- string file = orig;
- if(!isAbsolute(file))
- {
- file = cwd + "/" + file;
- }
- file = normalizePath(file, true);
-
- //
- // Modify the list of include paths to be absolute paths, with and
- // without symlinks resolved.
- //
- vector<string> newIncludePaths;
- vector<string>::const_iterator p;
- for(p = includePaths.begin(); p != includePaths.end(); ++p)
- {
- string includePath = *p;
- if(!isAbsolute(includePath))
- {
- includePath = cwd + "/" + includePath;
- }
- newIncludePaths.push_back(normalizePath(includePath, true));
-
-#ifndef _WIN32
- //
- // We need to get the real path name of the include directory in case
- // it is a symlink, since the preprocessor output contains real path names.
- //
- int fd = open(".", O_RDONLY);
- if(fd != -1)
- {
- if (!chdir(includePath.c_str()))
- {
- includePath = getCwd() + "/";
- fchdir(fd);
- }
- close(fd);
- }
- newIncludePaths.push_back(normalizePath(includePath, true));
-#endif
- }
-
- //
- // Compare each include path against the included file and select
- // the path that produces the shortest relative filename.
- //
- string result = file;
- for(p = newIncludePaths.begin(); p != newIncludePaths.end(); ++p)
- {
- string includePath = *p;
- if(file.compare(0, includePath.length(), includePath) == 0)
- {
- string s = file.substr(includePath.length());
- if(s.size() < result.size())
- {
- result = s;
- }
- }
- }
-
- if((pos = result.rfind('.')) != string::npos)
- {
- result.erase(pos);
- }
-
- return result;
-}
void
Slice::printHeader(Output& out)
diff --git a/cpp/src/Slice/Parser.cpp b/cpp/src/Slice/Parser.cpp
index c6816a19669..c93de96da22 100644
--- a/cpp/src/Slice/Parser.cpp
+++ b/cpp/src/Slice/Parser.cpp
@@ -5087,7 +5087,15 @@ Slice::Unit::scanPosition(const char* s)
}
}
- currentFile = normalizePath(currentFile, false);
+ //
+ // Cache full paths to avoid too many full path computations.
+ //
+ map<string, string>::const_iterator p = _fullPaths.find(currentFile);
+ if(p == _fullPaths.end())
+ {
+ p = _fullPaths.insert(make_pair(currentFile, fullPath(currentFile))).first;
+ }
+ currentFile = p->second;
enum LineType { File, Push, Pop };
@@ -5487,7 +5495,8 @@ Slice::Unit::parse(const string& filename, FILE* file, bool debug, Slice::Featur
_currentLine = 1;
_currentIncludeLevel = 0;
_featureProfile = profile;
- _topLevelFile = normalizePath(filename);
+ _topLevelFile = fullPath(filename);
+ _fullPaths[filename] = _topLevelFile;
pushContainer(this);
pushDefinitionContext();
diff --git a/cpp/src/Slice/Preprocessor.cpp b/cpp/src/Slice/Preprocessor.cpp
index b5efe23096e..d5231c06fbe 100755
--- a/cpp/src/Slice/Preprocessor.cpp
+++ b/cpp/src/Slice/Preprocessor.cpp
@@ -255,6 +255,13 @@ Slice::Preprocessor::printMakefileDependencies(Language lang, const vector<strin
pos = unprocessed.find(suffix) + suffix.size();
string result = unprocessed.substr(0, pos);
+ vector<string> fullIncludePaths;
+ vector<string>::const_iterator p;
+ for(p = includePaths.begin(); p != includePaths.end(); ++p)
+ {
+ fullIncludePaths.push_back(fullPath(*p));
+ }
+
//
// Process each dependency.
//
@@ -264,25 +271,18 @@ Slice::Preprocessor::printMakefileDependencies(Language lang, const vector<strin
end += 4;
string file = IceUtilInternal::trim(unprocessed.substr(pos, end - pos));
- //
- // Normalize paths if not relative path.
- //
if(isAbsolute(file))
{
+ //
+ // Transform back full paths generated by mcpp to paths relative to the specificed
+ // include paths.
+ //
string newFile = file;
- string cwd = getCwd();
- for(vector<string>::const_iterator p = includePaths.begin(); p != includePaths.end(); ++p)
+ for(vector<string>::const_iterator p = fullIncludePaths.begin(); p != fullIncludePaths.end(); ++p)
{
- string includePath = *p;
- if(!isAbsolute(includePath))
- {
- includePath = cwd + "/" + includePath;
- }
- includePath = normalizePath(includePath, false);
-
- if(file.compare(0, includePath.length(), includePath) == 0)
+ if(file.compare(0, p->length(), *p) == 0)
{
- string s = *p + file.substr(includePath.length());
+ string s = includePaths[p - fullIncludePaths.begin()] + file.substr(p->length());
if(isAbsolute(newFile) || s.size() < newFile.size())
{
newFile = s;
diff --git a/cpp/src/Slice/PythonUtil.cpp b/cpp/src/Slice/PythonUtil.cpp
index 62babf9f670..a422886255d 100644
--- a/cpp/src/Slice/PythonUtil.cpp
+++ b/cpp/src/Slice/PythonUtil.cpp
@@ -1771,46 +1771,6 @@ Slice::Python::CodeVisitor::collectExceptionMembers(const ExceptionPtr& p, Membe
}
}
-static string
-changeInclude(const string& inc, const vector<string>& includePaths)
-{
- string orig = normalizePath(inc);
- string curr = orig; // The current shortest pathname.
- string cwd = getCwd();
-
- //
- // Compare the pathname of the included file against each of the include directories.
- // If any of the include directories match the leading part of the included file,
- // then select the include directory whose removal results in the shortest pathname.
- //
- for(vector<string>::const_iterator p = includePaths.begin(); p != includePaths.end(); ++p)
- {
- string includePath = *p;
- if(isAbsolute(orig) && !isAbsolute(includePath))
- {
- includePath = cwd + "/" + includePath;
- }
- includePath = normalizePath(includePath);
-
- if(orig.compare(0, includePath.size(), includePath) == 0)
- {
- string s = orig.substr(includePath.size());
- if(s.size() < curr.size())
- {
- curr = s;
- }
- }
- }
-
- string::size_type pos = curr.rfind('.');
- if(pos != string::npos)
- {
- curr.erase(pos);
- }
-
- return curr;
-}
-
void
Slice::Python::generate(const UnitPtr& un, bool all, bool checksum, const vector<string>& includePaths, Output& out)
{
@@ -1824,11 +1784,7 @@ Slice::Python::generate(const UnitPtr& un, bool all, bool checksum, const vector
vector<string> paths = includePaths;
for(vector<string>::iterator p = paths.begin(); p != paths.end(); ++p)
{
- if(p->size() && (*p)[p->size() - 1] != '/')
- {
- *p += '/';
- }
- *p = normalizePath(*p);
+ *p = fullPath(*p);
}
StringList includes = un->includeFiles();
diff --git a/cpp/src/Slice/RubyUtil.cpp b/cpp/src/Slice/RubyUtil.cpp
index 2f861a8e283..de38a9a15bd 100644
--- a/cpp/src/Slice/RubyUtil.cpp
+++ b/cpp/src/Slice/RubyUtil.cpp
@@ -1600,46 +1600,6 @@ Slice::Ruby::CodeVisitor::collectExceptionMembers(const ExceptionPtr& p, MemberI
}
}
-static string
-changeInclude(const string& inc, const vector<string>& includePaths)
-{
- string orig = normalizePath(inc);
- string curr = orig; // The current shortest pathname.
- string cwd = getCwd();
-
- //
- // Compare the pathname of the included file against each of the include directories.
- // If any of the include directories match the leading part of the included file,
- // then select the include directory whose removal results in the shortest pathname.
- //
- for(vector<string>::const_iterator p = includePaths.begin(); p != includePaths.end(); ++p)
- {
- string includePath = *p;
- if(isAbsolute(orig) && !isAbsolute(includePath))
- {
- includePath = cwd + "/" + includePath;
- }
- includePath = normalizePath(includePath);
-
- if(orig.compare(0, includePath.size(), includePath) == 0)
- {
- string s = orig.substr(includePath.size());
- if(s.size() < curr.size())
- {
- curr = s;
- }
- }
- }
-
- string::size_type pos = curr.rfind('.');
- if(pos != string::npos)
- {
- curr.erase(pos);
- }
-
- return curr;
-}
-
void
Slice::Ruby::generate(const UnitPtr& un, bool all, bool checksum, const vector<string>& includePaths, Output& out)
{
@@ -1650,11 +1610,7 @@ Slice::Ruby::generate(const UnitPtr& un, bool all, bool checksum, const vector<s
vector<string> paths = includePaths;
for(vector<string>::iterator p = paths.begin(); p != paths.end(); ++p)
{
- if(p->size() && (*p)[p->size() - 1] != '/')
- {
- *p += '/';
- }
- *p = normalizePath(*p);
+ *p = fullPath(*p);
}
StringList includes = un->includeFiles();
diff --git a/cpp/src/Slice/Util.cpp b/cpp/src/Slice/Util.cpp
index c4cb197e655..4d6be4e1834 100644
--- a/cpp/src/Slice/Util.cpp
+++ b/cpp/src/Slice/Util.cpp
@@ -11,9 +11,7 @@
#include <IceUtil/Unicode.h>
#include <climits>
-#ifdef __hpux
-# include <unistd.h>
-#endif
+#include <unistd.h> // For readlink()
#ifdef __BCPLUSPLUS__
# include <dir.h>
@@ -22,74 +20,143 @@
using namespace std;
using namespace Slice;
-string
-Slice::getCwd()
+static string
+normalizePath(const string& path)
{
-#ifdef _WIN32
- wchar_t cwdbuf[_MAX_PATH];
- if(_wgetcwd(cwdbuf, _MAX_PATH) != NULL)
+ string result = path;
+ replace(result.begin(), result.end(), '\\', '/');
+ string::size_type pos;
+ while((pos = result.find("//")) != string::npos)
{
- return IceUtil::wstringToString(cwdbuf);
+ result.replace(pos, 2, "/");
}
-#else
- char cwdbuf[PATH_MAX];
- if(::getcwd(cwdbuf, PATH_MAX) != NULL)
+ pos = 0;
+ while((pos = result.find("/./", pos)) != string::npos)
{
- return cwdbuf;
+ result.erase(pos, 2);
}
-#endif
- return "";
+ pos = 0;
+ while((pos = result.find("/..", pos)) != string::npos)
+ {
+ string::size_type last = result.find_last_of("/", pos - 1);
+ if(last != string::npos && result.substr(last, 4) != "/../")
+ {
+ result.erase(last, pos - last + 3);
+ pos = last;
+ }
+ else
+ {
+ ++pos;
+ }
+ }
+ if(result[result.size() - 1] == '/') // Remove trailing '/'
+ {
+ result.erase(result.size() - 1);
+ }
+ return result;
}
bool
Slice::isAbsolute(const string& path)
{
#ifdef _WIN32
- if(path[0] == '\\' || path[0] == '/' || path.size() > 1 && isalpha(path[0]) && path[1] == ':')
+ if(path[0] == '\\' || path[0] == '/' || path.size() > 1 && isalpha(path[0]) && path[1] == ':')
#else
- if(path[0] == '/')
+ if(path[0] == '/')
#endif
- {
- return true;
- }
-
- return false;
+ {
+ return true;
+ }
+ return false;
}
string
-Slice::normalizePath(const string& path, bool removeDriveLetter)
+Slice::fullPath(const string& path)
{
- string result = path;
- replace(result.begin(), result.end(), '\\', '/');
- string::size_type pos;
- while((pos = result.find("//")) != string::npos)
+#ifdef _WIN32
+ if(!isAbsolute(path))
{
- result.replace(pos, 2, "/");
+ wchar_t cwdbuf[_MAX_PATH];
+ if(_wgetcwd(cwdbuf, _MAX_PATH) != NULL)
+ {
+ return normalizePath(IceUtil::wstringToString(cwdbuf) + "/" + path);
+ }
}
- pos = 0;
- while((pos = result.find("/./", pos)) != string::npos)
+ return normalizePath(path);
+#else
+ string result = path;
+ if(!isAbsolute(result))
{
- result.erase(pos, 2);
+ char cwdbuf[PATH_MAX];
+ if(::getcwd(cwdbuf, PATH_MAX) != NULL)
+ {
+ result = string(cwdbuf) + '/' + result;
+ }
}
- pos = 0;
- while((pos = result.find("/..", pos)) != string::npos)
+ result = normalizePath(result);
+
+ string::size_type beg = 0;
+ string::size_type next;
+ do
{
- string::size_type last = result.find_last_of("/", pos - 1);
- if(last != string::npos && result.substr(last, 4) != "/../")
+ string subpath;
+ next = result.find('/', beg + 1);
+ if(next == string::npos)
{
- result.erase(last, pos - last + 3);
- pos = last;
+ subpath = result;
}
else
{
- ++pos;
+ subpath = result.substr(0, next);
+ }
+
+ char buf[PATH_MAX + 1];
+ int len = readlink(subpath.c_str(), buf, sizeof(buf));
+ if(len > 0)
+ {
+ buf[len] = '\0';
+ result = normalizePath(buf) + (next != string::npos ? result.substr(next) : string());
+ beg = 0;
+ next = 0;
+ }
+ else
+ {
+ beg = next;
}
}
+ while(next != string::npos);
+ return result;
+#endif
+}
- if(removeDriveLetter && result.size() > 1 && isalpha(result[0]) && result[1] == ':')
+string
+Slice::changeInclude(const string& orig, const vector<string>& includePaths)
+{
+ string file = fullPath(orig);
+
+ //
+ // Compare each include path against the included file and select
+ // the path that produces the shortest relative filename.
+ //
+ string result = file;
+ for(vector<string>::const_iterator p = includePaths.begin(); p != includePaths.end(); ++p)
{
- result = result.substr(2);
+ if(file.compare(0, p->length(), *p) == 0)
+ {
+ string s = file.substr(p->length() + 1); // + 1 for the '/'
+ if(s.size() < result.size())
+ {
+ result = s;
+ }
+ }
+ }
+
+ string::size_type pos;
+ if((pos = result.rfind('.')) != string::npos)
+ {
+ result.erase(pos);
}
return result;
}
+
diff --git a/cpp/src/Slice/Util.h b/cpp/src/Slice/Util.h
deleted file mode 100644
index 26713a8656d..00000000000
--- a/cpp/src/Slice/Util.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// **********************************************************************
-//
-// Copyright (c) 2003-2008 ZeroC, Inc. All rights reserved.
-//
-// This copy of Ice is licensed to you under the terms described in the
-// ICE_LICENSE file included in this distribution.
-//
-// **********************************************************************
-
-#ifndef _SLICE_UTIL_H
-#define _SLICEP_UTIL_H
-
-#include <Slice/Parser.h>
-
-namespace Slice
-{
-
-SLICE_API std::string getCwd();
-SLICE_API bool isAbsolute(const std::string&);
-SLICE_API std::string normalizePath(const std::string&, bool = false);
-
-}
-
-#endif
diff --git a/cpp/src/slice2cpp/Gen.cpp b/cpp/src/slice2cpp/Gen.cpp
index 85662dff609..152837e9799 100755
--- a/cpp/src/slice2cpp/Gen.cpp
+++ b/cpp/src/slice2cpp/Gen.cpp
@@ -8,6 +8,7 @@
// **********************************************************************
#include <Gen.h>
+#include <Slice/Util.h>
#include <Slice/CPlusPlusUtil.h>
#include <IceUtil/Functional.h>
#include <IceUtil/Iterator.h>
@@ -68,10 +69,7 @@ Slice::Gen::Gen(const string& name, const string& base, const string& headerExte
for(vector<string>::iterator p = _includePaths.begin(); p != _includePaths.end(); ++p)
{
- if(p->length() && (*p)[p->length() - 1] != '/')
- {
- *p += '/';
- }
+ *p = fullPath(*p);
}
string::size_type pos = _base.find_last_of("/\\");
@@ -155,8 +153,8 @@ Slice::Gen::Gen(const string& name, const string& base, const string& headerExte
printHeader(H);
printHeader(C);
- H << "\n// Generated from file `" << changeInclude(_base, _includePaths) << ".ice'\n";
- C << "\n// Generated from file `" << changeInclude(_base, _includePaths) << ".ice'\n";
+ H << "\n// Generated from file `" << _base << ".ice'\n";
+ C << "\n// Generated from file `" << _base << ".ice'\n";
string s = fileH;
if(_include.size())
diff --git a/cpp/src/slice2cppe/Gen.cpp b/cpp/src/slice2cppe/Gen.cpp
index 9ecaf80640a..8baa671d1e6 100644
--- a/cpp/src/slice2cppe/Gen.cpp
+++ b/cpp/src/slice2cppe/Gen.cpp
@@ -8,6 +8,7 @@
// **********************************************************************
#include <Gen.h>
+#include <Slice/Util.h>
#include <Slice/CPlusPlusUtil.h>
#include <Slice/SignalHandler.h>
#include <IceUtil/Functional.h>
@@ -89,10 +90,7 @@ Slice::Gen::Gen(const string& name, const string& base, const string& headerExte
for(vector<string>::iterator p = _includePaths.begin(); p != _includePaths.end(); ++p)
{
- if(p->length() && (*p)[p->length() - 1] != '/')
- {
- *p += '/';
- }
+ *p = fullPath(*p);
}
string::size_type pos = _base.find_last_of("/\\");
diff --git a/cpp/src/slice2freeze/Main.cpp b/cpp/src/slice2freeze/Main.cpp
index f7b6c692971..417f50ad6aa 100644
--- a/cpp/src/slice2freeze/Main.cpp
+++ b/cpp/src/slice2freeze/Main.cpp
@@ -10,6 +10,7 @@
#include <IceUtil/DisableWarnings.h>
#include <IceUtil/Options.h>
#include <Slice/Preprocessor.h>
+#include <Slice/Util.h>
#include <Slice/CPlusPlusUtil.h>
#include <IceUtil/OutputUtil.h>
#include <Slice/SignalHandler.h>
@@ -1848,10 +1849,7 @@ main(int argc, char* argv[])
{
for(vector<string>::iterator p = includePaths.begin(); p != includePaths.end(); ++p)
{
- if(p->length() && (*p)[p->length() - 1] != '/')
- {
- *p += '/';
- }
+ *p = fullPath(*p);
}
}