/*
 * 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;
}
Exemple #2
0
/*
 * 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);
}