diff options
-rw-r--r-- | Driver/ASTConsumers.h | 3 | ||||
-rw-r--r-- | Driver/clang.cpp | 8 | ||||
-rw-r--r-- | include/clang/Rewrite/HTMLRewrite.h | 37 | ||||
-rw-r--r-- | lib/Rewrite/HTMLRewrite.cpp | 77 |
4 files changed, 124 insertions, 1 deletions
diff --git a/Driver/ASTConsumers.h b/Driver/ASTConsumers.h index 815f3cc438..fd9651ded2 100644 --- a/Driver/ASTConsumers.h +++ b/Driver/ASTConsumers.h @@ -53,6 +53,9 @@ ASTConsumer *CreateCodeRewriterTest(const std::string& InFile, Diagnostic &Diags, const LangOptions &LOpts); +ASTConsumer* CreateHTMLPrinter(); + + ASTConsumer *CreateSerializationTest(Diagnostic &Diags, FileManager& FMgr, const LangOptions &LOpts); diff --git a/Driver/clang.cpp b/Driver/clang.cpp index c004d9d6b1..333ac6096a 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -63,6 +63,7 @@ enum ProgActions { EmitLLVM, // Emit a .ll file. EmitBC, // Emit a .bc file. SerializeAST, // Emit a .ast file. + EmitHTML, // Translate input source into HTML. ASTPrint, // Parse ASTs and print them. ASTDump, // Parse ASTs and dump them. ASTView, // Parse ASTs and view them in Graphviz. @@ -100,6 +101,8 @@ ProgAction(llvm::cl::desc("Choose output type:"), llvm::cl::ZeroOrMore, "Run parser and perform semantic analysis"), clEnumValN(ParsePrintCallbacks, "parse-print-callbacks", "Run parser and print each callback invoked"), + clEnumValN(EmitHTML, "emit-html", + "Output input source as HTML"), clEnumValN(ASTPrint, "ast-print", "Build ASTs and then pretty-print them"), clEnumValN(ASTDump, "ast-dump", @@ -994,7 +997,10 @@ static ASTConsumer* CreateASTConsumer(const std::string& InFile, return CreateASTDumper(); case ASTView: - return CreateASTViewer(); + return CreateASTViewer(); + + case EmitHTML: + return CreateHTMLPrinter(); case ParseCFGDump: case ParseCFGView: diff --git a/include/clang/Rewrite/HTMLRewrite.h b/include/clang/Rewrite/HTMLRewrite.h new file mode 100644 index 0000000000..3270cddf59 --- /dev/null +++ b/include/clang/Rewrite/HTMLRewrite.h @@ -0,0 +1,37 @@ +//==- HTMLRewrite.h - Translate source code into prettified HTML ---*- C++ -*-// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines a set of functions used for translating source code +// into beautified HTML. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_HTMLREWRITER_H +#define LLVM_CLANG_HTMLREWRITER_H + +#include "clang/Basic/SourceLocation.h" + +namespace clang { + +class Rewriter; + +namespace html { + + enum Tags { PRE, HEAD, BODY }; + + void EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces = false); + + void InsertTag(Rewriter& R, Tags tag, + SourceLocation OpenLoc, SourceLocation CloseLoc, + bool NewlineOpen = false, bool NewlineClose = true); + +} // end html namespace +} // end clang namespace + +#endif diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp new file mode 100644 index 0000000000..3beede8697 --- /dev/null +++ b/lib/Rewrite/HTMLRewrite.cpp @@ -0,0 +1,77 @@ +//== HTMLRewrite.cpp - Translate source code into prettified HTML --*- C++ -*-// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the HTMLRewriter clas, which is used to translate the +// text of a source file into prettified HTML. +// +//===----------------------------------------------------------------------===// + +#include "clang/Rewrite/Rewriter.h" +#include "clang/Rewrite/HTMLRewrite.h" +#include "clang/Basic/SourceManager.h" +#include "llvm/Support/MemoryBuffer.h" +#include <sstream> + +using namespace clang; + +void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { + + const llvm::MemoryBuffer *Buf = R.getSourceMgr().getBuffer(FileID); + const char* C = Buf->getBufferStart(); + const char* FileEnd = Buf->getBufferEnd(); + + assert (C <= FileEnd); + + for (unsigned FilePos = 0; C != FileEnd ; ++C, ++FilePos) { + + SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos); + + switch (*C) { + default: break; + + case ' ': + if (EscapeSpaces) R.ReplaceText(Loc, 1, " ", 5); + break; + + case '<': R.ReplaceText(Loc, 1, "<", 4); break; + case '>': R.ReplaceText(Loc, 1, ">", 4); break; + case '&': R.ReplaceText(Loc, 1, "&", 5); break; + } + } +} + +void html::InsertTag(Rewriter& R, html::Tags tag, + SourceLocation B, SourceLocation E, + bool NewlineOpen, bool NewlineClose) { + + const char* TagStr = 0; + + switch (tag) { + default: break; + case PRE: TagStr = "pre"; break; + case HEAD: TagStr = "head"; break; + case BODY: TagStr = "body"; break; + } + + assert (TagStr && "Tag not supported."); + + { // Generate the opening tag. + std::ostringstream os; + os << '<' << TagStr << '>'; + if (NewlineOpen) os << '\n'; + R.InsertTextAfter(B, os.str().c_str(), os.str().size()); + } + + { // Generate the closing tag. + std::ostringstream os; + os << "</" << TagStr << '>'; + if (NewlineClose) os << '\n'; + R.InsertTextBefore(E, os.str().c_str(), os.str().size()); + } +} |