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)