]> granicus.if.org Git - clang/commitdiff
Preserve carriage return when using clang-format's XML interface.
authorManuel Klimek <klimek@google.com>
Tue, 3 Dec 2013 09:46:06 +0000 (09:46 +0000)
committerManuel Klimek <klimek@google.com>
Tue, 3 Dec 2013 09:46:06 +0000 (09:46 +0000)
Patch by James Park.

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

tools/clang-format/ClangFormat.cpp

index 513439649d282c94591e78556701d4224b2522ce..d8c0b51ee1c2bad3f07ee5825c9e21d05f0ad85d 100644 (file)
@@ -179,6 +179,26 @@ static bool fillRanges(SourceManager &Sources, FileID ID,
   return false;
 }
 
+static void outputReplacementXML(StringRef Text) {
+  size_t From = 0;
+  size_t Index;
+  while ((Index = Text.find_first_of("\n\r", From)) != StringRef::npos) {
+    llvm::outs() << Text.substr(From, Index - From);
+    switch (Text[Index]) {
+    case '\n':
+      llvm::outs() << "&#10;";
+      break;
+    case '\r':
+      llvm::outs() << "&#13;";
+      break;
+    default:
+      llvm_unreachable("Unexpected character encountered!");
+    }
+    From = Index + 1;
+  }
+  llvm::outs() << Text.substr(From);
+}
+
 // Returns true on error.
 static bool format(StringRef FileName) {
   FileManager Files((FileSystemOptions()));
@@ -211,8 +231,9 @@ static bool format(StringRef FileName) {
          I != E; ++I) {
       llvm::outs() << "<replacement "
                    << "offset='" << I->getOffset() << "' "
-                   << "length='" << I->getLength() << "'>"
-                   << I->getReplacementText() << "</replacement>\n";
+                   << "length='" << I->getLength() << "'>";
+      outputReplacementXML(I->getReplacementText());
+      llvm::outs() << "</replacement>\n";
     }
     llvm::outs() << "</replacements>\n";
   } else {