Mercurial > hg > octave-nkf
changeset 16099:4b6c44096862
Backout changeset 238e499c5fea (locale support in scanf)
author | Rik <rik@octave.org> |
---|---|
date | Mon, 25 Feb 2013 14:22:54 -0800 |
parents | 24b3800d30e7 |
children | 6b26e18d1dcb |
files | libinterp/interp-core/oct-stream.h libinterp/interpfcn/file-io.cc |
diffstat | 2 files changed, 8 insertions(+), 73 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/interp-core/oct-stream.h +++ b/libinterp/interp-core/oct-stream.h @@ -371,12 +371,6 @@ virtual std::ostream *output_stream (void) { return 0; } - // If the derived class is locale-aware, it must implement this function - // in order to set a new locale. By default, this function avoids messing - // with locales and ignores its input argument. - virtual std::locale imbue ( const std::locale &) - { return std::locale::classic (); } - // Return TRUE if this stream is open. bool is_open (void) const { return open_state; } @@ -619,23 +613,7 @@ { return rep ? rep->output_stream () : 0; } - - std::locale imbue (const std::locale & loc ) - { - if (!rep) return std::locale::classic (); - - std::istream *is = rep->input_stream (); - std::ostream *os = rep->output_stream (); - - if (os) - { - if (is) - (void) is->imbue (loc); - return os->imbue (loc); - } - return is ? is->imbue (loc) : std::locale::classic (); - } - + void clearerr (void) { if (rep) rep->clearerr (); } private:
--- a/libinterp/interpfcn/file-io.cc +++ b/libinterp/interpfcn/file-io.cc @@ -43,9 +43,7 @@ #include <iostream> #include <limits> -#include <locale> #include <stack> -#include <stdexcept> #include <vector> #include <fcntl.h> @@ -1087,7 +1085,7 @@ DEFUN (fscanf, args, , "-*- texinfo -*-\n\ @deftypefn {Built-in Function} {[@var{val}, @var{count}, @var{errmsg}] =} fscanf (@var{fid}, @var{template}, @var{size})\n\ -@deftypefnx {Built-in Function} {[@var{v1}, @var{v2}, @dots{}, @var{count}] =} fscanf (@var{fid}, @var{template}, @var{locale})\n\ +@deftypefnx {Built-in Function} {[@var{v1}, @var{v2}, @dots{}, @var{count}, @var{errmsg}] =} fscanf (@var{fid}, @var{template}, \"C\")\n\ In the first form, read from @var{fid} according to @var{template},\n\ returning the result in the matrix @var{val}.\n\ \n\ @@ -1126,10 +1124,7 @@ with each conversion specifier in @var{template} corresponding to a\n\ single scalar return value. This form is more `C-like', and also\n\ compatible with previous versions of Octave. The number of successful\n\ -conversions is returned in @var{count}. It permits to explicitly\n\ -specify a locale to take into account language specific features, \n\ -such as decimal separator. This operation restores the previous locales\n\ -setting at the end of the conversion.\n\ +conversions is returned in @var{count}\n\ @ifclear OCTAVE_MANUAL\n\ \n\ See the Formatted Input section of the GNU Octave manual for a\n\ @@ -1151,25 +1146,7 @@ if (! error_state) { if (args(1).is_string ()) - { - std::locale oldloc; - try - { - // Use args(2) val as the new locale setting. Keep - // old val for restoring afterwards. - oldloc = - os.imbue (std::locale (args(2).string_value ().c_str ())); - - } - catch (std::runtime_error) - { - // Display a warning if the specified locale is unknown - warning ("fscanf: invalid locale. Try 'locale -a' for a list of supported values."); - oldloc = std::locale::classic (); - } - retval = os.oscanf (args(1), who); - os.imbue (oldloc); - } + retval = os.oscanf (args(1), who); else ::error ("%s: format TEMPLATE must be a string", who.c_str ()); } @@ -1237,7 +1214,7 @@ DEFUN (sscanf, args, , "-*- texinfo -*-\n\ @deftypefn {Built-in Function} {[@var{val}, @var{count}, @var{errmsg}, @var{pos}] =} sscanf (@var{string}, @var{template}, @var{size})\n\ -@deftypefnx {Built-in Function} {[@var{v1}, @var{v2}, @dots{}, @var{count}] =} sscanf (@var{string}, @var{template}, @var{locale})\n\ +@deftypefnx {Built-in Function} {[@var{v1}, @var{v2}, @dots{}, @var{count}, @var{errmsg}] =} sscanf (@var{string}, @var{template}, \"C\")\n\ This is like @code{fscanf}, except that the characters are taken from the\n\ string @var{string} instead of from a stream. Reaching the end of the\n\ string is treated as an end-of-file condition. In addition to the values\n\ @@ -1262,22 +1239,8 @@ if (os.is_valid ()) { - if (args(1).is_string ()) - { - // Use args(2) val as the new locale setting. As the os - // object is short lived, we don't need to restore - // locale afterwards. - try - { - os.imbue (std::locale (args(2).string_value ().c_str ())); - } - catch (std::runtime_error) - { - // Display a warning if the specified locale is unknown - warning ("sscanf: invalid locale. Try 'locale -a' for a list of supported values."); - } - retval = os.oscanf (args(1), who); - } + if (args(1).is_string ()) + retval = os.oscanf (args(1), who); else ::error ("%s: format TEMPLATE must be a string", who.c_str ()); } @@ -1345,16 +1308,10 @@ return retval; } -/* -%!test -%! assert (sscanf ("1,2", "%f", "C"), 1) -%! assert (sscanf ("1,2", "%f", "fr_FR"), 1.2) -*/ - DEFUN (scanf, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Built-in Function} {[@var{val}, @var{count}, @var{errmsg}] =} scanf (@var{template}, @var{size})\n\ -@deftypefnx {Built-in Function} {[@var{v1}, @var{v2}, @dots{}, @var{count}] =} scanf (@var{template}, @var{locale})\n\ +@deftypefnx {Built-in Function} {[@var{v1}, @var{v2}, @dots{}, @var{count}, @var{errmsg}]] =} scanf (@var{template}, \"C\")\n\ This is equivalent to calling @code{fscanf} with @var{fid} = @code{stdin}.\n\ \n\ It is currently not useful to call @code{scanf} in interactive\n\