From 564a31f571fe24343d3716a6a2e132e334fa4543 Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 2 Sep 2015 12:16:53 +0200 Subject: [PATCH] Fixed some crashes and issues with binary output and files, and can now open binary files where non-utf-8 chars are replaced with '?'. --- src/sourcefile.cc | 45 ++++++++++++++++++++++++++++++++------------- src/terminal.cc | 32 ++++++++++++++++++++++++-------- 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/src/sourcefile.cc b/src/sourcefile.cc index b853796..e1434e5 100644 --- a/src/sourcefile.cc +++ b/src/sourcefile.cc @@ -17,23 +17,42 @@ std::string juci::filesystem::read(const std::string &path) { bool juci::filesystem::read(const std::string &path, Glib::RefPtr text_buffer) { std::ifstream input(path, std::ofstream::binary); + if(input) { - std::vector buffer(buffer_size); + //need to read the whole file to make this work... + std::stringstream ss; + ss << input.rdbuf(); + Glib::ustring ustr=std::move(ss.str()); + + Glib::ustring::iterator iter; + while(!ustr.validate(iter)) { + auto next_char_iter=iter; + next_char_iter++; + ustr.replace(iter, next_char_iter, "?"); + } + + text_buffer->insert_at_cursor(ustr); + + //TODO: maybe correct this, emphasis on maybe: + /*std::vector buffer(buffer_size); size_t read_length; - std::string buffer_str; while((read_length=input.read(&buffer[0], buffer_size).gcount())>0) { - buffer_str+=std::string(&buffer[0], read_length); - if(buffer_str.back()>=0) { - auto ustr=Glib::ustring(buffer_str); - buffer_str=""; - if(ustr.validate()) - text_buffer->insert_at_cursor(ustr); - else { - input.close(); - return false; - } + //auto ustr=Glib::ustring(std::string(&buffer[0], read_length)); //this works... + + //this does not work: + Glib::ustring ustr; + ustr.resize(read_length); + ustr.replace(0, read_length, &buffer[0]); + + Glib::ustring::iterator iter; + while(!ustr.validate(iter)) { + auto next_char_iter=iter; + next_char_iter++; + ustr.replace(iter, next_char_iter, "?"); } - } + + text_buffer->insert_at_cursor(ustr); //What if insert happens in the middle of an UTF-8 char??? + }*/ input.close(); return true; } diff --git a/src/terminal.cc b/src/terminal.cc index addce65..eb96fcf 100644 --- a/src/terminal.cc +++ b/src/terminal.cc @@ -283,14 +283,22 @@ void Terminal::kill_async_executes(bool force) { } int Terminal::print(const std::string &message, bool bold){ + Glib::ustring umessage=message; + Glib::ustring::iterator iter; + while(!umessage.validate(iter)) { + auto next_char_iter=iter; + next_char_iter++; + umessage.replace(iter, next_char_iter, "?"); + } + if(bold) - get_buffer()->insert_with_tag(get_buffer()->end(), message, bold_tag); + get_buffer()->insert_with_tag(get_buffer()->end(), umessage, bold_tag); else - get_buffer()->insert(get_buffer()->end(), message); + get_buffer()->insert(get_buffer()->end(), umessage); - auto iter=get_buffer()->end(); - if(iter.backward_char()) { - auto mark=get_buffer()->create_mark(iter); + auto end_iter=get_buffer()->end(); + if(end_iter.backward_char()) { + auto mark=get_buffer()->create_mark(end_iter); scroll_to(mark, 0.0, 1.0, 1.0); get_buffer()->delete_mark(mark); } @@ -299,9 +307,17 @@ int Terminal::print(const std::string &message, bool bold){ } void Terminal::print(int line_nr, const std::string &message){ - auto iter=get_buffer()->get_iter_at_line(line_nr); - while(!iter.ends_line() && iter.forward_char()) {} - get_buffer()->insert(iter, message); + Glib::ustring umessage=message; + Glib::ustring::iterator iter; + while(!umessage.validate(iter)) { + auto next_char_iter=iter; + next_char_iter++; + umessage.replace(iter, next_char_iter, "?"); + } + + auto end_line_iter=get_buffer()->get_iter_at_line(line_nr); + while(!end_line_iter.ends_line() && end_line_iter.forward_char()) {} + get_buffer()->insert(end_line_iter, umessage); } std::shared_ptr Terminal::print_in_progress(std::string start_msg) {