# HG changeset patch # User Rik # Date 1331498629 25200 # Node ID 8bfa6e2bb4ed9623a88f7078d323ad4722dc4123 # Parent 55fcb6b575bb08e85e057bb329d039b00b4e30f3# Parent 721be41ea98875e04152570e7862dcf3a6610538 maint: periodic merge of stable to default. diff -r 55fcb6b575bb -r 8bfa6e2bb4ed liboctave/regexp.cc --- a/liboctave/regexp.cc Sun Mar 11 13:49:11 2012 -0400 +++ b/liboctave/regexp.cc Sun Mar 11 13:43:49 2012 -0700 @@ -371,8 +371,21 @@ || ovector[2*i-1] != ovector[2*i+1]) { if (namecount > 0) - named_tokens(named_idx(i-pos_offset-1)) = - std::string (*(listptr+nidx[i-pos_offset-1])); + { + // FIXME: Should probably do this with a map() + // rather than a linear search. However, + // the number of captured, named expressions + // is usually pretty small (< 4) + for (int j = 0; j < namecount; j++) + { + if (nidx[j] == i) + { + named_tokens(named_idx(j)) = + std::string (*(listptr+i-pos_offset)); + break; + } + } + } tokens(pos_match++) = std::string (*(listptr+i)); } diff -r 55fcb6b575bb -r 8bfa6e2bb4ed src/DLD-FUNCTIONS/regexp.cc --- a/src/DLD-FUNCTIONS/regexp.cc Sun Mar 11 13:49:11 2012 -0400 +++ b/src/DLD-FUNCTIONS/regexp.cc Sun Mar 11 13:43:49 2012 -0700 @@ -769,10 +769,20 @@ %! assert (nm.last{1},'Davis'); %! assert (nm.last{2},'Rogers'); +## Tests for named tokens %!test %! # Parenthesis in named token (ie (int)) causes a problem %! assert (regexp('qwe int asd', ['(?(int))'], 'names'), struct ('typestr', 'int')); +%!test +%! ## Mix of named and unnamed tokens can cause segfault (bug #35683) +%! str = "abcde"; +%! ptn = '(?a)(\w+)(?d\w+)'; +%! tokens = regexp (str, ptn, "names"); +%! assert (isstruct (tokens) && numel (tokens) == 1); +%! assert (tokens.T1, "a"); +%! assert (tokens.T2, "de"); + %!assert(regexp("abc\nabc",'.'),[1:7]) %!assert(regexp("abc\nabc",'.','dotall'),[1:7]) %!test