static void rdf_EscapeAmpersandsAndAngleBrackets(nsCString& s) { uint32_t newLength, origLength; newLength = origLength = s.Length(); // Compute the length of the result string. const char* start = s.BeginReading(); const char* end = s.EndReading(); const char* c = start; while (c != end) { switch (*c) { case '&' : newLength += sizeof(amp) - 2; break; case '<': case '>': newLength += sizeof(gt) - 2; break; default: break; } ++c; } if (newLength == origLength) { // nothing to escape return; } // escape the chars from the end back to the front. s.SetLength(newLength); // Buffer might have changed, get the pointers again start = s.BeginReading(); // begin of string c = start + origLength - 1; // last char in original string char* w = s.EndWriting() - 1; // last char in grown buffer while (c >= start) { switch (*c) { case '&' : w -= 4; nsCharTraits<char>::copy(w, amp, sizeof(amp) - 1); break; case '<': w -= 3; nsCharTraits<char>::copy(w, lt, sizeof(lt) - 1); break; case '>': w -= 3; nsCharTraits<char>::copy(w, gt, sizeof(gt) - 1); break; default: *w = *c; } --w; --c; } }
// Does an in place rotation of the line static void Rot13Line(nsCString &line) { nsCString::iterator start, end; line.BeginWriting(start); line.EndWriting(end); while (start != end) { *start = kRot13Table[NS_STATIC_CAST(PRInt32, *start)]; ++start; } }