# HG changeset patch # User Rik # Date 1400189061 25200 # Node ID 86818f2c4a92215caf30576505c97b33e81788a9 # Parent c0270756d609fc0805f97a0039e76dda1d2ecb2d Return 0x0 empty matrix from strrep for Matlab compatibility (bug #42341). * strfind.cc (qs_replace): If retsiz is 0, return a 0x0 empty matrix. diff -r c0270756d609 -r 86818f2c4a92 libinterp/corefcn/strfind.cc --- 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) */