Mercurial > hg > octave-lyh
diff src/file-io.cc @ 13194:3e1871badab9
allow sscanf to accept character arrays with more than one row
* file-io.cc (get_sscanf_data): New function. Flatten character
arrays before extracting character data.
(Fsscanf): Use it.
* test_io.m: New sscanf test.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 19 Sep 2011 16:45:31 -0400 |
parents | c91bd3f10bec |
children | fba2cc36b762 |
line wrap: on
line diff
--- a/src/file-io.cc +++ b/src/file-io.cc @@ -1174,6 +1174,23 @@ return retval; } +static std::string +get_sscanf_data (const octave_value& val) +{ + std::string retval; + + if (val.is_string ()) + { + octave_value tmp = val.reshape (dim_vector (1, val.numel ())); + + retval = tmp.string_value (); + } + else + ::error ("sscanf: argument STRING must be a string"); + + return retval; +} + DEFUN (sscanf, args, , "-*- texinfo -*-\n\ @deftypefn {Built-in Function} {[@var{val}, @var{count}, @var{pos}] =} sscanf (@var{string}, @var{template}, @var{size})\n\ @@ -1194,10 +1211,10 @@ if (nargin == 3 && args(2).is_string ()) { - if (args(0).is_string ()) + std::string data = get_sscanf_data (args(0)); + + if (! error_state) { - std::string data = args(0).string_value (); - octave_stream os = octave_istrstream::create (data); if (os.is_valid ()) @@ -1223,10 +1240,10 @@ retval(1) = 0.0; retval(0) = Matrix (); - if (args(0).is_string ()) + std::string data = get_sscanf_data (args(0)); + + if (! error_state) { - std::string data = args(0).string_value (); - octave_stream os = octave_istrstream::create (data); if (os.is_valid ()) @@ -1263,8 +1280,6 @@ ::error ("%s: unable to create temporary input buffer", who.c_str ()); } - else - ::error ("%s: argument STRING must be a string", who.c_str ()); } else print_usage ();