PRBool nsCSSScanner::ParseString(nsresult& aErrorCode, PRInt32 aStop, nsCSSToken& aToken) { aToken.mIdent.SetLength(0); aToken.mType = eCSSToken_String; aToken.mSymbol = PRUnichar(aStop); // remember how it's quoted for (;;) { if (EatNewline(aErrorCode)) { aToken.mType = eCSSToken_Error; #ifdef CSS_REPORT_PARSE_ERRORS ReportUnexpectedToken(aToken, "SEUnterminatedString"); #endif return PR_TRUE; } PRInt32 ch = Read(aErrorCode); if (ch < 0) { return PR_FALSE; } if (ch == aStop) { break; } if (ch == CSS_ESCAPE) { ParseAndAppendEscape(aErrorCode, aToken.mIdent); } else if (0 < ch) { aToken.mIdent.Append(ch); } } return PR_TRUE; }
PRBool nsCSSScanner::ParseString(PRInt32 aStop, nsCSSToken& aToken) { aToken.mIdent.SetLength(0); aToken.mType = eCSSToken_String; aToken.mSymbol = PRUnichar(aStop); // remember how it's quoted for (;;) { // If nothing in pushback, first try to get as much as possible in one go if (!mPushbackCount && EnsureData()) { // See how much we can consume and append in one go PRUint32 n = mOffset; // Count number of characters that can be processed for (;n < mCount; ++n) { PRUnichar nextChar = mReadPointer[n]; if ((nextChar == aStop) || (nextChar == CSS_ESCAPE) || (nextChar == '\n') || (nextChar == '\r') || (nextChar == '\f')) { break; } #ifdef CSS_REPORT_PARSE_ERRORS if (nextChar == '\t') { mColNumber = ((mColNumber - 1 + TAB_STOP_WIDTH) / TAB_STOP_WIDTH) * TAB_STOP_WIDTH; } else { ++mColNumber; } #endif } // Add to the token what we have so far if (n > mOffset) { aToken.mIdent.Append(&mReadPointer[mOffset], n - mOffset); mOffset = n; } } PRInt32 ch = Read(); if (ch < 0 || ch == aStop) { break; } if (ch == '\n') { aToken.mType = eCSSToken_Bad_String; #ifdef CSS_REPORT_PARSE_ERRORS ReportUnexpectedToken(aToken, "SEUnterminatedString"); #endif break; } if (ch == CSS_ESCAPE) { ParseAndAppendEscape(aToken.mIdent); } else { aToken.mIdent.Append(ch); } } return PR_TRUE; }