chris@umcp-cs.UUCP (07/01/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 Makefile' sed 's/^X//' <<'//go.sysin dd *' >Makefile XDOBJS= display.o TrmAmb.o TrmBitG.o TrmTEK4025.o TrmTERM.o TrmVT100.o init.o XDSRCS= display.c TrmAmb.c TrmBitG.c TrmTEK4025.c TrmTERM.c TrmVT100.c init.c XWOBJS= acursor.o aprint.o aread.o auxcursor.o\ X back.o bclear.o bclearline.o bcopy.o\ X bcursor.o bdelchars.o bdelcols.o bdellines.o binschars.o binscols.o\ X binslines.o border.o box.o boxfind.o bprint.o bread.o bscroll.o\ X btowcursor.o cleanup.o clear.o clearline.o close.o closeall.o\ X cover.o delchars.o delcols.o dellines.o disp.o filedump.o find.o\ X frame.o front.o getframe.o globals.o hide.o inschars.o inscols.o\ X inslines.o label.o link.o move.o oncursor.o open.o print.o read.o\ X retro.o scroll.o setbuf.o setframe.o setmargins.o size.o suspend.o\ X wcursor.o wexit.o XWSRCS= acursor.c aprint.c aread.c auxcursor.c\ X back.c bclear.c bclearline.c bcopy.c\ X bcursor.c bdelchars.c bdelcols.c bdellines.c binschars.c binscols.c\ X binslines.c border.c box.c boxfind.c bprint.c bread.c bscroll.c\ X btowcursor.c cleanup.c clear.c clearline.c close.c closeall.c\ X cover.c delchars.c delcols.c dellines.c disp.c filedump.c find.c\ X frame.c front.c getframe.c globals.c hide.c inschars.c inscols.c\ X inslines.c label.c link.c move.c oncursor.c open.c print.c read.c\ X retro.c scroll.c setbuf.c setframe.c setmargins.c size.c suspend.c\ X wcursor.c wexit.c XJOBSOBJS= XLIBDIR=/usr/lib XINCLUDEDIR=/usr/include/local X X# To make winlib.a, type ``make winlib.a''. If you're on a Vax, X# everything should compile. If you're on a 68000, you'll need to X# edit win.h to reverse the two character elements of union chr. X# (If you don't, everything will (probably) compile, but not run.) X# X# To install winlib.a, after it has been made, type ``make install''. X# You probably need special priveleges for this, depending on what X# your system administrators have set up. X# X# Note 1: if your system does not have ``ranlib'', you can change the X# ``ar cr winlib.a ...'' line to read: X# ar cr winlib.a `cat TSORT` X# and comment out the ranlib line. X# X# Note 2: if your system does not have the jobs library, you can add X# the file "jobs.o" to the JOBSOBJS= line so that it reads X# JOBSOBJS=jobs.o X# and add 'jobs.o' to the end of the TSORT file. A better(?) alternative X# is to use jobs.c to make a ``jobs library''. X X# Take out the -DVAX if you're not on a Vax. X XCFLAGS= -O -R -DVAX X Xwinlib.a: $(DOBJS) $(WOBJS) $(JOBSOBJS) X ar cr winlib.a $(DOBJS) $(WOBJS) $(JOBSOBJS) X ranlib winlib.a X X# Once winlib has been made, it can be updated incrementally by X# deleting the "incremental-" from the front of this next name, X# commenting out the first entry, and removing the # from the X# second line of the .c.o entry. This will only work for people X# who have ranlib. X Xincremental-winlib.a: $(DOBJS) $(WOBJS) $(JOBSOBJS) X ranlib winlib.a X Xdepend: X mkdep -n $(DSRCS) $(WSRCS) X X.c.o: X cc $(CFLAGS) -c $< X# ar r winlib.a $@ X XTrmAmb.o: TrmAmb.c Trm.h XTrmBitG.o: TrmBitG.c Trm.h XTrmTEK4025.o: TrmTEK4025.c Trm.h XTrmTERM.o: TrmTERM.c Trm.h win.h XTrmVT100.o: TrmVT100.c Trm.h Xdisplay.o: display.c Trm.h win.h Xinit.o: init.c display.h win.h Trm.h X Xacursor.o: acursor.c win.h Xaread.o: aread.c win.h Xauxcursor.o: auxcursor.c win.h Xbclear.o: bclear.c win.h Xbclearline.o: bclearline.c win.h Xbcursor.o: bcursor.c win.h Xbdelchars.o: bdelchars.c win.h Xbdelcols.o: bdelcols.c win.h Xbdellines.o: bdellines.c win.h Xbinschars.o: binschars.c win.h Xbinscols.o: binscols.c win.h Xbinslines.o: binslines.c win.h Xborder.o: border.c win.h Xbox.o: box.c win.h display.h Trm.h Xboxfind.o: boxfind.c win.h Xbread.o: bread.c win.h Xbscroll.o: bscroll.c win.h Xbtowcursor.o: btowcursor.c win.h Xcleanup.o: cleanup.c win.h display.h Trm.h Xclear.o: clear.c win.h Xclearline.o: clearline.c win.h Xclose.o: close.c win.h Xcloseall.o: closeall.c win.h Xcover.o: cover.c win.h Xcursor.o: cursor.c win.h Xdelchars.o: delchars.c win.h Xdelcols.o: delcols.c win.h Xdellines.o: dellines.c win.h Xdisp.o: disp.c win.h display.h Trm.h Xfiledump.o: filedump.c win.h display.h Trm.h Xfind.o: find.c win.h Xframe.o: frame.c win.h Trm.h Xfront.o: front.c win.h Xgetframe.o: getframe.c Trm.h win.h Xglobals.o: globals.c win.h Xhide.o: hide.c win.h Xinschars.o: inschars.c win.h Xinscols.o: inscols.c win.h Xinslines.o: inslines.c win.h Xlabel.o: label.c win.h Xlink.o: link.c win.h display.h Trm.h Xmove.o: move.c win.h display.h Trm.h Xoncursor.o: oncursor.c win.h Xopen.o: open.c win.h display.h Trm.h Xprint.o: print.c win.h Xread.o: read.c win.h Xretro.o: retro.c win.h Xscroll.o: scroll.c win.h Xsetbuf.o: setbuf.c win.h Xsetframe.o: setframe.c Trm.h win.h Xsetmargins.o: setmargins.c win.h Xsize.o: size.c win.h display.h Trm.h Xsuspend.o: suspend.c win.h Xwcursor.o: wcursor.c win.h X Xinstall: X cp winlib.a $(LIBDIR)/libwinlib.a X cp win.h window.h $(INCLUDEDIR) X ranlib $(LIBDIR)/libwinlib.a X# uucp -c winlib.a cvl!~uucp/winlib.a X# uucp -c win.h cvl!~uucp/win.h X# uucp -c window.h cvl!~uucp/window.h X# mail -s 'new version of winlib in ~uucp' cvl!staff </dev/null X Xlint: X lint $(DSRCS) $(WSRCS) X Xprint: X llist -t Windows $(DSRCS) $(WSRCS) X Xprint8: X llist -8 -t Windows $(DSRCS) $(WSRCS) //go.sysin dd * made=TRUE if [ $made = TRUE ]; then /bin/chmod 644 Makefile /bin/echo -n ' '; /bin/ls -ld Makefile fi /bin/echo 'Extracting README' sed 's/^X//' <<'//go.sysin dd *' >README XLook at the Makefile for installation instructions. Everything is Xset up for a Vax running Berkeley Unix. If you're running Berkeley XUnix, you should only need to ``make winlib.a'' followed by a ``make Xinstall''. X XIf you're not on a Vax, several changes are in order. First, take Xout the -DVAX flag in the Makefile. Second, find out whether the Xdefinition of union chr in win.h must be changed. For a 68000, Xthe two char elements should be reversed. Third, you'll probably Xget a name conflict on WBclear and WBclearline, and on setmode and Xsetmodes in TrmTERM.c. For the first, add the following line to Xwin.h: X X#define WBclearline WBclrln X XFor the second, add the following line to the top of TrmTERM.c: X X#define setmodes smodes X XFourth, you may get an error in init.c (something like "Undefined: X_IOLBF"). If so, change the appropriate line to remove the "_IOLBF|" Xfrom it. X XFinally, you may not have ranlib. See the Makefile for an alternative. X XThe above changes were sufficient to make winlib run on a Sun XMicrosystems workstation and on a Codata CTW-300. (Both are 68000 Xbased.) X XFor greater speed, you may want to try rewriting the CopyLine Xroutine in assembly code. I found rewriting bcopy in assembly and Xchanging CopyLine sufficient on the Sun: X X/***** CopyLine *****/ Xhidden procedure CopyLine (from, to) Xregister struct line *from, *to; X{ X to -> touched = 0; X to -> length = from -> length; X bcopy (from -> body, to -> body, sizeof (Ch) * from -> length); X} X X/***** bcopy.s *****/ X .text Xn = -12 | 4 * (number of saved regs + number of local vars) Xsv = 0x3080 | save: a5/a4/d7 X X .globl _bcopy X_bcopy: X link a6,#-n X moveml #sv,a6@(n) X movl a6@(16),d7 | get # bytes X beq rtn | done if none X movl a6@(8),a5 | get from address X movl a6@(12),a4 | get to address X btst #0,a6@(8) | is from address on an even word boundary? X bne hard | no: do hard way X btst #0,a6@(12) | is to address on an even word boundary? X bne hard | no: do hard way X asrl #1,d7 | yes: divide count by 2 Xwd: movw a5@+,a4@+ | move one word X dbra d7,wd | --d7 and branch if nonzero X Xrtn: moveml a6@(n),#sv X unlk a6 X rts X Xhard: movb a5@+,a4@+ | move one byte X dbra d7,hard | --d7 and branch if nonzero X bra rtn //go.sysin dd * made=TRUE if [ $made = TRUE ]; then /bin/chmod 644 README /bin/echo -n ' '; /bin/ls -ld README fi /bin/echo 'Extracting WISHLIST' sed 's/^X//' <<'//go.sysin dd *' >WISHLIST XIf there was only a way to keep the tty driver from flushing output Xwhen you hit DEL... X XHP264? terminals standout just DOESN'T WORK.... X XThe generic terminal handler needs to be completely rewritten. It's Xa big CPU hog, and it's just plain ineffecient. It DOES, however, WORK X(for the most part). X XIt'd be nice not to have to copy lines in the two screens in display.c. //go.sysin dd * made=TRUE if [ $made = TRUE ]; then /bin/chmod 644 WISHLIST /bin/echo -n ' '; /bin/ls -ld WISHLIST fi /bin/echo 'Extracting TSORT' sed 's/^X//' <<'//go.sysin dd *' >TSORT Xacursor.o aprint.o aread.o auxcursor.o back.o bclear.o bclearline.o Xbcursor.o bdelchars.o bdelcols.o bdellines.o binschars.o binscols.o Xbinslines.o box.o boxfind.o bprint.o bread.o bscroll.o btowcursor.o Xclear.o closeall.o close.o delchars.o delcols.o dellines.o filedump.o Xfind.o frame.o border.o front.o getframe.o hide.o inschars.o Xinscols.o inslines.o label.o link.o move.o oncursor.o open.o read.o Xretro.o setframe.o size.o cover.o setbuf.o setmargins.o wcursor.o Xinit.o suspend.o wexit.o cleanup.o print.o disp.o scroll.o clearline.o Xdisplay.o TrmAmb.o TrmBitG.o TrmTEK4025.o TrmTERM.o TrmVT100.o Xbcopy.o globals.o //go.sysin dd * made=TRUE if [ $made = TRUE ]; then /bin/chmod 644 TSORT /bin/echo -n ' '; /bin/ls -ld TSORT fi /bin/echo 'Extracting jobs.c' sed 's/^X//' <<'//go.sysin dd *' >jobs.c X#include <signal.h> X X/* Copyright (c) 1983 University of Maryland Computer Science Department */ X X/* X * Jobs library emulator using old signal mechanism X * X * 26 March 1983 ACT X * X * held_sigs == the signals held via sighold() X * executing_sigs == the signals held because the signal handler is already X * running X * pending_sigs == the signals pending, for sigrelse() or whatever X */ X Xstatic long held_sigs, pending_sigs, executing_sigs; Xstatic int (*sigfuncs[32])(); Xint sigcatch(); X Xint (*sigset (signo, f))() Xregister signo; Xint (*f)(); X{ X int (*rv)() = sigfuncs[signo]; X X if (f == SIG_DFL || f == SIG_IGN) { /* these are just zap-em-ins */ X sigfuncs[signo] = f; X signal (signo, f); X pending_sigs &= ~(1<<signo); X return rv; X } X sigfuncs[signo] = f; X signal (signo, sigcatch); /* sigcatch() does the real work */ X return rv; X} X Xint (*sigignore (signo))() Xint signo; X{ X sigset (signo, SIG_IGN); X} X X/* This is easy too ... */ Xsighold (signo) Xint signo; X{ X held_sigs |= 1 << signo; X} X Xsigrelse (signo) Xint signo; X{ X register sigbit = 1 << signo; X X held_sigs &= ~sigbit; X if (pending_sigs & sigbit) X sigcatch (signo); /* sigcatch() does the real work */ X} X X/* RACE CONDITIONS ABOUND! */ X/* This code assumes that if a second signal occurs it will be during X the user's function. That isn't quite true, but... that's the way X it goes. */ Xstatic Xsigcatch (signo) Xregister signo; X{ X register sigbit; X X signal (signo, sigcatch); X sigbit = 1 << signo; Xresig: X /* If it's already executing, or if the user asked to hold it, X then don't call the function yet. */ X if ((executing_sigs|held_sigs) & sigbit) { X pending_sigs |= sigbit; X return; X } X pending_sigs &= ~sigbit; /* Clear pending signals */ X executing_sigs |= sigbit; /* Say this one is executing */ X (*sigfuncs[signo]) (signo); /* Call user function */ X executing_sigs &= ~sigbit; /* Not executing anymore */ X if (pending_sigs & sigbit) X goto resig; X} //go.sysin dd * made=TRUE if [ $made = TRUE ]; then /bin/chmod 644 jobs.c /bin/echo -n ' '; /bin/ls -ld jobs.c fi /bin/echo 'Extracting Trm.h' sed 's/^X//' <<'//go.sysin dd *' >Trm.h X/* Copyright (c) 1983 University of Maryland Computer Science Department */ X/* terminal control module header file */ X X/* Original code copyright (c) 1981,1980 James Gosling */ X X/* ACT 10-Nov-1982 Modified for Window Package */ X Xstruct TrmControl { X int (*t_topos) (); /* move the cursor to the indicated X (row,column); (1,1) is the upper left */ X int (*t_reset) (); /* reset terminal (screen is in unkown state, X convert it to a known one) */ X int (*t_INSmode) (); /* set or reset character insert mode */ X int (*t_modes) (); /* (re)set highlight, blink, bold, underln */ X int (*t_inslines) (); /* insert n lines */ X int (*t_dellines) (); /* delete n lines */ X int (*t_blanks) (); /* print n blanks */ X int (*t_init) (); /* initialize terminal settings */ X int (*t_cleanup) (); /* clean up terminal settings */ X int (*t_wipeline) (); /* erase to the end of the line */ X int (*t_wipescreen) (); /* erase the entire screen */ X int (*t_delchars) (); /* delete n characters */ X int (*t_writechars) (); /* write characters; either inserting or X overwriting according to the current X character insert mode. */ X int (*t_window) (); /* set the screen window so that IDline X operations only affect the first n X lines of the screen */ X int (*t_flash) (); /* Flash the screen -- not set if this X terminal type won't support it. */ X/* This is a hack for VT100s with cute graphics chars */ X int (*t_donerefresh) ();/* A Wrefresh() is done. Not set if not X needed. */ X/* costs are expressed as number_affected*mf + ov X cost to insert/delete 1 line: (number of lines left)*ILmf+ILov X cost to insert one character: (number of chars left on line)*ICmf+ICov X cost to delete n characters: n*DCmf+DCov */ X float t_ILmf; /* insert lines multiply factor */ X int t_ILov; /* insert lines overhead */ X float t_ICmf; /* insert character multiply factor */ X int t_ICov; /* insert character overhead */ X float t_DCmf; /* delete character multiply factor */ X int t_DCov; /* delete character overhead */ X int t_length; /* screen length */ X int t_width; /* screen width */ X int t_needspaces; /* set true iff the terminal needs to have X real spaces in the middle of lines in X order to have character insertion work -- X this only matters on terminals that X distinguish between real and imaginary X blanks. */ X char t_padc; /* Pad character (default ^@) */ X char t_frames[8]; /* Window frame chars (default +-+||+-+) */ X}; X X#define MissingFeature 99999 /* IC and IL overheads should be set to this X value if the corresponding feature is X missing */ Xstruct TrmControl W_tt; /* terminal specific information for the X current display */ X Xint InverseVideo, /* Use inverse video if terminal supports it */ X NoOperation (); /* Global no-op function */ //go.sysin dd * made=TRUE if [ $made = TRUE ]; then /bin/chmod 644 Trm.h /bin/echo -n ' '; /bin/ls -ld Trm.h fi /bin/echo 'Extracting display.h' sed 's/^X//' <<'//go.sysin dd *' >display.h X/* Copyright (c) 1983 University of Maryland Computer Science Department */ X X/* Ultra-hot screen management package X * James Gosling, January 1980 X * ACT 11-Nov-1982 modified for window package X */ X X#include "Trm.h" X X#define ScreenLength (W_tt.t_length) X#define ScreenWidth (W_tt.t_width) X Xint ScreenGarbaged, /* true => screen content is uncertain. */ X WDCurrentLine, /* current line for writing to the virtual X * screen. */ X#ifdef DEBUG X IDdebug, /* line insertion/deletion debug switch */ X RDdebug, /* line redraw debug switch */ X#endif DEBUG X WDleft; /* number of columns left on the current X * line of the virtual screen. */ XCh X *WDcursor; /* pointer into a line object, indicates X * where to put the next character */ X X/* 'dsputc' places a character at the current position on the display, X * the character must be a simple one, taking up EXACTLY one position on X * the screen. ie. tabs and \n's shouldn't be passed to dsputc. */ X#define dsputc(c,m) (WDleft--,\ X WDcursor++ -> ch_all = (((m)&MODEMASK)<<NBPB) | ((c)&0377)) X X/* 'dspxor' exclusive-or's a mode at the current postion on the display */ X#define dspxor(m) (WDleft--, WDcursor++ -> Mode ^= m) X X/* 'dspskip' skips over n characters on the display */ X#define dspskip(n) (WDleft -= (n), WDcursor += (n)) X X/* 'setpos' positions the cursor at position (row,col) in the virtual X * screen Xsetpos(row,col); X X/* 'WDUpdateScreen' updates the physical screen, assuming that it looks X * like the 'CurrentScreen', making it look like the 'DesiredScreen'. X * If 'hard' is true then the difficult line I/D algorithm will be used; X * otherwise no line I/D will be performed. XWDUpdateScreen(hard); X X */ //go.sysin dd * made=TRUE if [ $made = TRUE ]; then /bin/chmod 644 display.h /bin/echo -n ' '; /bin/ls -ld display.h fi /bin/echo 'Extracting win.h' sed 's/^X//' <<'//go.sysin dd *' >win.h X/* Copyright (c) 1983 University of Maryland Computer Science Department */ X X#define NBPB 8 /* Number of bits per byte */ X Xunion chr { X struct { X char ch; /* NOTE: this is known to be low byte */ X char mode; X } ch_two; X short ch_all; X}; X X/* ch_all is set to ' ' or (' '|(WBUF<<NBPB)) so Char must be low byte, and X Mode must be high byte. */ X X#define Char ch_two.ch X#define Mode ch_two.mode X Xtypedef struct { X int row, col; X} Pos; X Xtypedef struct { X int xorigin, yorigin; X int xextent, yextent; X} Rect; X Xstruct coverlist { X struct coverlist *c_next; X struct window *c_top, /* Window on top */ X *c_bot; /* Window on bottom */ X Rect c_area; /* Area of intersection */ X}; X Xtypedef union chr Ch; X Xstruct buffer { X Ch *b_contents; X int b_nwins; /* Number of windows using this buffer */ X int b_nrows, /* Number of rows of text */ X b_ncols; /* Number of cols */ X Pos b_cursor; /* Buffer cursor (WBputc ()) */ X int b_nmodw; /* If zero buffer not modified [see disp.c] */ X}; X Xtypedef struct coverlist Cov; Xtypedef struct buffer Buf; Xtypedef struct window Win; X Xstruct window { X Win *w_next; /* Next window in list */ X int w_id; /* Window ID */ X Rect w_outside; /* Describes whole window */ X Rect w_inside; /* Describes inner part of window */ X Buf *w_textbuf; /* Pointer to buffer containing text */ X Ch *w_winbuf; /* Pointer to window chars */ X Pos w_bstart; /* Coordinates of win projection on w_buf */ X Pos w_cursor; /* Coordinates of cursor */ X Pos w_auxcursor; /* Coordinates of aux cursor */ X Ch *w_bcursor; /* Cursor ptr into text [w_textbuf] */ X Ch *w_wcursor; /* Cursor ptr into window [w_auxcursor] */ X int w_popup; /* Number of lines to scroll */ X char w_mode; /* Current text-writing mode */ X char w_status; /* Status bits */ X}; X X#define OXO w_outside.xorigin X#define OXE w_outside.xextent X#define OYO w_outside.yorigin X#define OYE w_outside.yextent X X#define IXO w_inside.xorigin X#define IXE w_inside.xextent X#define IYO w_inside.yorigin X#define IYE w_inside.yextent X X/* Mode bits (w_mode, ch_two.mode) */ X#define WBOLD 0x01 /* Bold */ X#define WULINE 0x02 /* Underlined */ X#define WBLINK 0x04 /* Blinking */ X#define WINVERSE 0x08 /* Inverse video */ X#define MODEMASK (WBOLD|WULINE|WBLINK|WINVERSE) /* [all chars] */ X#define WINVIS 0x10 /* Invisible [windows only] */ X#define WBUF 0x20 /* From buffer [windows only] */ X X/* Status bits (w_status) */ X#define WWRAPOFF 0x01 /* Auto-wrap is off */ X#define WHIDDEN 0x02 /* Window is hidden */ X#define WNEWLINE 0x04 /* \r, \n act like \r\n */ X#define WCURSOR 0x08 /* Cursor is hidden */ X#define WDUMP 0x10 /* Window contents need dumping to screen */ X#define WCOVERED 0x20 /* Window is covered */ X#define WCOVERING 0x40 /* Window is covering others */ X#define WBORDERED 0x80 /* Window has been bordered (framed) */ X Xextern Win *WinList; /* Base of window list */ Xextern Win *CurWin; /* Current window */ Xextern Cov *WCovList; /* Base of coverings list */ Xextern Rect WBox; /* Information on the (single) box */ Xextern int MajorUpdate; /* True iff maximum optimization wanted */ Xextern int SigMagic; /* True iff sigset() magic is wanted */ Xextern int InputPending; /* True iff keyboard input is pending */ Xextern int LastRedisplayPaused; /* True iff last redisplay paused */ Xextern int ScreenGarbaged; /* True iff screen contents uncertain */ Xextern int WBoxActive; /* True iff box is active */ Xextern int WSetRealCursor; /* True iff want terminal cursor positioning */ Xextern int WRCurRow; /* Set real cursor to this row, */ Xextern int WRCurCol; /* ... this col [both 0 origin] */ Xextern int VisibleBell; /* True iff want ^G to flash */ Xextern int WindowsActive; /* Set while windows (stty settings) active */ X X#define Max(a,b) ((a)>(b)?(a):(b)) X#define Min(a,b) ((a)<(b)?(a):(b)) //go.sysin dd * made=TRUE if [ $made = TRUE ]; then /bin/chmod 644 win.h /bin/echo -n ' '; /bin/ls -ld win.h fi /bin/echo 'Extracting window.h' sed 's/^X//' <<'//go.sysin dd *' >window.h X/* Copyright (c) 1983 University of Maryland Computer Science Department */ X X#include "win.h" X X#define Wwrap(w,on) ((w)->w_status &= ~WWRAPOFF, \ X (w)->w_status |= (on)?0:WWRAPOFF, 0) X#define Wnewline(w,on) ((w)->w_status &= ~WNEWLINE, \ X (w)->w_status |= (on)?WNEWLINE:0, 0) X#define Wsetmode(w,m) ((w)->w_mode &= ~MODEMASK, \ X (w)->w_mode |= (m) & MODEMASK, 0) X#define Wsetpopup(w,p) ((w)->w_popup = (p), 0) X#define Wcurup(w,n) (WAcursor (w, \ X (w)->w_cursor.row+(w)->w_bstart.row-(n),\ X (w)->w_cursor.col+(w)->w_bstart.col)) X#define Wcurdown(w,n) (WAcursor (w, \ X (w)->w_cursor.row+(w)->w_bstart.row+(n),\ X (w)->w_cursor.col+(w)->w_bstart.col)) X#define Wcurleft(w,n) (WAcursor (w, \ X (w)->w_cursor.row+(w)->w_bstart.row,\ X (w)->w_cursor.col+(w)->w_bstart.col-(n))) X#define Wcurright(w,n) (WAcursor (w, \ X (w)->w_cursor.row+(w)->w_bstart.row,\ X (w)->w_cursor.col+(w)->w_bstart.col+(n))) X#define WWtoBcursor(w) (WAcursor (w, \ X (w)->w_textbuf->b_cursor.row, \ X (w)->w_textbuf->b_cursor.col)) X X/* NOTE: THESE MACROS MAY BE SYSTEM DEPENDENT */ X#define WCHAROF(c) ((c)&0377) X#define WMODEOF(c) ((c)>>NBPB) X X/* Function types for non-integer functions */ XWin *Wopen (), *Wlink (), *Wfind (), *Wboxfind (); //go.sysin dd * made=TRUE if [ $made = TRUE ]; then /bin/chmod 644 window.h /bin/echo -n ' '; /bin/ls -ld window.h fi -- UUCP: {seismo,allegra,brl-bmd}!umcp-cs!chris CSNet: chris@umcp-cs ARPA: chris.umcp-cs@UDel-Relay