Bug fix to window source: size.c
chris at umcp-cs.UUCP
chris at umcp-cs.UUCP
Mon Jul 4 16:25:45 AEST 1983
Naturally, there was a bug in the source I distributed. The 'Wsize'
function could generate garbage in the newly-expanded window. I thought
I had fixed that, but it turned out I was fixing the wrong thing, which
wasn't really broken. Here's a corrected version of size.c, with the
real bug really fixed (honest, I tested it).
- Chris
: Run this shell script with "sh" not "csh"
PATH=:/bin:/usr/bin:/usr/ucb
export PATH
all=FALSE
if [ $1x = -ax ]; then
all=TRUE
fi
/bin/echo 'Extracting size.c'
/bin/echo ' (window-expansion bug fixed)'
sed 's/^X//' <<'//go.sysin dd *' >size.c
X#include "win.h"
X#include "display.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Change the size of an existing window */
XWsize (w, xext, yext)
Xregister Win *w;
Xregister xext, yext;
X{
X register Buf *b;
X register Ch *c;
X
X if (xext < 1 || yext < 1)
X return -1;
X if (w -> OXO + xext > ScreenWidth || w -> OYO + yext > ScreenLength)
X return -1;
X b = w -> w_textbuf;
X if (b -> b_ncols < xext || b -> b_nrows < yext) {
X if (Wsetbuf (w, xext, yext))
X return -1;
X }
X if ((w -> w_status & WHIDDEN) == 0) {
X WErase (w); /* Erase visible portions */
X WRemoveCoverList (w); /* Uncover everything */
X }
X
X /* Get new winbuf */
X c = (Ch *) malloc (sizeof (Ch) * xext * yext);
X if (c == 0) {
X if ((w -> w_status & WHIDDEN) == 0)
X WComputeCover (w);
X return -1;
X }
X free (w -> w_winbuf);
X w -> w_winbuf = c;
X w -> w_outside.xextent = xext; /* Change size */
X w -> w_outside.yextent = yext;
X
X /* If the window has grown such that the bottom of the winbuf sticks
X out over the bottom of the textbuf, it must be moved upward. The
X distance to be moved is [real_bstart - max_bstart], or, in the y
X direction, [w -> w_bstart.row - (b -> b_nrows - yext)]. */
X if (w -> w_bstart.row + yext > b -> b_nrows) {
X /* Want cursor to stick to buffer, so must move down
X relative to window */
X w -> w_cursor.row += w -> w_bstart.row - b -> b_nrows + yext;
X w -> w_bstart.row = b -> b_nrows - yext;/* max_bstart.row */
X MajorUpdate = 1;
X }
X /* Similarly for the x direction */
X if (w -> w_bstart.col + xext > b -> b_ncols) {
X w -> w_cursor.col += w -> w_bstart.col - b -> b_ncols + xext;
X w -> w_bstart.col = b -> b_ncols - xext;/* max_bstart.col */
X }
X
X /* Make inside whole thing (sigh) */
X for (c = w -> w_winbuf + xext * yext; c > w -> w_winbuf;)
X (--c) -> ch_all = ' ' | (WBUF<<NBPB);
X WFixCursor (w);
X if ((w -> w_status & WHIDDEN) == 0)
X WComputeCover (w); /* Recompute cover with new size */
X return Wsetmargins (w, 0, 0, xext, yext);
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
/bin/chmod 644 size.c
/bin/echo -n ' '; /bin/ls -ld size.c
fi
--
UUCP: {seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet: chris at umcp-cs
ARPA: chris.umcp-cs at UDel-Relay
More information about the Comp.sources.unix
mailing list