void CAutoTextTestDlg::OnBnClickedAutotextscan() { UpdateData(); m_sResult.Empty(); m_sTimingLabel.Empty(); m_cContent.GetTextRange(0, m_cContent.GetTextLength(), m_sContent); if ((!m_sContent.IsEmpty())&&(!m_sRegex.IsEmpty())) { try { std::set<CString> autolist; wstring s = m_sContent; CHighResClock timer; tr1::wregex regCheck; std::map<CString, tr1::wregex>::const_iterator regIt; regCheck = tr1::wregex(m_sRegex, tr1::regex_constants::icase | tr1::regex_constants::ECMAScript); const tr1::wsregex_iterator end; for (tr1::wsregex_iterator it(s.begin(), s.end(), regCheck); it != end; ++it) { const tr1::wsmatch match = *it; for (size_t i=1; i<match.size(); ++i) { if (match[i].second-match[i].first) { ATLTRACE(_T("matched keyword : %s\n"), wstring(match[i]).c_str()); wstring result = wstring(match[i]); if (!result.empty()) { autolist.insert(result.c_str()); } } } } timer.Stop(); for (std::set<CString>::iterator it = autolist.begin(); it != autolist.end(); ++it) { m_sResult += *it; m_sResult += _T("\r\n"); } m_sTimingLabel.Format(_T("Parse time: %ld uSecs"), timer.GetMusecsTaken()); } catch (exception) { m_sResult = _T("Regex is invalid!"); } } UpdateData(FALSE); }
std::vector<CHARRANGE> ProjectProperties::FindBugIDPositions(const CString& msg) { size_t offset1 = 0; size_t offset2 = 0; std::vector<CHARRANGE> result; // first use the checkre string to find bug ID's in the message if (!sCheckRe.IsEmpty()) { if (!sBugIDRe.IsEmpty()) { // match with two regex strings (without grouping!) try { AutoUpdateRegex(); const tr1::wsregex_iterator end; wstring s = msg; for (tr1::wsregex_iterator it(s.begin(), s.end(), regCheck); it != end; ++it) { // (*it)[0] is the matched string wstring matchedString = (*it)[0]; ptrdiff_t matchpos = it->position(0); for (tr1::wsregex_iterator it2(matchedString.begin(), matchedString.end(), regBugID); it2 != end; ++it2) { ATLTRACE(_T("matched id : %s\n"), (*it2)[0].str().c_str()); ptrdiff_t matchposID = it2->position(0); CHARRANGE range = {(LONG)(matchpos+matchposID), (LONG)(matchpos+matchposID+(*it2)[0].str().size())}; result.push_back(range); } } } catch (exception) {} } else { try { AutoUpdateRegex(); const tr1::wsregex_iterator end; wstring s = msg; for (tr1::wsregex_iterator it(s.begin(), s.end(), regCheck); it != end; ++it) { const tr1::wsmatch match = *it; // we define group 1 as the whole issue text and // group 2 as the bug ID if (match.size() >= 2) { ATLTRACE(_T("matched id : %s\n"), wstring(match[1]).c_str()); CHARRANGE range = {(LONG)(match[1].first-s.begin()), (LONG)(match[1].second-s.begin())}; result.push_back(range); } } } catch (exception) {} } } else if (result.empty() && (!sMessage.IsEmpty())) { CString sBugLine; CString sFirstPart; CString sLastPart; BOOL bTop = FALSE; if (nBugIdPos < 0) return result; sFirstPart = sMessage.Left(nBugIdPos); sLastPart = sMessage.Mid(nBugIdPos + 7); CString sMsg = msg; sMsg.TrimRight('\n'); if (sMsg.ReverseFind('\n')>=0) { if (bAppend) sBugLine = sMsg.Mid(sMsg.ReverseFind('\n')+1); else { sBugLine = sMsg.Left(sMsg.Find('\n')); bTop = TRUE; } } else sBugLine = sMsg; if (sBugLine.Left(sFirstPart.GetLength()).Compare(sFirstPart)!=0) sBugLine.Empty(); if (sBugLine.Right(sLastPart.GetLength()).Compare(sLastPart)!=0) sBugLine.Empty(); if (sBugLine.IsEmpty()) { if (sMsg.Find('\n')>=0) sBugLine = sMsg.Left(sMsg.Find('\n')); if (sBugLine.Left(sFirstPart.GetLength()).Compare(sFirstPart)!=0) sBugLine.Empty(); if (sBugLine.Right(sLastPart.GetLength()).Compare(sLastPart)!=0) sBugLine.Empty(); bTop = TRUE; } if (sBugLine.IsEmpty()) return result; CString sBugIDPart = sBugLine.Mid(sFirstPart.GetLength(), sBugLine.GetLength() - sFirstPart.GetLength() - sLastPart.GetLength()); if (sBugIDPart.IsEmpty()) return result; //the bug id part can contain several bug id's, separated by commas if (!bTop) offset1 = sMsg.GetLength() - sBugLine.GetLength() + sFirstPart.GetLength(); else offset1 = sFirstPart.GetLength(); sBugIDPart.Trim(_T(",")); while (sBugIDPart.Find(',')>=0) { offset2 = offset1 + sBugIDPart.Find(','); CHARRANGE range = {(LONG)offset1, (LONG)offset2}; result.push_back(range); sBugIDPart = sBugIDPart.Mid(sBugIDPart.Find(',')+1); offset1 = offset2 + 1; } offset2 = offset1 + sBugIDPart.GetLength(); CHARRANGE range = {(LONG)offset1, (LONG)offset2}; result.push_back(range); } return result; }
std::set<CString> ProjectProperties::FindBugIDs(const CString& msg) { size_t offset1 = 0; size_t offset2 = 0; bool bFound = false; std::set<CString> bugIDs; // first use the checkre string to find bug ID's in the message if (!sCheckRe.IsEmpty()) { if (!sBugIDRe.IsEmpty()) { // match with two regex strings (without grouping!) try { const tr1::wregex regCheck(sCheckRe); const tr1::wregex regBugID(sBugIDRe); const tr1::wsregex_iterator end; wstring s = msg; for (tr1::wsregex_iterator it(s.begin(), s.end(), regCheck); it != end; ++it) { // (*it)[0] is the matched string wstring matchedString = (*it)[0]; for (tr1::wsregex_iterator it2(matchedString.begin(), matchedString.end(), regBugID); it2 != end; ++it2) { ATLTRACE(_T("matched id : %s\n"), (*it2)[0].str().c_str()); bugIDs.insert(CString((*it2)[0].str().c_str())); } } } catch (exception) {} } else { try { const tr1::wregex regCheck(sCheckRe); const tr1::wsregex_iterator end; wstring s = msg; for (tr1::wsregex_iterator it(s.begin(), s.end(), regCheck); it != end; ++it) { const tr1::wsmatch match = *it; // we define group 1 as the whole issue text and // group 2 as the bug ID if (match.size() >= 2) { ATLTRACE(_T("matched id : %s\n"), wstring(match[1]).c_str()); bugIDs.insert(CString(wstring(match[1]).c_str())); } } } catch (exception) {} } } else if ((!bFound)&&(!sMessage.IsEmpty())) { CString sBugLine; CString sFirstPart; CString sLastPart; BOOL bTop = FALSE; if (sMessage.Find(_T("%BUGID%"))<0) return bugIDs; sFirstPart = sMessage.Left(sMessage.Find(_T("%BUGID%"))); sLastPart = sMessage.Mid(sMessage.Find(_T("%BUGID%"))+7); CString sMsg = msg; sMsg.TrimRight('\n'); if (sMsg.ReverseFind('\n')>=0) { if (bAppend) sBugLine = sMsg.Mid(sMsg.ReverseFind('\n')+1); else { sBugLine = sMsg.Left(sMsg.Find('\n')); bTop = TRUE; } } else sBugLine = sMsg; if (sBugLine.Left(sFirstPart.GetLength()).Compare(sFirstPart)!=0) sBugLine.Empty(); if (sBugLine.Right(sLastPart.GetLength()).Compare(sLastPart)!=0) sBugLine.Empty(); if (sBugLine.IsEmpty()) { if (sMsg.Find('\n')>=0) sBugLine = sMsg.Left(sMsg.Find('\n')); if (sBugLine.Left(sFirstPart.GetLength()).Compare(sFirstPart)!=0) sBugLine.Empty(); if (sBugLine.Right(sLastPart.GetLength()).Compare(sLastPart)!=0) sBugLine.Empty(); bTop = TRUE; } if (sBugLine.IsEmpty()) return bugIDs; CString sBugIDPart = sBugLine.Mid(sFirstPart.GetLength(), sBugLine.GetLength() - sFirstPart.GetLength() - sLastPart.GetLength()); if (sBugIDPart.IsEmpty()) return bugIDs; //the bug id part can contain several bug id's, separated by commas if (!bTop) offset1 = sMsg.GetLength() - sBugLine.GetLength() + sFirstPart.GetLength(); else offset1 = sFirstPart.GetLength(); sBugIDPart.Trim(_T(",")); while (sBugIDPart.Find(',')>=0) { offset2 = offset1 + sBugIDPart.Find(','); CHARRANGE range = {(LONG)offset1, (LONG)offset2}; bugIDs.insert(msg.Mid(range.cpMin, range.cpMax-range.cpMin)); sBugIDPart = sBugIDPart.Mid(sBugIDPart.Find(',')+1); offset1 = offset2 + 1; } offset2 = offset1 + sBugIDPart.GetLength(); CHARRANGE range = {(LONG)offset1, (LONG)offset2}; bugIDs.insert(msg.Mid(range.cpMin, range.cpMax-range.cpMin)); } return bugIDs; }
BOOL ProjectProperties::FindBugID(const CString& msg, CWnd * pWnd) { size_t offset1 = 0; size_t offset2 = 0; bool bFound = false; if (sUrl.IsEmpty()) return FALSE; // first use the checkre string to find bug ID's in the message if (!sCheckRe.IsEmpty()) { if (!sBugIDRe.IsEmpty()) { // match with two regex strings (without grouping!) try { const tr1::wregex regCheck(sCheckRe); const tr1::wregex regBugID(sBugIDRe); const tr1::wsregex_iterator end; wstring s = msg; for (tr1::wsregex_iterator it(s.begin(), s.end(), regCheck); it != end; ++it) { // (*it)[0] is the matched string wstring matchedString = (*it)[0]; ptrdiff_t matchpos = it->position(0); for (tr1::wsregex_iterator it2(matchedString.begin(), matchedString.end(), regBugID); it2 != end; ++it2) { ATLTRACE(_T("matched id : %s\n"), (*it2)[0].str().c_str()); ptrdiff_t matchposID = it2->position(0); CHARRANGE range = {(LONG)(matchpos+matchposID), (LONG)(matchpos+matchposID+(*it2)[0].str().size())}; pWnd->SendMessage(EM_EXSETSEL, NULL, (LPARAM)&range); CHARFORMAT2 format; SecureZeroMemory(&format, sizeof(CHARFORMAT2)); format.cbSize = sizeof(CHARFORMAT2); format.dwMask = CFM_LINK; format.dwEffects = CFE_LINK; pWnd->SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format); bFound = true; } } } catch (exception) {} } else { try { const tr1::wregex regCheck(sCheckRe); const tr1::wsregex_iterator end; wstring s = msg; for (tr1::wsregex_iterator it(s.begin(), s.end(), regCheck); it != end; ++it) { const tr1::wsmatch match = *it; // we define group 1 as the whole issue text and // group 2 as the bug ID if (match.size() >= 2) { ATLTRACE(_T("matched id : %s\n"), wstring(match[1]).c_str()); CHARRANGE range = {(LONG)(match[1].first-s.begin()), (LONG)(match[1].second-s.begin())}; pWnd->SendMessage(EM_EXSETSEL, NULL, (LPARAM)&range); CHARFORMAT2 format; SecureZeroMemory(&format, sizeof(CHARFORMAT2)); format.cbSize = sizeof(CHARFORMAT2); format.dwMask = CFM_LINK; format.dwEffects = CFE_LINK; pWnd->SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format); bFound = true; } } } catch (exception) {} } } else if ((!bFound)&&(!sMessage.IsEmpty())) { CString sBugLine; CString sFirstPart; CString sLastPart; BOOL bTop = FALSE; if (sMessage.Find(_T("%BUGID%"))<0) return FALSE; sFirstPart = sMessage.Left(sMessage.Find(_T("%BUGID%"))); sLastPart = sMessage.Mid(sMessage.Find(_T("%BUGID%"))+7); CString sMsg = msg; sMsg.TrimRight('\n'); if (sMsg.ReverseFind('\n')>=0) { if (bAppend) sBugLine = sMsg.Mid(sMsg.ReverseFind('\n')+1); else { sBugLine = sMsg.Left(sMsg.Find('\n')); bTop = TRUE; } } else sBugLine = sMsg; if (sBugLine.Left(sFirstPart.GetLength()).Compare(sFirstPart)!=0) sBugLine.Empty(); if (sBugLine.Right(sLastPart.GetLength()).Compare(sLastPart)!=0) sBugLine.Empty(); if (sBugLine.IsEmpty()) { if (sMsg.Find('\n')>=0) sBugLine = sMsg.Left(sMsg.Find('\n')); if (sBugLine.Left(sFirstPart.GetLength()).Compare(sFirstPart)!=0) sBugLine.Empty(); if (sBugLine.Right(sLastPart.GetLength()).Compare(sLastPart)!=0) sBugLine.Empty(); bTop = TRUE; } if (sBugLine.IsEmpty()) return FALSE; CString sBugIDPart = sBugLine.Mid(sFirstPart.GetLength(), sBugLine.GetLength() - sFirstPart.GetLength() - sLastPart.GetLength()); if (sBugIDPart.IsEmpty()) return FALSE; //the bug id part can contain several bug id's, separated by commas if (!bTop) offset1 = sMsg.GetLength() - sBugLine.GetLength() + sFirstPart.GetLength(); else offset1 = sFirstPart.GetLength(); sBugIDPart.Trim(_T(",")); while (sBugIDPart.Find(',')>=0) { offset2 = offset1 + sBugIDPart.Find(','); CHARRANGE range = {(LONG)offset1, (LONG)offset2}; pWnd->SendMessage(EM_EXSETSEL, NULL, (LPARAM)&range); CHARFORMAT2 format; SecureZeroMemory(&format, sizeof(CHARFORMAT2)); format.cbSize = sizeof(CHARFORMAT2); format.dwMask = CFM_LINK; format.dwEffects = CFE_LINK; pWnd->SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format); sBugIDPart = sBugIDPart.Mid(sBugIDPart.Find(',')+1); offset1 = offset2 + 1; } offset2 = offset1 + sBugIDPart.GetLength(); CHARRANGE range = {(LONG)offset1, (LONG)offset2}; pWnd->SendMessage(EM_EXSETSEL, NULL, (LPARAM)&range); CHARFORMAT2 format; SecureZeroMemory(&format, sizeof(CHARFORMAT2)); format.cbSize = sizeof(CHARFORMAT2); format.dwMask = CFM_LINK; format.dwEffects = CFE_LINK; pWnd->SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format); return TRUE; } return FALSE; }