Mercurial > octave
changeset 18763:86818f2c4a92
Return 0x0 empty matrix from strrep for Matlab compatibility (bug #42341).
* strfind.cc (qs_replace): If retsiz is 0, return a 0x0 empty matrix.
author | Rik <rik@octave.org> |
---|---|
date | Thu, 15 May 2014 14:24:21 -0700 |
parents | c0270756d609 |
children | 89448a7523b2 |
files | libinterp/corefcn/strfind.cc |
diffstat | 1 files changed, 21 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/strfind.cc Thu May 15 13:59:08 2014 -0700 +++ b/libinterp/corefcn/strfind.cc Thu May 15 14:24:21 2014 -0700 @@ -314,22 +314,27 @@ else retsiz = siz + nidx * (rsiz - psiz); - ret.clear (dim_vector (1, retsiz)); - const char *src = str.data (); - const char *reps = rep.data (); - char *dest = ret.fortran_vec (); - - octave_idx_type k = 0; - for (octave_idx_type i = 0; i < nidx; i++) + if (retsiz == 0) + ret.clear (dim_vector (0, 0)); + else { - octave_idx_type j = idx(i); - if (j >= k) - dest = std::copy (src + k, src + j, dest); - dest = std::copy (reps, reps + rsiz, dest); - k = j + psiz; + ret.clear (dim_vector (1, retsiz)); + const char *src = str.data (); + const char *reps = rep.data (); + char *dest = ret.fortran_vec (); + + octave_idx_type k = 0; + for (octave_idx_type i = 0; i < nidx; i++) + { + octave_idx_type j = idx(i); + if (j >= k) + dest = std::copy (src + k, src + j, dest); + dest = std::copy (reps, reps + rsiz, dest); + k = j + psiz; + } + + std::copy (src + k, src + siz, dest); } - - std::copy (src + k, src + siz, dest); } } @@ -439,6 +444,8 @@ %!assert (strrep ("abababc", "abab", "xyz"), "xyzxyzc") %!assert (strrep ("abababc", "abab", "xyz", "overlaps", false), "xyzabc") +%!assert (size (strrep ("a", "a", "")), [0 0]) + %!error strrep () %!error strrep ("foo", "bar", 3, 4) */