Mercurial > octave
changeset 23307:85ffe1bdd3a0 stable
dlmread: Return empty matrix when requested range is outside data (bug #50102).
* dlmread.cc (Fdlmread): When no data was read, or when the requested
beginning column number c0 is greater than the actual number of data columns,
return an empty 0x0 matrix. Recode BIST tests to guarantee that temporary
file used in tests is deleted. Add new BIST tests for empty matrix return
value.
author | Rik <rik@octave.org> |
---|---|
date | Sun, 19 Mar 2017 14:45:17 -0700 |
parents | f093b9d4ef30 |
children | 507e3150f034 c0cc56ab176d |
files | libinterp/corefcn/dlmread.cc |
diffstat | 1 files changed, 45 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/dlmread.cc Fri Mar 17 12:25:40 2017 +0100 +++ b/libinterp/corefcn/dlmread.cc Sun Mar 19 14:45:17 2017 -0700 @@ -442,67 +442,75 @@ while (pos1 != std::string::npos); if (i == r1) - break; + break; // Stop early if the desired range has been read. i++; } + // Clip selection indices to actual size of data if (r1 >= r) r1 = r - 1; if (c1 >= c) c1 = c - 1; - // Now take the subset of the matrix if there are any values. - if (i > 0 || j > 0) + if (iscmplx) { - if (iscmplx) - cdata = cdata.extract (0, c0, r1, c1); - else - rdata = rdata.extract (0, c0, r1, c1); + if ((i == 0 && j == 0) || (c0 > c1)) + return ovl (ComplexMatrix (0,0)); + + cdata = cdata.extract (0, c0, r1, c1); + return ovl (cdata); } + else + { + if ((i == 0 && j == 0) || (c0 > c1)) + return ovl (Matrix (0,0)); - if (iscmplx) - return ovl (cdata); - else - return ovl (rdata); + rdata = rdata.extract (0, c0, r1, c1); + return ovl (rdata); + } } /* -%!shared file +%!test %! file = tempname (); %! fid = fopen (file, "wt"); %! fwrite (fid, "1, 2, 3\n4, 5, 6\n7, 8, 9\n10, 11, 12"); %! fclose (fid); - -%!assert (dlmread (file), [1, 2, 3; 4, 5, 6; 7, 8, 9;10, 11, 12]) -%!assert (dlmread (file, ","), [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]) -%!assert (dlmread (file, ",", [1, 0, 2, 1]), [4, 5; 7, 8]) -%!assert (dlmread (file, ",", "B1..C2"), [2, 3; 5, 6]) -%!assert (dlmread (file, ",", "B1:C2"), [2, 3; 5, 6]) -%!assert (dlmread (file, ",", "..C2"), [1, 2, 3; 4, 5, 6]) -%!assert (dlmread (file, ",", 0, 1), [2, 3; 5, 6; 8, 9; 11, 12]) -%!assert (dlmread (file, ",", "B1.."), [2, 3; 5, 6; 8, 9; 11, 12]) -%!error (dlmread (file, ",", [0 1])) +%! unwind_protect +%! assert (dlmread (file), [1, 2, 3; 4, 5, 6; 7, 8, 9;10, 11, 12]); +%! assert (dlmread (file, ","), [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]); +%! assert (dlmread (file, ",", [1, 0, 2, 1]), [4, 5; 7, 8]); +%! assert (dlmread (file, ",", "B1..C2"), [2, 3; 5, 6]); +%! assert (dlmread (file, ",", "B1:C2"), [2, 3; 5, 6]); +%! assert (dlmread (file, ",", "..C2"), [1, 2, 3; 4, 5, 6]); +%! assert (dlmread (file, ",", 0, 1), [2, 3; 5, 6; 8, 9; 11, 12]); +%! assert (dlmread (file, ",", "B1.."), [2, 3; 5, 6; 8, 9; 11, 12]); +%! assert (dlmread (file, ",", 10, 0), []); +%! assert (dlmread (file, ",", 0, 10), []); +%! fail ('dlmread (file, ",", [0 1])', "error parsing RANGE"); +%! unwind_protect_cleanup +%! unlink (file); +%! end_unwind_protect %!test -%! unlink (file); - -%!shared file %! file = tempname (); %! fid = fopen (file, "wt"); %! fwrite (fid, "1, 2, 3\n4+4i, 5, 6\n7, 8, 9\n10, 11, 12"); %! fclose (fid); +%! unwind_protect +%! assert (dlmread (file), [1, 2, 3; 4 + 4i, 5, 6; 7, 8, 9; 10, 11, 12]); +%! assert (dlmread (file, ","), [1, 2, 3; 4 + 4i, 5, 6; 7, 8, 9; 10, 11, 12]); +%! assert (dlmread (file, ",", [1, 0, 2, 1]), [4 + 4i, 5; 7, 8]); +%! assert (dlmread (file, ",", "A2..B3"), [4 + 4i, 5; 7, 8]); +%! assert (dlmread (file, ",", "A2:B3"), [4 + 4i, 5; 7, 8]); +%! assert (dlmread (file, ",", "..B3"), [1, 2; 4 + 4i, 5; 7, 8]); +%! assert (dlmread (file, ",", 1, 0), [4 + 4i, 5, 6; 7, 8, 9; 10, 11, 12]); +%! assert (dlmread (file, ",", "A2.."), [4 + 4i, 5, 6; 7, 8, 9; 10, 11, 12]); +%! assert (dlmread (file, ",", 10, 0), []); +%! assert (dlmread (file, ",", 0, 10), []); +%! unwind_protect_cleanup +%! unlink (file); +%! end_unwind_protect -%!assert (dlmread (file), [1, 2, 3; 4 + 4i, 5, 6; 7, 8, 9; 10, 11, 12]) -%!assert (dlmread (file, ","), [1, 2, 3; 4 + 4i, 5, 6; 7, 8, 9; 10, 11, 12]) -%!assert (dlmread (file, ",", [1, 0, 2, 1]), [4 + 4i, 5; 7, 8]) -%!assert (dlmread (file, ",", "A2..B3"), [4 + 4i, 5; 7, 8]) -%!assert (dlmread (file, ",", "A2:B3"), [4 + 4i, 5; 7, 8]) -%!assert (dlmread (file, ",", "..B3"), [1, 2; 4 + 4i, 5; 7, 8]) -%!assert (dlmread (file, ",", 1, 0), [4 + 4i, 5, 6; 7, 8, 9; 10, 11, 12]) -%!assert (dlmread (file, ",", "A2.."), [4 + 4i, 5, 6; 7, 8, 9; 10, 11, 12]) -%!error (dlmread (file, ",", [0 1])) - -%!test -%! unlink (file); */