changeset 18797: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)
 */