[net.sources] Window source #5 [of 0-7]: misc source

chris@umcp-cs.UUCP (07/03/83)

: 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 filedump.c'
sed 's/^X//' <<'//go.sysin dd *' >filedump.c
X#include "win.h"
X#include "display.h"
X#include <stdio.h>
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Dump current screen (as it would look if it were refreshed) to a file */
X/* File format is: two hex digits (= 1 byte) of screen width, two hex digits
X   of screen length, newline, screen length lines of screen width * 4
X   characters each, which are the characters/mode values for that position.
X   0000 (mode 0, char null) is an empty position.  (First 2 are mode.) */
X
XWfiledump (file)
Xchar *file;
X{
X	static Ch *disp;
X	register Ch *c;
X	register Win *w;
X	register j, i;
X	FILE *f;
X
X	if ((f = fopen (file, "w")) == NULL)
X		return -1;
X	if (disp == 0) {
X		disp = (Ch *)
X			malloc (sizeof (Ch) * ScreenLength * ScreenWidth);
X		if (disp == 0)
X			return -1;
X	}
X	for (c = disp + ScreenLength * ScreenWidth; c > disp; )
X		(--c) -> ch_all = 0;	/* Fake empty position */
X	for (w = WinList; w; w = w -> w_next) {
X		if ((w -> w_status & WHIDDEN) == 0)
X			WFDump (w, disp);
X	}
X	if (WBoxActive)
X		WFBox (disp);
X	fprintf (f, "%02x%02x\n", ScreenWidth, ScreenLength);
X	c = disp;
X	for (i = 0; i < ScreenLength; i++, fprintf (f, "\n"))
X		for (j = 0; j < ScreenWidth; j++, c++)
X			fprintf (f, "%02x%02x", ((int) c -> Mode) & 0xff,
X				((int) c -> Char) & 0xff);
X			c++;
X	fclose (f);
X	return 0;
X}
X
X/* Dump visible portions of window w to display d */
Xstatic
XWFDump (w, d)
Xregister Win *w;
XCh *d;
X{
X	register Ch *wt, *ww, *dp;
X	register i, j;
X	register Buf *b = w -> w_textbuf;
X
X	wt = b -> b_contents + w -> w_bstart.row * b -> b_ncols +
X		w -> w_bstart.col;
X	ww = w -> w_winbuf;
X	for (i = 0; i < w -> OYE; i++) {
X		dp = d + (w -> OYO + i) * ScreenWidth + w -> OXO;
X		for (j = 0; j < w -> OXE; j++) {
X			if (ww -> Mode & WINVIS)
X				dp++;
X			else if (ww -> Mode & WBUF) {
X				dp -> Mode = wt -> Mode ^ ww -> Mode;
X				dp++ -> Char = wt -> Char;
X			} else
X				dp++ -> ch_all = ww -> ch_all;
X			wt++, ww++;
X		}
X		wt += b -> b_ncols - w -> OXE;
X	}
X	if ((w -> w_status & WCURSOR) == 0) {
X		i = w -> IYO + w -> w_cursor.row;
X		j = w -> IXO + w -> w_cursor.col;
X		if (((w->w_winbuf + i * w->OXE + j)->Mode & WINVIS) == 0) {
X			dp = d + (w -> OYO + i) * ScreenWidth + w -> OXO + j;
X			dp -> Mode ^= WBLINK|WINVERSE;
X		}
X	}
X}
X
X/* Draw the box on display d */
Xstatic
XWFBox (d)
Xregister Ch *d;
X{
X	register i, j;
X	register Ch *dp;
X
X	j = WBox.yorigin;
X	dp = d + j * ScreenWidth + WBox.xorigin;
X	for (i = 0; i < WBox.xextent; i++)
X		dp++ -> Mode ^= WINVERSE;
X	for (i = 2; i < WBox.yextent; i++) {
X		dp = d + (++j) * ScreenWidth + WBox.xorigin;
X		dp -> Mode ^= WINVERSE;
X		if (WBox.xextent > 1) {
X			dp += WBox.xextent - 1;
X			dp -> Mode ^= WINVERSE;
X		}
X	}
X	if (WBox.yextent > 1) {
X		dp = d + (++j) * ScreenWidth + WBox.xorigin;
X		for (i = 0; i < WBox.xextent; i++)
X			dp++ -> Mode ^= WINVERSE;
X	}
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 filedump.c
	/bin/echo -n '	'; /bin/ls -ld filedump.c
fi
/bin/echo 'Extracting find.c'
sed 's/^X//' <<'//go.sysin dd *' >find.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Find window given ID, and make it the current one */
XWin *
XWfind (id)
Xregister id;
X{
X	register Win *w;
X
X	for (w = WinList; w; w = w -> w_next) {
X		if (w -> w_id == id)
X			return CurWin = w;
X	}
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 find.c
	/bin/echo -n '	'; /bin/ls -ld find.c
fi
/bin/echo 'Extracting frame.c'
sed 's/^X//' <<'//go.sysin dd *' >frame.c
X#include "Trm.h"
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Frame a window (using default frame chars) */
XWframe (w)
XWin *w;
X{
X	return Wborder (w, W_tt.t_frames[0], W_tt.t_frames[1],
X			   W_tt.t_frames[2], W_tt.t_frames[3],
X			   W_tt.t_frames[4], W_tt.t_frames[5],
X			   W_tt.t_frames[6], W_tt.t_frames[7]);
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 frame.c
	/bin/echo -n '	'; /bin/ls -ld frame.c
fi
/bin/echo 'Extracting front.c'
sed 's/^X//' <<'//go.sysin dd *' >front.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Bring window w to front (top), i.e., completely uncover it */
X/* If hidden, remains hidden */
XWfront (w)
Xregister Win *w;
X{
X	register Win *p;
X
X	/* Is w already front? */
X	if (WinList == w)
X		return 0;
X
X	/* Move w to top of window list */
X	for (p = WinList; p -> w_next != w; p = p -> w_next)
X		;
X	p -> w_next = w -> w_next;
X	w -> w_next = WinList;
X	WinList = w;
X
X	/* If hidden, or not covered, then our work is done */
X	if ((w -> w_status & WHIDDEN) || (w -> w_status & WCOVERED) == 0)
X		return 0;
X	WRemoveCoverList (w);	/* Unmark w, plus some extra work... */
X	WComputeCover (w);	/* Compute windows w covers */
X	w -> w_status |= WDUMP;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 front.c
	/bin/echo -n '	'; /bin/ls -ld front.c
fi
/bin/echo 'Extracting getframe.c'
sed 's/^X//' <<'//go.sysin dd *' >getframe.c
X#include "Trm.h"
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Get frame chars */
X/* This routine exists because users should only need to include "win.h" */
XWgetframe (ulc, top, urc, left, right, llc, bottom, lrc)
Xchar *ulc, *top, *urc, *left, *right, *llc, *bottom, *lrc;
X{
X	*ulc = W_tt.t_frames[0];
X	*top = W_tt.t_frames[1];
X	*urc = W_tt.t_frames[2];
X	*left = W_tt.t_frames[3];
X	*right = W_tt.t_frames[4];
X	*llc = W_tt.t_frames[5];
X	*bottom = W_tt.t_frames[6];
X	*lrc = W_tt.t_frames[7];
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 getframe.c
	/bin/echo -n '	'; /bin/ls -ld getframe.c
fi
/bin/echo 'Extracting globals.c'
sed 's/^X//' <<'//go.sysin dd *' >globals.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Definition of global variables -- see win.h */
X
XWin	*WinList;
XWin	*CurWin;
XCov	*WCovList;
XRect	WBox;
Xint	MajorUpdate;
Xint	SigMagic;
Xint	InputPending;
Xint	LastRedisplayPaused;
Xint	WBoxActive;
Xint	WSetRealCursor;
Xint	WRCurRow;
Xint	WRCurCol;
Xint	WindowsActive;
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 globals.c
	/bin/echo -n '	'; /bin/ls -ld globals.c
fi
/bin/echo 'Extracting hide.c'
sed 's/^X//' <<'//go.sysin dd *' >hide.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Routines dealing with hiding windows */
X
X/* Hide window w */
XWhide (w)
Xregister Win *w;
X{
X	if (w -> w_status & WHIDDEN)/* Already hidden */
X		return 0;
X	WErase (w);		/* Erase from display */
X	w -> w_status |= WHIDDEN;
X	WRemoveCoverList (w);	/* Uncover all windows w covered */
X	return 0;
X}
X
X/* Unhide window w */
XWunhide (w)
Xregister Win *w;
X{
X	if ((w -> w_status & WHIDDEN) == 0)/* Not hidden */
X		return 0;
X	w -> w_status &= ~WHIDDEN;
X	WComputeCover (w);
X	w -> w_status |= WDUMP;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 hide.c
	/bin/echo -n '	'; /bin/ls -ld hide.c
fi
/bin/echo 'Extracting init.c'
sed 's/^X//' <<'//go.sysin dd *' >init.c
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X/* 	Original code copyright (c) 1981,1980 James Gosling	*/
X
X/* ACT 11-Nov-1982 modified for window package */
X
X#include "win.h"
X#include "display.h"
X#include <sys/ioctl.h>
X#include <sgtty.h>
X#include <stdio.h>
X#include <signal.h>
X
Xstruct sgttyb WOld;		/* The initial tty mode bits */
Xint	WTtyFd;			/* File descriptor for stty/gtty */
Xint	(*sigset())();
Xextern	Wexit (), Wsuspend ();
X
X/* Init window system.  If settings == 1, use previous settings.  If
X   settings == 0, use default settings.  Otherwise use "settings" settings.
X   If nomagic != 0, don't catch stop, interrupt, and terminate signals.
X   RETURNS: 0 if OK to continue using window system, anything else to
X   indicate that the CRT is unusable. */
XWinit (settings, nomagic)
Xstruct sgttyb *settings;
X{
X    static struct sgttyb   sg;
X    int rv;
X    extern char _sobuf[];
X
X    WTtyFd = 0;
X
X    /* I dont know how system specific this is, but here goes: */
X    if ((stdout->_flag & (_IOLBF|_IONBF)) == 0 && stdout->_base == NULL)
X	setbuf (stdout, _sobuf);
X
X    /* I should use isatty, but it just does a gtty anyway, so why bother? */
X    /* Note: if both of these fail then "we ain't talkin' to no terminal" */
X    /* NOTE: STRUCTURE ASSIGNMENT */
X
X    if (gtty (0, &WOld) < 0)
X	gtty (WTtyFd = 1, &WOld);
X    if (settings) {
X	if (settings != (struct sgttyb *) 1)
X	    sg = *settings;
X	sg.sg_ispeed = WOld.sg_ispeed;/* My, how suspicious we are */
X	sg.sg_ospeed = WOld.sg_ospeed;
X    }
X    else
X	sg = WOld;
X    sg.sg_flags = (sg.sg_flags & ~(ECHO | CRMOD | XTABS)) | CBREAK;
X    ioctl (WTtyFd, TIOCSETN, &sg);
X    if (!nomagic /*|| SigMagic*/) {
X	SigMagic = 1;
X	sigset (SIGINT, Wexit);
X	sigset (SIGTSTP, Wsuspend);
X	sigset (SIGTERM, Wexit);
X    }
X    ScreenGarbaged = 1;
X
X    /* I wish I didn't have to set everything up yet, but since WDterm_init()
X       expects to be in un-user-usable mode I have to.  Oh well. */
X    /* NOTE: WDterm_init () may only fail on first attempts! */
X    if (rv = WDterm_init ()) {	/* Then we cant run on this terminal */
X	if (SigMagic) {		/* Wonder if this is really necessary? */
X	    sigignore (SIGTSTP);
X	    sigignore (SIGINT);
X	}
X	ioctl (WTtyFd, TIOCSETN, &WOld);
X	if (SigMagic) {
X	    sigset (SIGTSTP, SIG_DFL);
X	    sigset (SIGINT, SIG_DFL);
X	}
X	return rv;
X    }
X    if (W_tt.t_window) (*W_tt.t_window) (0);
X    WindowsActive++;
X    return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 init.c
	/bin/echo -n '	'; /bin/ls -ld init.c
fi
/bin/echo 'Extracting inschars.c'
sed 's/^X//' <<'//go.sysin dd *' >inschars.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Insert n blanks at cursor in window w */
XWinschars (w, n)
Xregister Win *w;
Xint n;
X{
X	register Buf *b;
X	register Ch *cp, *ct, *start;
X	int blank;
X
X	if (n < 0)
X		return -1;
X	if (n == 0)
X		return 0;
X	if (n + w -> w_cursor.col > w -> IXE)
X		n = w -> IXE - w -> w_cursor.col;
X	blank = ' ' | (w -> w_mode << NBPB);
X	b = w -> w_textbuf;
X
X	/* w->w_winbuf */
X	ct = w -> w_winbuf + (w -> IYO + w -> w_cursor.row) * w -> OXE +
X		w -> IXO;
X	start = ct + w -> w_cursor.col;
X	ct += w -> IXE;
X	cp = ct - n;
X	while (cp > start) {
X		(--ct) -> Char = (--cp) -> Char;
X		ct -> Mode &= WINVIS;
X		ct -> Mode |= cp -> Mode & ~WINVIS;
X	}
X	while (ct > start) {
X		(--ct) -> Char = (--cp) -> Char;
X		ct -> Mode &= WINVIS;
X		ct -> Mode |= WBUF;
X	}
X	/* w->w_textbuf */
X	ct = b -> b_contents +
X	  (w -> IYO + w -> w_bstart.row + w -> w_cursor.row) * b -> b_ncols +
X	  w -> w_bstart.col + w -> IXO;
X	start = ct + w -> w_cursor.col;
X	ct += w -> IXE;
X	cp = ct - n;
X	while (cp > start)
X		(--ct) -> ch_all = (--cp) -> ch_all;
X	while (ct > start)
X		(--ct) -> ch_all = blank;
X	w -> w_status |= WDUMP;
X	b -> b_nmodw = -1;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 inschars.c
	/bin/echo -n '	'; /bin/ls -ld inschars.c
fi
/bin/echo 'Extracting inscols.c'
sed 's/^X//' <<'//go.sysin dd *' >inscols.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Insert n columns before cursor in window w */
XWinscols (w, n)
Xregister Win *w;
Xint n;
X{
X	register Buf *b;
X	register Ch *cp, *ct;
X	register j;
X	int i, blank, nm;
X
X	if (n < 0)
X		return -1;
X	if (n == 0)
X		return 0;
X	if (n + w -> w_cursor.col > w -> IXE)
X		n = w -> IXE - w -> w_cursor.col;
X	blank = ' ' | (w -> w_mode << NBPB);
X	b = w -> w_textbuf;
X	nm = w -> IXE - n - w -> w_cursor.col;
X
X	/* w->w_winbuf */
X	ct = w -> w_winbuf + w -> IYO * w -> OXE + w -> IXO + w -> IXE;
X	cp = ct - n;
X	for (i = 0; i < w -> IYE; i++) {
X		for (j = 0; j < nm; j++) {
X			(--ct) -> Char = (--cp) -> Char;
X			ct -> Mode &= WINVIS;
X			ct -> Mode |= cp -> Mode & ~WINVIS;
X		}
X		ct += w -> OXE + j;
X		cp += w -> OXE + j;
X	}
X	ct = w -> w_winbuf + w -> IYO * w -> OXE +
X		w -> IXO + w -> w_cursor.col;
X	for (i = 0; i < w -> IYE; i++) {
X		for (j = 0; j < n; j++) {
X			ct -> Char = ' ';
X			ct -> Mode &= WINVIS;
X			ct++ -> Mode |= WBUF;
X		}
X		ct += w -> OXE - j;
X	}
X	/* w->w_textbuf */
X	ct = b -> b_contents +
X		(w -> IYO + w -> w_bstart.row) * b -> b_ncols +
X		w -> IXO + w -> w_bstart.col + w -> IXE;
X	cp = ct - n;
X	for (i = 0; i < w -> IYE; i++) {
X		for (j = 0; j < nm; j++)
X			(--ct) -> ch_all = (--cp) -> ch_all;
X		ct += b -> b_ncols + j;
X		cp += b -> b_ncols + j;
X	}
X	ct = b -> b_contents +
X		(w -> IYO + w -> w_bstart.row) * b -> b_ncols +
X		w -> IXO + w -> w_bstart.col + w -> w_cursor.col;
X	for (i = 0; i < w -> IYE; i++) {
X		for (j = 0; j < n; j++)
X			ct++ -> ch_all = blank;
X		ct += b -> b_ncols - j;
X	}
X	w -> w_status |= WDUMP;
X	b -> b_nmodw = -1;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 inscols.c
	/bin/echo -n '	'; /bin/ls -ld inscols.c
fi
/bin/echo 'Extracting inslines.c'
sed 's/^X//' <<'//go.sysin dd *' >inslines.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Insert n lines above cursor in window w */
XWinslines (w, n)
Xregister Win *w;
Xint n;
X{
X	register Buf *b;
X	register Ch *cp, *ct;
X	register j;
X	int i, blank, ndown;
X
X	if (n < 0)
X		return -1;
X	if (n == 0)
X		return 0;
X	blank = ' ' | (w -> w_mode << NBPB);
X	b = w -> w_textbuf;
X	if (n + w -> w_cursor.row > w -> IYE)
X		n = w -> IYE - w -> w_cursor.row;
X	ndown = w -> IYE - n - w -> w_cursor.row;
X
X	/* First, w -> w_winbuf */
X	ct = w -> w_winbuf +
X		(w -> IYO + w -> IYE - 1) * w -> OXE + w -> IXO;
X	cp = ct - n * w -> OXE;
X	for (i = 0; i < ndown; i++) {
X		for (j = 0; j < w -> IXE; j++) {
X			ct -> Char = cp -> Char;
X			ct -> Mode &= WINVIS;
X			ct++ -> Mode |= cp++ -> Mode & ~WINVIS;
X		}
X		ct -= w -> OXE + j;
X		cp -= w -> OXE + j;
X	}
X	for (i = 0; i < n; i++) {
X		for (j = 0; j < w -> IXE; j++) {
X			ct -> Char = ' ';
X			ct -> Mode &= WINVIS;
X			ct++ -> Mode |= WBUF;
X		}
X		ct -= w -> OXE + j;
X	}
X
X	/* Now, w -> w_textbuf */
X	ct = b -> b_contents +
X		(w -> IYO + w -> IYE + w -> w_bstart.row - 1) * b -> b_ncols +
X		w -> IXO + w -> w_bstart.col;
X	cp = ct - n * b -> b_ncols;
X	for (i = 0; i < ndown; i++) {
X		for (j = 0; j < w -> IXE; j++)
X			ct++ -> ch_all = cp++ -> ch_all;
X		ct -= b -> b_ncols + j;
X		cp -= b -> b_ncols + j;
X	}
X	for (i = 0; i < n; i++) {
X		for (j = 0; j < w -> IXE; j++)
X			ct++ -> ch_all = blank;
X		ct -= b -> b_ncols + j;
X	}
X	w -> w_status |= WDUMP;
X	b -> b_nmodw = -1;
X	MajorUpdate = 1;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 inslines.c
	/bin/echo -n '	'; /bin/ls -ld inslines.c
fi
/bin/echo 'Extracting label.c'
sed 's/^X//' <<'//go.sysin dd *' >label.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Label a window */
XWlabel (w, label, bottom, center)
Xregister Win *w;
Xregister char *label;
Xint bottom, center;
X{
X	int		len, maxlen, mode;
X	register Ch	*cp;
X	register	pos;
X
X	/* Make sure there is room, by calling setmargins if necessary */
X	if (bottom == 0)
X	    if (w -> IYO == 0 && Wsetmargins (w, w->IXO, 1, w->IXE, w->IYE-1))
X		return -1;
X	    else
X		cp = w -> w_winbuf;
X	else
X	    if (w -> IYO + w -> IYE == w -> OYE &&
X			Wsetmargins (w, w->IXO, w->IYO, w->IXE, w->IYE-1))
X		return -1;/* No room at bottom */
X	    else
X		cp = w -> w_winbuf + (w -> OYE - 1) * w -> OXE;
X	{
X		register char *s = label;
X
X		while (*s++)	
X			;
X		len = s - label - 1;
X	}
X	maxlen = w -> OXE;
X	if (w -> w_status & WBORDERED) {
X		maxlen -= 2;
X		cp++;
X	}
X	if (len > maxlen)
X		len = maxlen;
X	mode = w -> w_mode ^ WINVERSE;
X	pos = 0;
X	if (center && len < maxlen) {
X		register i = (maxlen - len) >> 1;/* / 2 but faster */
X
X		pos += i;
X		while (--i >= 0) {
X			cp -> Mode &= WINVIS;
X			cp -> Mode |= mode;
X			cp++ -> Char = ' ';
X		}
X	}
X	pos += len;
X	while (--len >= 0) {
X		cp -> Mode &= WINVIS;
X		cp -> Mode |= mode;
X		cp++ -> Char = *label++;
X	}
X	while (pos < maxlen) {
X		cp -> Mode &= WINVIS;
X		cp -> Mode |= mode;
X		cp++ -> Char = ' ';
X		pos++;
X	}
X	w -> w_status |= WDUMP;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 label.c
	/bin/echo -n '	'; /bin/ls -ld label.c
fi
/bin/echo 'Extracting link.c'
sed 's/^X//' <<'//go.sysin dd *' >link.c
X#include "win.h"
X#include "display.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Make a "link" to another window (i.e. both have same buffer) */
XWin *
XWlink (ew, id, xorg, yorg, xext, yext, bcols, brows)
Xregister Win *ew;
Xint id, xorg, yorg, xext, yext, bcols, brows;
X{
X	register Win *w;
X	register Buf *b;
X	register Ch *c;
X
X	if (xorg < 0 || xext < 1 || xorg+xext > ScreenWidth)
X		return 0;
X	if (yorg < 0 || yext < 1 || yorg+yext > ScreenLength)
X		return 0;
X	if (brows < 0 || bcols < 0)
X		return 0;
X	if (brows < yext) brows = yext;
X	if (bcols < xext) bcols = xext;
X	w = (Win *) malloc (sizeof (Win));
X	if (w == 0)
X		return 0;
X	w -> w_winbuf = (Ch *) malloc (sizeof (Ch) * xext * yext);
X	if (w -> w_winbuf == 0) {
X		free (w);
X		return 0;
X	}
X	b = ew -> w_textbuf;
X	if (b -> b_nrows < brows || b -> b_ncols < bcols)
X		if (Wsetbuf (ew, brows, bcols)) {
X			free (w -> w_winbuf);
X			free (w);
X			return 0;
X		}
X	b -> b_nwins++;
X/*	if (b -> b_nmodw && b -> b_nmodw != -1)
X		b -> b_nmodw++;	/* Not needed: w -> w_status = WDUMP */
X	w -> w_next = WinList;
X	w -> w_id = id;
X	w -> w_outside.xorigin = xorg;
X	w -> w_outside.xextent = xext;
X	w -> w_outside.yorigin = yorg;
X	w -> w_outside.yextent = yext;
X	w -> w_inside.xorigin = 0;
X	w -> w_inside.xextent = xext;
X	w -> w_inside.yorigin = 0;
X	w -> w_inside.yextent = yext;
X	w -> w_textbuf = b;
X	w -> w_bstart.row = 0;
X	w -> w_bstart.col = 0;
X	w -> w_cursor.row = 0;
X	w -> w_cursor.col = 0;
X	w -> w_auxcursor.row = 0;
X	w -> w_auxcursor.col = 0;
X	w -> w_bcursor = b -> b_contents;
X	w -> w_wcursor = w -> w_winbuf;
X	w -> w_popup = 1;
X	w -> w_mode = 0;
X	w -> w_status = WDUMP;
X	for (c = w -> w_winbuf + xext * yext; c > w -> w_winbuf;)
X		(--c) -> ch_all = ' ' | (WBUF<<NBPB);
X	WinList = CurWin = w;
X	WComputeCover (w);
X	return w;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 link.c
	/bin/echo -n '	'; /bin/ls -ld link.c
fi
/bin/echo 'Extracting move.c'
sed 's/^X//' <<'//go.sysin dd *' >move.c
X#include "win.h"
X#include "display.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Move window w */
XWmove (w, xorg, yorg)
Xregister Win *w;
Xregister xorg, yorg;
X{
X	if (xorg < 0 || xorg + w -> OXE > ScreenWidth)
X		return -1;
X	if (yorg < 0 || yorg + w -> OYE > ScreenLength)
X		return -1;
X	if (w -> OXO == xorg && w -> OYO == yorg)
X		return 0;
X	if ((w -> w_status & WHIDDEN) == 0) {
X		WErase (w);		/* Erase visible portions */
X		WRemoveCoverList (w);	/* Uncover all other windows */
X	}
X	w -> w_outside.xorigin = xorg;
X	w -> w_outside.yorigin = yorg;
X	if ((w -> w_status & WHIDDEN) == 0) {
X		WComputeCover (w);	/* Recompute cover for new position */
X		w -> w_status |= WDUMP;
X		MajorUpdate = 1;	/* May be able to delete/insert lines */
X	}
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 move.c
	/bin/echo -n '	'; /bin/ls -ld move.c
fi
/bin/echo 'Extracting oncursor.c'
sed 's/^X//' <<'//go.sysin dd *' >oncursor.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Turn the cursor on or off */
XWoncursor (w, on)
Xregister Win *w;
Xint on;
X{
X	if ((w -> w_status & WCURSOR) == (on ? 0 : WCURSOR))
X		return 0;		/* Already set correctly */
X	w -> w_status ^= WCURSOR;
X	w -> w_status |= WDUMP;
X	return 0;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 oncursor.c
	/bin/echo -n '	'; /bin/ls -ld oncursor.c
fi
/bin/echo 'Extracting open.c'
sed 's/^X//' <<'//go.sysin dd *' >open.c
X#ifndef lint
Xstatic char sccsid[]=
X"@(#)Window Library 1.03\tU of Maryland (ACT) 1-Jul-1983 (Released)";
X#endif
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X#include "win.h"
X#include "display.h"
X
X/* Open a new window */
XWin *
XWopen (id, xorg, yorg, xext, yext, bcols, brows)
Xregister id;
Xint xorg, yorg, xext, yext, bcols, brows;
X{
X	register Win *w;
X	register Buf *b;
X	register Ch *c;
X
X	if (xorg < 0 || xext < 1 || xorg+xext > ScreenWidth)
X		return 0;
X	if (yorg < 0 || yext < 1 || yorg+yext > ScreenLength)
X		return 0;
X	if (brows < 0 || bcols < 0)
X		return 0;
X	if (brows < yext) brows = yext;
X	if (bcols < xext) bcols = xext;
X	w = (Win *) malloc (sizeof (Win));
X	if (w == 0)
X		return 0;
X	w -> w_winbuf = (Ch *) malloc (sizeof (Ch) * xext * yext);
X	if (w -> w_winbuf == 0) {
X		free (w);
X		return 0;
X	}
X	b = (Buf *) malloc (sizeof (Buf));
X	if (b == 0) {
X		free (w -> w_winbuf);
X		free (w);
X		return 0;
X	}
X	b -> b_contents = (Ch *) malloc (sizeof (Ch) * brows * bcols);
X	if (b -> b_contents == 0) {
X		free (b);
X		free (w -> w_winbuf);
X		free (w);
X		return 0;
X	}
X	b -> b_nrows = brows;
X	b -> b_ncols = bcols;
X	b -> b_nwins = 1;
X	b -> b_nmodw = 0;
X	b -> b_cursor.row = 0;
X	b -> b_cursor.col = 0;
X	w -> w_next = WinList;
X	w -> w_id = id;
X	w -> w_outside.xorigin = xorg;
X	w -> w_outside.xextent = xext;
X	w -> w_outside.yorigin = yorg;
X	w -> w_outside.yextent = yext;
X	w -> w_inside.xorigin = 0;
X	w -> w_inside.xextent = xext;
X	w -> w_inside.yorigin = 0;
X	w -> w_inside.yextent = yext;
X	w -> w_textbuf = b;
X	w -> w_bstart.row = 0;
X	w -> w_bstart.col = 0;
X	w -> w_cursor.row = 0;
X	w -> w_cursor.col = 0;
X	w -> w_auxcursor.row = 0;
X	w -> w_auxcursor.col = 0;
X	w -> w_bcursor = b -> b_contents;
X	w -> w_wcursor = w -> w_winbuf;
X	w -> w_popup = 1;
X	w -> w_mode = 0;
X	w -> w_status = WDUMP;
X	for (c = w -> w_winbuf + xext * yext; c > w -> w_winbuf;)
X		(--c) -> ch_all = ' ' | (WBUF<<NBPB);
X	for (c = b -> b_contents + brows * bcols; c > b -> b_contents;)
X		(--c) -> ch_all = ' ';
X	WinList = CurWin = w;
X	WComputeCover (w);
X	return w;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 open.c
	/bin/echo -n '	'; /bin/ls -ld open.c
fi
/bin/echo 'Extracting print.c'
sed 's/^X//' <<'//go.sysin dd *' >print.c
X#include "win.h"
X
X/* Copyright (c) 1983 University of Maryland Computer Science Department */
X
X/* Print C style string into window w */
X/* PRINTS TO w->w_textbuf */
XWputs (s, w)
Xregister char *s;
Xregister Win *w;
X{
X	while (*s)
X		Wputc (*s++, w);
X	return 0;
X}
X
X/* Put a char into window w. */
X/* CHAR c REALLY GOES INTO w->w_textbuf */
XWputc (c, w)
Xregister c;
Xregister Win *w;
X{
X	int orow = w -> w_cursor.row + w -> IYO,
X	    ocol = w -> w_cursor.col + w -> IXO;
X
X	switch (c &= 0x7f) {
X	case '\n':		/* Newline */
Xnl:
X		w -> w_cursor.row++;
X		if (w -> w_cursor.row >= w -> w_inside.yextent)
X			Wscroll (w);
X		else {
X			w -> w_bcursor += w -> w_textbuf -> b_ncols;
X			if (w -> w_popup == 0)
X				Wclearline (w, 2);
X		}
X		if (w -> w_status & WNEWLINE)
X			goto cr;
X		break;
X	case '\r':		/* Carriage return */
X		if (w -> w_status & WNEWLINE)
X			goto nl;
Xcr:
X		w -> w_bcursor -= w -> w_cursor.col;
X		w -> w_cursor.col = 0;
X		break;
X	case '\b':		/* Backspace */
X		if (w -> w_cursor.col) {
X			w -> w_cursor.col--;
X			w -> w_bcursor--;
X		}
X		break;
X	case '\t':		/* Tab */
X		c = (w -> w_cursor.col / 8 + 1) * 8;
X		if (c >= w -> w_inside.xextent)
X			c = w -> w_inside.xextent - 1;
X		w -> w_bcursor += c - w -> w_cursor.col;
X		w -> w_cursor.col = c;
X		break;
X	case '\7':		/* Bell */
X		Ding ();
X		return 0;
X	default:
X		if (c < 0x20 || c == 0x7f)/* Control char or DEL */
X			return 0;
X		w -> w_bcursor++ -> ch_all = c | (w -> w_mode << NBPB);
X		orow = w -> w_cursor.row + w -> IYO;
X		ocol = w -> w_cursor.col + w -> IXO;
X		w -> w_cursor.col++;
X		if (w -> w_cursor.col >= w -> w_inside.xextent)
X			if (w -> w_status & WWRAPOFF) {
X				w -> w_cursor.col--;
X				w -> w_bcursor--;
X			} else {
X				w -> w_cursor.col = 0;
X				w -> w_cursor.row++;
X				if (w -> w_cursor.row >= w -> IYE)
X					Wscroll (w);
X				else {
X					WFixCursor (w);
X					if (w -> w_popup == 0)
X						Wclearline (w, 2);
X				}
X			}
X		break;
X	}
X	if (c == 0 || w -> w_status & (WDUMP|WHIDDEN)
X			|| w -> w_textbuf -> b_nwins > 1) {
X		w -> w_status |= WDUMP;
X		w -> w_textbuf -> b_nmodw = -1;
X	}
X	else {
X		WDispPut (w, orow, ocol, 0);
X		WDispPut (w, w -> w_cursor.row + w -> IYO,
X			     w -> w_cursor.col + w -> IXO,
X			     w -> w_status & WCURSOR ? 0 : 1);
X	}
X	return 0;
X}
X
X/* Fix cursor pointers (w_bcursor, w_wcursor) */
XWFixCursor (w)
Xregister Win *w;
X{
X    register Buf *b = w -> w_textbuf;
X
X    w -> w_bcursor =
X	b -> b_contents +
X	(w -> w_cursor.row + w -> w_bstart.row + w -> IYO) * b -> b_ncols +
X	(w -> w_cursor.col + w -> w_bstart.col + w -> IXO);
X    w -> w_wcursor =
X	w -> w_winbuf + w -> w_auxcursor.row * w -> OXE +
X	w -> w_auxcursor.col;
X}
//go.sysin dd *
made=TRUE
if [ $made = TRUE ]; then
	/bin/chmod 644 print.c
	/bin/echo -n '	'; /bin/ls -ld print.c
fi
-- 
UUCP:	{seismo,allegra,brl-bmd}!umcp-cs!chris
CSNet:	chris@umcp-cs
ARPA:	chris.umcp-cs@UDel-Relay