From: Ted Kremenek Date: Tue, 8 Apr 2008 22:37:58 +0000 (+0000) Subject: Don't expand tabs in EscapeText, but rather expand them when writing out X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fa5be3617294f0e3c341f0ecb6b2076478b1b5ac;p=clang Don't expand tabs in EscapeText, but rather expand them when writing out the HTML file. This should reduce the amount of memory pressure on the rewriter for files that have a lot of tabs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49406 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/HTMLDiagnostics.cpp b/Driver/HTMLDiagnostics.cpp index 870628963a..6910af74d0 100644 --- a/Driver/HTMLDiagnostics.cpp +++ b/Driver/HTMLDiagnostics.cpp @@ -199,8 +199,13 @@ void HTMLDiagnostics::HandlePathDiagnostic(const PathDiagnostic& D) { // Emit the HTML to disk. - for (RewriteBuffer::iterator I = Buf->begin(), E = Buf->end(); I!=E; ++I) - os << *I; + for (RewriteBuffer::iterator I = Buf->begin(), E = Buf->end(); I!=E; ++I) { + // Expand tabs. + if (*I == '\t') + os << " "; + else + os << *I; + } } void HTMLDiagnostics::HandlePiece(Rewriter& R, diff --git a/include/clang/Rewrite/HTMLRewrite.h b/include/clang/Rewrite/HTMLRewrite.h index b8f9b95913..d5bdc89070 100644 --- a/include/clang/Rewrite/HTMLRewrite.h +++ b/include/clang/Rewrite/HTMLRewrite.h @@ -24,8 +24,20 @@ class Rewriter; namespace html { - void EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces = false); - std::string EscapeText(const std::string& s, bool EscapeSpaces = false); + /// EscapeText - HTMLize a specified file so that special characters are + /// are translated so that they are not interpreted as HTML tags. In this + /// version tabs are not replaced with spaces by default, as this can + /// introduce a serious performance overhead as the amount of replaced + /// text can be very large. + void EscapeText(Rewriter& R, unsigned FileID, + bool EscapeSpaces = false, bool ReplacesTabs = false); + + /// EscapeText - HTMLized the provided string so that special characters + /// in 's' are not interpreted as HTML tags. Unlike the version of + /// EscapeText that rewrites a file, this version by default replaces tabs + /// with spaces. + std::string EscapeText(const std::string& s, + bool EscapeSpaces = false, bool ReplaceTabs = true); void AddLineNumbers(Rewriter& R, unsigned FileID); diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp index 8bc44e3a81..3e0d71a5b6 100644 --- a/lib/Rewrite/HTMLRewrite.cpp +++ b/lib/Rewrite/HTMLRewrite.cpp @@ -20,7 +20,8 @@ using namespace clang; -void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { +void html::EscapeText(Rewriter& R, unsigned FileID, + bool EscapeSpaces, bool ReplaceTabs) { const llvm::MemoryBuffer *Buf = R.getSourceMgr().getBuffer(FileID); const char* C = Buf->getBufferStart(); @@ -41,6 +42,9 @@ void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { break; case '\t': { + if (!ReplaceTabs) + break; + SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos); if (EscapeSpaces) @@ -72,7 +76,8 @@ void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { } } -std::string html::EscapeText(const std::string& s, bool EscapeSpaces) { +std::string html::EscapeText(const std::string& s, bool EscapeSpaces, + bool ReplaceTabs) { unsigned len = s.size(); std::ostringstream os; @@ -90,7 +95,13 @@ std::string html::EscapeText(const std::string& s, bool EscapeSpaces) { else os << ' '; break; - case '\t': for (unsigned i = 0; i < 4; ++i) os << " "; break; + case '\t': + if (ReplaceTabs) + for (unsigned i = 0; i < 4; ++i) os << " "; + else os << c; + + break; + case '<': os << "<"; break; case '>': os << ">"; break; case '&': os << "&"; break;