Add -o support for -emit-html, make it not produce a file on an error.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49777 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Driver/HTMLPrint.cpp b/Driver/HTMLPrint.cpp
index a0a76a5..44cd624 100644
--- a/Driver/HTMLPrint.cpp
+++ b/Driver/HTMLPrint.cpp
@@ -15,6 +15,7 @@
 #include "clang/AST/ASTConsumer.h"
 #include "clang/Rewrite/Rewriter.h"
 #include "clang/Rewrite/HTMLRewrite.h"
+#include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/AST/ASTContext.h"
 
@@ -27,33 +28,54 @@
 namespace {
   class HTMLPrinter : public ASTConsumer {
     Rewriter R;
+    std::string OutFilename;
+    Diagnostic &Diags;
   public:
-    HTMLPrinter() {}
+    HTMLPrinter(const std::string &OutFile, Diagnostic &D)
+      : OutFilename(OutFile), Diags(D) {}
     virtual ~HTMLPrinter();
     
     void Initialize(ASTContext &context);
   };
 }
 
-ASTConsumer* clang::CreateHTMLPrinter() { return new HTMLPrinter(); }
+ASTConsumer* clang::CreateHTMLPrinter(const std::string &OutFile, 
+                                      Diagnostic &D) {
+  return new HTMLPrinter(OutFile, D);
+}
 
 void HTMLPrinter::Initialize(ASTContext &context) {
   R.setSourceMgr(context.getSourceManager());
 }
 
 HTMLPrinter::~HTMLPrinter() {
-  
+  if (Diags.hasErrorOccurred())
+    return;
+
+  // Format the file.
   unsigned FileID = R.getSourceMgr().getMainFileID();
   html::EscapeText(R, FileID, false, true);
   html::AddLineNumbers(R, FileID);
   html::AddHeaderFooterInternalBuiltinCSS(R, FileID);
+
+  // Open the output.
+  FILE *OutputFILE;
+  if (OutFilename.empty() || OutFilename == "-")
+    OutputFILE = stdout;
+  else {
+    OutputFILE = fopen(OutFilename.c_str(), "w+");
+    if (OutputFILE == 0) {
+      fprintf(stderr, "Error opening output file '%s'.\n", OutFilename.c_str());
+      exit(1);
+    }
+  }
   
   // Emit the HTML.
+  const RewriteBuffer &RewriteBuf = R.getEditBuffer(FileID);
+  char *Buffer = (char*)malloc(RewriteBuf.size());
+  std::copy(RewriteBuf.begin(), RewriteBuf.end(), Buffer);
+  fwrite(Buffer, 1, RewriteBuf.size(), OutputFILE);
+  free(Buffer);
   
-  if (const RewriteBuffer *RewriteBuf = R.getRewriteBufferFor(FileID)) {
-    char *Buffer = (char*)malloc(RewriteBuf->size());
-    std::copy(RewriteBuf->begin(), RewriteBuf->end(), Buffer);
-    fwrite(Buffer, 1, RewriteBuf->size(), stdout);
-    free(Buffer);
-  }
+  if (OutputFILE != stdout) fclose(OutputFILE);
 }