Author: mvidner Date: Thu Mar 11 16:06:50 2010 New Revision: 61275 URL: http://svn.opensuse.org/viewcvs/yast?rev=61275&view=rev Log: Fixed the regexpsub algorithm not to loop endlessly if the source string contains \1 (bnc#552914). svn merge -c61272 http://svn.opensuse.org/svn/yast/branches/SuSE-Code-11-SP1-Branch/core Modified: trunk/core/ (props changed) trunk/core/VERSION trunk/core/libycp/src/YCPBuiltinString.cc trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.err trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.out trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.ycp trunk/core/package/yast2-core.changes Modified: trunk/core/VERSION URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/VERSION?rev=61275&r1=61274&r2=61275&view=diff ============================================================================== --- trunk/core/VERSION (original) +++ trunk/core/VERSION Thu Mar 11 16:06:50 2010 @@ -1 +1 @@ -2.19.1 +2.19.2 Modified: trunk/core/libycp/src/YCPBuiltinString.cc URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/libycp/src/YCPBuiltinString.cc?rev=61275&r1=61274&r2=61275&view=diff ============================================================================== --- trunk/core/libycp/src/YCPBuiltinString.cc (original) +++ trunk/core/libycp/src/YCPBuiltinString.cc Thu Mar 11 16:06:50 2010 @@ -891,10 +891,10 @@ /// (regexp builtins) typedef struct REG_RET { - string result_str; + string result_str; // for regexpsub string match_str[SUB_MAX]; // index 0 not used!! int match_nb; // 0 - 9 - string error_str; + string error_str; // from regerror bool error; bool solved; } Reg_Ret; @@ -903,6 +903,7 @@ /* * Universal regular expression solver. * It is used by all regexp* ycp builtins. + * Replacement is done if result is not "" */ Reg_Ret solve_regular_expression (const char *input, const char *pattern, const char *result) @@ -944,27 +945,38 @@ return reg_ret; } - static const char *index[] = { - NULL, /* not used */ - "\\1", "\\2", "\\3", "\\4", - "\\5", "\\6", "\\7", "\\8", "\\9" - }; - string input_str (input); - string result_str (result); for (unsigned int i=0; (i <= compiled.re_nsub) && (i <= SUB_MAX); i++) { reg_ret.match_str[i] = matchptr[i].rm_so >= 0 ? input_str.substr(matchptr[i].rm_so, matchptr[i].rm_eo - matchptr[i].rm_so) : ""; reg_ret.match_nb = i; - - string::size_type col = string::npos; - if(index[i] != NULL) col = result_str.find(index[i]); - while( col != string::npos ) { - result_str.replace( col, 2, reg_ret.match_str[i] ); - col = result_str.find(index[i], col + 1 ); - } } + + string result_str; + const char * done = result; // text before 'done' has been dealt with + const char * bspos = result; + + + while (1) { + bspos = strchr (bspos, '\\'); + if (bspos == NULL) // not found + break; + + // STATE: \ seen + ++bspos; + + if (*bspos >= '1' && *bspos <= '9') { + // copy non-backslash text + result_str.append (done, bspos - 1 - done); + // copy replacement string + result_str += reg_ret.match_str[*bspos - '0']; + done = bspos = bspos + 1; + } + } + // copy the rest + result_str += done; + reg_ret.result_str = result_str; regfree (&compiled); return reg_ret; Modified: trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.err URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.err?rev=61275&r1=61274&r2=61275&view=diff ============================================================================== --- trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.err (original) +++ trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.err Thu Mar 11 16:06:50 2010 @@ -142,6 +142,34 @@ ---------------------------------------------------------------------- Parsed: ---------------------------------------------------------------------- +(regexpsub ("aaabbb", "(a*b)(.*)", "\\1") == "aaab") +---------------------------------------------------------------------- +Parsed: +---------------------------------------------------------------------- +(regexpsub ("aaabbb", "(a*b)(.*)", "\\1\\1") == "aaabaaab") +---------------------------------------------------------------------- +Parsed: +---------------------------------------------------------------------- +(regexpsub ("aaabbb", "(a*b)(.*)", "\\") == "\\") +---------------------------------------------------------------------- +Parsed: +---------------------------------------------------------------------- +(regexpsub ("aaabbb", "(a*b)(.*)", "\\\\") == "\\\\") +---------------------------------------------------------------------- +Parsed: +---------------------------------------------------------------------- +(regexpsub ("aaabbb", "(a*b)(.*)", "A\\NZ") == "A\\NZ") +---------------------------------------------------------------------- +Parsed: +---------------------------------------------------------------------- +(regexpsub ("aaabbb", "(a*b)(.*)", "A\\\\1Z") == "A\\aaabZ") +---------------------------------------------------------------------- +Parsed: +---------------------------------------------------------------------- +(regexpsub ("machine=i386\\2ci486\\2ci586\\2ci686", "^([^=]*)=(.*)", "\\2") == "i386\\2ci486\\2ci586\\2ci686") +---------------------------------------------------------------------- +Parsed: +---------------------------------------------------------------------- (regexptokenize ("aaabbBb", "(.*[[:upper:]]).*") == ["aaabbB"]) ---------------------------------------------------------------------- Parsed: Modified: trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.out URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.out?rev=61275&r1=61274&r2=61275&view=diff ============================================================================== --- trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.out (original) +++ trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.out Thu Mar 11 16:06:50 2010 @@ -37,6 +37,13 @@ (true) (true) (true) +(true) +(true) +(true) +(true) +(true) +(true) +(true) ("** sformat **") ("five is greater % than 3") ("** conversions **") Modified: trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.ycp URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.ycp?rev=61275&r1=61274&r2=61275&view=diff ============================================================================== --- trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.ycp (original) +++ trunk/core/libycp/testsuite/tests/builtin/Builtin-String1.ycp Thu Mar 11 16:06:50 2010 @@ -65,6 +65,14 @@ (regexpsub ("aaabbb", "(.*ab).*", "s_\\1_e") == "s_aaab_e") (regexpsub ("aaabbb", "(.*abb)(.*)", "s_\\1_e\\2") == "s_aaabb_eb") +// bnc#552914 +(regexpsub ("aaabbb", "(a*b)(.*)", "\\1") == "aaab") +(regexpsub ("aaabbb", "(a*b)(.*)", "\\1\\1") == "aaabaaab") +(regexpsub ("aaabbb", "(a*b)(.*)", "\\") == "\\") +(regexpsub ("aaabbb", "(a*b)(.*)", "\\\\") == "\\\\") +(regexpsub ("aaabbb", "(a*b)(.*)", "A\\NZ") == "A\\NZ") +(regexpsub ("aaabbb", "(a*b)(.*)", "A\\\\1Z") == "A\\aaabZ") +(regexpsub ("machine=i386\\2ci486\\2ci586\\2ci686", "^([^=]*)=(.*)", "\\2") == "i386\\2ci486\\2ci586\\2ci686") (regexptokenize ("aaabbBb", "(.*[[:upper:]]).*") == [ "aaabbB" ]) (regexptokenize ("aaabbb", "(.*ab)(.*)") == ["aaab", "bb"]) Modified: trunk/core/package/yast2-core.changes URL: http://svn.opensuse.org/viewcvs/yast/trunk/core/package/yast2-core.changes?rev=61275&r1=61274&r2=61275&view=diff ============================================================================== --- trunk/core/package/yast2-core.changes (original) +++ trunk/core/package/yast2-core.changes Thu Mar 11 16:06:50 2010 @@ -1,4 +1,11 @@ ------------------------------------------------------------------- +Thu Mar 11 15:36:27 CET 2010 - mvidner@suse.cz + +- Fixed the regexpsub algorithm not to loop endlessly + if the source string contains \1 (bnc#552914). +- 2.19.2 + +------------------------------------------------------------------- Tue Mar 9 16:21:07 CET 2010 - mvidner@suse.cz - Fixed an ia64 crash in test_thread_log (a test case for bnc#565918). -- To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org For additional commands, e-mail: yast-commit+help@opensuse.org