ex_undo.c revision 254225
119304Speter/*- 219304Speter * Copyright (c) 1992, 1993, 1994 319304Speter * The Regents of the University of California. All rights reserved. 419304Speter * Copyright (c) 1992, 1993, 1994, 1995, 1996 519304Speter * Keith Bostic. All rights reserved. 619304Speter * 719304Speter * See the LICENSE file for redistribution information. 819304Speter */ 919304Speter 1019304Speter#include "config.h" 1119304Speter 1219304Speter#ifndef lint 13254225Speterstatic const char sccsid[] = "$Id: ex_undo.c,v 10.7 2001/06/25 15:19:21 skimo Exp $"; 1419304Speter#endif /* not lint */ 1519304Speter 1619304Speter#include <sys/types.h> 1719304Speter#include <sys/queue.h> 18254225Speter#include <sys/time.h> 1919304Speter 2019304Speter#include <bitstring.h> 2119304Speter#include <limits.h> 2219304Speter#include <stdio.h> 2319304Speter#include <stdlib.h> 2419304Speter 2519304Speter#include "../common/common.h" 2619304Speter 2719304Speter/* 2819304Speter * ex_undo -- u 2919304Speter * Undo the last change. 3019304Speter * 3119304Speter * PUBLIC: int ex_undo __P((SCR *, EXCMD *)); 3219304Speter */ 3319304Speterint 34254225Speterex_undo(SCR *sp, EXCMD *cmdp) 3519304Speter{ 3619304Speter EXF *ep; 3719304Speter MARK m; 3819304Speter 3919304Speter /* 4019304Speter * !!! 4119304Speter * Historic undo always set the previous context mark. 4219304Speter */ 4319304Speter m.lno = sp->lno; 4419304Speter m.cno = sp->cno; 4519304Speter if (mark_set(sp, ABSMARK1, &m, 1)) 4619304Speter return (1); 4719304Speter 4819304Speter /* 4919304Speter * !!! 5019304Speter * Multiple undo isn't available in ex, as there's no '.' command. 5119304Speter * Whether 'u' is undo or redo is toggled each time, unless there 5219304Speter * was a change since the last undo, in which case it's an undo. 5319304Speter */ 5419304Speter ep = sp->ep; 5519304Speter if (!F_ISSET(ep, F_UNDO)) { 5619304Speter F_SET(ep, F_UNDO); 5719304Speter ep->lundo = FORWARD; 5819304Speter } 5919304Speter switch (ep->lundo) { 6019304Speter case BACKWARD: 6119304Speter if (log_forward(sp, &m)) 6219304Speter return (1); 6319304Speter ep->lundo = FORWARD; 6419304Speter break; 6519304Speter case FORWARD: 6619304Speter if (log_backward(sp, &m)) 6719304Speter return (1); 6819304Speter ep->lundo = BACKWARD; 6919304Speter break; 7019304Speter case NOTSET: 7119304Speter abort(); 7219304Speter } 7319304Speter sp->lno = m.lno; 7419304Speter sp->cno = m.cno; 7519304Speter return (0); 7619304Speter} 77