Browse Source

Fixed some crashes and issues with binary output and files, and can now open binary files where non-utf-8 chars are replaced with '?'.

merge-requests/365/head
eidheim 10 years ago
parent
commit
564a31f571
  1. 45
      src/sourcefile.cc
  2. 32
      src/terminal.cc

45
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<Gtk::TextBuffer> text_buffer) {
std::ifstream input(path, std::ofstream::binary);
if(input) {
std::vector<char> 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<char> 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;
}

32
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::InProgress> Terminal::print_in_progress(std::string start_msg) {

Loading…
Cancel
Save