void VTTScanner::skipRun(const Run& run) { ASSERT(run.start() <= end()); ASSERT(run.end() >= run.start()); ASSERT(run.end() <= end()); seekTo(run.end()); }
inline bool try_merge(Run& run, Iterator iter, Range const& range) { // if *iter intersects with, or is adjacent to, 'range'... if (can_merge(*iter, range)) { typedef typename Range::value_type value_type; typedef integer_traits<value_type> integer_traits; // merge range and *iter merge(*iter, range); // collapse all subsequent ranges that can merge with *iter: Iterator i = iter+1; // 1. skip subsequent ranges completely included in *iter while (i != run.end() && i->last <= iter->last) ++i; // 2. collapse next range if adjacent or overlapping with *iter if (i != run.end() && i->first-1 <= iter->last) { iter->last = i->last; ++i; } // erase all ranges that were collapsed run.erase(iter+1, i); return true; } return false; }
String VTTScanner::extractString(const Run& run) { ASSERT(run.start() == position()); ASSERT(run.start() <= end()); ASSERT(run.end() >= run.start()); ASSERT(run.end() <= end()); String s; if (m_is8Bit) s = String(m_data.characters8, run.length()); else s = String(m_data.characters16, run.length()); seekTo(run.end()); return s; }
bool VTTScanner::scanFloat(float& number) { Run integerRun = collectWhile<isASCIIDigit>(); seekTo(integerRun.end()); Run decimalRun(getPosition(), getPosition(), m_is8Bit); if (scan('.')) { decimalRun = collectWhile<isASCIIDigit>(); seekTo(decimalRun.end()); } // At least one digit required. if (integerRun.isEmpty() && decimalRun.isEmpty()) { // Restore to starting position. seekTo(integerRun.start()); return false; } size_t lengthOfFloat = Run(integerRun.start(), getPosition(), m_is8Bit).length(); bool validNumber; if (m_is8Bit) number = charactersToFloat(integerRun.start(), lengthOfFloat, &validNumber); else number = charactersToFloat(reinterpret_cast<const UChar*>(integerRun.start()), lengthOfFloat, &validNumber); if (!validNumber) number = std::numeric_limits<float>::max(); return true; }
bool VTTScanner::scanRun(const Run& run, const String& toMatch) { ASSERT(run.start() == position()); ASSERT(run.start() <= end()); ASSERT(run.end() >= run.start()); ASSERT(run.end() <= end()); size_t matchLength = run.length(); if (toMatch.length() > matchLength) return false; bool matched; if (m_is8Bit) matched = WTF::equal(toMatch.impl(), m_data.characters8, matchLength); else matched = WTF::equal(toMatch.impl(), m_data.characters16, matchLength); if (matched) seekTo(run.end()); return matched; }
unsigned VTTScanner::scanDigits(int& number) { Run runOfDigits = collectWhile<isASCIIDigit>(); if (runOfDigits.isEmpty()) { number = 0; return 0; } bool validNumber; size_t numDigits = runOfDigits.length(); if (m_is8Bit) number = charactersToIntStrict(m_data.characters8, numDigits, &validNumber); else number = charactersToIntStrict(m_data.characters16, numDigits, &validNumber); // Since we know that scanDigits only scanned valid (ASCII) digits (and // hence that's what got passed to charactersToInt()), the remaining // failure mode for charactersToInt() is overflow, so if |validNumber| is // not true, then set |number| to the maximum int value. if (!validNumber) number = std::numeric_limits<int>::max(); // Consume the digits. seekTo(runOfDigits.end()); return numDigits; }