/* * Revert an action. Return the next undo entry. */ static Undo * revert_action (Undo * up) { size_t i; Point pt; pt.n = up->n; pt.o = up->o; doing_undo = true; if (up->type == UNDO_END_SEQUENCE) { undo_save (UNDO_START_SEQUENCE, pt, 0, 0); up = up->next; while (up->type != UNDO_START_SEQUENCE) up = revert_action (up); pt.n = up->n; pt.o = up->o; undo_save (UNDO_END_SEQUENCE, pt, 0, 0); goto_point (pt); return up->next; } goto_point (pt); if (up->type == UNDO_REPLACE_BLOCK) { undo_save (UNDO_REPLACE_BLOCK, pt, up->block.size, up->block.osize); undo_nosave = true; for (i = 0; i < up->block.size; ++i) delete_char (); insert_nstring (astr_cstr (up->block.text), up->block.osize); undo_nosave = false; } doing_undo = false; if (up->unchanged) set_buffer_modified (cur_bp, false); return up->next; }
bool find_file (const char *filename) { Buffer bp; for (bp = head_bp; bp != NULL; bp = get_buffer_next (bp)) if (get_buffer_filename (bp) != NULL && STREQ (get_buffer_filename (bp), filename)) break; if (bp == NULL) { if (exist_file (filename) && !is_regular_file (filename)) { minibuf_error ("File exists but could not be read"); return false; } else { bp = buffer_new (); set_buffer_names (bp, filename); set_buffer_dir (bp, astr_new_cstr (dir_name (filename))); estr es = estr_readf (filename); if (es) set_buffer_readonly (bp, !check_writable (filename)); else es = estr_new_astr (astr_new ()); set_buffer_text (bp, es); /* Reset undo history. */ set_buffer_next_undop (bp, NULL); set_buffer_last_undop (bp, NULL); set_buffer_modified (bp, false); } } switch_to_buffer (bp); thisflag |= FLAG_NEED_RESYNC; return true; }