changeset 21493:a41e48ef2b99

textscan: Don't pad columns with ReturnOnError = 1 * textscan.cc (textscan::do_scan): Do not check for EOL at EOF if error occurs. Add BIST tests.
author Lachlan Andrew <lachlanbis@gmail.com>
date Fri, 18 Mar 2016 19:58:37 -0700
parents db67dc54fa2c
children 8e9833b8791d
files libinterp/corefcn/textscan.cc
diffstat 1 files changed, 13 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/textscan.cc	Fri Mar 18 17:38:38 2016 -0700
+++ b/libinterp/corefcn/textscan.cc	Fri Mar 18 19:58:37 2016 -0700
@@ -1409,7 +1409,9 @@
 
   // If file does not end in EOL, do not pad columns with NaN.
   bool uneven_columns = false;
-  if (isp.eof () || (err & 4))
+  if (err & 4)
+    uneven_columns = true;
+  else if (isp.eof ())
     {
       isp.clear ();
       isp.seekg (-1, std::ios_base::end);
@@ -3241,7 +3243,8 @@
 %! ## Check ReturnOnError
 %! f = tempname ();
 %! fid = fopen (f, "w+");
-%! fprintf (fid, "1 2 3\n4 s 6");
+%! str = "1 2 3\n4 s 6";
+%! fprintf (fid, str);
 %! fseek (fid, 0, "bof");
 %! c = textscan (fid, "%f %f %f");
 %! fseek (fid, 0, "bof");
@@ -3249,20 +3252,27 @@
 %! fseek (fid, 0, "bof");
 %! fclose (fid);
 %! unlink (f);
+%! u = textscan (str, "%f %f %f");
+%! v = textscan (str, "%f %f %f", "ReturnOnError", 1);
 %! assert (c, {[1;4], [2;NaN], [3;6]})
 %! assert (d, {[1;4], [2], [3]})
+%! assert (u, {[1;4], [2;NaN], [3;6]})
+%! assert (v, {[1;4], [2], [3]})
 
 %!test
 %! ## Check ReturnOnError
 %! f = tempname ();
 %! fid = fopen (f, "w+");
-%! fprintf (fid, "1 2 3\n4 s 6\n");
+%! str = "1 2 3\n4 s 6\n";
+%! fprintf (fid, str);
 %! fseek (fid, 0, "bof");
 %! c = textscan (fid, "%f %f %f", "ReturnOnError", 1);
 %! fseek (fid, 0, "bof");
 %! fclose (fid);
 %! unlink (f);
+%! u = textscan (str, "%f %f %f", "ReturnOnError", 1);
 %! assert (c, {[1;4], 2, 3})
+%! assert (u, {[1;4], 2, 3})
 
 %!error <Read error in field 2 of row 2> textscan ("1 2 3\n4 s 6", "%f %f %f", "ReturnOnError", 0);