diff --git a/scintilla/Scintilla.vcxproj b/scintilla/Scintilla.vcxproj index c28da785e..16da66d66 100644 --- a/scintilla/Scintilla.vcxproj +++ b/scintilla/Scintilla.vcxproj @@ -341,6 +341,7 @@ + diff --git a/scintilla/Scintilla.vcxproj.filters b/scintilla/Scintilla.vcxproj.filters index a910054e8..f45d1bc18 100644 --- a/scintilla/Scintilla.vcxproj.filters +++ b/scintilla/Scintilla.vcxproj.filters @@ -183,6 +183,9 @@ src + + oniguruma\src + diff --git a/scintilla/oniguruma/scintilla/OnigurumaRegExEngine.cxx b/scintilla/oniguruma/scintilla/OnigurumaRegExEngine.cxx index fcbb51f20..24f033b26 100644 --- a/scintilla/oniguruma/scintilla/OnigurumaRegExEngine.cxx +++ b/scintilla/oniguruma/scintilla/OnigurumaRegExEngine.cxx @@ -82,18 +82,16 @@ static void SetSimpleOptions(OnigOptionType& onigOptions, EOLmode /*eolMode*/, // Notepad3 forced options ONIG_OPTION_ON(onigOptions, ONIG_OPTION_NEGATE_SINGLELINE); - + ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_SINGLELINE); ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_POSIX_REGION); ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_EXTEND); - ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_SINGLELINE); ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_FIND_LONGEST); - + ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_MATCH_WHOLE_STRING); + ONIG_OPTION_OFF(onigOptions, ONIG_SYN_OP_DOT_ANYCHAR); // (!!!) //ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_ASCII_RANGE); //ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_CAPTURE_GROUP); // dynamic options - ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_MATCH_WHOLE_STRING); - //switch (eolMode) { // case EOLmode::CR: // case EOLmode::LF: @@ -102,14 +100,12 @@ static void SetSimpleOptions(OnigOptionType& onigOptions, EOLmode /*eolMode*/, // break; //} - bool const bDotMatchesAll = FlagSet(searchFlags, FindOption::DotMatchAll); - - if (bDotMatchesAll) { - ONIG_OPTION_ON(onigOptions, ONIG_SYN_OP_DOT_ANYCHAR); + if (FlagSet(searchFlags, FindOption::DotMatchAll)) { + //~ONIG_OPTION_ON(onigOptions, ONIG_SYN_OP_DOT_ANYCHAR); ONIG_OPTION_ON(onigOptions, ONIG_OPTION_MULTILINE); } else { - ONIG_OPTION_OFF(onigOptions, ONIG_SYN_OP_DOT_ANYCHAR); + //~ONIG_OPTION_OFF(onigOptions, ONIG_SYN_OP_DOT_ANYCHAR); ONIG_OPTION_OFF(onigOptions, ONIG_OPTION_MULTILINE); } @@ -124,36 +120,40 @@ static void SetSimpleOptions(OnigOptionType& onigOptions, EOLmode /*eolMode*/, } else { } + } // ============================================================================ +#define NP3_ONIG_SYNTAX_FLAVOR (ONIG_SYNTAX_DEFAULT) // default is: ONIG_SYNTAX_ONIGURUMA - +// ----------------------------------------------------------------------------- class OnigurumaRegExEngine : public RegexSearchBase { public: explicit OnigurumaRegExEngine(CharClassify* /*charClassTable*/) - : m_OnigSyntax(*ONIG_SYNTAX_DEFAULT) + : m_OnigSyntax(*NP3_ONIG_SYNTAX_FLAVOR) , m_CmplOptions(ONIG_OPTION_DEFAULT) , m_RegExpr(nullptr) , m_Region({0,0,nullptr,nullptr,nullptr}) + , m_RangeBeg(-1) + , m_RangeEnd(-1) , m_ErrorInfo() + , m_Result(ONIG_MISMATCH) , m_MatchPos(ONIG_MISMATCH) , m_MatchLen(0) { m_OnigSyntax.op |= ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END; // xcluded from ONIG_SYNTAX_DEFAULT ? onig_initialize(s_UsedEncodingsTypes, _ARRAYSIZE(s_UsedEncodingsTypes)); - ///onig_set_default_syntax(ONIG_SYNTAX_ONIGURUMA); // std is: ONIG_SYNTAX_ONIGURUMA + onig_set_default_syntax(NP3_ONIG_SYNTAX_FLAVOR); // std is: ONIG_SYNTAX_ONIGURUMA onig_region_init(&m_Region); } ~OnigurumaRegExEngine() override { - onig_region_free(&m_Region, 0); /* 1:free self, 0:free contents only */ - onig_free(m_RegExpr); + clear(); onig_end(); } @@ -166,9 +166,11 @@ public: private: - std::string &translateRegExpr(std::string ®ExprStr, bool wholeWord, bool wordStart, EndOfLine eolMode, OnigOptionType &rxOptions); + void clear(); - std::string& convertReplExpr(std::string& replStr); + std::string translateRegExpr(const std::string & regExprStr, bool wholeWord, bool wordStart, EndOfLine eolMode, OnigOptionType & rxOptions); + + std::string convertReplExpr(const std::string & replStr); //void regexFindAndReplace(std::string& inputStr_inout, const std::string& patternStr, const std::string& replStr); @@ -181,8 +183,12 @@ private: OnigRegex m_RegExpr; OnigRegion m_Region; + Sci::Position m_RangeBeg; + Sci::Position m_RangeEnd; + char m_ErrorInfo[ONIG_MAX_ERROR_MESSAGE_LEN]; + OnigPos m_Result; Sci::Position m_MatchPos; Sci::Position m_MatchLen; @@ -273,6 +279,7 @@ Sci::Position OnigurumaRegExEngine::FindText(Document* doc, Sci::Position minPos return SciPos(-1); } + auto const docBegPos = SciPos(0); auto const docEndPos = SciPos(doc->Length()); EOLmode const eolMode = static_cast(doc->eolMode); @@ -283,48 +290,53 @@ Sci::Position OnigurumaRegExEngine::FindText(Document* doc, Sci::Position minPos minPos = doc->MovePositionOutsideChar(minPos + (findForward ? 0 : -1), increment, false); maxPos = doc->MovePositionOutsideChar(maxPos, increment, false); - Sci::Position const rangeBeg = (findForward) ? minPos : maxPos; Sci::Position const rangeEnd = (findForward) ? maxPos : minPos; Sci::Position const rangeLen = (rangeEnd - rangeBeg); OnigOptionType onigOptions; SetSimpleOptions(onigOptions, eolMode, caseSensitive, findForward, searchFlags); - ONIG_OPTION_ON(onigOptions, (rangeBeg > 0) ? ONIG_OPTION_NOTBOL : ONIG_OPTION_NONE); + ONIG_OPTION_ON(onigOptions, (rangeBeg > docBegPos) ? ONIG_OPTION_NOTBOL : ONIG_OPTION_NONE); ONIG_OPTION_ON(onigOptions, (rangeEnd < docEndPos) ? ONIG_OPTION_NOTEOL : ONIG_OPTION_NONE); - std::string sPattern(pattern); - std::string const & sRegExprStrg = translateRegExpr(sPattern, word, wordStart, doc->eolMode, onigOptions); + std::string const sRegExprStrg = translateRegExpr(pattern, word, wordStart, doc->eolMode, onigOptions); bool const bReCompile = (m_RegExpr == nullptr) || (m_CmplOptions != onigOptions) || (m_RegExprStrg.compare(sRegExprStrg) != 0); if (bReCompile) { - m_RegExprStrg.clear(); + clear(); m_RegExprStrg = sRegExprStrg; m_CmplOptions = onigOptions; + m_RangeBeg = rangeBeg; + m_RangeEnd = rangeEnd; m_ErrorInfo[0] = '\0'; try { OnigErrorInfo einfo; - onig_free(m_RegExpr); - //OnigEncoding const onigEncType = ONIG_ENCODING_UTF8; OnigEncoding const onigEncType = (eolMode == EOLmode::LF) ? ONIG_ENCODING_UTF8 : ((eolMode == EOLmode::CR) ? ONIG_ENCODING_UTF8_CR : ONIG_ENCODING_UTF8_CRLF); - int res = onig_new(&m_RegExpr, UCharCPtr(m_RegExprStrg.c_str()), UCharCPtr(m_RegExprStrg.c_str() + m_RegExprStrg.length()), - m_CmplOptions, onigEncType, &m_OnigSyntax, &einfo); + + int const res = onig_new(&m_RegExpr, UCharCPtr(m_RegExprStrg.c_str()), UCharCPtr(m_RegExprStrg.c_str() + m_RegExprStrg.length()), + m_CmplOptions, onigEncType, &m_OnigSyntax, &einfo); + if (res != ONIG_NORMAL) { onig_error_code_to_str(UCharPtr(m_ErrorInfo), res, &einfo); + clear(); return SciPos(-2); // -1 is normally used for not found, -2 is used here for invalid regex } } catch (...) { + clear(); return SciPos(-2); } + } else { + // check if already searched for + if ((m_RangeBeg == rangeBeg) && (m_RangeEnd == rangeEnd)) { + *length = m_MatchLen; + return m_MatchPos; + } } - m_MatchPos = SciPos(ONIG_MISMATCH); // not found - m_MatchLen = SciPos(0); - // --- search document range for pattern match --- // !!! Performance issue: Scintilla: moving Gap needs memcopy - high costs for find/replace in large document auto const docBegPtr = UCharCPtr(doc->RangePointer(0, docEndPos)); @@ -332,31 +344,34 @@ Sci::Position OnigurumaRegExEngine::FindText(Document* doc, Sci::Position minPos auto const rangeBegPtr = UCharCPtr(doc->RangePointer(rangeBeg, rangeLen)); auto const rangeEndPtr = UCharCPtr(doc->RangePointer(rangeEnd, 0)); - OnigPos result = ONIG_MISMATCH; + m_Result = ONIG_MISMATCH; try { onig_region_free(&m_Region, 0); /* 1:free self, 0:free contents only */ onig_region_init(&m_Region); if (findForward) - result = onig_search(m_RegExpr, docBegPtr, docEndPtr, rangeBegPtr, rangeEndPtr, &m_Region, onigOptions); + m_Result = onig_search(m_RegExpr, docBegPtr, docEndPtr, rangeBegPtr, rangeEndPtr, &m_Region, onigOptions); else // X // - result = onig_search(m_RegExpr, docBegPtr, docEndPtr, rangeEndPtr, rangeBegPtr, &m_Region, onigOptions); + m_Result = onig_search(m_RegExpr, docBegPtr, docEndPtr, rangeEndPtr, rangeBegPtr, &m_Region, onigOptions); } catch (...) { return SciPos(-3); // -1 is normally used for not found, -3 is used here for exception } - if (result < ONIG_MISMATCH) { - onig_error_code_to_str(UCharPtr(m_ErrorInfo), result); + if (m_Result < ONIG_MISMATCH) { + onig_error_code_to_str(UCharPtr(m_ErrorInfo), m_Result); return SciPos(-3); } - if ((result >= 0) && (rangeBegPtr <= rangeEndPtr)) + if ((m_Result >= 0) && (m_Region.num_regs >= 1)) { - //~m_MatchPos = SciPos(result); // + //~m_MatchPos = SciPos(m_Result); // m_MatchPos = SciPos(m_Region.beg[0]); - //~m_MatchLen = SciPos(m_Region.end[0] - result); - m_MatchLen = SciPos(m_Region.end[0]) - SciPos(m_Region.beg[0]); + //~m_MatchLen = SciPos(m_Region.end[0] - m_Result); + m_MatchLen = SciPos(m_Region.end[0]) - m_MatchPos; + } else { + m_MatchPos = SciPos(ONIG_MISMATCH); + m_MatchLen = SciPos(0); } //NOTE: potential 64-bit-size issue at interface here: @@ -514,24 +529,37 @@ void OnigurumaRegExEngine::regexFindAndReplace(std::string& inputStr_inout, cons */ +void OnigurumaRegExEngine::clear() { + m_RegExprStrg.clear(); + onig_region_free(&m_Region, 0); /* 1:free self, 0:free contents only */ + onig_free(m_RegExpr); + m_RegExpr = nullptr; + // reset + m_RangeBeg = SciPos(ONIG_MISMATCH); + m_RangeEnd = SciPos(ONIG_MISMATCH); + m_Result = ONIG_MISMATCH; + m_MatchPos = SciPos(ONIG_MISMATCH); + m_MatchLen = SciPos(0); +} +// ---------------------------------------------------------------------------- -std::string &OnigurumaRegExEngine::translateRegExpr(std::string ®ExprStr, bool wholeWord, bool wordStart, EndOfLine eolMode, OnigOptionType & /*rxOptions*/) { - std::string tmpStr; - bool bUseTmpStrg = false; + +std::string OnigurumaRegExEngine::translateRegExpr(const std::string & regExprStr, bool wholeWord, bool wordStart, EndOfLine eolMode, OnigOptionType & /*rxOptions*/) +{ + std::string transRegExpr; if (wholeWord || wordStart) { // push '\b' at the begin of regexpr - tmpStr.push_back('\\'); - tmpStr.push_back('b'); - tmpStr.append(regExprStr); + transRegExpr.push_back('\\'); + transRegExpr.push_back('b'); + transRegExpr.append(regExprStr); if (wholeWord) { // push '\b' at the end of regexpr - tmpStr.push_back('\\'); - tmpStr.push_back('b'); + transRegExpr.push_back('\\'); + transRegExpr.push_back('b'); } - replaceAll(tmpStr, ".", R"(\w)"); - bUseTmpStrg = true; + replaceAll(transRegExpr, ".", R"(\w)"); } else { - tmpStr.append(regExprStr); + transRegExpr.append(regExprStr); } //if (wholeString) { @@ -542,11 +570,10 @@ std::string &OnigurumaRegExEngine::translateRegExpr(std::string ®ExprStr, boo // Oniguruma supports LTGT word boundary by: ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END // - //~replaceAll(tmpStr, R"(\<)", R"((?)", R"((?<=\w)(?!\w))"); // word end - //~replaceAll(tmpStr, R"(\(?<=\w)(?!\w))", R"(\\>)"); // esc'd - //~bUseTmpStrg = true; + //~replaceAll(transRegExpr, R"(\<)", R"((?)", R"((?<=\w)(?!\w))"); // word end + //~replaceAll(transRegExpr, R"(\(?<=\w)(?!\w))", R"(\\>)"); // esc'd // EOL modes @@ -561,16 +588,15 @@ std::string &OnigurumaRegExEngine::translateRegExpr(std::string ®ExprStr, boo break; } - if (bUseTmpStrg) { std::swap(regExprStr, tmpStr); } - - return regExprStr; + return transRegExpr; } // ---------------------------------------------------------------------------- -std::string& OnigurumaRegExEngine::convertReplExpr(std::string& replStr) +std::string OnigurumaRegExEngine::convertReplExpr(const std::string& replStr) { - std::string tmpStr; + std::string convReplExpr; + for (size_t i = 0; i < replStr.length(); ++i) { char ch = replStr[i]; if (ch == '\\') { @@ -578,36 +604,36 @@ std::string& OnigurumaRegExEngine::convertReplExpr(std::string& replStr) if (ch >= '1' && ch <= '9') { // former behavior convenience: // change "\\" to deelx's group reference ($) - tmpStr.push_back('$'); - tmpStr.push_back(ch); + convReplExpr.push_back('$'); + convReplExpr.push_back(ch); continue; } switch (ch) { // check for escape seq: case 'a': - tmpStr.push_back('\a'); + convReplExpr.push_back('\a'); break; case 'b': - tmpStr.push_back('\x1B'); + convReplExpr.push_back('\x1B'); break; case 'f': - tmpStr.push_back('\f'); + convReplExpr.push_back('\f'); break; case 'n': - tmpStr.push_back('\n'); + convReplExpr.push_back('\n'); break; case 'r': - tmpStr.push_back('\r'); + convReplExpr.push_back('\r'); break; case 't': - tmpStr.push_back('\t'); + convReplExpr.push_back('\t'); break; case 'v': - tmpStr.push_back('\v'); + convReplExpr.push_back('\v'); break; case '\\': - tmpStr.push_back('\\'); // preserve escd "\" - tmpStr.push_back('\\'); + convReplExpr.push_back('\\'); // preserve escd "\" + convReplExpr.push_back('\\'); break; case 'x': case 'u': @@ -646,31 +672,30 @@ std::string& OnigurumaRegExEngine::convertReplExpr(std::string& replStr) if (val[0]) { val[1] = 0; WideCharToMultiByte(CP_UTF8, 0, val, -1, buf, ARRAYSIZE(val), nullptr, nullptr); - tmpStr.push_back(*pch++); + convReplExpr.push_back(*pch++); while (*pch) - tmpStr.push_back(*pch++); + convReplExpr.push_back(*pch++); } else - tmpStr.push_back(ch); // unknown hex seq + convReplExpr.push_back(ch); // unknown hex seq } else - tmpStr.push_back(ch); // unknown hex seq + convReplExpr.push_back(ch); // unknown hex seq } break; default: // unknown ctrl seq - tmpStr.push_back('\\'); // revert - tmpStr.push_back(ch); + convReplExpr.push_back('\\'); // revert + convReplExpr.push_back(ch); break; } } else { - tmpStr.push_back(ch); + convReplExpr.push_back(ch); } } //for - std::swap(replStr,tmpStr); - return replStr; + return convReplExpr; } // ============================================================================ @@ -688,7 +713,7 @@ public: explicit SimpleRegExEngine(const EOLmode eolMode) : m_EOLmode(eolMode) - , m_OnigSyntax(*ONIG_SYNTAX_DEFAULT) + , m_OnigSyntax(*NP3_ONIG_SYNTAX_FLAVOR) , m_Options(ONIG_OPTION_DEFAULT) , m_RegExpr(nullptr) , m_Region({ 0,0,nullptr,nullptr,nullptr }) @@ -698,6 +723,7 @@ public: { m_OnigSyntax.op |= ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END; // xcluded from ONIG_SYNTAX_DEFAULT ? onig_initialize(s_UsedEncodingsTypes, _ARRAYSIZE(s_UsedEncodingsTypes)); + onig_set_default_syntax(NP3_ONIG_SYNTAX_FLAVOR); // std is: ONIG_SYNTAX_ONIGURUMA onig_region_init(&m_Region); } @@ -775,8 +801,7 @@ OnigPos SimpleRegExEngine::Find(const OnigUChar* pattern, const OnigUChar* docum const UChar* rangeEnd = strgEnd; // start search - OnigPos result = onig_search(m_RegExpr, strgBeg, strgEnd, - rangeBeg, rangeEnd, &m_Region, m_Options); + OnigPos result = onig_search(m_RegExpr, strgBeg, strgEnd, rangeBeg, rangeEnd, &m_Region, m_Options); if (result < ONIG_MISMATCH) { //onig_error_code_to_str(m_ErrorInfo, result); @@ -791,7 +816,7 @@ OnigPos SimpleRegExEngine::Find(const OnigUChar* pattern, const OnigUChar* docum //~m_MatchPos = result; // m_MatchPos = m_Region.beg[0]; //~m_MatchLen = (m_Region.end[0] - result); - m_MatchLen = (m_Region.end[0] - m_Region.beg[0]); + m_MatchLen = m_Region.end[0] - m_MatchPos; } //else if (result == ONIG_MISMATCH) // not found //{ diff --git a/scintilla/oniguruma/src/ascii.c b/scintilla/oniguruma/src/ascii.c index 8330b82d4..c19272811 100644 --- a/scintilla/oniguruma/src/ascii.c +++ b/scintilla/oniguruma/src/ascii.c @@ -146,8 +146,8 @@ OnigEncodingType OnigEncodingASCII_CR = { OnigEncodingType OnigEncodingASCII_CRLF = { onigenc_single_byte_mbc_enc_len, "US-ASCII", /* name */ - 1, /* max enc length */ - 1, /* min enc length */ + 2, /* max enc length */ + 2, /* min enc length */ onigenc_is_mbc_newline_0x0d_0x0a, onigenc_single_byte_mbc_to_code, onigenc_single_byte_code_to_mbclen, diff --git a/scintilla/oniguruma/src/make_unicode_property_data.py b/scintilla/oniguruma/src/make_unicode_property_data.py index ee896f979..d30a92b04 100644 --- a/scintilla/oniguruma/src/make_unicode_property_data.py +++ b/scintilla/oniguruma/src/make_unicode_property_data.py @@ -7,7 +7,7 @@ import sys import re POSIX_LIST = [ - 'NEWLINE', 'Alpha', 'Blank', 'Cntrl', 'Digit', 'Graph', 'Lower', + 'NEWLINE', 'Alpha', 'Blank', 'Cntrl', 'Digit', 'Graph', 'Lower', 'Print', 'PosixPunct', 'Space', 'Upper', 'XDigit', 'Word', 'Alnum', 'ASCII' ] diff --git a/scintilla/oniguruma/src/oniguruma.h b/scintilla/oniguruma/src/oniguruma.h index aa4f3de55..b39571c19 100644 --- a/scintilla/oniguruma/src/oniguruma.h +++ b/scintilla/oniguruma/src/oniguruma.h @@ -195,9 +195,8 @@ ONIG_EXTERN OnigEncodingType OnigEncodingUTF8_CR; ONIG_EXTERN OnigEncodingType OnigEncodingUTF8_CRLF; #endif +#if 0 #define ONIG_ENCODING_ASCII (&OnigEncodingASCII) -#define ONIG_ENCODING_ASCII_CR (&OnigEncodingASCII_CR) -#define ONIG_ENCODING_ASCII_CRLF (&OnigEncodingASCII_CRLF) #define ONIG_ENCODING_ISO_8859_1 (&OnigEncodingISO_8859_1) #define ONIG_ENCODING_ISO_8859_2 (&OnigEncodingISO_8859_2) #define ONIG_ENCODING_ISO_8859_3 (&OnigEncodingISO_8859_3) @@ -214,8 +213,6 @@ ONIG_EXTERN OnigEncodingType OnigEncodingUTF8_CRLF; #define ONIG_ENCODING_ISO_8859_15 (&OnigEncodingISO_8859_15) #define ONIG_ENCODING_ISO_8859_16 (&OnigEncodingISO_8859_16) #define ONIG_ENCODING_UTF8 (&OnigEncodingUTF8) -#define ONIG_ENCODING_UTF8_CR (&OnigEncodingUTF8_CR) -#define ONIG_ENCODING_UTF8_CRLF (&OnigEncodingUTF8_CRLF) #define ONIG_ENCODING_UTF16_BE (&OnigEncodingUTF16_BE) #define ONIG_ENCODING_UTF16_LE (&OnigEncodingUTF16_LE) #define ONIG_ENCODING_UTF32_BE (&OnigEncodingUTF32_BE) @@ -230,6 +227,14 @@ ONIG_EXTERN OnigEncodingType OnigEncodingUTF8_CRLF; #define ONIG_ENCODING_CP1251 (&OnigEncodingCP1251) #define ONIG_ENCODING_BIG5 (&OnigEncodingBIG5) #define ONIG_ENCODING_GB18030 (&OnigEncodingGB18030) +#else // lean and mean +#define ONIG_ENCODING_ASCII (&OnigEncodingASCII) +#define ONIG_ENCODING_ASCII_CR (&OnigEncodingASCII_CR) +#define ONIG_ENCODING_ASCII_CRLF (&OnigEncodingASCII_CRLF) +#define ONIG_ENCODING_UTF8 (&OnigEncodingUTF8) +#define ONIG_ENCODING_UTF8_CR (&OnigEncodingUTF8_CR) +#define ONIG_ENCODING_UTF8_CRLF (&OnigEncodingUTF8_CRLF) +#endif #define ONIG_ENCODING_UNDEF ((OnigEncoding )0) diff --git a/scintilla/oniguruma/src/regcomp.c b/scintilla/oniguruma/src/regcomp.c index 6277a2071..b8e5a4231 100644 --- a/scintilla/oniguruma/src/regcomp.c +++ b/scintilla/oniguruma/src/regcomp.c @@ -7076,7 +7076,7 @@ clear_optimize_info(regex_t* reg) static void print_enc_string(FILE* fp, OnigEncoding enc, - const UChar *s, const UChar *end) + const UChar *s, const UChar *end) { if (ONIGENC_MBC_MINLEN(enc) > 1) { const UChar *p; @@ -7106,7 +7106,7 @@ print_enc_string(FILE* fp, OnigEncoding enc, } } else { /* for UTF-8 */ - fputc((int )*s, fp); + fputc((int )*s, fp); } s++; } @@ -7251,7 +7251,7 @@ print_optimize_info(FILE* f, regex_t* reg) if (reg->map[i]) n++; fprintf(f, "map: n=%d, dmin: %u, dmax: %u\n", - n, reg->dist_min, reg->dist_max); + n, reg->dist_min, reg->dist_max); if (n > 0) { c = 0; fputc('[', f); diff --git a/scintilla/oniguruma/src/regenc.c b/scintilla/oniguruma/src/regenc.c index a5d9f2a13..975359fec 100644 --- a/scintilla/oniguruma/src/regenc.c +++ b/scintilla/oniguruma/src/regenc.c @@ -719,8 +719,7 @@ extern int onigenc_is_mbc_newline_0x0d_0x0a(const UChar* p, const UChar* end) { if (p < end) { - //~if ((*p == CARRIAGE_RET) && (*(p+1) == NEWLINE_CODE)) return 1; // CRLF - if ((*p == NEWLINE_CODE) || (*p == CARRIAGE_RET)) return 1; // LF|CR + if ((*p == CARRIAGE_RET) && (*(p+1) == NEWLINE_CODE)) return 1; // CRLF } return 0; } diff --git a/scintilla/oniguruma/src/regexec.c b/scintilla/oniguruma/src/regexec.c index eb450dba0..4a92bcadc 100644 --- a/scintilla/oniguruma/src/regexec.c +++ b/scintilla/oniguruma/src/regexec.c @@ -3059,7 +3059,7 @@ match_at(regex_t* reg, const UChar* str, const UChar* end, } #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE - if (OPTON_FIND_LONGEST(options)) { + if (OPTON_FIND_LONGEST(options)) { if (n > best_len) { if (n > msa->best_len) { best_len = n; @@ -3080,10 +3080,10 @@ match_at(regex_t* reg, const UChar* str, const UChar* end, } } else { - best_len = n; - } -#else best_len = n; + } +#else + best_len = n; #endif /* set region */ @@ -4656,8 +4656,8 @@ regset_search_body_position_lead(OnigRegSet* set, static inline int regset_search_body_regex_lead(OnigRegSet* set, - const UChar* str, const UChar* end, - const UChar* start, const UChar* orig_range, OnigRegSetLead lead, + const UChar* str, const UChar* end, + const UChar* start, const UChar* orig_range, OnigRegSetLead lead, OnigOptionType option, OnigMatchParam* mps[], int* rmatch_pos) { int r; @@ -4828,9 +4828,9 @@ onig_regset_search_with_param(OnigRegSet* set, goto match; } else goto finish; /* error */ - } } } + } goto mismatch; } @@ -4890,7 +4890,7 @@ onig_regset_search_with_param(OnigRegSet* set, extern int onig_regset_search(OnigRegSet* set, const UChar* str, const UChar* end, - const UChar* start, const UChar* range, + const UChar* start, const UChar* range, OnigRegSetLead lead, OnigOptionType option, int* rmatch_pos) { int r; diff --git a/scintilla/oniguruma/src/regext.c b/scintilla/oniguruma/src/regext.c new file mode 100644 index 000000000..c46f630c5 --- /dev/null +++ b/scintilla/oniguruma/src/regext.c @@ -0,0 +1,202 @@ +/********************************************************************** + regext.c - Oniguruma (regular expression library) +**********************************************************************/ +/*- + * Copyright (c) 2002-2019 K.Kosako + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "regint.h" + +#if 0 +static void +conv_ext0be32(const UChar* s, const UChar* end, UChar* conv) +{ + while (s < end) { + *conv++ = '\0'; + *conv++ = '\0'; + *conv++ = '\0'; + *conv++ = *s++; + } +} + +static void +conv_ext0le32(const UChar* s, const UChar* end, UChar* conv) +{ + while (s < end) { + *conv++ = *s++; + *conv++ = '\0'; + *conv++ = '\0'; + *conv++ = '\0'; + } +} + +static void +conv_ext0be(const UChar* s, const UChar* end, UChar* conv) +{ + while (s < end) { + *conv++ = '\0'; + *conv++ = *s++; + } +} + +static void +conv_ext0le(const UChar* s, const UChar* end, UChar* conv) +{ + while (s < end) { + *conv++ = *s++; + *conv++ = '\0'; + } +} + +static void +conv_swap4bytes(const UChar* s, const UChar* end, UChar* conv) +{ + while (s < end) { + *conv++ = s[3]; + *conv++ = s[2]; + *conv++ = s[1]; + *conv++ = s[0]; + s += 4; + } +} + +static void +conv_swap2bytes(const UChar* s, const UChar* end, UChar* conv) +{ + while (s < end) { + *conv++ = s[1]; + *conv++ = s[0]; + s += 2; + } +} + +static int +conv_encoding(OnigEncoding from, OnigEncoding to, const UChar* s, const UChar* end, + UChar** conv, UChar** conv_end) +{ + int len = (int )(end - s); + + if (to == ONIG_ENCODING_UTF16_BE) { + if (from == ONIG_ENCODING_ASCII || from == ONIG_ENCODING_ISO_8859_1) { + *conv = (UChar* )xmalloc(len * 2); + CHECK_NULL_RETURN_MEMERR(*conv); + *conv_end = *conv + (len * 2); + conv_ext0be(s, end, *conv); + return 0; + } + else if (from == ONIG_ENCODING_UTF16_LE) { + swap16: + *conv = (UChar* )xmalloc(len); + CHECK_NULL_RETURN_MEMERR(*conv); + *conv_end = *conv + len; + conv_swap2bytes(s, end, *conv); + return 0; + } + } + else if (to == ONIG_ENCODING_UTF16_LE) { + if (from == ONIG_ENCODING_ASCII || from == ONIG_ENCODING_ISO_8859_1) { + *conv = (UChar* )xmalloc(len * 2); + CHECK_NULL_RETURN_MEMERR(*conv); + *conv_end = *conv + (len * 2); + conv_ext0le(s, end, *conv); + return 0; + } + else if (from == ONIG_ENCODING_UTF16_BE) { + goto swap16; + } + } + if (to == ONIG_ENCODING_UTF32_BE) { + if (from == ONIG_ENCODING_ASCII || from == ONIG_ENCODING_ISO_8859_1) { + *conv = (UChar* )xmalloc(len * 4); + CHECK_NULL_RETURN_MEMERR(*conv); + *conv_end = *conv + (len * 4); + conv_ext0be32(s, end, *conv); + return 0; + } + else if (from == ONIG_ENCODING_UTF32_LE) { + swap32: + *conv = (UChar* )xmalloc(len); + CHECK_NULL_RETURN_MEMERR(*conv); + *conv_end = *conv + len; + conv_swap4bytes(s, end, *conv); + return 0; + } + } + else if (to == ONIG_ENCODING_UTF32_LE) { + if (from == ONIG_ENCODING_ASCII || from == ONIG_ENCODING_ISO_8859_1) { + *conv = (UChar* )xmalloc(len * 4); + CHECK_NULL_RETURN_MEMERR(*conv); + *conv_end = *conv + (len * 4); + conv_ext0le32(s, end, *conv); + return 0; + } + else if (from == ONIG_ENCODING_UTF32_BE) { + goto swap32; + } + } + + return ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION; +} +#endif + +extern int +onig_new_deluxe(regex_t** reg, const UChar* pattern, const UChar* pattern_end, + OnigCompileInfo* ci, OnigErrorInfo* einfo) +{ + int r; + UChar *cpat, *cpat_end; + + if (IS_NOT_NULL(einfo)) einfo->par = (UChar* )NULL; + + if (ci->pattern_enc != ci->target_enc) { + return ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION; + } + else { + cpat = (UChar* )pattern; + cpat_end = (UChar* )pattern_end; + } + + *reg = (regex_t* )xmalloc(sizeof(regex_t)); + if (IS_NULL(*reg)) { + r = ONIGERR_MEMORY; + goto err2; + } + + r = onig_reg_init(*reg, ci->option, ci->case_fold_flag, ci->target_enc, + ci->syntax); + if (r != 0) goto err; + + r = onig_compile(*reg, cpat, cpat_end, einfo); + if (r != 0) { + err: + onig_free(*reg); + *reg = NULL; + } + + err2: + if (cpat != pattern) xfree(cpat); + + return r; +} diff --git a/scintilla/oniguruma/src/regparse.c b/scintilla/oniguruma/src/regparse.c index efd106b42..fc9734029 100644 --- a/scintilla/oniguruma/src/regparse.c +++ b/scintilla/oniguruma/src/regparse.c @@ -5172,10 +5172,10 @@ is_posix_bracket_start(UChar* from, UChar* to, OnigEncoding enc) p = from; while (p < to) { x = ONIGENC_MBC_TO_CODE(enc, p, to); - p += enclen(enc, p); + p += enclen(enc, p); if (x == ':') { if (p < to) { - x = ONIGENC_MBC_TO_CODE(enc, p, to); + x = ONIGENC_MBC_TO_CODE(enc, p, to); if (x == ']') { if (n == 0) return FALSE; else return TRUE; @@ -5183,13 +5183,13 @@ is_posix_bracket_start(UChar* from, UChar* to, OnigEncoding enc) } return FALSE; - } + } else if (x == '^' && n == 0) { ; } else if (! ONIGENC_IS_CODE_ALPHA(enc, x)) { break; - } + } n += 1; } @@ -6666,8 +6666,8 @@ prs_posix_bracket(CClassNode* cc, UChar** src, UChar* end, ParseEnv* env) } } - return ONIGERR_INVALID_POSIX_BRACKET_TYPE; - } + return ONIGERR_INVALID_POSIX_BRACKET_TYPE; +} static int fetch_char_property_to_ctype(UChar** src, UChar* end, ParseEnv* env) diff --git a/scintilla/oniguruma/src/regposix.c b/scintilla/oniguruma/src/regposix.c index 0219cf65d..ad69d70fa 100644 --- a/scintilla/oniguruma/src/regposix.c +++ b/scintilla/oniguruma/src/regposix.c @@ -223,7 +223,7 @@ onig_posix_regexec(onig_posix_regex_t* reg, const char* str, size_t nmatch, ENC_STRING_LEN(ONIG_C(reg)->enc, str, len); end = (UChar* )(str + len); r = onig_search(ONIG_C(reg), (UChar* )str, end, (UChar* )str, end, - (OnigRegion* )pm, options); + (OnigRegion* )pm, options); if (r >= 0) { r = 0; /* Match */ diff --git a/src/Edit.c b/src/Edit.c index 7e4472c6f..eab5e657d 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -5888,8 +5888,6 @@ static char* _GetReplaceString(HWND hwnd, CLPCEDITFINDREPLACE lpefr, int* iRepla static DocPos _FindInTarget(LPCWSTR wchFind, int sFlags, DocPos* begin, DocPos* end, bool bForceNext, FR_UPD_MODES fMode) { - UNREFERENCED_PARAMETER(bForceNext); - static char chFind[8192] = { '\0' }; // max find buffer DocPos iPos = -1LL; // not found @@ -6606,7 +6604,8 @@ static INT_PTR CALLBACK EditFindReplaceDlgProc(HWND hwnd, UINT umsg, WPARAM wPar DocPos end = Sci_GetDocEndPosition(); LPCWSTR wchFind = _EditGetFindStrg(s_pEfrData->hwnd, s_pEfrData, false); - DocPos const iPos = _FindInTarget(wchFind, (int)(s_pEfrData->fuFlags), &start, &end, false, FRMOD_NORM); + DocPos const iPos = _FindInTarget(wchFind, (int)(s_pEfrData->fuFlags), &start, &end, false, FRMOD_NORM); + if (iPos >= 0) { if (s_bIsReplaceDlg) { SciCall_ScrollRange(end, iPos); @@ -7077,7 +7076,7 @@ bool EditFindNext(HWND hwnd, const LPEDITFINDREPLACE lpefr, bool bExtendSelectio DocPos const iDocEndPos = Sci_GetDocEndPosition(); - EditSetCaretToSelectionEnd(); // fluent swittch between Prev/Next + EditSetCaretToSelectionEnd(); // fluent switch between Prev/Next DocPos start = SciCall_GetCurrentPos(); DocPos end = iDocEndPos; diff --git a/src/Notepad3.c b/src/Notepad3.c index 49b7accc9..ecfea5e25 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -12613,6 +12613,39 @@ static unsigned __stdcall FileChangeObserver(void * pArg) { // ---------------------------------------------------------------------------- +static void StopFileChangeObserver(HANDLE* phObserverThread) +{ +#pragma warning(push) +#pragma warning(disable : 6258) + + if (IS_VALID_HANDLE(*phObserverThread)) { + if (IS_VALID_HANDLE(s_hEventObserverDone)) { + DWORD const wait = SignalObjectAndWait(s_hEventObserverDone, *phObserverThread, + /*INFINITE*/ (dwObservingTimeout << 1), FALSE); + if (wait == WAIT_OBJECT_0) { + CloseHandle(*phObserverThread); // ok + } + else if (wait == WAIT_TIMEOUT) { + TerminateThread(*phObserverThread, 0UL); + assert("Observer Timeout Exceeded Error!" && false); + } + else { + TerminateThread(*phObserverThread, 0UL); + assert("Fatal Observer Error!" && false); + } + } + else { + TerminateThread(*phObserverThread, 0UL); + assert("Fatal: Invalid Observer Done Handle!" && false); + } + *phObserverThread = INVALID_HANDLE_VALUE; + } + +#pragma warning(pop) +} +// ---------------------------------------------------------------------------- + + void InstallFileWatching(const bool bInstall) { static HANDLE _hChangeHandle = INVALID_HANDLE_VALUE; // observer @@ -12639,40 +12672,13 @@ void InstallFileWatching(const bool bInstall) { bool const bTerminate = !bInstall || !bWatchFile || !bFileDirExists; -#pragma warning(push) -#pragma warning(disable:6258) - // Terminate previous watching if (bTerminate) { - ResetFileObservationData(true); - KillTimer(Globals.hwndMain, ID_WATCHTIMER); - - if (IS_VALID_HANDLE(_hObserverThread)) { - if (IS_VALID_HANDLE(s_hEventObserverDone)) { - DWORD const wait = SignalObjectAndWait(s_hEventObserverDone, _hObserverThread, - /*INFINITE*/ (dwObservingTimeout << 1), FALSE); - if (wait == WAIT_OBJECT_0) { - CloseHandle(_hObserverThread); // ok - } - else if (wait == WAIT_TIMEOUT) { - TerminateThread(_hObserverThread, 0UL); - assert("Observer Timeout Exceeded Error!" && false); - } else { - TerminateThread(_hObserverThread, 0UL); - assert("Fatal Observer Error!" && false); - } - } else { - TerminateThread(_hObserverThread, 0UL); - assert("Fatal: Invalid Observer Done Handle!" && false); - } - _hObserverThread = INVALID_HANDLE_VALUE; - } + StopFileChangeObserver(&_hObserverThread); } -#pragma warning(pop) - if (bInstall) { if (bWatchFile) {