From: <va...@us...> - 2010-08-14 14:12:30
|
Revision: 12187 http://swig.svn.sourceforge.net/swig/?rev=12187&view=rev Author: vadz Date: 2010-08-14 14:12:23 +0000 (Sat, 14 Aug 2010) Log Message: ----------- Fix bug in applying regex replacement to non-matching strings. We didn't handle pcre_exec() return code properly and so the replacement could be still done even if there was no match if the replacement part contained anything else than back-references (in this, the only tested so far, case the replacement was still done but the result turned out to be empty and the calling code assumed the regex didn't match). Do check for PCRE_ERROR_NOMATCH now and also give an error message if another error unexpectedly occurred. Add a test case for the bug that was fixed. Modified Paths: -------------- trunk/Examples/test-suite/rename_pcre_encoder.i trunk/Source/Swig/misc.c Modified: trunk/Examples/test-suite/rename_pcre_encoder.i =================================================================== --- trunk/Examples/test-suite/rename_pcre_encoder.i 2010-07-28 05:53:17 UTC (rev 12186) +++ trunk/Examples/test-suite/rename_pcre_encoder.i 2010-08-14 14:12:23 UTC (rev 12187) @@ -3,9 +3,14 @@ // strip the wx prefix from all identifiers except those starting with wxEVT %rename("%(regex:/wx(?!EVT)(.*)/\\1/)s") ""; +// Replace "Set" prefix with "put" in all functions +%rename("%(regex:/^Set(.*)/put\\1/)s", %$isfunction) ""; + %inline %{ -class wxSomeWidget { +struct wxSomeWidget { + void SetBorderWidth(int); + void SetSize(int, int); }; struct wxAnotherWidget { Modified: trunk/Source/Swig/misc.c =================================================================== --- trunk/Source/Swig/misc.c 2010-07-28 05:53:17 UTC (rev 12186) +++ trunk/Source/Swig/misc.c 2010-08-14 14:12:23 UTC (rev 12187) @@ -1188,6 +1188,8 @@ int captures[30]; if (split_regex_pattern_subst(s, &pattern, &subst, &input)) { + int rc; + compiled_pat = pcre_compile( Char(pattern), pcre_options, &pcre_error, &pcre_errorpos, NULL); if (!compiled_pat) { @@ -1195,8 +1197,15 @@ pcre_error, Char(pattern), pcre_errorpos); exit(1); } - pcre_exec(compiled_pat, NULL, input, strlen(input), 0, 0, captures, 30); - res = replace_captures(input, subst, captures); + rc = pcre_exec(compiled_pat, NULL, input, strlen(input), 0, 0, captures, 30); + if (rc >= 0) { + res = replace_captures(input, subst, captures); + } + else if (rc != PCRE_ERROR_NOMATCH) { + Swig_error("SWIG", Getline(s), "PCRE execution failed: error %d while matching \"%s\" in \"%s\".\n", + rc, Char(pattern), input); + exit(1); + } } DohDelete(pattern); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |