// FindWhitespace bool COpcTextReader::FindWhitespace(COpcText& cToken) { OPC_ASSERT(m_szBuf != NULL); OPC_ASSERT(m_uLength != 0); UINT uPosition = 0; // skip leading non-whitespace if (cToken.GetSkipLeading()) { for (UINT ii = 0; ii < m_uEndOfData; ii++) { if (CheckForHalt(cToken, ii)) { return false; } if (iswspace(m_szBuf[ii])) { uPosition = ii; break; } } } // check if there is still data left to read. if (uPosition >= m_uEndOfData) { return false; } // read until a non-whitespace. for (UINT ii = uPosition; ii < m_uEndOfData; ii++) { if (CheckForHalt(cToken, ii)) { break; } if (!iswspace(m_szBuf[ii])) { break; } } // check for empty token if (ii == uPosition) { return false; } // copy token. CopyData(cToken, uPosition, ii); return true; }
// FindLiteral bool COpcTextReader::FindLiteral(COpcText& cToken) { OPC_ASSERT(m_szBuf != NULL); OPC_ASSERT(m_uLength != 0); LPCWSTR szText = cToken.GetText(); UINT uLength = (szText != NULL)?wcslen(szText):0; // check for trivial case if (uLength == 0) { return false; } UINT uPosition = SkipWhitespace(cToken); // check if there is enough data. if (uLength > (m_uEndOfData - uPosition)) { return false; } for (UINT ii = uPosition; ii < m_uEndOfData-uLength+1; ii++) { // check if search halted. if (CheckForHalt(cToken, ii)) { return false; } // compare text at current position. if (IsEqual(cToken, m_szBuf+ii, szText, uLength)) { CopyData(cToken, ii, ii+uLength); return true; } // stop search if leading unmatching characters are not ignored. if (!cToken.GetSkipLeading()) { break; } } return false; }