diff --git a/etk/RegExp.cpp b/etk/RegExp.cpp index 5330668..98e0eb4 100644 --- a/etk/RegExp.cpp +++ b/etk/RegExp.cpp @@ -64,39 +64,45 @@ const struct etk::convertionTable etk::constConvertionTable[] = { }; const int64_t etk::constConvertionTableSize = sizeof(etk::constConvertionTable) / sizeof(struct etk::convertionTable) ; -std::ostream& etk::displayElem(std::ostream& _os, const std::vector& _data, int64_t _start, int64_t _stop) { - _os << ETK_BASH_COLOR_NORMAL; + +std::string etk::createString(const std::vector& _data, int64_t _start, int64_t _stop) { + std::string output(ETK_BASH_COLOR_NORMAL); for (int64_t iii=_start; iii<(int64_t)_data.size() && iii<_stop ; iii++) { switch(_data[iii]) { - case regexpOpcodePTheseIn: _os < check if \w is not present (other regExp will be <> ...) [anjdi] or [a-gt-j] range . dot [^\x00-\x08\x0A-\x1F\x7F] -==> TODO : $ End / Start of line of line ==> ce sera un truc suplémentaire comme le \@ +==> TODO : ^in the [] invertion of the range element + Sart of line + force regexp to be the shortest. multiplicity : * ==> {0, 2147483647} @@ -120,7 +122,7 @@ extern const struct convertionTable constConvertionTable[]; //! @not-in-doc extern const int64_t constConvertionTableSize; //! @not-in-doc -std::ostream& displayElem(std::ostream& _os, const std::vector& _data, int64_t _start=0, int64_t _stop=0x7FFFFFFF); +std::string createString(const std::vector& _data, int64_t _start=0, int64_t _stop=0x7FFFFFFF); //! @not-in-doc char * levelSpace(uint32_t _level); //! @not-in-doc @@ -186,7 +188,7 @@ template class RegExpNode { * @param[in] level of the node */ virtual void display(uint32_t _level) { - TK_INFO("Find NODE : " << levelSpace(_level) << "@???@ {" << getMultMin() << "," << getMultMax() << "} subdata=" /*<< etk::displayElem(m_RegExpData) */); + TK_INFO("Find NODE : " << levelSpace(_level) << "@???@ {" << getMultMin() << "," << getMultMax() << "} subdata=" << etk::createString(m_RegExpData) ); }; /** * @brief Set the multiplicity of this Node. @@ -235,7 +237,7 @@ template class RegExpNodeValue : public etk::RegExpNode& _data) { RegExpNode::m_RegExpData = _data; - TK_REG_EXP_DBG_MODE("Request Parse \"Value\" data=" /*<< etk::displayElem(RegExpNode::m_RegExpData)*/ ); + TK_REG_EXP_DBG_MODE("Request Parse \"Value\" data=" << etk::createString(RegExpNode::m_RegExpData) ); m_data.clear(); for (int32_t i=0; i<(int64_t)RegExpNode::m_RegExpData.size(); i++) { m_data.push_back(RegExpNode::m_RegExpData[i]); @@ -289,8 +291,8 @@ template class RegExpNodeValue : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData)*/ - << " data: " /*<< etk::displayElem(m_data)*/ ); + << etk::createString(RegExpNode::m_RegExpData) + << " data: " << etk::createString(m_data) ); }; }; #undef __class__ @@ -314,7 +316,7 @@ template class RegExpNodeBracket : public etk::RegExpNode& _data) { RegExpNode::m_RegExpData = _data; - TK_REG_EXP_DBG_MODE("Request Parse [...] data=" /*<< etk::displayElem(RegExpNode::m_RegExpData)*/ ); + TK_REG_EXP_DBG_MODE("Request Parse [...] data=" << etk::createString(RegExpNode::m_RegExpData) ); m_data.clear(); char32_t lastElement = 'a'; @@ -352,7 +354,7 @@ template class RegExpNodeBracket : public etk::RegExpNode::m_multipleMax && tmpFind ==true && jjj < _lenMax; jjj++) { @@ -380,8 +382,8 @@ template class RegExpNodeBracket : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax - << "} subdata=" /*<< etk::displayElem(RegExpNode::m_RegExpData)*/ - << " data: " /*<< etk::displayElem(m_data)*/ ); + << "} subdata=" << etk::createString(RegExpNode::m_RegExpData) + << " data: " << etk::createString(m_data) ); }; }; #undef __class__ @@ -433,7 +435,7 @@ template class RegExpNodeDigit : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << - "} subdata=" /*<< etk::displayElem(RegExpNode::m_RegExpData)*/); + "} subdata=" << etk::createString(RegExpNode::m_RegExpData)); }; }; #undef __class__ @@ -478,7 +480,7 @@ template class RegExpNodeDigitNot : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" /*<< etk::displayElem(RegExpNode::m_RegExpData)*/ ); + TK_INFO("Find NODE : " << levelSpace(_level) << "@DigitNot@ {" << RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" << etk::createString(RegExpNode::m_RegExpData) ); }; }; #undef __class__ @@ -528,7 +530,7 @@ template class RegExpNodeLetter : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData) */); + << etk::createString(RegExpNode::m_RegExpData) ); }; }; #undef __class__ @@ -578,7 +580,7 @@ template class RegExpNodeLetterNot : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData)*/ ); + << etk::createString(RegExpNode::m_RegExpData) ); }; }; #undef __class__ @@ -630,7 +632,7 @@ template class RegExpNodeWhiteSpace : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData)*/ ); + << etk::createString(RegExpNode::m_RegExpData) ); }; }; #undef __class__ @@ -682,7 +684,7 @@ template class RegExpNodeWhiteSpaceNot : public etk::RegExpNod TK_INFO("Find NODE : " << levelSpace(_level) << "@SpaceNot@ {" << RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData) */); + << etk::createString(RegExpNode::m_RegExpData) ); }; }; #undef __class__ @@ -734,7 +736,7 @@ template class RegExpNodeWordChar : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData) */); + << etk::createString(RegExpNode::m_RegExpData)); }; }; #undef __class__ @@ -785,7 +787,7 @@ template class RegExpNodeWordCharNot : public etk::RegExpNode< TK_INFO("Find NODE : " << levelSpace(_level) << "@WordNot@ {" << RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData) */); + << etk::createString(RegExpNode::m_RegExpData) ); }; }; #undef __class__ @@ -838,7 +840,7 @@ template class RegExpNodeDot : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData) */); + << etk::createString(RegExpNode::m_RegExpData) ); }; }; @@ -860,15 +862,36 @@ template class RegExpNodeSOL : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "}"); + TK_REG_EXP_DBG_MODE("Parse node : SOL{" << RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "}"); + // TODO : is it really what I want ... (maybe next ellement will be requested... (check if previous element is \r or \n + bool tmpFind = true; + uint32_t jjj; + for (jjj=0; jjj::m_multipleMax && tmpFind ==true && jjj < _lenMax; jjj++) { + char32_t tmpVal = _data[_currentPos+jjj]; + // TODO : check if the file is a \r\n file ... + if ( tmpVal == 0x0d /* */ + || tmpVal == 0x0A /* */) { + _findLen += 1; + } else { + tmpFind=false; + } + } + if( jjj>=RegExpNode::m_multipleMin + && jjj<=RegExpNode::m_multipleMax + && _findLen>0 ) { + TK_REG_EXP_DBG_MODE("find " << _findLen); + return true; + } else if( 0 == RegExpNode::m_multipleMin ) { + TK_REG_EXP_DBG_MODE("find size=0"); + return true; + } return false; }; void display(uint32_t _level) { TK_INFO("Find NODE : " << levelSpace(_level) << "@SOL@ {" << RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData) */); + << etk::createString(RegExpNode::m_RegExpData) ); }; }; @@ -890,15 +913,35 @@ template class RegExpNodeEOL : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "}"); + TK_REG_EXP_DBG_MODE("Parse node : EOL{" << RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "}"); + bool tmpFind = true; + uint32_t jjj; + for (jjj=0; jjj::m_multipleMax && tmpFind ==true && jjj < _lenMax; jjj++) { + char32_t tmpVal = _data[_currentPos+jjj]; + // TODO : check if the file is a \r\n file ... + if ( tmpVal == 0x0d /* */ + || tmpVal == 0x0A /* */) { + _findLen += 1; + } else { + tmpFind=false; + } + } + if( jjj>=RegExpNode::m_multipleMin + && jjj<=RegExpNode::m_multipleMax + && _findLen>0 ) { + TK_REG_EXP_DBG_MODE("find " << _findLen); + return true; + } else if( 0 == RegExpNode::m_multipleMin ) { + TK_REG_EXP_DBG_MODE("find size=0"); + return true; + } return false; }; void display(uint32_t _level) { TK_INFO("Find NODE : " << levelSpace(_level) << "@EOL@ {" << RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData) */); + << etk::createString(RegExpNode::m_RegExpData) ); }; }; @@ -931,7 +974,7 @@ template class RegExpNodePTheseElem : public etk::RegExpNode& _data) { RegExpNode::m_RegExpData = _data; - TK_REG_EXP_DBG_MODE("Request Parse (elem) data=" /*<< etk::displayElem(RegExpNode::m_RegExpData)*/ ); + TK_REG_EXP_DBG_MODE("Request Parse (elem) data=" << etk::createString(RegExpNode::m_RegExpData) ); int64_t pos = 0; int64_t elementSize = 0; std::vector tmpData; @@ -1085,7 +1128,7 @@ template class RegExpNodePTheseElem : public etk::RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData) */); + << etk::createString(RegExpNode::m_RegExpData) ); for(int64_t iii=0; iii<(int64_t)m_subNode.size(); iii++) { m_subNode[iii]->display(_level+1); } @@ -1132,7 +1175,7 @@ template class RegExpNodePThese : public etk::RegExpNode& _data) { RegExpNode::m_RegExpData = _data; - TK_REG_EXP_DBG_MODE("Request Parse (...) data=" /*<< etk::displayElem(RegExpNode::m_RegExpData)*/ ); + TK_REG_EXP_DBG_MODE("Request Parse (...) data=" << etk::createString(RegExpNode::m_RegExpData) ); //Find all the '|' in the string (and at the good level ...) int64_t pos = 0; int32_t elementSize = getLenOfPTheseElem(RegExpNode::m_RegExpData, pos); @@ -1148,7 +1191,7 @@ template class RegExpNodePThese : public etk::RegExpNode class RegExpNodePThese : public etk::RegExpNode::m_RegExpData) */); + TK_INFO("regExp :" << etk::createString(RegExpNode::m_RegExpData) ); } else { TK_INFO("Find NODE : " << levelSpace(_level) << "@(...)@ {" << RegExpNode::m_multipleMin << "," << RegExpNode::m_multipleMax << "} subdata=" - /*<< etk::displayElem(RegExpNode::m_RegExpData) */); + << etk::createString(RegExpNode::m_RegExpData) ); for(int64_t i=0; i<(int64_t)m_subNode.size(); i++) { m_subNode[i]->display(_level+1); } @@ -1207,7 +1250,14 @@ template class RegExpNodePThese : public etk::RegExpNode::m_RegExpData)*/ ); + TK_INFO("regExp :" << etk::createString(RegExpNode::m_RegExpData) ); + } + /** + * @brief get the string represented the regexp (colored) + * @return Regexp string + */ + std::string getColoredRegEx() { + return etk::createString(RegExpNode::m_RegExpData); } }; #undef __class__ @@ -1412,7 +1462,7 @@ template class RegExp { return; } - //TK_REG_EXP_DBG_MODE("Main element :" /*<< etk::displayElem(tmpExp)*/ ); + //TK_REG_EXP_DBG_MODE("Main element :" << etk::createString(tmpExp) ); if ( tmpExp.size()>0 && tmpExp[0] == regexpOpcodeNoChar) { @@ -1647,8 +1697,7 @@ template class RegExp { * @return The decorated string */ std::string getRegExDecorated() { - // TODO : do it... - return ""; + return m_exprRootNode.getColoredRegEx(); } private: /**