bl@infovax.UUCP (Bj|rn Larsson) (08/27/87)
# This is a shar archive. # Remove everything above this line. # Run the file through sh, not csh. # (type `sh pccurses.sh.1') echo extracting - Makefile sed 's/^X//' > Makefile << 'FRIDAY_NIGHT' X################################################################# X# PCCURSES # X# Makefile to generate scurses.lib, ccurses.lib, mcurses.lib, # X# lcurses.lib for MicroSoft 'C'. Use MicroSoft 'C' v.4.0! # X# # X# This makefile will generate subdirectories and call itself # X# recursively... # X################################################################# X# 1.0: Release: 870515 # X################################################################# X X# The following are the directories where your lib and include files X# will be installed X XLIBDIR= \msc\lib XINCDIR= \msc\inc X X# General definitions: X XCOBJS= attrib.obj beep.obj boxes.obj charadd.obj \ X chardel.obj charget.obj charins.obj charpick.obj \ X clrtobot.obj clrtoeol.obj endwin.obj initscr.obj \ X linedel.obj lineins.obj longname.obj move.obj \ X mvcursor.obj newwin.obj options.obj overlay.obj \ X prntscan.obj refresh.obj scrreg.obj setterm.obj \ X stradd.obj strget.obj termmisc.obj tabsize.obj \ X unctrl.obj update.obj winclear.obj windel.obj \ X winerase.obj winmove.obj winscrol.obj wintouch.obj X XASMOBJS= cursesio.obj X XOBJS= $(COBJS) $(ASMOBJS) X X################################################################# X# 'all' is all that can (and usually is) done # X################################################################# X Xall: small compact medium large X X################################################################# X# The following copies the header files to their proper place # X################################################################# X Xheaders: $(INCDIR)\curses.h $(INCDIR)\curspriv.h X X$(INCDIR)\curses.h: curses.h X copy curses.h $(INCDIR)\curses.h X X$(INCDIR)\curspriv.h: curspriv.h X copy curspriv.h $(INCDIR)\curspriv.h X X################################################################# X# The following will create a subdirectory for each memory # X# model, and initiate the make:ing in each one. # X################################################################# X X################################################################# X# create work directory if non-existent, go to it, and # X# perform the job - small model # X################################################################# X Xsmall: headers \ X smodel \ X smodel\farnear.inc \ X smodel\smalhuge.inc X cd smodel X -make -f ..\makefile $(MAKEFLAGS) "MODEL=s" $(LIBDIR)\scurses.lib X cd .. X Xsmodel: X mkdir smodel X Xsmodel\farnear.inc: nearcall.inc X copy nearcall.inc smodel\farnear.inc X Xsmodel\smalhuge.inc: smaldata.inc X copy smaldata.inc smodel\smalhuge.inc X X################################################################# X# create work directory if non-existent, go to it, and # X# perform the job - compact model # X################################################################# X Xcompact: headers \ X cmodel \ X cmodel\farnear.inc \ X cmodel\smalhuge.inc X cd cmodel X -make -f ..\makefile $(MAKEFLAGS) "MODEL=c" $(LIBDIR)\ccurses.lib X cd .. X Xcmodel: X mkdir cmodel X Xcmodel\farnear.inc: nearcall.inc X copy nearcall.inc cmodel\farnear.inc X Xcmodel\smalhuge.inc: hugedata.inc X copy hugedata.inc cmodel\smalhuge.inc X X################################################################# X# create work directory if non-existent, go to it, and # X# perform the job - medium model # X################################################################# X Xmedium: headers \ X mmodel \ X mmodel\farnear.inc \ X mmodel\smalhuge.inc X cd mmodel X -make -f ..\makefile $(MAKEFLAGS) "MODEL=m" $(LIBDIR)\mcurses.lib X cd .. X Xmmodel: X mkdir mmodel X Xmmodel\farnear.inc: farcall.inc X copy farcall.inc mmodel\farnear.inc X Xmmodel\smalhuge.inc: smaldata.inc X copy smaldata.inc mmodel\smalhuge.inc X X################################################################# X# create work directory if non-existent, go to it, and # X# perform the job - large model # X################################################################# X Xlarge: headers \ X lmodel \ X lmodel\farnear.inc \ X lmodel\smalhuge.inc X cd lmodel X -make -f ..\makefile $(MAKEFLAGS) "MODEL=l" $(LIBDIR)\lcurses.lib X cd .. X Xlmodel: X mkdir lmodel X Xlmodel\farnear.inc: farcall.inc X copy farcall.inc lmodel\farnear.inc X Xlmodel\smalhuge.inc: hugedata.inc X copy hugedata.inc lmodel\smalhuge.inc X X################################################################# X# Put together the library in file tmp.lib, then copy it to # X# the appropriate name for the memory model in question, and # X# delete the temporary file # X################################################################# X X$(LIBDIR)\$(MODEL)curses.lib: $(OBJS) X del tmp.lib X lib @..\curses.cmd X copy tmp.lib $(LIBDIR)\$(MODEL)curses.lib X del tmp.lib X X################################################################# X# commands and dependencies for individual modules # X################################################################# X Xattrib.obj: ..\attrib.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Foattrib ..\attrib.c X Xbeep.obj: ..\beep.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fobeep ..\beep.c X Xboxes.obj: ..\boxes.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Foboxes ..\boxes.c X Xcharadd.obj: ..\charadd.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Focharadd ..\charadd.c X Xchardel.obj: ..\chardel.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fochardel ..\chardel.c X Xcharget.obj: ..\charget.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Focharget ..\charget.c X Xcharins.obj: ..\charins.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Focharins ..\charins.c X Xcharpick.obj: ..\charpick.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Focharpick ..\charpick.c X Xclrtobot.obj: ..\clrtobot.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Foclrtobot ..\clrtobot.c X Xclrtoeol.obj: ..\clrtoeol.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Foclrtoeol ..\clrtoeol.c X Xendwin.obj: ..\endwin.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Foendwin ..\endwin.c X Xinitscr.obj: ..\initscr.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Foinitscr ..\initscr.c X Xlinedel.obj: ..\linedel.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Folinedel ..\linedel.c X Xlineins.obj: ..\lineins.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Folineins ..\lineins.c X Xlongname.obj: ..\longname.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Folongname ..\longname.c X Xmove.obj: ..\move.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fomove ..\move.c X Xmvcursor.obj: ..\mvcursor.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fomvcursor ..\mvcursor.c X Xnewwin.obj: ..\newwin.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fonewwin ..\newwin.c X Xoptions.obj: ..\options.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fooptions ..\options.c X Xoverlay.obj: ..\overlay.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fooverlay ..\overlay.c X Xprntscan.obj: ..\prntscan.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Oat -Foprntscan ..\prntscan.c X Xrefresh.obj: ..\refresh.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Forefresh ..\refresh.c X Xscrreg.obj: ..\scrreg.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Foscrreg ..\scrreg.c X Xsetterm.obj: ..\setterm.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fosetterm ..\setterm.c X Xstradd.obj: ..\stradd.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fostradd ..\stradd.c X Xstrget.obj: ..\strget.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fostrget ..\strget.c X Xtabsize.obj: ..\tabsize.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fotabsize ..\tabsize.c X Xtermmisc.obj: ..\termmisc.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fotermmisc ..\termmisc.c X Xunctrl.obj: ..\unctrl.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Founctrl ..\unctrl.c X Xupdate.obj: ..\update.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Foupdate ..\update.c X Xwinclear.obj: ..\winclear.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fowinclear ..\winclear.c X Xwindel.obj: ..\windel.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fowindel ..\windel.c X Xwinerase.obj: ..\winerase.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fowinerase ..\winerase.c X Xwinmove.obj: ..\winmove.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fowinmove ..\winmove.c X Xwinscrol.obj: ..\winscrol.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fowinscrol ..\winscrol.c X Xwintouch.obj: ..\wintouch.c ..\curses.h ..\curspriv.h X cl -M$(MODEL) -c -Ox -Fowintouch ..\wintouch.c X Xcursesio.obj: ..\cursesio.asm X masm ..\cursesio.asm/mx,cursesio.obj,nul,nul; X X################################################################# X# Perform a backup of the files in the directory where the # X# 'make backup' command was issued - copies all files to the # X# directory \pccurses on the A: floppy # X################################################################# X Xbackup: X @echo ***** backup of curses ***** X @echo Insert backup diskette in drive A: and hit any key! X @pause X mkdir a:\pccurses X del a:\pccurses\*.* X copy *.* a:\pccurses X X################################################################# X# Remove all temporary files and work directories that were # X# created # X################################################################# X Xclean: X del smodel\*.* X del cmodel\*.* X del mmodel\*.* X del lmodel\*.* X rmdir smodel X rmdir cmodel X rmdir mmodel X rmdir lmodel FRIDAY_NIGHT echo extracting - README.NOW sed 's/^X//' > README.NOW << 'FRIDAY_NIGHT' X PCCURSES v.1.0 Release Notes - 870824 X =================================================== X X X X This is the release notes for the PCcurses v.1.0 cursor/window control Xpackage. PCcurses offers the functionality of UNIX curses, plus some Xextras. Normally it should be possible to port curses-based programs from XUNIX curses to PCcurses on the IBM PC without changes. PCcurses is a port/ Xrewrite of Pavel Curtis' public domain 'ncurses' package. All the code has Xbeen re-written - it is not just an edit of ncurses (or UNIX curses). I Xmention this to clarify any copyright violation claims. The data struc- Xtures and ideas are very similar to ncurses. As for UNIX curses, I have Xnot even seen any sources for it. X X For an introduction to the use of 'curses' and it's derivatives, you Xshould read 'Screen Updating and Cursor Movement Optimization: A Library XPackage' by Kenneth C. R. C. Arnold, which describes the original Berkely XUNIX version of curses. It is available as part of the UNIX manuals. The Xother source of information is 'The Ncurses Reference Manual' by Pavel XCurtis. The latter is part of Curtis' ncurses package. X X The only other documentation provided is a 'man' page which describes Xall the included functions in a very terse way. In the sources, each Xfunction is preceded by a rather thourough description of what the Xfunction does. I didn't have time to write a nice manual/tutorial - sorry. X X PCcurses is released as a number of source files, a man page, and a make Xfile. A uuencoded copy of a 'make' utility, and a manpage for the 'make' is Xalso provided to make it easier to put together PCcurses libraries. Even if Xyou are not interested in PCcurses, it may be worthwhile to grab the make. X X The makefile assumes the presence of the MicroSoft 'C' compiler (3.0 or X4.0), MicroSoft MASM and LIB, plus some MS-DOS utilities. The reason for Xsupplying MAKE.EXE is that the MicroSoft 'MAKE:s' are much inferior to a Xreal UNIX make. The supplied make is a port of a public domain make, pub- Xlished on UseNet. It is almost completely compatible with UNIX make. When Xgenerating the curses libraries, the makefile will direct make to do some Xdirectory creating and file copying, and then re-invoke itself with new Xtargets. The workings of the makefile are not absolutely crystal clear at Xfirst sight... just start it and see what it does. X X For portability, the curses libraries depend on one assembler file for Xaccess to the BIOS routines. There is no support for the EGA, but both XCGA, MGA, and the HGA can be used. The libraries are originally for Micro- XSoft 'C', but all C modules should be portable right away. In the assembler Xfile, segment names probably need to be changed, and possibly the parameter Xpassing scheme. I think Turbo C will work right away - as far as I under- Xstand, all it's conventions are compatible with MicroSoft C. X X There are some parts left out between ncurses and PCcurses. One is the Xsupport for multiple terminals - not very interesting on a PC anyway. Be- Xcause we KNOW what terminal we have, there is no need for a termcap or Xtermio library. PCcurses also has some things that neither curses nor Xncurses have. Compared to the original UNIX curses, PCcurses has lots Xof extras. X X The BIOS routines are used directly, which gives fast screen updates. XPCcurses does not do direct writes to screen RAM - in my opinion it is Xa bit ugly to rely that much on hardware compatibility. Anyone could fix Xthat, of course... X X One of the more serious problems with PCcurses is the way in which nor- Xmal, cbreak, and raw input modes are done. All those details are in the X'charget' module - I do raw I/O via the BIOS, and perform any buffering Xmyself. If an application program uses PCcurses, it should do ALL it's XI/O via PCcurses calls, otherwise the mix of normal and PCcurses I/O may Xmess up the display. I think my code is reasonable... comments are welcome, Xprovided you express them nicely... X X To install, copy all files to a work directory, edit 'makefile' to define Xthe standard include and library file directory names of your choice (these Xdirectories must exist already, and their path names must be relative to the Xroot directory, not to the current one). You must also run uudecode on Xmake.uu, to generate MAKE.EXE. You can do that on your PC, if you have Xuudecode there, otherwise you can do it under UNIX and do a binary transfer Xto the PC. When you have MAKE.EXE in your work directory (or in your /bin Xdirectory), type make. X X Make will now create 4 sub-directories (one for each memory model), copy Xsome assembler include files into them, copy two include files to your Xinclude directory, CHDIR to each sub-directory and re-invoke itself with Xother make targets to compile and assemble all the source files into the Xappropriate directories. Then the library manager is run to create the Xlibrary files in your desired library directory. Presto! X X If you only want to generate a library for one memory model, type 'make Xsmall', 'make large', etc. The name of the memory model must be in lower Xcase, like in the makefile. X X I think the package is fairly well debugged - but then again, that's Xwhat I always think. It was completed in May-87, and no problems found Xyet. Now it's your turn... Comments, suggestions and bug reports and Xfixes (no flames please) to X XBjorn Larsson XINFOVOX AB XBox 2503 (...seismo!mcvax!enea!infovax!bl) XS-171 02 Solna XSWEDEN FRIDAY_NIGHT echo extracting - attrib.c sed 's/^X//' > attrib.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Character attribute routines of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Wattrset() sets the attributes as specified in window 'win'. */ X/****************************************************************/ X Xvoid wattrset(win,attrs) X WINDOW *win; X int attrs; X { X win->_attrs = attrs & ATR_MSK; X } /* wattrset */ X X/****************************************************************/ X/* Wattron() sets the specified attribute(s) in window 'win'. */ X/****************************************************************/ X Xvoid wattron(win,attrs) X WINDOW *win; X int attrs; X { X win->_attrs |= (attrs & ATR_MSK); X } /* wattron */ X X/****************************************************************/ X/* Wattroff() clears the specified attribute(s) in window */ X/* 'win'. */ X/****************************************************************/ X Xvoid wattroff(win,attrs) X WINDOW *win; X int attrs; X { X win->_attrs &= (~attrs & ATR_MSK); X } /* wattroff */ X X/****************************************************************/ X/* Wstandout() starts standout mode in window 'win'. */ X/****************************************************************/ X Xvoid wstandout(win) X WINDOW *win; X { X win->_attrs = A_STANDOUT; X } /* wstandout */ X X/****************************************************************/ X/* Wstandend() clears all special attributes in window 'win'. */ X/****************************************************************/ X Xvoid wstandend(win) X WINDOW *win; X { X win->_attrs = ATR_NRM; X } /* wstandend */ X X/****************************************************************/ X/* Attrset() sets the attributes as specified in stdscr. */ X/****************************************************************/ X Xvoid attrset(attrs) X int attrs; X { X stdscr->_attrs = attrs & ATR_MSK; X } /* attrset */ X X/****************************************************************/ X/* Attron() sets the specified attribute(s) in stdscr. */ X/****************************************************************/ X Xvoid attron(attrs) X int attrs; X { X stdscr->_attrs |= (attrs & ATR_MSK); X } /* attron */ X X/****************************************************************/ X/* Attroff() clears the specified attribute(s) in stdscr. */ X/****************************************************************/ X Xvoid attroff(attrs) X int attrs; X { X stdscr->_attrs &= (~attrs & ATR_MSK); X } /* attroff */ X X/****************************************************************/ X/* Standout() starts standout mode in stdscr. */ X/****************************************************************/ X Xvoid standout() X { X stdscr->_attrs = A_STANDOUT; X } /* standout */ X X/****************************************************************/ X/* Standend() clears all special attributes in stdscr. */ X/****************************************************************/ X Xvoid standend() X { X stdscr->_attrs = ATR_NRM; X } /* standend */ FRIDAY_NIGHT echo extracting - beep.c sed 's/^X//' > beep.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* */ X/* Beep() and flash() routines of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Beep() sounds the terminal bell. */ X/****************************************************************/ X Xvoid beep() X { X _cursesputc('\007',0); X } /* beep */ X X/****************************************************************/ X/* Flash() flashes the terminal screen. */ X/****************************************************************/ X Xvoid flash() X { X int i; X X _cursesscroll(0,0,LINES-1,COLS-1,0,0x70); X for (i=0;i<10000;) X i++; X _cursesscroll(0,0,LINES-1,COLS-1,0,0x0); X wrefresh(curscr); X } /* flash */ FRIDAY_NIGHT echo extracting - boxes.c sed 's/^X//' > boxes.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Box() routines of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* wbox(win,ymin,xmin,ymax,xmax,v,h) draws a box in window */ X/* 'win', enclosing the area xmin-xmax and ymin-xmax. If */ X/* xmax and/or ymax is 0, the window max value is used. 'v' and */ X/* 'h' are the vertical and horizontal characters to use. If */ X/* 'v' and 'h' are PC grapics lines, wbox will make the corners */ X/* in a pretty way. */ X/****************************************************************/ X Xint wbox(win,ymin,xmin,ymax,xmax,v,h) X WINDOW *win; X int ymin; X int xmin; X int ymax; X int xmax; X char v; X char h; X { X static int vc,hc,ulc,urc,llc,lrc; /* corner chars */ X int i; X X if (ymax == 0) X ymax = win->_maxy; X if (xmax == 0) X xmax = win->_maxx; X X if (ymin >= win->_maxy || ymax > win->_maxy || X xmin >= win->_maxx || xmax > win->_maxx || X ymin >= ymax || xmin >= xmax X ) X return(ERR); X X vc = v; X hc = h; X vc &= 0xff; /* get rid of sign-extended int */ X hc &= 0xff; X ulc = urc = llc = lrc = vc; /* default same as vertical */ X X if (vc == 0xba) /* vertical double bars */ X { X if (hc == 0xcd) /* horizontal too? */ X { X ulc = 0xc9; /* use double bar corners */ X urc = 0xbb; X llc = 0xc8; X lrc = 0xbc; X } /* if */ X else X { X ulc = 0xd6; /* use hor-s vert-d corners */ X urc = 0xb7; X llc = 0xd3; X lrc = 0xbd; X } /* else */ X } /* if */ X X if (vc == 0xb3) /* vertical single bars */ X { X if (hc == 0xcd) /* horizontal double bars */ X { X ulc = 0xd5; X urc = 0xb8; X llc = 0xd4; X lrc = 0xbe; X } /* if */ X else /* use hor-s vert-s bars */ X { X ulc = 0xda; X urc = 0xbf; X llc = 0xc0; X lrc = 0xd9; X } /* else */ X } /* if */ X X for (i = xmin+1;i <= xmax-1;i++) X { X win->_line[ymin][i] = hc | win->_attrs; X win->_line[ymax][i] = hc | win->_attrs; X } X for (i = ymin+1;i <= ymax-1;i++) X { X win->_line[i][xmin] = vc | win->_attrs; X win->_line[i][xmax] = vc | win->_attrs; X } X win->_line[ymin][xmin] = ulc | win->_attrs; X win->_line[ymin][xmax] = urc | win->_attrs; X win->_line[ymax][xmin] = llc | win->_attrs; X win->_line[ymax][xmax] = lrc | win->_attrs; X X for (i=ymin; i <= ymax ; i++) X { X if (win->_minchng[i] == _NO_CHANGE) X { X win->_minchng[i] = xmin; X win->_maxchng[i] = xmax; X } /* if */ X else X { X win->_minchng[i] = min(win->_minchng[i], xmin); X win->_maxchng[i] = max(win->_maxchng[i], xmax); X } /* else */ X } /* for */ X return(OK); X } /* box */ X X/****************************************************************/ X/* box(win,v,h) draws a box around window window 'win'. 'v' and */ X/* 'h' are the vertical and horizontal characters to use. */ X/****************************************************************/ X Xvoid box(win,vc,hc) X WINDOW *win; X char vc; X char hc; X { X wbox(win,0,0,0,0,vc,hc); X } /* box */ FRIDAY_NIGHT echo extracting - charadd.c sed 's/^X//' > charadd.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Addch() routines of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Newline() does line advance and returns the new cursor line. */ X/* If error, return -1. */ X/****************************************************************/ X Xstatic short newline(win, lin) X WINDOW *win; X short lin; X { X if (++lin > win->_regbottom) X { X lin--; X if (win->_scroll) X scroll(win); X else X return(-1); X } /* if */ X return(lin); X } /* newline */ X X/****************************************************************/ X/* Waddch() inserts character 'c' at the current cursor posi- */ X/* tion in window 'win', and takes any actions as dictated by */ X/* the character. */ X/****************************************************************/ X Xint waddch(win, c) X register WINDOW *win; X char c; X { X short x = win->_curx; X short y = win->_cury; X short newx; X int ch = c; X int ts = win->_tabsize; X X ch &= 0xff; /* kill any sing-extend */ X if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) X return(ERR); X switch (ch) X { X case '\t': for (newx = ((x/ts) + 1) * ts; x < newx; x++) X { X if (waddch(win, ' ') == ERR) X return(ERR); X if (win->_curx == 0) /* if tab to next line */ X return(OK); /* exit the loop */ X } /* for */ X return(OK); X case '\n': if (_cursvar.autocr && !(_cursvar.raw)) /* if lf -> crlf */ X x = 0; X if ((y = newline(win, y)) < 0) X return(ERR); X break; X case '\r': x = 0; X break; X case '\b': if (--x < 0) /* no back over left margin */ X x = 0; X break; X case 0x7f: if (waddch(win,'^') == ERR) X return(ERR); X return(waddch(win,'?')); X default: if (ch < ' ') /* handle control chars */ X { X if (waddch(win,'^') == ERR) X return(ERR); X return(waddch(win,c + '@')); X } /* if */ X ch |= (win->_attrs & ATR_MSK); X if (win->_line[y][x] != ch) /* only if data change */ X { X if (win->_minchng[y] == _NO_CHANGE) X win->_minchng[y] = win->_maxchng[y] = x; X else X if (x < win->_minchng[y]) X win->_minchng[y] = x; X else X if (x > win->_maxchng[y]) X win->_maxchng[y] = x; X } /* if */ X win->_line[y][x++] = ch; X if (x > win->_maxx) /* wrap around test */ X { X x = 0; X if ((y = newline(win, y)) < 0) X return(ERR); X } /* if */ X break; X } /* switch */ X win->_curx = x; X win->_cury = y; X return(OK); X } /* waddch */ X X/****************************************************************/ X/* Addch() inserts character 'c' at the current cursor posi- */ X/* tion in stdscr, and takes any actions as dictated by the */ X/* character. */ X/****************************************************************/ X Xint addch(c) X char c; X { X return (waddch(stdscr,c)); X } /* addch */ X X/****************************************************************/ X/* Mvaddch() moves to position in stdscr, then inserts charac- */ X/* ter 'c' at that point, and takes any actions as dictated by */ X/* the character. */ X/****************************************************************/ X Xint mvaddch(y,x,c) X int x; X int y; X char c; X { X if (wmove(stdscr,y,x) == ERR) X return(ERR); X return (waddch(stdscr,c)); X } /* mvaddch */ X X/****************************************************************/ X/* Mvwaddch() moves to position in window 'win', then inserts */ X/* character 'c' at that point in the window, and takes any */ X/* actions as dictated by the character. */ X/****************************************************************/ X Xint mvwaddch(win,y,x,c) X WINDOW *win; X int x; X int y; X char c; X { X if (wmove(win,y,x) == ERR) X return(ERR); X return (waddch(win,c)); X } /* mvwaddch */ FRIDAY_NIGHT echo extracting - chardel.c sed 's/^X//' > chardel.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Wdelch() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Wdelch() deletes the character at the window cursor, and the */ X/* characters to the right of it are shifted left, inserting a */ X/* space at the last position of the line. */ X/****************************************************************/ X Xint wdelch(win) X WINDOW *win; X { X int *temp1; X int *temp2; X int *end; X short y = win->_cury; X short x = win->_curx; X short maxx = win->_maxx; X X end = &win->_line[y][maxx]; X temp1 = &win->_line[y][x]; X temp2 = temp1 + 1; X while (temp1 < end) X *temp1++ = *temp2++; X *temp1 = ' ' | (win->_attrs & ATR_MSK); X win->_maxchng[y] = maxx; X if (win->_minchng[y] == _NO_CHANGE || win->_minchng[y] > x) X win->_minchng[y] = x; X return(OK); X } /* wdelch */ X X/****************************************************************/ X/* Delch() deletes the character at the stdscr cursor, and the */ X/* characters to the right of it are shifted left, inserting a */ X/* space at the last position of the line. */ X/****************************************************************/ X Xint delch() X { X return(wdelch(stdscr)); X } /* delch */ X X/****************************************************************/ X/* Mvdelch() moves the stdscr cursor to a new position, then */ X/* deletes the character at the stdscr cursor, and the charac- */ X/* ters to the right of it are shifted left, inserting a space */ X/* at the last position of the line. */ X/****************************************************************/ X Xint mvdelch(y,x) X int y; X int x; X { X if (wmove(stdscr,y,x) == ERR) X return(ERR); X return(wdelch(stdscr)); X } /* mvdelch */ X X/****************************************************************/ X/* Mvwdelch() moves the cursor of window 'win' to a new posi- */ X/* tion, then deletes the character at the stdscr cursor, and */ X/* the characters to the right of it are shifted left, inser- */ X/* ting a space at the last position of the line. */ X/****************************************************************/ X Xint mvwdelch(win,y,x) X WINDOW *win; X int y; X int x; X { X if (wmove(win,y,x) == ERR) X return(ERR); X return(wdelch(win)); X } /* mvwdelch */ FRIDAY_NIGHT echo extracting - charget.c sed 's/^X//' > charget.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Getch() routines of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X Xstatic int rawgetch(); /* get raw char via BIOS */ Xstatic int sysgetch(); /* get char via system */ Xstatic int validchar(); /* keypad xlate and char check */ X Xstatic int buffer[_INBUFSIZ]; /* character buffer */ Xstatic int pindex = 0; /* putter index */ Xstatic int gindex = 1; /* getter index */ Xstatic WINDOW *w; /* to reduce stack usage */ Xstatic int ungind = 0; /* wungetch() push index */ Xstatic int ungch[NUNGETCH]; /* array of ungotten chars */ X X/* table for key code translation of function keys in keypad mode */ X/* These values are for strict IBM keyboard compatibles only */ X Xstatic int kptab[] = X { X 0x3b,KEY_F(1), 0x3c,KEY_F(2), 0x3d,KEY_F(3), 0x3e,KEY_F(4), X 0x3f,KEY_F(5), 0x40,KEY_F(6), 0x41,KEY_F(7), 0x42,KEY_F(8), X 0x43,KEY_F(9), 0x44,KEY_F(10), 0x47,KEY_HOME, 0x48,KEY_UP, X 0x49,KEY_PPAGE, 0x4b,KEY_LEFT, 0x4d,KEY_RIGHT, 0x4f,KEY_LL, X 0x50,KEY_DOWN, 0x51,KEY_NPAGE, 0x52,KEY_IC, 0x53,KEY_DC, X 0x54,KEY_F(11), 0x55,KEY_F(12), 0x56,KEY_F(13), 0x57,KEY_F(14), X 0x58,KEY_F(15), 0x59,KEY_F(16), 0x5a,KEY_F(17), 0x5b,KEY_F(18), X 0x5c,KEY_F(19), 0x5d,KEY_F(20), 0x5e,KEY_F(21), 0x5f,KEY_F(22), X 0x60,KEY_F(23), 0x61,KEY_F(24), 0x62,KEY_F(25), 0x63,KEY_F(26), X 0x64,KEY_F(27), 0x65,KEY_F(28), 0x66,KEY_F(29), 0x67,KEY_F(30), X 0x73,KEY_LEFT, 0x74,KEY_RIGHT, 0x75,KEY_LL, 0x76,KEY_NPAGE, X 0x77,KEY_HOME, 0x84,KEY_PPAGE, 0x100, -1 X }; X X X/****************************************************************/ X/* Wgetch(win) gets a character from the terminal, in normal, */ X/* cbreak or raw mode, optionally echoing to window 'win'. */ X/****************************************************************/ X Xint wgetch(win) X WINDOW *win; X { X int key; X int cbr; X X if (ungind) /* if ungotten char exists */ X return(ungch[--ungind]); /* remove and return it */ X X if ((!_cursvar.raw) && (!_cursvar.cbreak)) /* if normal */ X if (gindex < pindex) /* and data in buffer */ X return(buffer[gindex++]); X X w = win; /* static for speed & stack */ X pindex = 0; /* prepare to buffer data */ X gindex = 0; X while(1) /* loop for any buffering */ X { X if (_cursvar.raw) /* get a raw character */ X key = rawgetch(); X else /* get a system character */ X { X cbr = _cursesgcb(); /* get ^BREAK status */ X _cursesscb(_cursvar.orgcbr); /* if break return proper */ X key = sysgetch(); X _cursesscb(cbr); /* restore as it was */ X } X if (w->_nodelay && (key == -1)) /* if nodelay and no char */ X return(-1); X if ((key == '\r') && _cursvar.autocr && !_cursvar.raw) /* translate cr */ X key = '\n'; X if (_cursvar.echo && (key < 0x100)) /* check if echo */ X { X waddch(w,key); X wrefresh(w); X } X if (_cursvar.raw || _cursvar.cbreak) /* if no buffering */ X return(key); X if (pindex < _INBUFSIZ-2) /* if no overflow, */ X buffer[pindex++] = key; /* put data in buffer */ X if ((key == '\n') || (key == '\r')) /* if we got a line */ X return(buffer[gindex++]); X } /* while */ X } /* wgetch */ X X/****************************************************************/ X/* Flushinp() kills any pending input characters. */ X/****************************************************************/ X Xvoid flushinp() X { X while(_curseskeytst) /* empty keyboard buffer */ X _curseskey(); X while(kbhit()) /* empty system's buffers */ X getch(); X gindex = 1; /* set indices to kill buffer */ X pindex = 0; X ungind = 0; /* clear ungch array */ X } /* flushinp */ X X/****************************************************************/ X/* Wungetch() pushes back it's argument on the input stream. If */ X/* OK, returns 1, otherwise returns 0. */ X/****************************************************************/ X Xint wungetch(ch) X int ch; X { X if (ungind >= NUNGETCH) /* pushback stack full */ X return(0); X ungch[ungind++] = ch; X return(1); X } /* wungetch() */ X X/****************************************************************/ X/* Mvgetch() first moves the stdscr cursor to a new location, */ X/* then does a wgetch() on stdscr. */ X/****************************************************************/ X Xint mvgetch(y,x) X int y; X int x; X { X wmove(stdscr,y,x); X wgetch(stdscr); X } /* mvgetch */ X X/****************************************************************/ X/* Mvwgetch() first moves the cursor of window 'win' to a new */ X/* location, then does a wgetch() in 'win'. */ X/****************************************************************/ X Xint mvwgetch(win,y,x) X WINDOW *win; X int y; X int x; X { X wmove(win,y,x); X wgetch(win); X } /* mvwgetch */ X X/****************************************************************/ X/* rawgetch() gets a character without any interpretation at */ X/* all and returns it. If keypad mode is active for the desig- */ X/* nated window, function key translation will be performed. */ X/* Otherwise, function keys are ignored.If nodelay mode is */ X/* active in the window, then rawgetch() returns -1 if no cha- */ X/* racter is available. */ X/****************************************************************/ X Xstatic int rawgetch() X { X int c; X X if (w->_nodelay && !_curseskeytst()) X return(-1); X while(1) /* loop to get valid char */ X { X if ((c = validchar(_curseskey())) >= 0) X return(c); X } /* while */ X } /* rawgetch */ X X/****************************************************************/ X/* Sysgetch() gets a character with normal ^S, ^Q, ^P and ^C */ X/* interpretation and returns it. If keypad mode is active for */ X/* the designated window, function key translation will be per- */ X/* formed. Otherwise, function keys are ignored. If nodelay */ X/* mode is active in the window, then sysgetch() returns -1 if */ X/* no character is available. */ X/****************************************************************/ X#undef getch /* we use MSC getch() below */ X Xstatic int sysgetch() X { X int c; X X if (w->_nodelay && !kbhit()) X return(-1); X while(1) X { X c = getch(); X if (c) /* if not a function key */ X return(c & 0xff); /* avoids sign-extending */ X c = getch(); X if ((c = validchar(c << 8)) >= 0) /* get & check next char */ X return(c); X } /* while */ X } /* sysgetch */ X X/****************************************************************/ X/* Validchar(c) chacks that 'c' is a valid character, and */ X/* if so returns it, with function key translation applied if */ X/* 'w' has keypad mode set. If char is invalid, returns -1. */ X/****************************************************************/ X Xstatic int validchar(c) X int c; X { X int *scanp; X X if (c == 0x0300) /* special case, ^@ = NULL */ X return(0); X if (!(c & 0xff00)) /* normal character */ X return(c); X if (!(w->_keypad)) /* skip f keys if not keypad mode */ X return(-1); X c = (c >> 8) & 0xff; X scanp = kptab; X while(*scanp <= c) /* search for value */ X { /* (stops on table entry 0x100) */ X if (*scanp++ == c) X return(*scanp); /* found, return it */ X scanp++; X } X return(-1); /* not found, invalid */ X } /* validchar */ X X/****************************************************************/ X/* _cursespendch() returns 1 if there is any character avai- */ X/* lable, and 0 if there is none. this is not for programmer */ X/* usage, but for the updatew routines. */ X/****************************************************************/ X Xbool _cursespendch() X { X if (ungind) /* ungotten char */ X return(TRUE); X if (pindex > gindex) /* buffered char */ X return(TRUE); X if (_cursvar.raw) /* raw mode test */ X return(_curseskeytest()); X return(kbhit()); /* normal mode test */ X } /* _cursespendch */ FRIDAY_NIGHT echo extracting - charins.c sed 's/^X//' > charins.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Winsch() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Winsch() inserts character 'c' at the cursor position in */ X/* window 'win'. The cursor is advanced. */ X/****************************************************************/ X Xint winsch(win, c) X WINDOW *win; X char c; X { X int *temp1; X int *temp2; X int *end; X int x = win->_curx; X int y = win->_cury; X int maxx = win->_maxx; X X if((c < ' ') && (c == '\n' || c == '\r' || c == '\t' || c == '\b')) X return(waddch(win, c)); X end = &win->_line[y][x]; X temp1 = &win->_line[y][maxx]; X temp2 = temp1 - 1; X if(c < ' ') /* if CTRL-char make space for 2 */ X temp2--; X while (temp1 > end) X *temp1-- = *temp2--; X win->_maxchng[y] = maxx; X if ((win->_minchng[y] == _NO_CHANGE) || (win->_minchng[y] > x)) X win->_minchng[y] = x; X return(waddch(win, c)); /* fixes CTRL-chars too */ X } /* winsch */ X X/****************************************************************/ X/* Insch() inserts character 'c' at the cursor position in */ X/* stdscr. The cursor is advanced. */ X/****************************************************************/ X Xint insch(c) X char c; X { X winsch(stdscr,c); X } /* insch */ X X/****************************************************************/ X/* Mvinsch() moves the stdscr cursor to a new position, then */ X/* inserts character 'c' at the cursor position in stdscr. The */ X/* cursor is advanced. */ X/****************************************************************/ X Xint mvinsch(y,x,c) X int y; X int x; X char c; X { X if (wmove(stdscr,y,x) == ERR) X return(ERR); X return(winsch(stdscr,c)); X } /* mvinsch */ X X/****************************************************************/ X/* Mvwinsch() moves the cursor of window 'win' to a new posi- */ X/* tion, then inserts character 'c' at the cursor position in */ X/* window 'win'. The cursor is advanced. */ X/****************************************************************/ X Xint mvwinsch(win,y,x,c) X WINDOW *win; X int y; X int x; X char c; X { X if (wmove(win,y,x) == ERR) X return(ERR); X return(winsch(win,c)); X } /* mvwinsch */ FRIDAY_NIGHT echo extracting - charpick.c sed 's/^X//' > charpick.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Winch() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Winch(win) returns the character at the current position in */ X/* window 'win'. */ X/****************************************************************/ X Xint winch(win) X WINDOW *win; X { X return((win->_line[win->_cury][win->_curx]) & 0xff); X } /* winch */ X X/****************************************************************/ X/* Inch() returns the character at the current cursor position */ X/* in stdscr. */ X/****************************************************************/ X Xint inch() X { X return((stdscr->_line[stdscr->_cury][stdscr->_curx]) & 0xff); X } /* inch */ X X/****************************************************************/ X/* Mvinch() moves the stdscr cursor to a new position, then */ X/* returns the character at that position. */ X/****************************************************************/ X Xint mvinch(y,x) X int y; X int x; X { X if (wmove(stdscr,y,x) == ERR) X return(ERR); X return((stdscr->_line[stdscr->_cury][stdscr->_curx]) & 0xff); X } /* mvinch */ X X/****************************************************************/ X/* Mvwinch() moves the cursor of window 'win' to a new posi- */ X/* tion, then returns the character at that position. */ X/****************************************************************/ X Xint mvwinch(win,y,x) X WINDOW *win; X int y; X int x; X { X if (wmove(win,y,x) == ERR) X return(ERR); X return((win->_line[win->_cury][win->_curx]) & 0xff); X } /* mvwinch */ FRIDAY_NIGHT echo extracting - clrtobot.c sed 's/^X//' > clrtobot.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Wclrtobot() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Wclrtobot() fills the right half of the cursor line of */ X/* window 'win', and all lines below it with blanks. */ X/****************************************************************/ X Xint wclrtobot(win) X WINDOW *win; X { X int y; X int minx; X static int startx; X static int *ptr; X static int *end; X static int *maxx; X static int blank; X X blank = ' ' | (win->_attrs & ATR_MSK); X startx = win->_curx; X for (y = win->_cury; y <= win->_regbottom; y++) X { X minx = _NO_CHANGE; X end = &win->_line[y][win->_maxx]; X for (ptr = &win->_line[y][startx]; ptr <= end; ptr++) X { X if (*ptr != blank) X { X maxx = ptr; X if (minx == _NO_CHANGE) X minx = ptr - win->_line[y]; X *ptr = blank; X } /* if */ X } /* for */ X if (minx != _NO_CHANGE) X { X if ((win->_minchng[y] > minx) || (win->_minchng[y] == _NO_CHANGE)) X win->_minchng[y] = minx; X if (win->_maxchng[y] < maxx - win->_line[y]) X win->_maxchng[y] = maxx - win->_line[y]; X } /* if */ X startx = 0; X } /* for */ X return(OK); X } /* wclrtobot */ X X/****************************************************************/ X/* Wclrtobot() fills the right half of the cursor line of */ X/* stdscr, and all lines below it with blanks. */ X/****************************************************************/ X Xint clrbot() X { X return(wclrtobot(stdscr)); X } /* clrbot */ X X/****************************************************************/ X/* Mvclrtobot() moves the cursor to a new position in stdscr */ X/* and fills the right half of the cursor line, and all lines */ X/* below it with blanks. */ X/****************************************************************/ X Xint mvclrtobot(y,x) X int y; X int x; X { X if (wmove(stdscr,y,x) == ERR) X return(ERR); X return(wclrtobot(stdscr)); X } /* mvclrtobot */ X X/****************************************************************/ X/* Mvwclrtobot() moves the cursor to a new position in window */ X/* 'win', and fills the right half of the cursor line, and all */ X/* lines below it with blanks. */ X/****************************************************************/ X Xint mvwclrtobot(win,y,x) X WINDOW *win; X int y; X int x; X { X if (wmove(win,y,x) == ERR) X return(ERR); X return(wclrtobot(win)); X } /* mvwclrtobot */ FRIDAY_NIGHT echo extracting - clrtoeol.c sed 's/^X//' > clrtoeol.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Wclrtoeol() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Wclrtoeol() fills the half of the cursor line to the right */ X/* of the cursor in window 'win' with blanks. */ X/****************************************************************/ X Xint wclrtoeol(win) X WINDOW *win; X { X int *maxx; X int *ptr; X int *end; X static int y; X static int x; X static int minx; X static int blank; X X y = win->_cury; X x = win->_curx; X blank = ' ' | (win->_attrs & ATR_MSK); X X end = &win->_line[y][win->_maxx]; X minx = _NO_CHANGE; X maxx = &win->_line[y][x]; X for (ptr = maxx; ptr <= end; ptr++) X { X if (*ptr != blank) X { X maxx = ptr; X if (minx == _NO_CHANGE) X minx = ptr - win->_line[y]; X *ptr = blank; X } /* if */ X } /* for */ X X if (minx != _NO_CHANGE) X { X if (win->_minchng[y] > minx || win->_minchng[y] == _NO_CHANGE) X win->_minchng[y] = minx; X if (win->_maxchng[y] < maxx - win->_line[y]) X win->_maxchng[y] = maxx - win->_line[y]; X } /* if */ X return(OK); X } /* wclrtoeol */ X X/****************************************************************/ X/* Clrtoeol() fills the half of the cursor line to the right */ X/* of the cursor in stdscr with blanks. */ X/****************************************************************/ X Xint clrtoeol() X { X return(wclrtoeol(stdscr)); X } /* clrtoeol */ X X/****************************************************************/ X/* Mvclrtoeol() moves the cursor to a new position in stdscr */ X/* and fills the right half of the cursor line with blanks. */ X/****************************************************************/ X Xint mvcltoreol(y,x) X int y; X int x; X { X if (wmove(stdscr,y,x) == ERR) X return(ERR); X return(wclrtoeol(stdscr)); X } /* mvclrtoeol */ X X/****************************************************************/ X/* Mvwclrtoeol() moves the cursor to a new position in window */ X/* 'win', and fills the right half of the cursor line with */ X/* blanks. */ X/****************************************************************/ X Xint mvwclrtoeol(win,y,x) X WINDOW *win; X int y; X int x; X { X if (wmove(win,y,x) == ERR) X return(ERR); X return(wclrtoeol(win)); X } /* mvwclrtoeol */ FRIDAY_NIGHT echo pccurses.sh.1 completed!