aboutsummaryrefslogtreecommitdiff
path: root/tools/llvm-ar/llvm-ar.cpp
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2004-12-02 09:21:55 +0000
committerReid Spencer <rspencer@reidspencer.com>2004-12-02 09:21:55 +0000
commit0de66b5cc8766102197c565a32bc7f9436b607da (patch)
tree55dd1ddd7fa27fa994b1be44e54329c54558b219 /tools/llvm-ar/llvm-ar.cpp
parent86ac2dcda153cbf317fa6ea7c8ad97ec0f173c4c (diff)
Implement file replacement correctly even with the f (TruncateNames) flag
set. The member name comparison was failing for truncated names. This patch fixes that. Truncated names are now properly replaced. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18423 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-ar/llvm-ar.cpp')
-rw-r--r--tools/llvm-ar/llvm-ar.cpp25
1 files changed, 23 insertions, 2 deletions
diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp
index 0707fd66e7..2a9b4717d0 100644
--- a/tools/llvm-ar/llvm-ar.cpp
+++ b/tools/llvm-ar/llvm-ar.cpp
@@ -578,8 +578,29 @@ void doReplaceOrInsert() {
// Determine if this archive member matches one of the paths we're trying
// to replace.
- std::set<sys::Path>::iterator found =
- std::find(remaining.begin(),remaining.end(), I->getPath());
+
+ std::set<sys::Path>::iterator found = remaining.end();
+ for (std::set<sys::Path>::iterator RI = remaining.begin(),
+ RE = remaining.end(); RI != RE; ++RI ) {
+ std::string compare(RI->get());
+ if (TruncateNames && compare.length() > 15) {
+ const char* nm = compare.c_str();
+ unsigned len = compare.length();
+ size_t slashpos = compare.rfind('/');
+ if (slashpos != std::string::npos) {
+ nm += slashpos + 1;
+ len -= slashpos +1;
+ }
+ if (len > 15)
+ len = 15;
+ compare.assign(nm,len);
+ }
+ if (compare == I->getPath().get()) {
+ found = RI;
+ break;
+ }
+ }
+
if (found != remaining.end()) {
sys::Path::StatusInfo si;
found->getStatusInfo(si);