void CLabelFormatter::AssembleMask(unsigned int label, const std::string& mask) { assert(label < 2); m_staticContent[label].clear(); m_dynamicContent[label].clear(); // we want to match [<prefix>%A<postfix] // but allow %%, %[, %] to be in the prefix and postfix. Anything before the first [ // could be a mask that's not surrounded with [], so pass to SplitMask. CRegExp reg; reg.RegComp("(^|[^%])\\[(([^%]|%%|%\\]|%\\[)*)%([" MASK_CHARS "])(([^%]|%%|%\\]|%\\[)*)\\]"); std::string work(mask); int findStart = -1; while ((findStart = reg.RegFind(work.c_str())) >= 0) { // we've found a match for a pre/postfixed string // send anything SplitMask(label, work.substr(0, findStart) + reg.GetMatch(1)); m_dynamicContent[label].push_back(CMaskString( reg.GetMatch(2), reg.GetMatch(4)[0], reg.GetMatch(5))); work = work.substr(findStart + reg.GetFindLen()); } SplitMask(label, work); assert(m_staticContent[label].size() == m_dynamicContent[label].size() + 1); }
bool CDVDSubtitleParserVplayer::Open(CDVDStreamInfo &hints) { if (!CDVDSubtitleParserText::Open()) return false; // Vplayer subtitles have 1-second resolution m_framerate = DVD_TIME_BASE; // Vplayer subtitles don't have StopTime, so we use following subtitle's StartTime // for that, unless gap was more than 4 seconds. Then we set subtitle duration // for 4 seconds, to not have text hanging around in silent scenes... int iDefaultDuration = 4 * (int)m_framerate; char line[1024]; CRegExp reg; if (!reg.RegComp("([0-9]+):([0-9]+):([0-9]+):([^|]*?)(\\|([^|]*?))?$")) return false; CDVDOverlayText* pPrevOverlay = NULL; while (m_pStream->ReadLine(line, sizeof(line))) { if (reg.RegFind(line) > -1) { std::string hour(reg.GetMatch(1)); std::string min (reg.GetMatch(2)); std::string sec (reg.GetMatch(3)); std::string lines[3]; lines[0] = reg.GetMatch(4); lines[1] = reg.GetMatch(6); lines[2] = reg.GetMatch(8); CDVDOverlayText* pOverlay = new CDVDOverlayText(); pOverlay->Acquire(); // increase ref count with one so that we can hold a handle to this overlay pOverlay->iPTSStartTime = m_framerate * (3600*atoi(hour.c_str()) + 60*atoi(min.c_str()) + atoi(sec.c_str())); // set StopTime for previous overlay if (pPrevOverlay) { if ( (pOverlay->iPTSStartTime - pPrevOverlay->iPTSStartTime) < iDefaultDuration) pPrevOverlay->iPTSStopTime = pOverlay->iPTSStartTime; else pPrevOverlay->iPTSStopTime = pPrevOverlay->iPTSStartTime + iDefaultDuration; } pPrevOverlay = pOverlay; for (int i = 0; i < 3 && !lines[i].empty(); i++) pOverlay->AddElement(new CDVDOverlayText::CElementText(lines[i].c_str())); m_collection.Add(pOverlay); } // set StopTime for the last subtitle if (pPrevOverlay) pPrevOverlay->iPTSStopTime = pPrevOverlay->iPTSStartTime + iDefaultDuration; } return true; }
TEST(TestRegExp, GetMatch) { CRegExp regex; EXPECT_TRUE(regex.RegComp("^(Test)\\s*(.*)\\.")); EXPECT_EQ(0, regex.RegFind("Test string.")); EXPECT_STREQ("Test string.", regex.GetMatch(0).c_str()); EXPECT_STREQ("Test", regex.GetMatch(1).c_str()); EXPECT_STREQ("string", regex.GetMatch(2).c_str()); }
void CInputCodingTableBaiduPY::HandleResponse(const std::string& strCode, const std::string& response) { if (strCode != m_code) // don't handle obsolete response return; std::vector<std::wstring> words; CRegExp reg; reg.RegComp("\\[\"(.+?)\",[^\\]]+\\]"); int pos = 0; int num = 0; while ((pos = reg.RegFind(response.c_str(), pos)) >= 0) { num++; std::string full = reg.GetMatch(0); std::string word = reg.GetMatch(1); pos += full.length(); words.push_back(UnicodeToWString(word)); } if (words.size() < 20) m_api_nomore = true; else { m_api_begin += 20; m_api_end += 20; } CSingleLock lock(m_CS); m_responses.insert(std::make_pair(++m_messageCounter, words)); CGUIMessage msg(GUI_MSG_CODINGTABLE_LOOKUP_COMPLETED, 0, 0, m_messageCounter); msg.SetStringParam(strCode); lock.Leave(); g_windowManager.SendThreadMessage(msg, g_windowManager.GetActiveWindowID()); }
void CScraperParser::ConvertJSON(std::string &string) { CRegExp reg; reg.RegComp("\\\\u([0-f]{4})"); while (reg.RegFind(string.c_str()) > -1) { int pos = reg.GetSubStart(1); std::string szReplace(reg.GetMatch(1)); std::string replace = StringUtils::Format("&#x%s;", szReplace.c_str()); string.replace(string.begin()+pos-2, string.begin()+pos+4, replace); } CRegExp reg2; reg2.RegComp("\\\\x([0-9]{2})([^\\\\]+;)"); while (reg2.RegFind(string.c_str()) > -1) { int pos1 = reg2.GetSubStart(1); int pos2 = reg2.GetSubStart(2); std::string szHexValue(reg2.GetMatch(1)); std::string replace = StringUtils::Format("%li", strtol(szHexValue.c_str(), NULL, 16)); string.replace(string.begin()+pos1-2, string.begin()+pos2+reg2.GetSubLength(2), replace); } StringUtils::Replace(string, "\\\"","\""); }
void CLabelFormatter::SplitMask(unsigned int label, const std::string &mask) { assert(label < 2); CRegExp reg; reg.RegComp("%([" MASK_CHARS "])"); std::string work(mask); int findStart = -1; while ((findStart = reg.RegFind(work.c_str())) >= 0) { // we've found a match m_staticContent[label].push_back(work.substr(0, findStart)); m_dynamicContent[label].push_back(CMaskString("", reg.GetMatch(1)[0], "")); work = work.substr(findStart + reg.GetFindLen()); } m_staticContent[label].push_back(work); }
const std::vector<std::string> CTagLoaderTagLib::SplitMBID(const std::vector<std::string> &values) { if (values.empty() || values.size() > 1) return values; // Picard, and other taggers use a heap of different separators. We use a regexp to detect // MBIDs to make sure we hit them all... std::vector<std::string> ret; std::string value = values[0]; StringUtils::ToLower(value); CRegExp reg; if (reg.RegComp("([[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12})")) { int pos = -1; while ((pos = reg.RegFind(value, pos+1)) > -1) ret.push_back(reg.GetMatch(1)); } return ret; }
bool CDVDSubtitleParserMPL2::Open(CDVDStreamInfo &hints) { if (!CDVDSubtitleParserText::Open()) return false; // MPL2 is time-based, with 0.1s accuracy m_framerate = DVD_TIME_BASE / 10.0; char line[1024]; CRegExp reg; if (!reg.RegComp("\\[([0-9]+)\\]\\[([0-9]+)\\]")) return false; CDVDSubtitleTagMicroDVD TagConv; while (m_pStream->ReadLine(line, sizeof(line))) { if ((strlen(line) > 0) && (line[strlen(line) - 1] == '\r')) line[strlen(line) - 1] = 0; int pos = reg.RegFind(line); if (pos > -1) { const char* text = line + pos + reg.GetFindLen(); std::string startFrame(reg.GetMatch(1)); std::string endFrame (reg.GetMatch(2)); CDVDOverlayText* pOverlay = new CDVDOverlayText(); pOverlay->Acquire(); // increase ref count with one so that we can hold a handle to this overlay pOverlay->iPTSStartTime = m_framerate * atoi(startFrame.c_str()); pOverlay->iPTSStopTime = m_framerate * atoi(endFrame.c_str()); TagConv.ConvertLine(pOverlay, text, strlen(text)); m_collection.Add(pOverlay); } } return true; }
bool CDAVFile::Execute(const CURL& url) { CURL url2(url); ParseAndCorrectUrl(url2); CLog::Log(LOGDEBUG, "CDAVFile::Execute(%p) %s", (void*)this, m_url.c_str()); assert(!(!m_state->m_easyHandle ^ !m_state->m_multiHandle)); if( m_state->m_easyHandle == NULL ) g_curlInterface.easy_aquire(url2.GetProtocol().c_str(), url2.GetHostName().c_str(), &m_state->m_easyHandle, &m_state->m_multiHandle); // setup common curl options SetCommonOptions(m_state); SetRequestHeaders(m_state); lastResponseCode = m_state->Connect(m_bufferSize); if( lastResponseCode < 0 || lastResponseCode >= 400) return false; char* efurl; if (CURLE_OK == g_curlInterface.easy_getinfo(m_state->m_easyHandle, CURLINFO_EFFECTIVE_URL,&efurl) && efurl) m_url = efurl; if (lastResponseCode == 207) { std::string strResponse; ReadData(strResponse); CXBMCTinyXML davResponse; davResponse.Parse(strResponse); if (!davResponse.Parse(strResponse)) { CLog::Log(LOGERROR, "%s - Unable to process dav response (%s)", __FUNCTION__, m_url.c_str()); Close(); return false; } TiXmlNode *pChild; // Iterate over all responses for (pChild = davResponse.RootElement()->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) { if (CDAVCommon::ValueWithoutNamespace(pChild, "response")) { std::string sRetCode = CDAVCommon::GetStatusTag(pChild->ToElement()); CRegExp rxCode; rxCode.RegComp("HTTP/1\\.1\\s(\\d+)\\s.*"); if (rxCode.RegFind(sRetCode) >= 0) { if (rxCode.GetSubCount()) { lastResponseCode = atoi(rxCode.GetMatch(1).c_str()); if( lastResponseCode < 0 || lastResponseCode >= 400) return false; } } } } } return true; }