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.

llvm-svn: 49406
This commit is contained in:
Ted Kremenek 2008-04-08 22:37:58 +00:00
parent 5d1647daf9
commit 5f7ece0bff
3 changed files with 35 additions and 7 deletions

View File

@ -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,

View File

@ -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);

View File

@ -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 << "&nbsp;"; break;
case '\t':
if (ReplaceTabs)
for (unsigned i = 0; i < 4; ++i) os << "&nbsp;";
else os << c;
break;
case '<': os << "&lt;"; break;
case '>': os << "&gt;"; break;
case '&': os << "&amp;"; break;