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) { bool juci::filesystem::read(const std::string &path, Glib::RefPtr<Gtk::TextBuffer> text_buffer) {
std::ifstream input(path, std::ofstream::binary); std::ifstream input(path, std::ofstream::binary);
if(input) { 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; size_t read_length;
std::string buffer_str;
while((read_length=input.read(&buffer[0], buffer_size).gcount())>0) { while((read_length=input.read(&buffer[0], buffer_size).gcount())>0) {
buffer_str+=std::string(&buffer[0], read_length); //auto ustr=Glib::ustring(std::string(&buffer[0], read_length)); //this works...
if(buffer_str.back()>=0) {
auto ustr=Glib::ustring(buffer_str); //this does not work:
buffer_str=""; Glib::ustring ustr;
if(ustr.validate()) ustr.resize(read_length);
text_buffer->insert_at_cursor(ustr); ustr.replace(0, read_length, &buffer[0]);
else {
input.close(); Glib::ustring::iterator iter;
return false; 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(); input.close();
return true; 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){ 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) 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 else
get_buffer()->insert(get_buffer()->end(), message); get_buffer()->insert(get_buffer()->end(), umessage);
auto iter=get_buffer()->end(); auto end_iter=get_buffer()->end();
if(iter.backward_char()) { if(end_iter.backward_char()) {
auto mark=get_buffer()->create_mark(iter); auto mark=get_buffer()->create_mark(end_iter);
scroll_to(mark, 0.0, 1.0, 1.0); scroll_to(mark, 0.0, 1.0, 1.0);
get_buffer()->delete_mark(mark); 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){ void Terminal::print(int line_nr, const std::string &message){
auto iter=get_buffer()->get_iter_at_line(line_nr); Glib::ustring umessage=message;
while(!iter.ends_line() && iter.forward_char()) {} Glib::ustring::iterator iter;
get_buffer()->insert(iter, message); 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) { std::shared_ptr<Terminal::InProgress> Terminal::print_in_progress(std::string start_msg) {

Loading…
Cancel
Save