blob: a0a76a566e76043d41b42d622936f5604566b23a [file] [log] [blame]
Ted Kremenek33245d32008-04-16 04:38:45 +00001//===--- HTMLPrint.cpp - Source code -> HTML pretty-printing --------------===//
Ted Kremenekd1cf5592008-03-18 22:21:07 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Ted Kremenek33245d32008-04-16 04:38:45 +000010// Pretty-printing of source code to HTML.
Ted Kremenekd1cf5592008-03-18 22:21:07 +000011//
12//===----------------------------------------------------------------------===//
13
14#include "ASTConsumers.h"
15#include "clang/AST/ASTConsumer.h"
16#include "clang/Rewrite/Rewriter.h"
17#include "clang/Rewrite/HTMLRewrite.h"
18#include "clang/Basic/SourceManager.h"
Ted Kremenekd1cf5592008-03-18 22:21:07 +000019#include "clang/AST/ASTContext.h"
20
21using namespace clang;
22
Ted Kremeneke1a79d82008-03-19 07:53:42 +000023//===----------------------------------------------------------------------===//
24// Functional HTML pretty-printing.
25//===----------------------------------------------------------------------===//
26
Ted Kremenekd1cf5592008-03-18 22:21:07 +000027namespace {
28 class HTMLPrinter : public ASTConsumer {
29 Rewriter R;
30 public:
31 HTMLPrinter() {}
32 virtual ~HTMLPrinter();
33
34 void Initialize(ASTContext &context);
35 };
36}
37
38ASTConsumer* clang::CreateHTMLPrinter() { return new HTMLPrinter(); }
39
40void HTMLPrinter::Initialize(ASTContext &context) {
41 R.setSourceMgr(context.getSourceManager());
42}
43
44HTMLPrinter::~HTMLPrinter() {
Ted Kremenekd1cf5592008-03-18 22:21:07 +000045
Ted Kremeneke1a79d82008-03-19 07:53:42 +000046 unsigned FileID = R.getSourceMgr().getMainFileID();
Ted Kremenekbb404482008-04-08 23:25:54 +000047 html::EscapeText(R, FileID, false, true);
Ted Kremenekd1cf5592008-03-18 22:21:07 +000048 html::AddLineNumbers(R, FileID);
Ted Kremenek0735c172008-03-19 06:14:37 +000049 html::AddHeaderFooterInternalBuiltinCSS(R, FileID);
Ted Kremenekd1cf5592008-03-18 22:21:07 +000050
51 // Emit the HTML.
52
53 if (const RewriteBuffer *RewriteBuf = R.getRewriteBufferFor(FileID)) {
Chris Lattnerf8dea312008-04-16 03:46:57 +000054 char *Buffer = (char*)malloc(RewriteBuf->size());
55 std::copy(RewriteBuf->begin(), RewriteBuf->end(), Buffer);
56 fwrite(Buffer, 1, RewriteBuf->size(), stdout);
57 free(Buffer);
Ted Kremenekd1cf5592008-03-18 22:21:07 +000058 }
59}