static PRUint32 net_FindMediaDelimiter(const nsCString& flatStr, PRUint32 searchStart, char delimiter) { do { // searchStart points to the spot from which we should start looking // for the delimiter. const char delimStr[] = { delimiter, '"', '\0' }; PRUint32 curDelimPos = flatStr.FindCharInSet(delimStr, searchStart); if (curDelimPos == PRUint32(kNotFound)) return flatStr.Length(); char ch = flatStr.CharAt(curDelimPos); if (ch == delimiter) { // Found delimiter return curDelimPos; } // We hit the start of a quoted string. Look for its end. searchStart = net_FindStringEnd(flatStr, curDelimPos, ch); if (searchStart == flatStr.Length()) return searchStart; ++searchStart; // searchStart now points to the first char after the end of the // string, so just go back to the top of the loop and look for // |delimiter| again. } while (true); NS_NOTREACHED("How did we get here?"); return flatStr.Length(); }
nsresult nsGopherContentStream::ParseTypeAndSelector(char &type, nsCString &selector) { nsCAutoString buffer; nsresult rv = mChannel->URI()->GetPath(buffer); // unescaped down below if (NS_FAILED(rv)) return rv; // No path given if (buffer[0] == '\0' || (buffer[0] == '/' && buffer[1] == '\0')) { type = '1'; selector.Truncate(); } else { NS_ENSURE_STATE(buffer[1] != '\0'); type = buffer[1]; // Ignore leading '/' // Do it this way in case selector contains embedded nulls after // unescaping. char *sel = buffer.BeginWriting() + 2; PRInt32 count = nsUnescapeCount(sel); selector.Assign(sel, count); // NOTE: FindCharInSet cannot be used to search for a null byte. if (selector.FindCharInSet("\t\n\r") != kNotFound || selector.FindChar('\0') != kNotFound) { // gopher selectors cannot containt tab, cr, lf, or \0 return NS_ERROR_MALFORMED_URI; } } return NS_OK; }
// Return the index of the closing quote of the string, if any static PRUint32 net_FindStringEnd(const nsCString& flatStr, PRUint32 stringStart, char stringDelim) { NS_ASSERTION(stringStart < flatStr.Length() && flatStr.CharAt(stringStart) == stringDelim && (stringDelim == '"' || stringDelim == '\''), "Invalid stringStart"); const char set[] = { stringDelim, '\\', '\0' }; do { // stringStart points to either the start quote or the last // escaped char (the char following a '\\') // Write to searchStart here, so that when we get back to the // top of the loop right outside this one we search from the // right place. PRUint32 stringEnd = flatStr.FindCharInSet(set, stringStart + 1); if (stringEnd == PRUint32(kNotFound)) return flatStr.Length(); if (flatStr.CharAt(stringEnd) == '\\') { // Hit a backslash-escaped char. Need to skip over it. stringStart = stringEnd + 1; if (stringStart == flatStr.Length()) return stringStart; // Go back to looking for the next escape or the string end continue; } return stringEnd; } while (true); NS_NOTREACHED("How did we get here?"); return flatStr.Length(); }