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
diff --git a/lib/Rewrite/HTMLRewrite.cpp b/lib/Rewrite/HTMLRewrite.cpp
index 7fea7fa..c832eff 100644
--- a/lib/Rewrite/HTMLRewrite.cpp
+++ b/lib/Rewrite/HTMLRewrite.cpp
@@ -29,20 +29,40 @@
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 @@
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 @@
// 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.