diff options
author | Kjell Wooding <kjell@cvs.openbsd.org> | 2005-10-11 01:08:54 +0000 |
---|---|---|
committer | Kjell Wooding <kjell@cvs.openbsd.org> | 2005-10-11 01:08:54 +0000 |
commit | 84d65e93af5f549a6a231de6c1463310a43308c9 (patch) | |
tree | 00c8eb5a04689436c97aa614aef8405e24426ae9 | |
parent | 0ecee07d8fe56b1a0133782d5bd5870088af493a (diff) |
A while back, undo records were moved from the BUFFER struct to MGWIN.
This is nonsensical, and utterly broken if you are undo-ing across
multiple buffers. Change them back to being associated with the BUFFER
struct. (effectively, just revert the original change)
ok deraadt@
-rw-r--r-- | usr.bin/mg/buffer.c | 13 | ||||
-rw-r--r-- | usr.bin/mg/def.h | 10 | ||||
-rw-r--r-- | usr.bin/mg/undo.c | 28 | ||||
-rw-r--r-- | usr.bin/mg/window.c | 26 |
4 files changed, 35 insertions, 42 deletions
diff --git a/usr.bin/mg/buffer.c b/usr.bin/mg/buffer.c index 9b4eae3019e..6f565281899 100644 --- a/usr.bin/mg/buffer.c +++ b/usr.bin/mg/buffer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: buffer.c,v 1.45 2005/09/28 06:37:52 deraadt Exp $ */ +/* $OpenBSD: buffer.c,v 1.46 2005/10/11 01:08:52 kjell Exp $ */ /* This file is in the public domain. */ @@ -126,6 +126,7 @@ killbuffer(BUFFER *bp) BUFFER *bp2; MGWIN *wp; int s; + struct undo_rec *rec, *next; /* * Find some other buffer to display. Try the alternate buffer, @@ -176,6 +177,13 @@ killbuffer(BUFFER *bp) bp1->b_altb = (bp->b_altb == bp1) ? NULL : bp->b_altb; bp1 = bp1->b_bufp; } + rec = LIST_FIRST(&bp->b_undo); + while (rec != NULL) { + next = LIST_NEXT(rec, next); + free_undo_record(rec); + rec = next; + } + free((char *)bp->b_bname); /* Release name block */ free(bp); /* Release buffer block */ return (TRUE); @@ -488,6 +496,9 @@ bfind(const char *bname, int cflag) bp->b_nwnd = 0; bp->b_linep = lp; bp->b_nmodes = defb_nmodes; + LIST_INIT(&bp->b_undo); + bp->b_undoptr = NULL; + memset(&bp->b_undopos, 0, sizeof(bp->b_undopos)); i = 0; do { bp->b_modes[i] = defb_modes[i]; diff --git a/usr.bin/mg/def.h b/usr.bin/mg/def.h index 78c4aff8611..2055a40d206 100644 --- a/usr.bin/mg/def.h +++ b/usr.bin/mg/def.h @@ -1,4 +1,4 @@ -/* $OpenBSD: def.h,v 1.66 2005/10/11 00:50:00 kjell Exp $ */ +/* $OpenBSD: def.h,v 1.67 2005/10/11 01:08:53 kjell Exp $ */ /* This file is in the public domain. */ @@ -203,10 +203,6 @@ typedef struct MGWIN { char w_ntrows; /* # of rows of text in window */ char w_force; /* If NZ, forcing row. */ char w_flag; /* Flags. */ - LIST_HEAD(, undo_rec) w_undo; /* Undo actions list */ - int w_undopos; /* Where we were during the */ - /* last undo action. */ - struct undo_rec *w_undoptr; struct LINE *w_wrapline; } MGWIN; #define w_wndp w_list.l_p.l_wp @@ -253,6 +249,10 @@ typedef struct BUFFER { char b_flag; /* Flags */ char b_fname[NFILEN]; /* File name */ struct fileinfo b_fi; /* File attributes */ + LIST_HEAD(, undo_rec) b_undo; /* Undo actions list */ + int b_undopos; /* Where we were during the */ + /* last undo action. */ + struct undo_rec *b_undoptr; } BUFFER; #define b_bufp b_list.l_p.x_bp #define b_bname b_list.l_name diff --git a/usr.bin/mg/undo.c b/usr.bin/mg/undo.c index f5e7d5c3f2e..61f276d3541 100644 --- a/usr.bin/mg/undo.c +++ b/usr.bin/mg/undo.c @@ -1,4 +1,4 @@ -/* $OpenBSD: undo.c,v 1.28 2005/10/06 16:48:00 kjell Exp $ */ +/* $OpenBSD: undo.c,v 1.29 2005/10/11 01:08:53 kjell Exp $ */ /* * Copyright (c) 2002 Vincent Labrecque <vincent@openbsd.org> * All rights reserved. @@ -155,7 +155,7 @@ drop_oldest_undo_record(void) { struct undo_rec *rec; - rec = LIST_END(&curwp->w_undo); + rec = LIST_END(&curbp->b_undo); if (rec != NULL) { undo_free_num--; LIST_REMOVE(rec, next); @@ -170,7 +170,7 @@ lastrectype(void) { struct undo_rec *rec; - if ((rec = LIST_FIRST(&curwp->w_undo)) != NULL) + if ((rec = LIST_FIRST(&curbp->b_undo)) != NULL) return (rec->type); return (0); } @@ -205,7 +205,7 @@ undo_add_boundary(void) rec = new_undo_record(); rec->type = BOUNDARY; - LIST_INSERT_HEAD(&curwp->w_undo, rec, next); + LIST_INSERT_HEAD(&curbp->b_undo, rec, next); return (TRUE); } @@ -228,7 +228,7 @@ undo_add_insert(LINE *lp, int offset, int size) /* * We try to reuse the last undo record to `compress' things. */ - rec = LIST_FIRST(&curwp->w_undo); + rec = LIST_FIRST(&curbp->b_undo); if (rec != NULL && rec->type == INSERT) { if (rec->pos + rec->region.r_size == pos) { rec->region.r_size += reg.r_size; @@ -247,7 +247,7 @@ undo_add_insert(LINE *lp, int offset, int size) undo_add_boundary(); - LIST_INSERT_HEAD(&curwp->w_undo, rec, next); + LIST_INSERT_HEAD(&curbp->b_undo, rec, next); return (TRUE); } @@ -273,7 +273,7 @@ undo_add_delete(LINE *lp, int offset, int size) if (offset == llength(lp)) /* if it's a newline... */ undo_add_boundary(); - else if ((rec = LIST_FIRST(&curwp->w_undo)) != NULL) { + else if ((rec = LIST_FIRST(&curbp->b_undo)) != NULL) { /* * Separate this command from the previous one if we're not * just before the previous record... @@ -300,7 +300,7 @@ undo_add_delete(LINE *lp, int offset, int size) if (lastrectype() != DELETE) undo_add_boundary(); - LIST_INSERT_HEAD(&curwp->w_undo, rec, next); + LIST_INSERT_HEAD(&curbp->b_undo, rec, next); return (TRUE); } @@ -352,7 +352,7 @@ undo_dump(int f, int n) } num = 0; - for (rec = LIST_FIRST(&curwp->w_undo); rec != NULL; + for (rec = LIST_FIRST(&curbp->b_undo); rec != NULL; rec = LIST_NEXT(rec, next)) { num++; snprintf(buf, sizeof(buf), @@ -422,11 +422,11 @@ undo(int f, int n) dot = find_dot(curwp->w_dotp, curwp->w_doto); - ptr = curwp->w_undoptr; + ptr = curbp->b_undoptr; /* if we moved, make ptr point back to the top of the list */ - if ((ptr == NULL && nulled == TRUE) || curwp->w_undopos != dot) { - ptr = LIST_FIRST(&curwp->w_undo); + if ((ptr == NULL && nulled == TRUE) || curbp->b_undopos != dot) { + ptr = LIST_FIRST(&curbp->b_undo); nulled = TRUE; } @@ -513,9 +513,9 @@ undo(int f, int n) * Record where we are. (we have to save our new position at the end * since we change the dot when undoing....) */ - curwp->w_undoptr = ptr; + curbp->b_undoptr = ptr; - curwp->w_undopos = find_dot(curwp->w_dotp, curwp->w_doto); + curbp->b_undopos = find_dot(curwp->w_dotp, curwp->w_doto); return (rval); } diff --git a/usr.bin/mg/window.c b/usr.bin/mg/window.c index 9331e54fe51..b56722605b1 100644 --- a/usr.bin/mg/window.c +++ b/usr.bin/mg/window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.17 2005/06/14 18:14:40 kjell Exp $ */ +/* $OpenBSD: window.c,v 1.18 2005/10/11 01:08:53 kjell Exp $ */ /* This file is in the public domain. */ @@ -27,27 +27,9 @@ new_window(BUFFER *bp) wp->w_wrapline = NULL; if (bp) bp->b_nwnd++; - LIST_INIT(&wp->w_undo); - wp->w_undoptr = NULL; - wp->w_undopos = 0; - return (wp); } -void -free_window(MGWIN *wp) -{ - struct undo_rec *rec, *next; - - rec = LIST_FIRST(&wp->w_undo); - while (rec != NULL) { - next = LIST_NEXT(rec, next); - free_undo_record(rec); - rec = next; - } - free(wp); -} - /* * Reposition dot in the current window to line "n". If the argument is * positive, it is that line. If it is negative it is that line from the @@ -177,7 +159,7 @@ onlywind(int f, int n) wp->w_bufp->b_markp = wp->w_markp; wp->w_bufp->b_marko = wp->w_marko; } - free_window(wp); + free(wp); } while (curwp->w_wndp != NULL) { wp = curwp->w_wndp; @@ -188,7 +170,7 @@ onlywind(int f, int n) wp->w_bufp->b_markp = wp->w_markp; wp->w_bufp->b_marko = wp->w_marko; } - free_window(wp); + free(wp); } lp = curwp->w_linep; i = curwp->w_toprow; @@ -425,7 +407,7 @@ delwind(int f, int n) nwp->w_wndp = wp->w_wndp; break; } - free_window(wp); + free(wp); return (TRUE); } |