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