# HG changeset patch # User John W. Eaton # Date 1458411734 14400 # Node ID 2cdbae31c02201cdfc3aef1e7410331448cddff9 # Parent 128703a2938862fbaaf176a38c4678f8d83a2966 improve compatibility of textscan for character arrays * file-io.cc (get_scan_string_data): Rename from get_sscanf_data. New arg, WHO. Change caller. (textscan_internal): Use gets_scan_string_data instead of simply extracting string. New test. diff -r 128703a29388 -r 2cdbae31c022 libinterp/corefcn/file-io.cc --- a/libinterp/corefcn/file-io.cc Sat Mar 19 14:12:10 2016 -0400 +++ b/libinterp/corefcn/file-io.cc Sat Mar 19 14:22:14 2016 -0400 @@ -1064,12 +1064,12 @@ } static std::string -get_sscanf_data (const octave_value& val) +get_scan_string_data (const octave_value& val, const std::string& who) { std::string retval; if (! val.is_string ()) - error ("sscanf: argument STRING must be a string"); + error ("%s: argument STRING must be a string", who.c_str ()); octave_value tmp = val.reshape (dim_vector (1, val.numel ())); @@ -1100,7 +1100,7 @@ octave_value_list retval; - std::string data = get_sscanf_data (args(0)); + std::string data = get_scan_string_data (args(0), who); octave_stream os = octave_istrstream::create (data); @@ -1163,19 +1163,19 @@ if (args.length () < 1) print_usage (who); - std::string data; - - bool first_arg_is_string = args(0).is_string (); - - if (first_arg_is_string) - data = args(0).string_value (); - - octave_stream os = (first_arg_is_string - ? octave_istrstream::create (data) - : octave_stream_list::lookup (args(0), who)); - - if (first_arg_is_string && ! os.is_valid ()) - error ("%s: unable to create temporary input buffer", who.c_str ()); + octave_stream os; + + if (args(0).is_string ()) + { + std::string data = get_scan_string_data (args(0), who); + + os = octave_istrstream::create (data); + + if (! os.is_valid ()) + error ("%s: unable to create temporary input buffer", who.c_str ()); + } + else + os =octave_stream_list::lookup (args(0), who); int nskip = 1; @@ -2198,6 +2198,8 @@ %!## Test start of comment as string %! c = textscan ("1 / 2 // 3", "%n %s %u8", "CommentStyle", {"//"}); %! assert (c, {1, "/", 2}); + +%!assert (textscan (["1 2 3 4"; "5 6 7 8"], "%f"), {[15; 26; 37; 48]}) */ // These tests have end-comment sequences, so can't just be in a comment