Window source #5 [of 0-7]: misc source
chris at umcp-cs.UUCP
chris at umcp-cs.UUCP
Sun Jul 3 17:17:37 AEST 1983
: 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 at umcp-cs
ARPA: chris.umcp-cs at UDel-Relay
More information about the Comp.sources.unix
mailing list