From 6df562cf481f50f13458f8f458e1faaff3cb8f9a Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Tue, 23 Oct 2001 15:32:52 +0000 Subject: [PATCH] Convert nsXMLProcessingInstruction::GetAttrValue to iterators. Bug 106163, r=jag, sr=jst --- .../src/nsXMLProcessingInstruction.cpp | 87 +++++++++++-------- 1 file changed, 51 insertions(+), 36 deletions(-) diff --git a/content/xml/content/src/nsXMLProcessingInstruction.cpp b/content/xml/content/src/nsXMLProcessingInstruction.cpp index 66cfdaa1d7e4..8be1c1a22cfd 100644 --- a/content/xml/content/src/nsXMLProcessingInstruction.cpp +++ b/content/xml/content/src/nsXMLProcessingInstruction.cpp @@ -291,7 +291,7 @@ public: PRBool* aIsAlternate); protected: - PRBool GetAttrValue(const char *aAttr, nsString& aValue); + PRBool GetAttrValue(const nsAString& aAttr, nsAString& aValue); // XXX Processing instructions are currently implemented by using // the generic CharacterData inner object, even though PIs are not @@ -367,47 +367,62 @@ nsXMLProcessingInstruction::SetData(const nsAReadableString& aData) } PRBool -nsXMLProcessingInstruction::GetAttrValue(const char *aAttr, nsString& aValue) +nsXMLProcessingInstruction::GetAttrValue(const nsAString& aAttr, nsAString& aValue) { nsAutoString data; mInner.GetData(data); + aValue.Truncate(); + nsAString::const_iterator start, end; + data.BeginReading(start); + data.EndReading(end); + nsAString::const_iterator iter(end); - while (1) { - aValue.Truncate(); + while (start != end) { - PRInt32 pos = data.Find(aAttr); + if (FindInReadable(aAttr, start, iter)) { + // walk past any whitespace + while (iter != end && nsCRT::IsAsciiSpace(*iter)) { + ++iter; + } - if (pos < 0) - return PR_FALSE; + if (iter == end) + break; + + // valid name="value" pair? + if (*iter != '=') { + start = iter; + iter = end; + continue; + } + // move past the = + ++iter; - // Cut off data up to the end of the attr string - data.Cut(0, pos + nsCRT::strlen(aAttr)); - data.CompressWhitespace(); + while (iter != end && nsCRT::IsAsciiSpace(*iter)) { + ++iter; + } + + if (iter == end) + break; - if (data.First() != '=') - continue; + PRUnichar q = *iter; + if (q != '"' && q != '\'') { + start = iter; + iter = end; + continue; + } - // Cut off the '=' - data.Cut(0, 1); - data.CompressWhitespace(); + // point to the first char of the value + ++iter; + start = iter; + if (FindCharInReadable(q, iter, end)) { + aValue = Substring(start, iter); + return PR_TRUE; + } - PRUnichar q = data.First(); - - if (q != '"' && q != '\'') - continue; - - // Cut off the first quote character - data.Cut(0, 1); - - pos = data.FindChar(q); - - if (pos < 0) - return PR_FALSE; - - data.Left(aValue, pos); - - return PR_TRUE; + // we've run out of string. Just return... + break; + } } return PR_FALSE; @@ -588,17 +603,17 @@ nsXMLProcessingInstruction::GetStyleSheetInfo(nsAWritableString& aUrl, nsAutoString href, title, type, media, alternate; - GetAttrValue("href", href); + GetAttrValue(NS_LITERAL_STRING("href"), href); if (href.IsEmpty()) { // if href is empty then just bail return; } - GetAttrValue("title", title); + GetAttrValue(NS_LITERAL_STRING("title"), title); title.CompressWhitespace(); aTitle.Assign(title); - GetAttrValue("alternate", alternate); + GetAttrValue(NS_LITERAL_STRING("alternate"), alternate); // if alternate, does it have title? if (alternate.Equals(NS_LITERAL_STRING("yes"))) { @@ -609,11 +624,11 @@ nsXMLProcessingInstruction::GetStyleSheetInfo(nsAWritableString& aUrl, } } - GetAttrValue("media", media); + GetAttrValue(NS_LITERAL_STRING("media"), media); aMedia.Assign(media); ToLowerCase(aMedia); // case sensitivity? - GetAttrValue("type", type); + GetAttrValue(NS_LITERAL_STRING("type"), type); nsAutoString mimeType; nsAutoString notUsed;