diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Slice/.depend | 14 | ||||
-rw-r--r-- | cpp/src/Slice/CPlusPlusUtil.cpp | 71 | ||||
-rw-r--r-- | cpp/src/Slice/Parser.cpp | 13 | ||||
-rwxr-xr-x | cpp/src/Slice/Preprocessor.cpp | 28 | ||||
-rw-r--r-- | cpp/src/Slice/PythonUtil.cpp | 46 | ||||
-rw-r--r-- | cpp/src/Slice/RubyUtil.cpp | 46 | ||||
-rw-r--r-- | cpp/src/Slice/Util.cpp | 147 | ||||
-rw-r--r-- | cpp/src/Slice/Util.h | 24 | ||||
-rwxr-xr-x | cpp/src/slice2cpp/Gen.cpp | 10 | ||||
-rw-r--r-- | cpp/src/slice2cppe/Gen.cpp | 6 | ||||
-rw-r--r-- | cpp/src/slice2freeze/Main.cpp | 6 |
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); } } |