dump strings with escapes and other stuff in them nicely.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40964 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/StmtDumper.cpp b/AST/StmtDumper.cpp
index 145f8a1..62a27eb 100644
--- a/AST/StmtDumper.cpp
+++ b/AST/StmtDumper.cpp
@@ -327,27 +327,26 @@
 void StmtDumper::VisitStringLiteral(StringLiteral *Str) {
   DumpExpr(Str);
   // FIXME: this doesn't print wstrings right.
-  // FIXME: this doesn't print strings with \0's in them.
-  fprintf(F, " \"%s\")", Str->getStrData());
+  fprintf(F, " %s\"", Str->isWide() ? "L" : "");
 
-#if 0
-  if (Str->isWide()) OS << 'L';
-  OS << '"';
-  
   for (unsigned i = 0, e = Str->getByteLength(); i != e; ++i) {
-    switch (Str->getStrData()[i]) {
-    default: OS << Str->getStrData()[i]; break;
+    switch (char C = Str->getStrData()[i]) {
+    default:
+      if (isprint(C))
+        fputc(C, F); 
+      else
+        fprintf(F, "\\%03o", C);
+      break;
     // Handle some common ones to make dumps prettier.
-    case '\\': OS << "\\\\"; break;
-    case '"': OS << "\\\""; break;
-    case '\n': OS << "\\n"; break;
-    case '\t': OS << "\\t"; break;
-    case '\a': OS << "\\a"; break;
-    case '\b': OS << "\\b"; break;
+    case '\\': fprintf(F, "\\\\"); break;
+    case '"':  fprintf(F, "\\\""); break;
+    case '\n': fprintf(F, "\\n"); break;
+    case '\t': fprintf(F, "\\t"); break;
+    case '\a': fprintf(F, "\\a"); break;
+    case '\b': fprintf(F, "\\b"); break;
     }
   }
-  OS << '"';
-#endif
+  fprintf(F, "\")");
 }
 void StmtDumper::VisitParenExpr(ParenExpr *Node) {
   DumpExpr(Node);