diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-04-03 07:12:29 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-04-03 07:12:29 +0000 |
commit | 49cd6354d5373245dd2e69ca7b7113e6a795d36e (patch) | |
tree | 364a4d4c8dbf4eae7206be0f7d18a233c0696019 /lib/Rewrite/HTMLRewrite.cpp | |
parent | 10f883fe7ef74139f8778e49acacf0ce408e7088 (diff) |
Some cleanups in EscapeText and AddLineNumbers. Still investigating performance
issues.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49150 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Rewrite/HTMLRewrite.cpp')
-rw-r--r-- | lib/Rewrite/HTMLRewrite.cpp | 84 |
1 files changed, 47 insertions, 37 deletions
diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp index 7fea7fa18f..c832eff46d 100644 --- a/lib/Rewrite/HTMLRewrite.cpp +++ b/lib/Rewrite/HTMLRewrite.cpp @@ -29,20 +29,40 @@ void html::EscapeText(Rewriter& R, unsigned FileID, bool EscapeSpaces) { 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, " ", 6); + if (EscapeSpaces) { + SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos); + R.ReplaceText(Loc, 1, " ", 6); + } break; - case '\t': R.ReplaceText(Loc, 1, " ", 6*4); break; - case '<': R.ReplaceText(Loc, 1, "<", 4); break; - case '>': R.ReplaceText(Loc, 1, ">", 4); break; - case '&': R.ReplaceText(Loc, 1, "&", 5); break; + case '\t': { + SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos); + R.ReplaceText(Loc, 1, " ", 6*4); + break; + } + + case '<': { + SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos); + R.ReplaceText(Loc, 1, "<", 4); + break; + } + + case '>': { + SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos); + R.ReplaceText(Loc, 1, ">", 4); + break; + } + + case '&': { + SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos); + R.ReplaceText(Loc, 1, "&", 5); + break; + } } } } @@ -78,28 +98,17 @@ std::string html::EscapeText(const std::string& s, bool EscapeSpaces) { static void AddLineNumber(Rewriter& R, unsigned LineNo, SourceLocation B, SourceLocation E) { - // Put the closing </tr> first. - - R.InsertCStrBefore(E, "</tr>"); - - if (B == E) // Handle empty lines. - R.InsertCStrBefore(B, "<td class=\"line\"> </td>"); - else { - R.InsertCStrBefore(E, "</td>"); - R.InsertCStrBefore(B, "<td class=\"line\">"); - } - - // Insert a div tag for the line number. - std::ostringstream os; - os << "<td class=\"num\">" << LineNo << "</td>"; - - R.InsertStrBefore(B, os.str()); - - // Now prepend the <tr>. - - R.InsertCStrBefore(B, "<tr>"); + os << "<tr><td class=\"num\">" << LineNo << "</td><td class=\"line\">"; + if (B == E) { // Handle empty lines. + os << " </td></tr>"; + R.InsertStrBefore(B, os.str()); + } + else { + R.InsertStrBefore(B, os.str()); + R.InsertCStrBefore(E, "</td></tr>"); + } } void html::AddLineNumbers(Rewriter& R, unsigned FileID) { @@ -125,20 +134,21 @@ void html::AddLineNumbers(Rewriter& R, unsigned FileID) { // Scan until the newline (or end-of-file). - for ( ; C != FileEnd ; ++C, ++FilePos) - if (*C == '\n') { - LineEndPos = FilePos; + while (C != FileEnd) { + char c = *C; + ++C; + + if (c == '\n') { + LineEndPos = FilePos++; break; } + + ++FilePos; + } AddLineNumber(R, LineNo, SourceLocation::getFileLoc(FileID, LineStartPos), - SourceLocation::getFileLoc(FileID, LineEndPos)); - - if (C != FileEnd) { - ++C; - ++FilePos; - } + SourceLocation::getFileLoc(FileID, LineEndPos)); } // Add one big div tag that surrounds all of the code. |