Mercurial > octave
diff libinterp/corefcn/oct-stream.cc @ 26703:29ea2369971d
Add basic backend for encodings in file streams (bug #55452).
* oct-stream.h (base_stream): Store encoding in class.
* oct-stream.cc (do_scanf_conv): Convert strings from encoding.
(do_printf_string): Convert strings to encoding.
(base_stream::printf): Convert format string to encoding.
* oct-stdstrm.h (octave_stdiostream, octave_tstdiostream, octave_zstdiostream,
create): Pass encoding through to base_stream.
* oct-prcstrm.[cc,h] (octave_iprocstream, octave_oprocstream, create): Pass
encoding through to octave_stdiostream.
* oct-strstrm.[cc,h] (octave_istrstream, octave_ostrstream, create): Pass
encoding through to base_stream.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Sat, 09 Feb 2019 16:43:11 +0100 |
parents | c18e59476795 |
children | c13143821eef |
line wrap: on
line diff
--- a/libinterp/corefcn/oct-stream.cc Sat Feb 02 20:07:45 2019 +0100 +++ b/libinterp/corefcn/oct-stream.cc Sat Feb 09 16:43:11 2019 +0100 @@ -54,6 +54,7 @@ #include "octave.h" #include "oct-iostrm.h" #include "oct-stdstrm.h" +#include "oct-string.h" #include "oct-stream.h" #include "ov.h" #include "ovl.h" @@ -4529,6 +4530,8 @@ #define FINISH_CHARACTER_CONVERSION() \ do \ { \ + if (encoding ().compare ("utf-8")) \ + tmp = octave::string::u8_from_encoding (who, tmp, encoding ()); \ width = tmp.length (); \ \ if (is) \ @@ -5557,7 +5560,7 @@ static size_t do_printf_string (std::ostream& os, const printf_format_elt *elt, int nsa, int sa_1, int sa_2, const std::string& arg, - const std::string& who) + const std::string& encoding, const std::string& who) { if (nsa > 2) ::error ("%s: internal error handling format", who.c_str ()); @@ -5568,12 +5571,19 @@ size_t len = arg.length (); + size_t prec = (nsa > 1 ? sa_2 : (elt->prec == -1 ? len : elt->prec)); + + std::string print_str = prec < arg.length () ? arg.substr (0, prec) : arg; + if (encoding.compare ("utf-8")) + { + size_t src_len = print_str.length (); + print_str = string::u8_to_encoding (who, print_str, encoding); + len -= src_len - print_str.length (); + } + size_t fw = (nsa > 0 ? sa_1 : (elt->fw == -1 ? len : elt->fw)); - size_t prec = (nsa > 1 ? sa_2 : (elt->prec == -1 ? len : elt->prec)); - - os << std::setw (fw) - << (left ? std::left : std::right) - << (prec < len ? arg.substr (0, prec) : arg); + + os << std::setw (fw) << (left ? std::left : std::right) << print_str; return len > fw ? len : fw; } @@ -5846,7 +5856,8 @@ std::string sval = val.string_value (); retval += do_printf_string (os, elt, nsa, sa_1, - sa_2, sval, who); + sa_2, sval, encoding (), + who); } else retval += do_numeric_printf_conv (os, elt, nsa, sa_1, @@ -5886,10 +5897,13 @@ } int - base_stream::printf (const std::string& fmt, + base_stream::printf (std::string fmt, const octave_value_list& args, const std::string& who) { + if (encoding ().compare ("utf-8")) + fmt = string::u8_to_encoding (who, fmt, encoding ()); + printf_format_list fmt_list (fmt); if (fmt_list.num_conversions () == -1)