Mercurial > octave
changeset 21507:2cdbae31c022
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.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 19 Mar 2016 14:22:14 -0400 |
parents | 128703a29388 |
children | 04923b7b0d89 |
files | libinterp/corefcn/file-io.cc |
diffstat | 1 files changed, 18 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- 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