diff --git a/data/languages/c/highlight.xml b/data/languages/c/highlight.xml index 98d63ef..92241c4 100644 --- a/data/languages/c/highlight.xml +++ b/data/languages/c/highlight.xml @@ -50,71 +50,69 @@ doubleQuoteText '((\\[\\'])|.){1,2}' - - SYNTAX_ERROR - ' - keyword - \@return|goto|if|else|case|default|switch|break|continue|while|do|for|sizeof\@ + \b(return|goto|if|else|case|default|switch|break|continue|while|do|for|sizeof)\b systemFunction - \@new|delete|try|catch|memset|fopen|fread|fwrite|fgets|fclose|printf|(f|s|diag_)printf|calloc|malloc|realloc|(cyg|sup)_([a-z]|[A-Z]|[0-9]|_)+\@ + \b(new|delete|try|catch|memset|fopen|fread|fwrite|fgets|fclose|printf|(f|s|diag_)printf|calloc|malloc|realloc|(cyg|sup)_([a-z]|[A-Z]|[0-9]|_)+)\b type - \@bool|BOOL|char(16_t|32_t)?|double|float|u?int(8|16|32|64|128)?(_t)?|long|short|signed|size_t|unsigned|void|(I|U)(8|16|32|64|128)\@ + \b(bool|BOOL|char(16_t|32_t)?|double|float|u?int(8|16|32|64|128)?(_t)?|long|short|signed|size_t|unsigned|void|(I|U)(8|16|32|64|128))\b type - \@std::(vector|(u16|u32|w)?string|codecvt_utf(16|8_utf16|8)+|complex|iterator(_traits)?|tuple(_element|_size)?|pair)\@ + \b(std::(vector|(u16|u32|w)?string|codecvt_utf(16|8_utf16|8)+|complex|iterator(_traits)?|tuple(_element|_size)?|pair))\b storageKeyword - \@inline|const|class|virtual|private|public|protected|friend|const|extern|auto|register|static|unsigned|signed|volatile|char|double|float|int|long|short|void|typedef|struct|union|enum\@ + \b(inline|const|class|virtual|private|public|protected|friend|const|extern|auto|register|static|unsigned|signed|volatile|char|double|float|int|long|short|void|typedef|struct|union|enum)\b commonDefine - \@NULL|MAX|MIN|__LINE__|__DATA__|__FILE__|__func__|__TIME__|__STDC__\@ + \b(NULL|MAX|MIN|__LINE__|__DATA__|__FILE__|__func__|__TIME__|__STDC__)\b number - \@((0(x|X)[0-9a-fA-F]*)|(\d+\.?\d*|\.\d+)((e|E)(\+|\-)?\d+)?)(L|l|UL|ul|u|U|F|f)?\@ + \b(((0(x|X)[0-9a-fA-F]*)|(\d+\.?\d*|\.\d+)((e|E)(\+|\-)?\d+)?)(L|l|UL|ul|u|U|F|f)?)\b boolean - \@true|TRUE|false|FALSE\@ + \b(true|TRUE|false|FALSE)\b macro - \@[A-Z_][A-Z_0-9]{3,500}\@ + \b([A-Z_][A-Z_0-9]{3,500})\b memberClass - \@m_[A-Za-z_0-9]*\@ + \b(m_[A-Za-z_0-9]*)\b inputFunction - \@_[A-Za-z_0-9]*\@ + \b(_[A-Za-z_0-9]*)\b false - macro ([A-Z]|_){4,500} doxElem + + SYNTAX_ERROR + '|" + diff --git a/sources/appl/Highlight.cpp b/sources/appl/Highlight.cpp index 7583774..893caa9 100644 --- a/sources/appl/Highlight.cpp +++ b/sources/appl/Highlight.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -176,19 +177,27 @@ void appl::Highlight::parse(int64_t _start, int64_t elementStart = _start; int64_t elementStop = _stop; appl::HighlightInfo resultat; + int64_t startTime = ewol::getTime(); while (elementStart <= elementStop) { - HL_DEBUG("Parse element in the buffer pos=" << elementStart); + //APPL_DEBUG("Parse element in the buffer pos=" << elementStart); appl::HighlightInfo resultatLast; int64_t findAnOtherId = -1; + int64_t currentTime = ewol::getTime(); //try to fond the HL in ALL of we have for (int64_t jjj=0; jjj<(int64_t)m_listHighlightPass1.size(); jjj++){ enum resultFind ret = HLP_FIND_OK; - HL_DEBUG("Parse HL id=" << jjj << " position search: (" << elementStart << "," << _stop << ") input start='" << _buffer[elementStart] << "' " << m_listHighlightPass1[jjj]->getPaternString()); + /* + if (_buffer[elementStart] == '\n') { + APPL_DEBUG("Parse HL id=" << jjj << " position search: (" << elementStart << "," << _stop << ") input start='\\n' " << m_listHighlightPass1[jjj]->getPaternString()); + } else { + APPL_DEBUG("Parse HL id=" << jjj << " position search: (" << elementStart << "," << _stop << ") input start='" << _buffer[elementStart] << "' " << m_listHighlightPass1[jjj]->getPaternString()); + } + */ // Stop the search to the end (to get the end of the pattern) ret = m_listHighlightPass1[jjj]->find(elementStart, _buffer.size(), resultat, _buffer); if (HLP_FIND_ERROR != ret) { if (elementStart == resultat.start) { - APPL_DEBUG("Find Pattern in the Buffer : (" << resultat.start << "," << resultat.stop << ") startPos=" << elementStart ); + //APPL_DEBUG(" native Find"); findAnOtherId = jjj; resultatLast = resultat; break; @@ -202,13 +211,16 @@ void appl::Highlight::parse(int64_t _start, } } } + int64_t currentTimeEnd = ewol::getTime(); + int64_t deltaTime = currentTimeEnd - currentTime; if (findAnOtherId != -1) { + //APPL_DEBUG("Find Pattern in the Buffer : time=" << (float)deltaTime/1000.0f << " ms (" << resultatLast.start << "," << resultatLast.stop << ") startPos=" << elementStart << " for=" << m_listHighlightPass1[findAnOtherId]->getPaternString()); // remove element in the current List where the current Element have a end inside the next... int64_t kkk=_addingPos; while(kkk < (int64_t)_metaData.size() ) { if (_metaData[kkk].start <= resultatLast.stop) { // remove element - HL_DEBUG("Erase element=" << kkk); + APPL_DEBUG("Erase element=" << kkk); _metaData.erase(_metaData.begin()+kkk, _metaData.begin()+kkk+1); // Increase the end of search if (kkk < (int64_t)_metaData.size()) { @@ -232,11 +244,17 @@ void appl::Highlight::parse(int64_t _start, _addingPos++; // We find a pattern == > Stop search for the current element } else { - break; + //APPL_DEBUG("loose time : time=" << deltaTime << " us"); + //break; } // Go to the next element (and search again ...). elementStart++; } + int64_t stopTime = ewol::getTime(); + int64_t deltaTimeGlobal = stopTime - startTime; + APPL_DEBUG("parse in time=" << (float)deltaTimeGlobal/1000.0f << " ms "); + + } @@ -258,24 +276,42 @@ void appl::Highlight::parse2(int64_t _start, if (elementStart == 306) { //etk::log::setLevel(etk::log::logLevelVerbose); } + appl::HighlightInfo resultatLast; + int64_t findAnOtherId = -1; //HL2_DEBUG("Parse element in the buffer pos=" << elementStart << "," << _buffer.size() << ")" ); //try to fond the HL in ALL of we have for (int64_t jjj=0; jjj<(int64_t)m_listHighlightPass2.size(); jjj++){ - enum resultFind ret = HLP_FIND_OK; - HL2_DEBUG("Parse HL id=" << jjj << " position search: (" << - elementStart << "," << elementStop << ") in='" - << _buffer[elementStart] << "' " << m_listHighlightPass2[jjj]->getPaternString()); + enum resultFind ret; + HL_DEBUG("Parse HL id=" << jjj << " position search: (" << + elementStart << "," << elementStop << ") in='" + << _buffer[elementStart] << "' " << m_listHighlightPass2[jjj]->getPaternString()); // Stop the search to the end (to get the end of the pattern) ret = m_listHighlightPass2[jjj]->find(elementStart, elementStop, resultat, _buffer); if (ret != HLP_FIND_ERROR) { - HL2_DEBUG("Find Pattern in the Buffer : (" << resultat.start << "," << resultat.stop << ")" ); - // add curent element in the list ... - _metaData.push_back(resultat); - elementStart = resultat.stop-1; - // Exit current cycle - break; + if (elementStart == resultat.start) { + //APPL_DEBUG("Find Pattern in the Buffer : (" << resultat.start << "," << resultat.stop << ") startPos=" << elementStart ); + findAnOtherId = jjj; + resultatLast = resultat; + break; + } else { + // stack last find to prevent a unneded seach: + if ( findAnOtherId == -1 + || resultat.start < resultatLast.start) { + findAnOtherId = jjj; + resultatLast = resultat; + } + } } } + + if (findAnOtherId != -1) { + //APPL_DEBUG("Find Pattern in the Buffer : (" << resultat.start << "," << resultat.stop << ") startPos=" << elementStart ); + // add curent element in the list ... + _metaData.push_back(resultat); + elementStart = resultat.stop-1; + } else { + //break; + } // Go to the next element (and search again ...). elementStart++; } diff --git a/sources/appl/HighlightPattern.cpp b/sources/appl/HighlightPattern.cpp index 441403d..a9b8c9f 100644 --- a/sources/appl/HighlightPattern.cpp +++ b/sources/appl/HighlightPattern.cpp @@ -31,7 +31,8 @@ appl::HighlightPattern::~HighlightPattern() { void appl::HighlightPattern::setPatern(const std::string& _regExp, bool forceMaximize) { m_regexValue = _regExp; try { - m_regExp.assign(_regExp); + m_regExp.assign(_regExp, std::regex_constants::optimize | std::regex_constants::ECMAScript); + //m_regExp.assign(_regExp, std::regex_constants::optimize | std::regex_constants::extended); m_hasParsingError = false; } catch (std::regex_error e) { m_hasParsingError = true; @@ -126,12 +127,23 @@ enum resultFind appl::HighlightPattern::find(int32_t _start, std::smatch resultMatch; //APPL_DEBUG("find data at : start=" << _start << " stop=" << _stop << " regex='" << m_regexValue << "'"); - std::regex_search(_buffer.begin() + _start, _buffer.begin() + _stop, resultMatch, m_regExp); + std::regex_search(_buffer.begin() + _start, _buffer.begin() + _stop, resultMatch, m_regExp, std::regex_constants::match_continuous); if (resultMatch.size() > 0) { _resultat.start = std::distance(_buffer.begin(), resultMatch[0].first);; _resultat.stop = std::distance(_buffer.begin(), resultMatch[0].second); //APPL_DEBUG("find data at : start=" << _resultat.start << " stop=" << _resultat.stop << " data='" <