# HG changeset patch # User Markus Mützel # Date 1591992784 -7200 # Node ID 159b6a1eb4083170a766cca614bb9a380b15346f # Parent 597e7cf93cacff56ff4c4488fa415267d4b99102 Use wide character overload to open file streams on Windows. * liboctave/system/lo-sysdep.cc, liboctave/system/lo-sysdep.h (fstream, ifstream, ofstream): Add "wrapper" functions to open file streams. * libinterp/corefcn/__fcn__.cc (F__ftp_mput__, F__ftp_mget__), libinterp/corefcn/debug.cc (do_dbtype), libinterp/corefcn/help.cc (help_system::raw_help_from_docstrings_file), libinterp/corefcn/load-save.cc (check_gzip_magic, load_save_system::get_file_format, load_save_system::dump_octave_core, load_save_system::load, load_save_system::save), libinterp/corefcn/oct-hist.cc (mk_tmp_hist_file, history_system::do_edit_history), libinterp/corefcn/urlwrite.cc (Furlwrite), libinterp/octave-value/ov-java.cc (read_java_opts, read_classpath_txt), libinterp/parse-tree/oct-parse.yy (get_file_line), liboctave/util/cmd-hist.cc (gnu_history::do_append), liboctave/util/file-info.cc (file_info::snarf_file), liboctave/util/url-transfer.cc (base_url_transfer::mget_directory, base_url_transfer::mput_directory): Use new functions. * libinterp/corefcn/dlmread.cc (dlmread): Use wide character overload for std::ifstream::open on Windows. * src/mkoctfile.in.cc (octave_u8_conv_to_encoding): Dummy function for cross-compiler. (main): Use wide character overload of std::ofstream::open on Windows. diff -r 597e7cf93cac -r 159b6a1eb408 libinterp/corefcn/__ftp__.cc --- a/libinterp/corefcn/__ftp__.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/libinterp/corefcn/__ftp__.cc Fri Jun 12 22:13:04 2020 +0200 @@ -424,11 +424,10 @@ } else { - std::string ascii_fname = octave::sys::get_ASCII_filename (file); - // FIXME: Does ascii mode need to be flagged here? - std::ifstream ifile (ascii_fname.c_str (), - std::ios::in | std::ios::binary); + std::ifstream ifile = + octave::sys::ifstream (file.c_str (), + std::ios::in | std::ios::binary); if (! ifile.is_open ()) error ("__ftp_mput__: unable to open file"); @@ -497,9 +496,9 @@ url_xfer.mget_directory (sv(i), target); else { - std::ofstream ofile ((target + sv(i)).c_str (), - std::ios::out | - std::ios::binary); + std::ofstream ofile = + octave::sys::ofstream ((target + sv(i)).c_str (), + std::ios::out | std::ios::binary); if (! ofile.is_open ()) error ("__ftp_mget__: unable to open file"); diff -r 597e7cf93cac -r 159b6a1eb408 libinterp/corefcn/debug.cc --- a/libinterp/corefcn/debug.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/libinterp/corefcn/debug.cc Fri Jun 12 22:13:04 2020 +0200 @@ -582,9 +582,7 @@ os << "dbtype: unknown function " << name << "\n"; else { - std::string ascii_fname = octave::sys::get_ASCII_filename (ff); - - std::ifstream fs (ascii_fname.c_str (), std::ios::in); + std::ifstream fs = octave::sys::ifstream (ff.c_str (), std::ios::in); if (! fs) os << "dbtype: unable to open '" << ff << "' for reading!\n"; diff -r 597e7cf93cac -r 159b6a1eb408 libinterp/corefcn/dlmread.cc --- a/libinterp/corefcn/dlmread.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/libinterp/corefcn/dlmread.cc Fri Jun 12 22:13:04 2020 +0200 @@ -228,9 +228,12 @@ tname = octave::find_data_file_in_load_path ("dlmread", tname); - std::string ascii_fname = octave::sys::get_ASCII_filename (tname); - - input_file.open (ascii_fname.c_str (), std::ios::in); +#if defined (OCTAVE_USE_WINDOWS_API) + std::wstring wname = octave::sys::u8_to_wstring (tname); + input_file.open (wname.c_str (), std::ios::in); +#else + input_file.open (tname.c_str (), std::ios::in); +#endif if (! input_file) error ("dlmread: unable to open file '%s'", fname.c_str ()); diff -r 597e7cf93cac -r 159b6a1eb408 libinterp/corefcn/help.cc --- a/libinterp/corefcn/help.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/libinterp/corefcn/help.cc Fri Jun 12 22:13:04 2020 +0200 @@ -600,11 +600,8 @@ if (! initialized) { - std::string ascii_fname - = sys::get_ASCII_filename (m_built_in_docstrings_file); - - std::ifstream file (ascii_fname.c_str (), - std::ios::in | std::ios::binary); + std::ifstream file = sys::ifstream (m_built_in_docstrings_file.c_str (), + std::ios::in | std::ios::binary); if (! file) error ("failed to open docstrings file: %s", @@ -686,11 +683,8 @@ std::streampos beg = txt_limits.first; std::streamoff len = txt_limits.second; - std::string ascii_fname - = sys::get_ASCII_filename (m_built_in_docstrings_file); - - std::ifstream file (ascii_fname.c_str (), - std::ios::in | std::ios::binary); + std::ifstream file = sys::ifstream (m_built_in_docstrings_file.c_str (), + std::ios::in | std::ios::binary); if (! file) error ("failed to open docstrings file: %s", diff -r 597e7cf93cac -r 159b6a1eb408 libinterp/corefcn/load-save.cc --- a/libinterp/corefcn/load-save.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/libinterp/corefcn/load-save.cc Fri Jun 12 22:13:04 2020 +0200 @@ -167,8 +167,8 @@ std::string ascii_fname = sys::get_ASCII_filename (fname); - std::ifstream file (ascii_fname.c_str (), - std::ios::in | std::ios::binary); + std::ifstream file = sys::ifstream (fname.c_str (), + std::ios::in | std::ios::binary); unsigned char magic[2]; if (file.read (reinterpret_cast (&magic[0]), 2) @@ -348,8 +348,8 @@ if (! use_zlib) { - std::ifstream file (ascii_fname.c_str (), - std::ios::in | std::ios::binary); + std::ifstream file = sys::ifstream (fname.c_str (), + std::ios::in | std::ios::binary); if (file) { retval = get_file_format (file, orig_fname); @@ -803,7 +803,7 @@ else #endif { - std::ofstream file (fname, mode); + std::ofstream file = sys::ofstream (fname, mode); if (file) { @@ -1352,9 +1352,7 @@ else #endif { - std::string ascii_fname = sys::get_ASCII_filename (fname); - - std::ifstream file (ascii_fname.c_str (), mode); + std::ifstream file = sys::ifstream (fname.c_str (), mode); if (! file) error ("load: unable to open input file '%s'", @@ -1525,7 +1523,7 @@ else #endif { - std::ofstream file (fname.c_str (), mode); + std::ofstream file = sys::ofstream (fname.c_str (), mode); if (! file) err_file_open ("save", fname); diff -r 597e7cf93cac -r 159b6a1eb408 libinterp/corefcn/oct-hist.cc --- a/libinterp/corefcn/oct-hist.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/libinterp/corefcn/oct-hist.cc Fri Jun 12 22:13:04 2020 +0200 @@ -47,6 +47,7 @@ #include "cmd-hist.h" #include "file-ops.h" #include "lo-mappers.h" +#include "lo-sysdep.h" #include "oct-env.h" #include "oct-time.h" #include "str-vec.h" @@ -238,7 +239,7 @@ std::string name = sys::tempnam ("", "oct-"); - std::fstream file (name.c_str (), std::ios::out); + std::ofstream file = sys::ofstream (name.c_str (), std::ios::out); if (! file) error ("%s: couldn't open temporary file '%s'", warn_for, @@ -478,7 +479,7 @@ // Write the commands to the history file since source_file // disables command line history while it executes. - std::fstream file (name.c_str (), std::ios::in); + std::fstream file = sys::fstream (name.c_str (), std::ios::in); char *line; //int first = 1; diff -r 597e7cf93cac -r 159b6a1eb408 libinterp/corefcn/urlwrite.cc --- a/libinterp/corefcn/urlwrite.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/libinterp/corefcn/urlwrite.cc Fri Jun 12 22:13:04 2020 +0200 @@ -142,7 +142,8 @@ octave::sys::file_stat fs (filename); - std::ofstream ofile (filename.c_str (), std::ios::out | std::ios::binary); + std::ofstream ofile = + octave::sys::ofstream (filename.c_str (), std::ios::out | std::ios::binary); if (! ofile.is_open ()) error ("urlwrite: unable to open file"); diff -r 597e7cf93cac -r 159b6a1eb408 libinterp/octave-value/ov-java.cc --- a/libinterp/octave-value/ov-java.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/libinterp/octave-value/ov-java.cc Fri Jun 12 22:13:04 2020 +0200 @@ -254,9 +254,7 @@ void read_java_opts (const std::string& filename) { - std::string ascii_fname = sys::get_ASCII_filename (filename); - - std::ifstream js (ascii_fname.c_str ()); + std::ifstream js = sys::ifstream (filename.c_str ()); if (! js.bad () && ! js.fail ()) { @@ -376,9 +374,7 @@ { std::string classpath; - std::string ascii_fname = octave::sys::get_ASCII_filename (filepath); - - std::ifstream fs (ascii_fname.c_str ()); + std::ifstream fs = octave::sys::ifstream (filepath.c_str ()); if (! fs.bad () && ! fs.fail ()) { diff -r 597e7cf93cac -r 159b6a1eb408 libinterp/parse-tree/oct-parse.yy --- a/libinterp/parse-tree/oct-parse.yy Fri Jun 12 11:39:35 2020 -0400 +++ b/libinterp/parse-tree/oct-parse.yy Fri Jun 12 22:13:04 2020 +0200 @@ -4648,9 +4648,7 @@ { // NAME should be an absolute file name and the file should exist. - std::string ascii_fname = sys::get_ASCII_filename (name); - - std::ifstream fs (ascii_fname.c_str (), std::ios::in); + std::ifstream fs = sys::ifstream (name.c_str (), std::ios::in); std::string text; diff -r 597e7cf93cac -r 159b6a1eb408 liboctave/system/lo-sysdep.cc --- a/liboctave/system/lo-sysdep.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/liboctave/system/lo-sysdep.cc Fri Jun 12 22:13:04 2020 +0200 @@ -27,8 +27,6 @@ # include "config.h" #endif -#include - #include "dir-ops.h" #include "file-ops.h" #include "lo-error.h" @@ -350,6 +348,48 @@ #endif } + std::fstream + fstream (const std::string& filename, const std::ios::openmode mode) + { +#if defined (OCTAVE_USE_WINDOWS_API) + + std::wstring wfilename = u8_to_wstring (filename); + + return std::fstream (wfilename.c_str (), mode); + +#else + return std::fstream (filename.c_str (), mode); +#endif + } + + std::ifstream + ifstream (const std::string& filename, const std::ios::openmode mode) + { +#if defined (OCTAVE_USE_WINDOWS_API) + + std::wstring wfilename = u8_to_wstring (filename); + + return std::ifstream (wfilename.c_str (), mode); + +#else + return std::ifstream (filename.c_str (), mode); +#endif + } + + std::ofstream + ofstream (const std::string& filename, const std::ios::openmode mode) + { +#if defined (OCTAVE_USE_WINDOWS_API) + + std::wstring wfilename = u8_to_wstring (filename); + + return std::ofstream (wfilename.c_str (), mode); + +#else + return std::ofstream (filename.c_str (), mode); +#endif + } + void putenv_wrapper (const std::string& name, const std::string& value) { diff -r 597e7cf93cac -r 159b6a1eb408 liboctave/system/lo-sysdep.h --- a/liboctave/system/lo-sysdep.h Fri Jun 12 11:39:35 2020 -0400 +++ b/liboctave/system/lo-sysdep.h Fri Jun 12 22:13:04 2020 +0200 @@ -28,6 +28,7 @@ #include "octave-config.h" +#include #include #include @@ -49,6 +50,16 @@ extern std::FILE * fopen (const std::string& name, const std::string& mode); + extern std::fstream fstream (const std::string& name, + const std::ios::openmode mode = + std::ios::in | std::ios::out); + + extern std::ifstream ifstream (const std::string& name, + const std::ios::openmode mode = std::ios::in); + + extern std::ofstream ofstream (const std::string& name, + const std::ios::openmode mode = std::ios::out); + extern void putenv_wrapper (const std::string& name, const std::string& value); diff -r 597e7cf93cac -r 159b6a1eb408 liboctave/util/cmd-hist.cc --- a/liboctave/util/cmd-hist.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/liboctave/util/cmd-hist.cc Fri Jun 12 22:13:04 2020 +0200 @@ -37,6 +37,7 @@ #include "cmd-hist.h" #include "file-ops.h" #include "lo-error.h" +#include "lo-sysdep.h" #include "singleton-cleanup.h" #include "str-vec.h" @@ -399,7 +400,7 @@ if (! fs) { - std::fstream tmp (f, std::ios::out); + std::ofstream tmp = sys::ofstream (f, std::ios::out); tmp.close (); } diff -r 597e7cf93cac -r 159b6a1eb408 liboctave/util/file-info.cc --- a/liboctave/util/file-info.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/liboctave/util/file-info.cc Fri Jun 12 22:13:04 2020 +0200 @@ -83,9 +83,8 @@ size_t sz = fs.size (); - std::string ascii_fname = sys::get_ASCII_filename (fname); - - std::ifstream file (ascii_fname.c_str (), std::ios::in | std::ios::binary); + std::ifstream file = sys::ifstream (fname.c_str (), + std::ios::in | std::ios::binary); if (file) { diff -r 597e7cf93cac -r 159b6a1eb408 liboctave/util/url-transfer.cc --- a/liboctave/util/url-transfer.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/liboctave/util/url-transfer.cc Fri Jun 12 22:13:04 2020 +0200 @@ -121,8 +121,9 @@ { std::string realfile = target + directory + sep + sv(i); - std::ofstream ofile (realfile.c_str (), - std::ios::out | std::ios::binary); + std::ofstream ofile = + sys::ofstream (realfile.c_str (), + std::ios::out | std::ios::binary); if (! ofile.is_open ()) { @@ -206,10 +207,9 @@ else { // FIXME: Does ascii mode need to be flagged here? - std::string ascii_fname = sys::get_ASCII_filename (realfile); - - std::ifstream ifile (ascii_fname.c_str (), - std::ios::in | std::ios::binary); + std::ifstream ifile = + sys::ifstream (realfile.c_str (), + std::ios::in | std::ios::binary); if (! ifile.is_open ()) { diff -r 597e7cf93cac -r 159b6a1eb408 src/mkoctfile.in.cc --- a/src/mkoctfile.in.cc Fri Jun 12 11:39:35 2020 -0400 +++ b/src/mkoctfile.in.cc Fri Jun 12 22:13:04 2020 +0200 @@ -61,6 +61,7 @@ # endif #else # include "mkostemps-wrapper.h" +# include "uniconv-wrappers.h" # include "unistd-wrappers.h" # include "wait-wrappers.h" #endif @@ -89,6 +90,14 @@ return mkostemps (tmpl, suffixlen, 0); } +static char * +octave_u8_conv_to_encoding (const char *tocode, const uint8_t *src, + size_t srclen, size_t *lengthp) +{ + // FIXME: Do we need to provide the conversion here? + return nullptr; +} + static int octave_unlink_wrapper (const char *nm) { @@ -980,8 +989,33 @@ + vars["CPPFLAGS"] + ' ' + vars["ALL_CFLAGS"] + ' ' + incflags + ' ' + defs + ' ' + quote_path (f)); + // FIXME: Use wide character API for popen on Windows. FILE *fd = popen (cmd.c_str (), "r"); + +#if defined (OCTAVE_USE_WINDOWS_API) + // FIXME: liboctinterp isn't linked in to mkoctfile. + // So we cannot use octave::sys::ofstream. Instead we fall back + // on using the functions available from libwrappers. + size_t srclen = dfile.length (); + const uint8_t *src = reinterpret_cast + (dfile.c_str ()); + + size_t length = 0; + wchar_t *wchar = reinterpret_cast + (octave_u8_conv_to_encoding ("wchar_t", src, srclen, + &length)); + + std::ofstream fo; + if (wchar != nullptr) + { + fo.open (wchar); + free (static_cast (wchar)); + } + else + fo.open (dfile.c_str ()); +#else std::ofstream fo (dfile.c_str ()); +#endif size_t pos; while (! feof (fd)) { @@ -1014,8 +1048,33 @@ + vars["CPPFLAGS"] + ' ' + vars["ALL_CXXFLAGS"] + ' ' + incflags + ' ' + defs + ' ' + quote_path (f)); + // FIXME: Use wide character API for popen on Windows. FILE *fd = popen (cmd.c_str (), "r"); + +#if defined (OCTAVE_USE_WINDOWS_API) + // FIXME: liboctinterp isn't linked in to mkoctfile. + // So we cannot use octave::sys::ofstream. Instead we fall back + // on using the functions available from libwrappers. + size_t srclen = dfile.length (); + const uint8_t *src = reinterpret_cast + (dfile.c_str ()); + + size_t length = 0; + wchar_t *wchar = reinterpret_cast + (octave_u8_conv_to_encoding ("wchar_t", src, srclen, + &length)); + + std::ofstream fo; + if (wchar != nullptr) + { + fo.open (wchar); + free (static_cast (wchar)); + } + else + fo.open (dfile.c_str ()); +#else std::ofstream fo (dfile.c_str ()); +#endif size_t pos; while (! feof (fd)) {