/* * Save a reverse delta for doing undo. */ void undo_save(int type, int startn, int starto, int arg1, int arg2) { undop up; if (cur_bp->flags & BFLAG_NOUNDO || undo_nosave) return; up = (undop)zmalloc(sizeof(*up)); up->type = type; up->pointn = startn; up->pointo = starto; switch (type) { case UNDO_INSERT_CHAR: case UNDO_REPLACE_CHAR: case UNDO_INTERCALATE_CHAR: up->delta.c = arg1; break; case UNDO_INSERT_BLOCK: up->delta.block.size = arg1; up->delta.block.text = copy_text_block(startn, starto, arg1); break; case UNDO_REPLACE_BLOCK: up->delta.block.osize = arg1; up->delta.block.size = arg2; up->delta.block.text = copy_text_block(startn, starto, arg1); break; case UNDO_REMOVE_BLOCK: up->delta.block.size = arg1; break; case UNDO_START_SEQUENCE: case UNDO_END_SEQUENCE: break; } up->next = cur_bp->last_undop; cur_bp->last_undop = up; if (!doing_undo) cur_bp->next_undop = up; }
/* * Save a reverse delta for doing undo. */ void undo_save (int type, Point pt, size_t osize, size_t size) { Undo *up; if (get_buffer_noundo (cur_bp) || undo_nosave) return; up = (Undo *) XZALLOC (Undo); up->type = type; up->n = pt.n; up->o = pt.o; if (!get_buffer_modified (cur_bp)) up->unchanged = true; if (type == UNDO_REPLACE_BLOCK) { Line * lp = get_buffer_pt (cur_bp).p; size_t n = get_buffer_pt (cur_bp).n; if (n > pt.n) do lp = get_line_prev (lp); while (--n > pt.n); else if (n < pt.n) do lp = get_line_next (lp); while (++n < pt.n); pt.p = lp; up->block.osize = osize; up->block.size = size; up->block.text = copy_text_block (pt, osize); } up->next = get_buffer_last_undop (cur_bp); set_buffer_last_undop (cur_bp, up); if (!doing_undo) set_buffer_next_undop (cur_bp, up); }