]> granicus.if.org Git - clang/commitdiff
clang/lib/Driver/Multilib.cpp: Rewrite normalizePathSegment() to be tolerant dosish...
authorNAKAMURA Takumi <geek4civic@gmail.com>
Wed, 12 Feb 2014 11:42:02 +0000 (11:42 +0000)
committerNAKAMURA Takumi <geek4civic@gmail.com>
Wed, 12 Feb 2014 11:42:02 +0000 (11:42 +0000)
FIXME: It could be more simple...

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201227 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/Multilib.cpp

index 746d01bfb2411b0ca2079d6f7c303b4d55d61fb4..6681e7f3649217981e42b57c2c8f1d8a856cf704 100644 (file)
 using namespace clang::driver;
 using namespace clang;
 using namespace llvm::opt;
+using namespace llvm::sys;
 
+/// normalize Segment to "/foo/bar" or "".
 static void normalizePathSegment(std::string &Segment) {
-  if (Segment.empty() || Segment == "/." || Segment == "/" || Segment == ".") {
+  StringRef seg = Segment;
+
+  // Prune trailing "/" or "./"
+  while (1) {
+    StringRef last = *--path::end(seg);
+    if (last != ".")
+      break;
+    seg = path::parent_path(seg);
+  }
+
+  if (seg.empty() || seg == "/") {
     Segment = "";
+    return;
+  }
+
+  // Add leading '/'
+  if (seg.front() != '/') {
+    Segment = "/" + seg.str();
   } else {
-    if (StringRef(Segment).back() == '/')
-      Segment.erase(Segment.begin() + Segment.size() - 1);
-    if (StringRef(Segment).front() != '/')
-      Segment = "/" + Segment;
+    Segment = seg;
   }
 }