void FunctionZoneParser::classParse(vector<foundInfo> & foundInfos, vector< pair<int, int> > &scannedZones, const std::vector< std::pair<int, int> > & commentZones, size_t begin, size_t end, ScintillaEditView **ppEditView, generic_string classStructName) { if (begin >= end) return; int flags = SCFIND_REGEXP | SCFIND_POSIX | SCFIND_REGEXP_DOTMATCHESNL; (*ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); int targetStart = (*ppEditView)->searchInTarget(_rangeExpr.c_str(), _rangeExpr.length(), begin, end); int targetEnd = 0; while (targetStart != -1 && targetStart != -2) { targetEnd = int((*ppEditView)->execute(SCI_GETTARGETEND)); // Get class name int foundPos = 0; generic_string classStructName = parseSubLevel(targetStart, targetEnd, _classNameExprArray, foundPos, ppEditView); if (_openSymbole != TEXT("") && _closeSymbole != TEXT("")) { targetEnd = getBodyClosePos(targetEnd, _openSymbole.c_str(), _closeSymbole.c_str(), ppEditView); } if (targetEnd > int(end)) //we found a result but outside our range, therefore do not process it { break; } scannedZones.push_back(pair<int, int>(targetStart, targetEnd)); int foundTextLen = targetEnd - targetStart; if (targetStart + foundTextLen == int(end)) break; // Begin to search all method inside //vector< generic_string > emptyArray; if (!isInZones(targetStart, commentZones)) { funcParse(foundInfos, targetStart, targetEnd, ppEditView, classStructName); } begin = targetStart + (targetEnd - targetStart); targetStart = (*ppEditView)->searchInTarget(_rangeExpr.c_str(), _rangeExpr.length(), begin, end); } }
// This method will void FunctionListPanel::parse2(std::vector<foundInfo> & foundInfos, size_t begin, size_t end, const TCHAR *block, std::vector< generic_string > blockNameToSearch, const TCHAR *bodyOpenSymbol, const TCHAR *bodyCloseSymbol, const TCHAR *function, std::vector< generic_string > functionToSearch) { if (begin >= end) return; int flags = SCFIND_REGEXP | SCFIND_POSIX; (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); int targetStart = (*_ppEditView)->searchInTarget(block, lstrlen(block), begin, end); int targetEnd = 0; //foundInfos.clear(); while (targetStart != -1 && targetStart != -2) { targetEnd = int((*_ppEditView)->execute(SCI_GETTARGETEND)); // Get class name int foundPos = 0; generic_string classStructName = parseSubLevel(targetStart, targetEnd, blockNameToSearch, foundPos); if (lstrcmp(bodyOpenSymbol, TEXT("")) != 0 && lstrcmp(bodyCloseSymbol, TEXT("")) != 0) { targetEnd = getBodyClosePos(targetEnd, bodyOpenSymbol, bodyCloseSymbol); } if (targetEnd > int(end)) //we found a result but outside our range, therefore do not process it { break; } int foundTextLen = targetEnd - targetStart; if (targetStart + foundTextLen == int(end)) break; // Begin to search all method inside vector< generic_string > emptyArray; parse(foundInfos, targetStart, targetEnd, function, functionToSearch, emptyArray, classStructName); begin = targetStart + (targetEnd - targetStart); targetStart = (*_ppEditView)->searchInTarget(block, lstrlen(block), begin, end); } }
generic_string FunctionParser::parseSubLevel(size_t begin, size_t end, std::vector< generic_string > dataToSearch, int & foundPos, ScintillaEditView **ppEditView) { if (begin >= end) { foundPos = -1; return TEXT(""); } if (!dataToSearch.size()) return TEXT(""); int flags = SCFIND_REGEXP | SCFIND_POSIX | SCFIND_REGEXP_DOTMATCHESNL; (*ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); const TCHAR *regExpr2search = dataToSearch[0].c_str(); int targetStart = (*ppEditView)->searchInTarget(regExpr2search, lstrlen(regExpr2search), begin, end); if (targetStart == -1 || targetStart == -2) { foundPos = -1; return TEXT(""); } int targetEnd = int((*ppEditView)->execute(SCI_GETTARGETEND)); if (dataToSearch.size() >= 2) { dataToSearch.erase(dataToSearch.begin()); return parseSubLevel(targetStart, targetEnd, dataToSearch, foundPos, ppEditView); } else // only one processed element, so we conclude the result { TCHAR foundStr[1024]; (*ppEditView)->getGenericText(foundStr, 1024, targetStart, targetEnd); foundPos = targetStart; return foundStr; } }
void FunctionParser::funcParse(std::vector<foundInfo> & foundInfos, size_t begin, size_t end, ScintillaEditView **ppEditView, generic_string classStructName) { if (begin >= end) return; if (_functionExpr.length() == 0) return; int flags = SCFIND_REGEXP | SCFIND_POSIX | SCFIND_REGEXP_DOTMATCHESNL; (*ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); int targetStart = (*ppEditView)->searchInTarget(_functionExpr.c_str(), _functionExpr.length(), begin, end); int targetEnd = 0; //foundInfos.clear(); while (targetStart != -1 && targetStart != -2) { targetStart = int((*ppEditView)->execute(SCI_GETTARGETSTART)); targetEnd = int((*ppEditView)->execute(SCI_GETTARGETEND)); if (targetEnd > int(end)) //we found a result but outside our range, therefore do not process it { break; } int foundTextLen = targetEnd - targetStart; if (targetStart + foundTextLen == int(end)) break; foundInfo fi; // dataToSearch & data2ToSearch are optional if (!_functionNameExprArray.size() && !_classNameExprArray.size()) { TCHAR foundData[1024]; (*ppEditView)->getGenericText(foundData, 1024, targetStart, targetEnd); fi._data = foundData; // whole found data fi._pos = targetStart; } else { int foundPos; if (_functionNameExprArray.size()) { fi._data = parseSubLevel(targetStart, targetEnd, _functionNameExprArray, foundPos, ppEditView); fi._pos = foundPos; } if (classStructName != TEXT("")) { fi._data2 = classStructName; fi._pos2 = 0; // change -1 valeur for validated data2 } else if (_classNameExprArray.size()) { fi._data2 = parseSubLevel(targetStart, targetEnd, _classNameExprArray, foundPos, ppEditView); fi._pos2 = foundPos; } } if (fi._pos != -1 || fi._pos2 != -1) // at least one should be found { foundInfos.push_back(fi); } begin = targetStart + foundTextLen; targetStart = (*ppEditView)->searchInTarget(_functionExpr.c_str(), _functionExpr.length(), begin, end); } }
void FunctionListPanel::parse(vector<foundInfo> & foundInfos, size_t begin, size_t end, const TCHAR *regExpr2search, vector< generic_string > dataToSearch, vector< generic_string > data2ToSearch, generic_string classStructName) { if (begin >= end) return; int flags = SCFIND_REGEXP | SCFIND_POSIX; (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); int targetStart = (*_ppEditView)->searchInTarget(regExpr2search, lstrlen(regExpr2search), begin, end); int targetEnd = 0; //foundInfos.clear(); while (targetStart != -1 && targetStart != -2) { targetStart = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); targetEnd = int((*_ppEditView)->execute(SCI_GETTARGETEND)); if (targetEnd > int(end)) //we found a result but outside our range, therefore do not process it { break; } int foundTextLen = targetEnd - targetStart; if (targetStart + foundTextLen == int(end)) break; foundInfo fi; // dataToSearch & data2ToSearch are optional if (!dataToSearch.size() && !data2ToSearch.size()) { TCHAR foundData[1024]; (*_ppEditView)->getGenericText(foundData, 1024, targetStart, targetEnd); fi._data = foundData; // whole found data fi._pos = targetStart; } else { int foundPos; if (dataToSearch.size()) { fi._data = parseSubLevel(targetStart, targetEnd, dataToSearch, foundPos); fi._pos = foundPos; } if (data2ToSearch.size()) { fi._data2 = parseSubLevel(targetStart, targetEnd, data2ToSearch, foundPos); fi._pos2 = foundPos; } else if (classStructName != TEXT("")) { fi._data2 = classStructName; fi._pos2 = 0; // change -1 valeur for validated data2 } } if (fi._pos != -1 || fi._pos2 != -1) // at least one should be found { foundInfos.push_back(fi); } begin = targetStart + foundTextLen; targetStart = (*_ppEditView)->searchInTarget(regExpr2search, lstrlen(regExpr2search), begin, end); } }