aboutsummaryrefslogtreecommitdiff
path: root/lib/Rewrite/HTMLRewrite.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-04-03 07:12:29 +0000
committerTed Kremenek <kremenek@apple.com>2008-04-03 07:12:29 +0000
commit49cd6354d5373245dd2e69ca7b7113e6a795d36e (patch)
tree364a4d4c8dbf4eae7206be0f7d18a233c0696019 /lib/Rewrite/HTMLRewrite.cpp
parent10f883fe7ef74139f8778e49acacf0ce408e7088 (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.cpp84
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, "&nbsp;", 6);
+ if (EscapeSpaces) {
+ SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos);
+ R.ReplaceText(Loc, 1, "&nbsp;", 6);
+ }
break;
- case '\t': R.ReplaceText(Loc, 1, "&nbsp;&nbsp;&nbsp;&nbsp;", 6*4); break;
- case '<': R.ReplaceText(Loc, 1, "&lt;", 4); break;
- case '>': R.ReplaceText(Loc, 1, "&gt;", 4); break;
- case '&': R.ReplaceText(Loc, 1, "&amp;", 5); break;
+ case '\t': {
+ SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos);
+ R.ReplaceText(Loc, 1, "&nbsp;&nbsp;&nbsp;&nbsp;", 6*4);
+ break;
+ }
+
+ case '<': {
+ SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos);
+ R.ReplaceText(Loc, 1, "&lt;", 4);
+ break;
+ }
+
+ case '>': {
+ SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos);
+ R.ReplaceText(Loc, 1, "&gt;", 4);
+ break;
+ }
+
+ case '&': {
+ SourceLocation Loc = SourceLocation::getFileLoc(FileID, FilePos);
+ R.ReplaceText(Loc, 1, "&amp;", 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.