home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume1 / 8708 / pc-curses / 1 next >
Encoding:
Text File  |  1987-08-28  |  52.2 KB  |  1,588 lines

  1. Article 185 of comp.sources.misc:
  2. Relay-Version: version B 2.10.3 alpha 5/22/85; site osu-eddie.UUCP
  3. Path: osu-eddie!cbosgd!ihnp4!ptsfa!ames!ll-xn!husc6!necntc!ncoast!allbery
  4. From: bl@infovax.UUCP (Bj|rn Larsson)
  5. Newsgroups: comp.sources.misc
  6. Subject: PCcurses shar 1
  7. Message-ID: <4269@ncoast.UUCP>
  8. Date: 26 Aug 87 22:51:34 GMT
  9. Date-Received: 27 Aug 87 12:23:09 GMT
  10. Sender: allbery@ncoast.UUCP
  11. Lines: 1571
  12. Approved: allbery@ncoast.UUCP
  13. X-Archive: comp.sources.misc/8708/pc-curses/1
  14.  
  15. # This is a shar archive.
  16. # Remove everything above this line.
  17. # Run the file through sh, not csh.
  18. # (type `sh pccurses.sh.1')
  19. echo extracting - Makefile
  20. sed 's/^X//' > Makefile << 'FRIDAY_NIGHT'
  21. X#################################################################
  22. X#                PCCURSES                #
  23. X# Makefile to generate scurses.lib, ccurses.lib, mcurses.lib,    #
  24. X# lcurses.lib for MicroSoft 'C'. Use MicroSoft 'C' v.4.0!    #
  25. X#                                #
  26. X# This makefile will generate subdirectories and call itself    #
  27. X# recursively...                        #
  28. X#################################################################
  29. X# 1.0:    Release:                    870515    #
  30. X#################################################################
  31. X
  32. X# The following are the directories where your lib and include files
  33. X# will be installed
  34. X
  35. XLIBDIR=    \msc\lib
  36. XINCDIR= \msc\inc
  37. X
  38. X# General definitions:
  39. X
  40. XCOBJS=        attrib.obj   beep.obj     boxes.obj    charadd.obj   \
  41. X        chardel.obj  charget.obj  charins.obj  charpick.obj  \
  42. X        clrtobot.obj clrtoeol.obj endwin.obj   initscr.obj   \
  43. X        linedel.obj  lineins.obj  longname.obj move.obj      \
  44. X        mvcursor.obj newwin.obj   options.obj  overlay.obj   \
  45. X        prntscan.obj refresh.obj  scrreg.obj   setterm.obj   \
  46. X        stradd.obj   strget.obj   termmisc.obj tabsize.obj   \
  47. X        unctrl.obj   update.obj   winclear.obj windel.obj    \
  48. X        winerase.obj winmove.obj  winscrol.obj wintouch.obj
  49. X
  50. XASMOBJS=    cursesio.obj
  51. X
  52. XOBJS=        $(COBJS) $(ASMOBJS)
  53. X
  54. X#################################################################
  55. X# 'all' is all that can (and usually is) done            #
  56. X#################################################################
  57. X
  58. Xall:        small compact medium large
  59. X
  60. X#################################################################
  61. X# The following copies the header files to their proper place    #
  62. X#################################################################
  63. X
  64. Xheaders:    $(INCDIR)\curses.h $(INCDIR)\curspriv.h
  65. X
  66. X$(INCDIR)\curses.h:    curses.h
  67. X    copy curses.h $(INCDIR)\curses.h
  68. X
  69. X$(INCDIR)\curspriv.h:    curspriv.h
  70. X    copy curspriv.h $(INCDIR)\curspriv.h
  71. X
  72. X#################################################################
  73. X# The following will create a subdirectory for each memory    #
  74. X# model, and initiate the make:ing in each one.            #
  75. X#################################################################
  76. X
  77. X#################################################################
  78. X# create work directory if non-existent, go to it, and        #
  79. X# perform the job - small model                    #
  80. X#################################################################
  81. X
  82. Xsmall:        headers            \
  83. X        smodel            \
  84. X        smodel\farnear.inc    \
  85. X        smodel\smalhuge.inc
  86. X    cd    smodel
  87. X    -make    -f ..\makefile $(MAKEFLAGS) "MODEL=s" $(LIBDIR)\scurses.lib
  88. X    cd    ..
  89. X
  90. Xsmodel:
  91. X    mkdir    smodel
  92. X
  93. Xsmodel\farnear.inc:    nearcall.inc
  94. X    copy    nearcall.inc    smodel\farnear.inc
  95. X
  96. Xsmodel\smalhuge.inc:    smaldata.inc
  97. X    copy    smaldata.inc    smodel\smalhuge.inc
  98. X
  99. X#################################################################
  100. X# create work directory if non-existent, go to it, and        #
  101. X# perform the job - compact model                #
  102. X#################################################################
  103. X
  104. Xcompact:    headers            \
  105. X        cmodel            \
  106. X        cmodel\farnear.inc    \
  107. X        cmodel\smalhuge.inc
  108. X    cd    cmodel
  109. X    -make    -f ..\makefile $(MAKEFLAGS) "MODEL=c" $(LIBDIR)\ccurses.lib
  110. X    cd    ..
  111. X
  112. Xcmodel:
  113. X    mkdir    cmodel
  114. X
  115. Xcmodel\farnear.inc:    nearcall.inc
  116. X    copy    nearcall.inc    cmodel\farnear.inc
  117. X
  118. Xcmodel\smalhuge.inc:    hugedata.inc
  119. X    copy    hugedata.inc    cmodel\smalhuge.inc
  120. X
  121. X#################################################################
  122. X# create work directory if non-existent, go to it, and        #
  123. X# perform the job - medium model                #
  124. X#################################################################
  125. X
  126. Xmedium:        headers            \
  127. X        mmodel            \
  128. X        mmodel\farnear.inc    \
  129. X        mmodel\smalhuge.inc
  130. X    cd    mmodel
  131. X    -make    -f ..\makefile $(MAKEFLAGS) "MODEL=m" $(LIBDIR)\mcurses.lib
  132. X    cd    ..
  133. X
  134. Xmmodel:
  135. X    mkdir    mmodel
  136. X
  137. Xmmodel\farnear.inc:    farcall.inc
  138. X    copy    farcall.inc    mmodel\farnear.inc
  139. X
  140. Xmmodel\smalhuge.inc:    smaldata.inc
  141. X    copy    smaldata.inc    mmodel\smalhuge.inc
  142. X
  143. X#################################################################
  144. X# create work directory if non-existent, go to it, and        #
  145. X# perform the job - large model                    #
  146. X#################################################################
  147. X
  148. Xlarge:        headers            \
  149. X        lmodel            \
  150. X        lmodel\farnear.inc    \
  151. X        lmodel\smalhuge.inc
  152. X    cd    lmodel
  153. X    -make    -f ..\makefile $(MAKEFLAGS) "MODEL=l" $(LIBDIR)\lcurses.lib
  154. X    cd    ..
  155. X
  156. Xlmodel:
  157. X    mkdir    lmodel
  158. X
  159. Xlmodel\farnear.inc:    farcall.inc
  160. X    copy    farcall.inc    lmodel\farnear.inc
  161. X
  162. Xlmodel\smalhuge.inc:    hugedata.inc
  163. X    copy    hugedata.inc    lmodel\smalhuge.inc
  164. X
  165. X#################################################################
  166. X# Put together the library in file tmp.lib, then copy it to    #
  167. X# the appropriate name for the memory model in question, and    #
  168. X# delete the temporary file                    #
  169. X#################################################################
  170. X
  171. X$(LIBDIR)\$(MODEL)curses.lib:    $(OBJS)
  172. X    del    tmp.lib
  173. X    lib @..\curses.cmd
  174. X    copy    tmp.lib $(LIBDIR)\$(MODEL)curses.lib
  175. X    del    tmp.lib
  176. X
  177. X#################################################################
  178. X# commands and dependencies for individual modules        #
  179. X#################################################################
  180. X
  181. Xattrib.obj:    ..\attrib.c ..\curses.h ..\curspriv.h
  182. X    cl -M$(MODEL) -c -Ox -Foattrib   ..\attrib.c
  183. X
  184. Xbeep.obj:    ..\beep.c ..\curses.h ..\curspriv.h
  185. X    cl -M$(MODEL) -c -Ox -Fobeep     ..\beep.c
  186. X
  187. Xboxes.obj:    ..\boxes.c ..\curses.h ..\curspriv.h
  188. X    cl -M$(MODEL) -c -Ox -Foboxes    ..\boxes.c
  189. X
  190. Xcharadd.obj:    ..\charadd.c ..\curses.h ..\curspriv.h
  191. X    cl -M$(MODEL) -c -Ox -Focharadd    ..\charadd.c
  192. X
  193. Xchardel.obj:    ..\chardel.c ..\curses.h ..\curspriv.h
  194. X    cl -M$(MODEL) -c -Ox -Fochardel  ..\chardel.c
  195. X
  196. Xcharget.obj:    ..\charget.c ..\curses.h ..\curspriv.h
  197. X    cl -M$(MODEL) -c -Ox -Focharget  ..\charget.c
  198. X
  199. Xcharins.obj:    ..\charins.c ..\curses.h ..\curspriv.h
  200. X    cl -M$(MODEL) -c -Ox -Focharins  ..\charins.c
  201. X
  202. Xcharpick.obj:    ..\charpick.c ..\curses.h ..\curspriv.h
  203. X    cl -M$(MODEL) -c -Ox -Focharpick ..\charpick.c
  204. X
  205. Xclrtobot.obj:    ..\clrtobot.c ..\curses.h ..\curspriv.h
  206. X    cl -M$(MODEL) -c -Ox -Foclrtobot ..\clrtobot.c
  207. X
  208. Xclrtoeol.obj:    ..\clrtoeol.c ..\curses.h ..\curspriv.h
  209. X    cl -M$(MODEL) -c -Ox -Foclrtoeol ..\clrtoeol.c
  210. X
  211. Xendwin.obj:    ..\endwin.c ..\curses.h ..\curspriv.h
  212. X    cl -M$(MODEL) -c -Ox -Foendwin   ..\endwin.c
  213. X
  214. Xinitscr.obj:    ..\initscr.c ..\curses.h ..\curspriv.h
  215. X    cl -M$(MODEL) -c -Ox -Foinitscr  ..\initscr.c
  216. X
  217. Xlinedel.obj:    ..\linedel.c ..\curses.h ..\curspriv.h
  218. X    cl -M$(MODEL) -c -Ox -Folinedel  ..\linedel.c
  219. X
  220. Xlineins.obj:    ..\lineins.c ..\curses.h ..\curspriv.h
  221. X    cl -M$(MODEL) -c -Ox -Folineins  ..\lineins.c
  222. X
  223. Xlongname.obj:    ..\longname.c ..\curses.h ..\curspriv.h
  224. X    cl -M$(MODEL) -c -Ox -Folongname ..\longname.c
  225. X
  226. Xmove.obj:    ..\move.c ..\curses.h ..\curspriv.h
  227. X    cl -M$(MODEL) -c -Ox -Fomove     ..\move.c
  228. X
  229. Xmvcursor.obj:    ..\mvcursor.c ..\curses.h ..\curspriv.h
  230. X    cl -M$(MODEL) -c -Ox -Fomvcursor ..\mvcursor.c
  231. X
  232. Xnewwin.obj:    ..\newwin.c ..\curses.h ..\curspriv.h
  233. X    cl -M$(MODEL) -c -Ox -Fonewwin   ..\newwin.c
  234. X
  235. Xoptions.obj:    ..\options.c ..\curses.h ..\curspriv.h
  236. X    cl -M$(MODEL) -c -Ox -Fooptions  ..\options.c
  237. X
  238. Xoverlay.obj:    ..\overlay.c ..\curses.h ..\curspriv.h
  239. X    cl -M$(MODEL) -c -Ox -Fooverlay  ..\overlay.c
  240. X
  241. Xprntscan.obj:    ..\prntscan.c ..\curses.h ..\curspriv.h
  242. X    cl -M$(MODEL) -c -Oat -Foprntscan ..\prntscan.c
  243. X
  244. Xrefresh.obj:    ..\refresh.c ..\curses.h ..\curspriv.h
  245. X    cl -M$(MODEL) -c -Ox -Forefresh  ..\refresh.c
  246. X
  247. Xscrreg.obj:    ..\scrreg.c ..\curses.h ..\curspriv.h
  248. X    cl -M$(MODEL) -c -Ox -Foscrreg   ..\scrreg.c
  249. X
  250. Xsetterm.obj:    ..\setterm.c ..\curses.h ..\curspriv.h
  251. X    cl -M$(MODEL) -c -Ox -Fosetterm  ..\setterm.c
  252. X
  253. Xstradd.obj:    ..\stradd.c ..\curses.h ..\curspriv.h
  254. X    cl -M$(MODEL) -c -Ox -Fostradd   ..\stradd.c
  255. X
  256. Xstrget.obj:    ..\strget.c ..\curses.h ..\curspriv.h
  257. X    cl -M$(MODEL) -c -Ox -Fostrget   ..\strget.c
  258. X
  259. Xtabsize.obj:    ..\tabsize.c ..\curses.h ..\curspriv.h
  260. X    cl -M$(MODEL) -c -Ox -Fotabsize  ..\tabsize.c
  261. X
  262. Xtermmisc.obj:    ..\termmisc.c ..\curses.h ..\curspriv.h
  263. X    cl -M$(MODEL) -c -Ox -Fotermmisc ..\termmisc.c
  264. X
  265. Xunctrl.obj:    ..\unctrl.c ..\curses.h ..\curspriv.h
  266. X    cl -M$(MODEL) -c -Ox -Founctrl   ..\unctrl.c
  267. X
  268. Xupdate.obj:    ..\update.c ..\curses.h ..\curspriv.h
  269. X    cl -M$(MODEL) -c -Ox -Foupdate   ..\update.c
  270. X
  271. Xwinclear.obj:    ..\winclear.c ..\curses.h ..\curspriv.h
  272. X    cl -M$(MODEL) -c -Ox -Fowinclear  ..\winclear.c
  273. X
  274. Xwindel.obj:    ..\windel.c ..\curses.h ..\curspriv.h
  275. X    cl -M$(MODEL) -c -Ox -Fowindel   ..\windel.c
  276. X
  277. Xwinerase.obj:    ..\winerase.c ..\curses.h ..\curspriv.h
  278. X    cl -M$(MODEL) -c -Ox -Fowinerase ..\winerase.c
  279. X
  280. Xwinmove.obj:    ..\winmove.c ..\curses.h ..\curspriv.h
  281. X    cl -M$(MODEL) -c -Ox -Fowinmove  ..\winmove.c
  282. X
  283. Xwinscrol.obj:    ..\winscrol.c ..\curses.h ..\curspriv.h
  284. X    cl -M$(MODEL) -c -Ox -Fowinscrol ..\winscrol.c
  285. X
  286. Xwintouch.obj:    ..\wintouch.c ..\curses.h ..\curspriv.h
  287. X    cl -M$(MODEL) -c -Ox -Fowintouch ..\wintouch.c
  288. X
  289. Xcursesio.obj:    ..\cursesio.asm
  290. X    masm ..\cursesio.asm/mx,cursesio.obj,nul,nul;
  291. X
  292. X#################################################################
  293. X# Perform a backup of the files in the directory where the    #
  294. X# 'make backup' command was issued - copies all files to the    #
  295. X# directory \pccurses on the A: floppy                #
  296. X#################################################################
  297. X
  298. Xbackup:
  299. X    @echo ***** backup of curses *****
  300. X    @echo Insert backup diskette in drive A: and hit any key!
  301. X    @pause
  302. X    mkdir a:\pccurses
  303. X    del   a:\pccurses\*.*
  304. X    copy  *.* a:\pccurses
  305. X
  306. X#################################################################
  307. X# Remove all temporary files and work directories that were    #
  308. X# created                            #
  309. X#################################################################
  310. X
  311. Xclean:
  312. X    del smodel\*.*
  313. X    del cmodel\*.*
  314. X    del mmodel\*.*
  315. X    del lmodel\*.*
  316. X    rmdir smodel
  317. X    rmdir cmodel
  318. X    rmdir mmodel
  319. X    rmdir lmodel
  320. FRIDAY_NIGHT
  321. echo extracting - README.NOW
  322. sed 's/^X//' > README.NOW << 'FRIDAY_NIGHT'
  323. X               PCCURSES v.1.0 Release Notes - 870824
  324. X    ===================================================
  325. X
  326. X
  327. X
  328. X  This is the release notes for the PCcurses v.1.0 cursor/window control
  329. Xpackage. PCcurses offers the functionality of UNIX curses, plus some
  330. Xextras. Normally it should be possible to port curses-based programs from
  331. XUNIX curses to PCcurses on the IBM PC without changes. PCcurses is a port/
  332. Xrewrite of Pavel Curtis' public domain 'ncurses' package. All the code has
  333. Xbeen re-written - it is not just an edit of ncurses (or UNIX curses). I
  334. Xmention this to clarify any copyright violation claims. The data struc-
  335. Xtures and ideas are very similar to ncurses. As for UNIX curses, I have
  336. Xnot even seen any sources for it.
  337. X
  338. X For an introduction to the use of 'curses' and it's derivatives, you
  339. Xshould read 'Screen Updating and Cursor Movement Optimization: A Library
  340. XPackage' by Kenneth C. R. C. Arnold, which describes the original Berkely
  341. XUNIX version of curses. It is available as part of the UNIX manuals. The
  342. Xother source of information is 'The Ncurses Reference Manual' by Pavel
  343. XCurtis. The latter is part of Curtis' ncurses package.
  344. X
  345. X  The only other documentation provided is a 'man' page which describes
  346. Xall the included functions in a very terse way. In the sources, each
  347. Xfunction is preceded by a rather thourough description of what the
  348. Xfunction does. I didn't have time to write a nice manual/tutorial - sorry.
  349. X
  350. X  PCcurses is released as a number of source files, a man page, and a make
  351. Xfile. A uuencoded copy of a 'make' utility, and a manpage for the 'make' is
  352. Xalso provided to make it easier to put together PCcurses libraries. Even if
  353. Xyou are not interested in PCcurses, it may be worthwhile to grab the make.
  354. X
  355. X  The makefile assumes the presence of the MicroSoft 'C' compiler (3.0 or
  356. X4.0), MicroSoft MASM and LIB, plus some MS-DOS utilities. The reason for
  357. Xsupplying MAKE.EXE is that the MicroSoft 'MAKE:s' are much inferior to a
  358. Xreal UNIX make. The supplied make is a port of a public domain make, pub-
  359. Xlished on UseNet. It is almost completely compatible with UNIX make. When
  360. Xgenerating the curses libraries, the makefile will direct make to do some
  361. Xdirectory creating and file copying, and then re-invoke itself with new
  362. Xtargets. The workings of the makefile are not absolutely crystal clear at
  363. Xfirst sight... just start it and see what it does.
  364. X
  365. X  For portability, the curses libraries depend on one assembler file for
  366. Xaccess to the BIOS routines. There is no support for the EGA, but both
  367. XCGA, MGA, and the HGA can be used. The libraries are originally for Micro-
  368. XSoft 'C', but all C modules should be portable right away. In the assembler
  369. Xfile, segment names probably need to be changed, and possibly the parameter
  370. Xpassing scheme. I think Turbo C will work right away - as far as I under-
  371. Xstand, all it's conventions are compatible with MicroSoft C.
  372. X
  373. X  There are some parts left out between ncurses and PCcurses. One is the
  374. Xsupport for multiple terminals - not very interesting on a PC anyway. Be-
  375. Xcause we KNOW what terminal we have, there is no need for a termcap or
  376. Xtermio library. PCcurses also has some things that neither curses nor
  377. Xncurses have. Compared to the original UNIX curses, PCcurses has lots
  378. Xof extras.
  379. X
  380. X  The BIOS routines are used directly, which gives fast screen updates.
  381. XPCcurses does not do direct writes to screen RAM - in my opinion it is
  382. Xa bit ugly to rely that much on hardware compatibility. Anyone could fix
  383. Xthat, of course...
  384. X
  385. X  One of the more serious problems with PCcurses is the way in which nor-
  386. Xmal, cbreak, and raw input modes are done. All those details are in the
  387. X'charget' module - I do raw I/O via the BIOS, and perform any buffering
  388. Xmyself. If an application program uses PCcurses, it should do ALL it's
  389. XI/O via PCcurses calls, otherwise the mix of normal and PCcurses I/O may
  390. Xmess up the display. I think my code is reasonable... comments are welcome,
  391. Xprovided you express them nicely...
  392. X
  393. X  To install, copy all files to a work directory, edit 'makefile' to define
  394. Xthe standard include and library file directory names of your choice (these
  395. Xdirectories must exist already, and their path names must be relative to the
  396. Xroot directory, not to the current one). You must also run uudecode on
  397. Xmake.uu, to generate MAKE.EXE. You can do that on your PC, if you have
  398. Xuudecode there, otherwise you can do it under UNIX and do a binary transfer
  399. Xto the PC. When you have MAKE.EXE in your work directory (or in your /bin
  400. Xdirectory), type make.
  401. X
  402. X  Make will now create 4 sub-directories (one for each memory model), copy
  403. Xsome assembler include files into them, copy two include files to your
  404. Xinclude directory, CHDIR to each sub-directory and re-invoke itself with
  405. Xother make targets to compile and assemble all the source files into the
  406. Xappropriate directories. Then the library manager is run to create the
  407. Xlibrary files in your desired library directory. Presto!
  408. X
  409. X  If you only want to generate a library for one memory model, type 'make
  410. Xsmall', 'make large', etc. The name of the memory model must be in lower
  411. Xcase, like in the makefile.
  412. X
  413. X  I think the package is fairly well debugged - but then again, that's
  414. Xwhat I always think. It was completed in May-87, and no problems found
  415. Xyet. Now it's your turn... Comments, suggestions and bug reports and
  416. Xfixes (no flames please) to
  417. X
  418. XBjorn Larsson
  419. XINFOVOX AB
  420. XBox 2503                (...seismo!mcvax!enea!infovax!bl)
  421. XS-171 02 Solna
  422. XSWEDEN
  423. FRIDAY_NIGHT
  424. echo extracting - attrib.c
  425. sed 's/^X//' > attrib.c << 'FRIDAY_NIGHT'
  426. X/****************************************************************/
  427. X/* Character attribute routines of the PCcurses package        */
  428. X/*                                */
  429. X/****************************************************************/
  430. X/* This version of curses is based on ncurses, a curses version    */
  431. X/* originally written by Pavel Curtis at Cornell University.    */
  432. X/* I have made substantial changes to make it run on IBM PC's,    */
  433. X/* and therefore consider myself free make it public domain.    */
  434. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  435. X/****************************************************************/
  436. X/* 1.0:    Release:                    870515    */
  437. X/****************************************************************/
  438. X
  439. X#include <curses.h>
  440. X#include <curspriv.h>
  441. X
  442. X/****************************************************************/
  443. X/* Wattrset() sets the attributes as specified in window 'win'.    */
  444. X/****************************************************************/
  445. X
  446. Xvoid wattrset(win,attrs)
  447. X  WINDOW    *win;
  448. X  int         attrs;
  449. X  {
  450. X  win->_attrs = attrs & ATR_MSK;
  451. X  } /* wattrset */
  452. X
  453. X/****************************************************************/
  454. X/* Wattron() sets the specified attribute(s) in window 'win'.    */
  455. X/****************************************************************/
  456. X
  457. Xvoid    wattron(win,attrs)
  458. X  WINDOW    *win;
  459. X  int         attrs;
  460. X  {
  461. X  win->_attrs |= (attrs & ATR_MSK);
  462. X  } /* wattron */
  463. X
  464. X/****************************************************************/
  465. X/* Wattroff() clears the specified attribute(s) in window    */
  466. X/* 'win'.                            */
  467. X/****************************************************************/
  468. X
  469. Xvoid    wattroff(win,attrs)
  470. X  WINDOW    *win;
  471. X  int         attrs;
  472. X  {
  473. X  win->_attrs &= (~attrs & ATR_MSK);
  474. X  } /* wattroff */
  475. X
  476. X/****************************************************************/
  477. X/* Wstandout() starts standout mode in window 'win'.        */
  478. X/****************************************************************/
  479. X
  480. Xvoid    wstandout(win)
  481. X  WINDOW    *win;
  482. X  {
  483. X  win->_attrs = A_STANDOUT;
  484. X  } /* wstandout */
  485. X
  486. X/****************************************************************/
  487. X/* Wstandend() clears all special attributes in window 'win'.    */
  488. X/****************************************************************/
  489. X
  490. Xvoid    wstandend(win)
  491. X  WINDOW    *win;
  492. X  {
  493. X  win->_attrs = ATR_NRM;
  494. X  } /* wstandend */
  495. X
  496. X/****************************************************************/
  497. X/* Attrset() sets the attributes as specified in stdscr.    */
  498. X/****************************************************************/
  499. X
  500. Xvoid    attrset(attrs)
  501. X  int attrs;
  502. X  {
  503. X  stdscr->_attrs = attrs & ATR_MSK;
  504. X  } /* attrset */
  505. X
  506. X/****************************************************************/
  507. X/* Attron() sets the specified attribute(s) in stdscr.        */
  508. X/****************************************************************/
  509. X
  510. Xvoid    attron(attrs)
  511. X  int         attrs;
  512. X  {
  513. X  stdscr->_attrs |= (attrs & ATR_MSK);
  514. X  } /* attron */
  515. X
  516. X/****************************************************************/
  517. X/* Attroff() clears the specified attribute(s) in stdscr.    */
  518. X/****************************************************************/
  519. X
  520. Xvoid    attroff(attrs)
  521. X  int         attrs;
  522. X  {
  523. X  stdscr->_attrs &= (~attrs & ATR_MSK);
  524. X  } /* attroff */
  525. X
  526. X/****************************************************************/
  527. X/* Standout() starts standout mode in stdscr.            */
  528. X/****************************************************************/
  529. X
  530. Xvoid    standout()
  531. X  {
  532. X  stdscr->_attrs = A_STANDOUT;
  533. X  } /* standout */
  534. X
  535. X/****************************************************************/
  536. X/* Standend() clears all special attributes in stdscr.        */
  537. X/****************************************************************/
  538. X
  539. Xvoid    standend()
  540. X  {
  541. X  stdscr->_attrs = ATR_NRM;
  542. X  } /* standend */
  543. FRIDAY_NIGHT
  544. echo extracting - beep.c
  545. sed 's/^X//' > beep.c << 'FRIDAY_NIGHT'
  546. X/****************************************************************/
  547. X/*                                */
  548. X/* Beep() and flash() routines of the PCcurses package        */
  549. X/*                                */
  550. X/****************************************************************/
  551. X/* This version of curses is based on ncurses, a curses version    */
  552. X/* originally written by Pavel Curtis at Cornell University.    */
  553. X/* I have made substantial changes to make it run on IBM PC's,    */
  554. X/* and therefore consider myself free to make it public domain.    */
  555. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  556. X/****************************************************************/
  557. X/* 1.0:    Release:                    870515    */
  558. X/****************************************************************/
  559. X
  560. X#include <curses.h>
  561. X#include <curspriv.h>
  562. X
  563. X/****************************************************************/
  564. X/* Beep() sounds the terminal bell.                */
  565. X/****************************************************************/
  566. X
  567. Xvoid    beep()
  568. X  {
  569. X  _cursesputc('\007',0);
  570. X  } /* beep */
  571. X
  572. X/****************************************************************/
  573. X/* Flash() flashes the terminal screen.                */
  574. X/****************************************************************/
  575. X
  576. Xvoid    flash()
  577. X  {
  578. X  int i;
  579. X
  580. X  _cursesscroll(0,0,LINES-1,COLS-1,0,0x70);
  581. X  for (i=0;i<10000;)
  582. X    i++;
  583. X  _cursesscroll(0,0,LINES-1,COLS-1,0,0x0);
  584. X  wrefresh(curscr);
  585. X  } /* flash */
  586. FRIDAY_NIGHT
  587. echo extracting - boxes.c
  588. sed 's/^X//' > boxes.c << 'FRIDAY_NIGHT'
  589. X/****************************************************************/
  590. X/* Box() routines of the PCcurses package            */
  591. X/*                                */
  592. X/****************************************************************/
  593. X/* This version of curses is based on ncurses, a curses version    */
  594. X/* originally written by Pavel Curtis at Cornell University.    */
  595. X/* I have made substantial changes to make it run on IBM PC's,    */
  596. X/* and therefore consider myself free to make it public domain.    */
  597. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  598. X/****************************************************************/
  599. X/* 1.0:    Release:                    870515    */
  600. X/****************************************************************/
  601. X
  602. X#include <curses.h>
  603. X#include <curspriv.h>
  604. X
  605. X/****************************************************************/
  606. X/* wbox(win,ymin,xmin,ymax,xmax,v,h) draws a box in window    */
  607. X/* 'win', enclosing the area xmin-xmax and ymin-xmax. If    */
  608. X/* xmax and/or ymax is 0, the window max value is used. 'v' and    */
  609. X/* 'h' are the vertical and horizontal characters to use. If    */
  610. X/* 'v' and 'h' are PC grapics lines, wbox will make the corners    */
  611. X/* in a pretty way.                        */
  612. X/****************************************************************/
  613. X
  614. Xint    wbox(win,ymin,xmin,ymax,xmax,v,h)
  615. X  WINDOW    *win;
  616. X  int         ymin;
  617. X  int         xmin;
  618. X  int         ymax;
  619. X  int         xmax;
  620. X  char         v;
  621. X  char         h;
  622. X  {
  623. X  static int     vc,hc,ulc,urc,llc,lrc;    /* corner chars */
  624. X  int         i;
  625. X
  626. X  if (ymax == 0)
  627. X    ymax = win->_maxy;
  628. X  if (xmax == 0)
  629. X    xmax = win->_maxx;
  630. X
  631. X  if (ymin >= win->_maxy || ymax > win->_maxy ||
  632. X      xmin >= win->_maxx || xmax > win->_maxx ||
  633. X      ymin >= ymax || xmin >= xmax
  634. X     )
  635. X     return(ERR);
  636. X
  637. X  vc = v;
  638. X  hc = h;
  639. X  vc &= 0xff;                /* get rid of sign-extended int */
  640. X  hc &= 0xff;
  641. X  ulc = urc = llc = lrc = vc;        /* default same as vertical */
  642. X
  643. X  if (vc == 0xba)            /* vertical double bars */
  644. X    {
  645. X    if (hc == 0xcd)            /* horizontal too? */
  646. X      {
  647. X      ulc = 0xc9;            /* use double bar corners */
  648. X      urc = 0xbb;
  649. X      llc = 0xc8;
  650. X      lrc = 0xbc;
  651. X      } /* if */
  652. X    else
  653. X      {
  654. X      ulc = 0xd6;            /* use hor-s vert-d corners */
  655. X      urc = 0xb7;
  656. X      llc = 0xd3;
  657. X      lrc = 0xbd;
  658. X      } /* else */
  659. X    } /* if */
  660. X
  661. X  if (vc == 0xb3)            /* vertical single bars */
  662. X    {
  663. X    if (hc == 0xcd)            /* horizontal double bars */
  664. X      {
  665. X      ulc = 0xd5;
  666. X      urc = 0xb8;
  667. X      llc = 0xd4;
  668. X      lrc = 0xbe;
  669. X      } /* if */
  670. X    else                /* use hor-s vert-s bars */
  671. X      {
  672. X      ulc = 0xda;
  673. X      urc = 0xbf;
  674. X      llc = 0xc0;
  675. X      lrc = 0xd9;
  676. X      } /* else */
  677. X    } /* if */
  678. X  
  679. X  for (i = xmin+1;i <= xmax-1;i++)
  680. X    {
  681. X    win->_line[ymin][i] = hc | win->_attrs;
  682. X    win->_line[ymax][i] = hc | win->_attrs;
  683. X    }
  684. X  for (i = ymin+1;i <= ymax-1;i++)
  685. X    {
  686. X    win->_line[i][xmin] = vc | win->_attrs;
  687. X    win->_line[i][xmax] = vc | win->_attrs;
  688. X    }
  689. X  win->_line[ymin][xmin] = ulc | win->_attrs;
  690. X  win->_line[ymin][xmax] = urc | win->_attrs;
  691. X  win->_line[ymax][xmin] = llc | win->_attrs;
  692. X  win->_line[ymax][xmax] = lrc | win->_attrs;
  693. X
  694. X  for (i=ymin; i <= ymax ; i++)
  695. X    {
  696. X    if (win->_minchng[i] == _NO_CHANGE)
  697. X      {
  698. X      win->_minchng[i] = xmin;
  699. X      win->_maxchng[i] = xmax;
  700. X      } /* if */
  701. X    else
  702. X      {
  703. X      win->_minchng[i] = min(win->_minchng[i], xmin);
  704. X      win->_maxchng[i] = max(win->_maxchng[i], xmax);
  705. X      } /* else */
  706. X    } /* for */
  707. X  return(OK);
  708. X  } /* box */
  709. X
  710. X/****************************************************************/
  711. X/* box(win,v,h) draws a box around window window 'win'. 'v' and    */
  712. X/* 'h' are the vertical and horizontal characters to use.    */
  713. X/****************************************************************/
  714. X
  715. Xvoid    box(win,vc,hc)
  716. X  WINDOW    *win;
  717. X  char         vc;
  718. X  char         hc;
  719. X  {
  720. X  wbox(win,0,0,0,0,vc,hc);
  721. X  } /* box */
  722. FRIDAY_NIGHT
  723. echo extracting - charadd.c
  724. sed 's/^X//' > charadd.c << 'FRIDAY_NIGHT'
  725. X/****************************************************************/
  726. X/* Addch() routines of the PCcurses package            */
  727. X/*                                */
  728. X/****************************************************************/
  729. X/* This version of curses is based on ncurses, a curses version    */
  730. X/* originally written by Pavel Curtis at Cornell University.    */
  731. X/* I have made substantial changes to make it run on IBM PC's,    */
  732. X/* and therefore consider myself free to make it public domain.    */
  733. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  734. X/****************************************************************/
  735. X/* 1.0:    Release:                    870515    */
  736. X/****************************************************************/
  737. X
  738. X#include <curses.h>
  739. X#include <curspriv.h>
  740. X
  741. X/****************************************************************/
  742. X/* Newline() does line advance and returns the new cursor line.    */
  743. X/* If error, return -1.                        */
  744. X/****************************************************************/
  745. X
  746. Xstatic    short    newline(win, lin)
  747. X  WINDOW    *win;
  748. X  short      lin;
  749. X  {
  750. X  if (++lin > win->_regbottom)
  751. X    {
  752. X    lin--;
  753. X    if (win->_scroll)
  754. X      scroll(win);
  755. X    else
  756. X      return(-1);
  757. X    } /* if */
  758. X  return(lin);
  759. X  } /* newline */
  760. X
  761. X/****************************************************************/
  762. X/* Waddch() inserts character 'c' at the current cursor posi-    */
  763. X/* tion in window 'win', and takes any actions as dictated by    */
  764. X/* the character.                        */
  765. X/****************************************************************/
  766. X
  767. Xint waddch(win, c)
  768. X  register WINDOW    *win;
  769. X  char             c;
  770. X  {
  771. X  short    x = win->_curx;
  772. X  short    y = win->_cury;
  773. X  short    newx;
  774. X  int    ch = c;
  775. X  int      ts = win->_tabsize;
  776. X
  777. X  ch &= 0xff;            /* kill any sing-extend */
  778. X  if (y > win->_maxy  ||  x > win->_maxx  ||  y < 0  ||  x < 0)
  779. X    return(ERR);
  780. X  switch (ch)
  781. X    {
  782. X    case '\t':    for (newx = ((x/ts) + 1) * ts; x < newx; x++)
  783. X          {
  784. X          if (waddch(win, ' ') == ERR)
  785. X            return(ERR);
  786. X          if (win->_curx == 0)        /* if tab to next line */
  787. X            return(OK);            /* exit the loop */
  788. X          } /* for */
  789. X        return(OK);
  790. X    case '\n':    if (_cursvar.autocr && !(_cursvar.raw)) /* if lf -> crlf */
  791. X          x = 0;
  792. X        if ((y = newline(win, y)) < 0)
  793. X          return(ERR);
  794. X        break;
  795. X    case '\r':    x = 0;
  796. X        break;
  797. X    case '\b':    if (--x < 0)            /* no back over left margin */
  798. X          x = 0;
  799. X        break;
  800. X    case 0x7f:    if (waddch(win,'^') == ERR)
  801. X          return(ERR);
  802. X        return(waddch(win,'?'));
  803. X    default:    if (ch < ' ')            /* handle control chars */
  804. X          {
  805. X          if (waddch(win,'^') == ERR)
  806. X            return(ERR);
  807. X          return(waddch(win,c + '@'));
  808. X          } /* if */
  809. X        ch |= (win->_attrs & ATR_MSK);
  810. X        if (win->_line[y][x] != ch)    /* only if data change */
  811. X          {
  812. X          if (win->_minchng[y] == _NO_CHANGE)
  813. X            win->_minchng[y] = win->_maxchng[y] = x;
  814. X          else
  815. X            if (x < win->_minchng[y])
  816. X              win->_minchng[y] = x;
  817. X            else
  818. X              if (x > win->_maxchng[y])
  819. X            win->_maxchng[y] = x;
  820. X          } /* if */
  821. X        win->_line[y][x++] = ch;
  822. X        if (x > win->_maxx)        /* wrap around test */
  823. X          {
  824. X          x = 0;
  825. X          if ((y = newline(win, y)) < 0)
  826. X            return(ERR);
  827. X          } /* if */
  828. X        break;
  829. X    } /* switch */
  830. X  win->_curx = x;
  831. X  win->_cury = y;
  832. X  return(OK);
  833. X  } /* waddch */
  834. X
  835. X/****************************************************************/
  836. X/* Addch() inserts character 'c' at the current cursor posi-    */
  837. X/* tion in stdscr, and takes any actions as dictated by the    */
  838. X/* character.                            */
  839. X/****************************************************************/
  840. X
  841. Xint addch(c)
  842. X  char     c;
  843. X  {
  844. X  return (waddch(stdscr,c));
  845. X  } /* addch */
  846. X
  847. X/****************************************************************/
  848. X/* Mvaddch() moves to position in stdscr, then inserts charac-    */
  849. X/* ter 'c' at that point, and takes any actions as dictated by    */
  850. X/* the character.                        */
  851. X/****************************************************************/
  852. X
  853. Xint mvaddch(y,x,c)
  854. X  int     x;
  855. X  int     y;
  856. X  char     c;
  857. X  {
  858. X  if (wmove(stdscr,y,x) == ERR)
  859. X    return(ERR);
  860. X  return (waddch(stdscr,c));
  861. X  } /* mvaddch */
  862. X
  863. X/****************************************************************/
  864. X/* Mvwaddch() moves to position in window 'win', then inserts    */
  865. X/* character 'c' at that point in the window, and takes any    */
  866. X/* actions as dictated by the character.            */
  867. X/****************************************************************/
  868. X
  869. Xint mvwaddch(win,y,x,c)
  870. X  WINDOW *win;
  871. X  int      x;
  872. X  int      y;
  873. X  char      c;
  874. X  {
  875. X  if (wmove(win,y,x) == ERR)
  876. X    return(ERR);
  877. X  return (waddch(win,c));
  878. X  } /* mvwaddch */
  879. FRIDAY_NIGHT
  880. echo extracting - chardel.c
  881. sed 's/^X//' > chardel.c << 'FRIDAY_NIGHT'
  882. X/****************************************************************/
  883. X/* Wdelch() routine of the PCcurses package            */
  884. X/*                                */
  885. X/****************************************************************/
  886. X/* This version of curses is based on ncurses, a curses version    */
  887. X/* originally written by Pavel Curtis at Cornell University.    */
  888. X/* I have made substantial changes to make it run on IBM PC's,    */
  889. X/* and therefore consider myself free to make it public domain.    */
  890. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  891. X/****************************************************************/
  892. X/* 1.0:    Release:                    870515    */
  893. X/****************************************************************/
  894. X
  895. X#include <curses.h>
  896. X#include <curspriv.h>
  897. X
  898. X/****************************************************************/
  899. X/* Wdelch() deletes the character at the window cursor, and the    */
  900. X/* characters to the right of it are shifted left, inserting a    */
  901. X/* space at the last position of the line.            */
  902. X/****************************************************************/
  903. X
  904. Xint    wdelch(win)
  905. X  WINDOW    *win;
  906. X  {
  907. X  int        *temp1;
  908. X  int        *temp2;
  909. X  int        *end;
  910. X  short     y = win->_cury;
  911. X  short     x = win->_curx;
  912. X  short     maxx = win->_maxx;
  913. X
  914. X  end = &win->_line[y][maxx];
  915. X  temp1 = &win->_line[y][x];
  916. X  temp2 = temp1 + 1;
  917. X  while (temp1 < end)
  918. X    *temp1++ = *temp2++;
  919. X  *temp1 = ' ' | (win->_attrs & ATR_MSK);
  920. X  win->_maxchng[y] = maxx;
  921. X  if (win->_minchng[y] == _NO_CHANGE || win->_minchng[y] > x)
  922. X    win->_minchng[y] = x;
  923. X  return(OK);
  924. X  } /* wdelch */
  925. X
  926. X/****************************************************************/
  927. X/* Delch() deletes the character at the stdscr cursor, and the    */
  928. X/* characters to the right of it are shifted left, inserting a    */
  929. X/* space at the last position of the line.            */
  930. X/****************************************************************/
  931. X
  932. Xint delch()
  933. X  {
  934. X  return(wdelch(stdscr));
  935. X  } /* delch */
  936. X
  937. X/****************************************************************/
  938. X/* Mvdelch() moves the stdscr cursor to a new position, then    */
  939. X/* deletes the character at the stdscr cursor, and the charac-    */
  940. X/* ters to the right of it are shifted left, inserting a space    */
  941. X/* at the last position of the line.                */
  942. X/****************************************************************/
  943. X
  944. Xint mvdelch(y,x)
  945. X  int y;
  946. X  int x;
  947. X  {
  948. X  if (wmove(stdscr,y,x) == ERR)
  949. X    return(ERR);
  950. X  return(wdelch(stdscr));
  951. X  } /* mvdelch */
  952. X
  953. X/****************************************************************/
  954. X/* Mvwdelch() moves the cursor of window 'win' to a new posi-    */
  955. X/* tion, then deletes the character at the stdscr cursor, and    */
  956. X/* the characters to the right of it are shifted left, inser-    */
  957. X/* ting a space at the last position of the line.        */
  958. X/****************************************************************/
  959. X
  960. Xint mvwdelch(win,y,x)
  961. X  WINDOW *win;
  962. X  int y;
  963. X  int x;
  964. X  {
  965. X  if (wmove(win,y,x) == ERR)
  966. X    return(ERR);
  967. X  return(wdelch(win));
  968. X  } /* mvwdelch */
  969. FRIDAY_NIGHT
  970. echo extracting - charget.c
  971. sed 's/^X//' > charget.c << 'FRIDAY_NIGHT'
  972. X/****************************************************************/
  973. X/* Getch() routines of the PCcurses package            */
  974. X/*                                */
  975. X/****************************************************************/
  976. X/* This version of curses is based on ncurses, a curses version    */
  977. X/* originally written by Pavel Curtis at Cornell University.    */
  978. X/* I have made substantial changes to make it run on IBM PC's,    */
  979. X/* and therefore consider myself free to make it public domain.    */
  980. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  981. X/****************************************************************/
  982. X/* 1.0:    Release:                    870515    */
  983. X/****************************************************************/
  984. X
  985. X#include <curses.h>
  986. X#include <curspriv.h>
  987. X
  988. Xstatic    int    rawgetch();        /* get raw char via BIOS */
  989. Xstatic    int    sysgetch();        /* get char via system */
  990. Xstatic    int    validchar();        /* keypad xlate and char check */
  991. X
  992. Xstatic    int    buffer[_INBUFSIZ];    /* character buffer */
  993. Xstatic    int    pindex = 0;        /* putter index */
  994. Xstatic    int    gindex = 1;        /* getter index */
  995. Xstatic    WINDOW *w;            /* to reduce stack usage */
  996. Xstatic    int    ungind = 0;        /* wungetch() push index */
  997. Xstatic    int    ungch[NUNGETCH];    /* array of ungotten chars */
  998. X
  999. X/* table for key code translation of function keys in keypad mode */
  1000. X/* These values are for strict IBM keyboard compatibles only */
  1001. X
  1002. Xstatic    int    kptab[] =
  1003. X  {
  1004. X  0x3b,KEY_F(1),  0x3c,KEY_F(2),  0x3d,KEY_F(3),  0x3e,KEY_F(4),
  1005. X  0x3f,KEY_F(5),  0x40,KEY_F(6),  0x41,KEY_F(7),  0x42,KEY_F(8),
  1006. X  0x43,KEY_F(9),  0x44,KEY_F(10), 0x47,KEY_HOME,  0x48,KEY_UP,
  1007. X  0x49,KEY_PPAGE, 0x4b,KEY_LEFT,  0x4d,KEY_RIGHT, 0x4f,KEY_LL,
  1008. X  0x50,KEY_DOWN,  0x51,KEY_NPAGE, 0x52,KEY_IC,    0x53,KEY_DC,
  1009. X  0x54,KEY_F(11), 0x55,KEY_F(12), 0x56,KEY_F(13), 0x57,KEY_F(14),
  1010. X  0x58,KEY_F(15), 0x59,KEY_F(16), 0x5a,KEY_F(17), 0x5b,KEY_F(18),
  1011. X  0x5c,KEY_F(19), 0x5d,KEY_F(20), 0x5e,KEY_F(21), 0x5f,KEY_F(22),
  1012. X  0x60,KEY_F(23), 0x61,KEY_F(24), 0x62,KEY_F(25), 0x63,KEY_F(26),
  1013. X  0x64,KEY_F(27), 0x65,KEY_F(28), 0x66,KEY_F(29), 0x67,KEY_F(30),
  1014. X  0x73,KEY_LEFT,  0x74,KEY_RIGHT,  0x75,KEY_LL,   0x76,KEY_NPAGE,
  1015. X  0x77,KEY_HOME,  0x84,KEY_PPAGE,  0x100,        -1
  1016. X  };
  1017. X
  1018. X
  1019. X/****************************************************************/
  1020. X/* Wgetch(win) gets a character from the terminal, in normal,    */
  1021. X/* cbreak or raw mode, optionally echoing to window  'win'.    */
  1022. X/****************************************************************/
  1023. X
  1024. Xint wgetch(win)
  1025. X  WINDOW    *win;
  1026. X  {
  1027. X  int key;
  1028. X  int cbr;
  1029. X
  1030. X  if (ungind)                    /* if ungotten char exists */
  1031. X    return(ungch[--ungind]);            /* remove and return it */
  1032. X
  1033. X  if ((!_cursvar.raw) && (!_cursvar.cbreak))    /* if normal */
  1034. X    if (gindex < pindex)            /* and data in buffer */
  1035. X      return(buffer[gindex++]);
  1036. X
  1037. X  w = win;                    /* static for speed & stack */
  1038. X  pindex = 0;                    /* prepare to buffer data */
  1039. X  gindex = 0;
  1040. X  while(1)                    /* loop for any buffering */
  1041. X    {
  1042. X    if (_cursvar.raw)                /* get a raw character */
  1043. X      key = rawgetch();
  1044. X    else                    /* get a system character */
  1045. X      {
  1046. X      cbr = _cursesgcb();            /* get ^BREAK status */
  1047. X      _cursesscb(_cursvar.orgcbr);        /* if break return proper */
  1048. X      key = sysgetch();
  1049. X      _cursesscb(cbr);                /* restore as it was */
  1050. X      }
  1051. X    if (w->_nodelay && (key == -1))        /* if nodelay and no char */
  1052. X      return(-1);
  1053. X    if ((key == '\r') && _cursvar.autocr && !_cursvar.raw) /* translate cr */
  1054. X      key = '\n';
  1055. X    if (_cursvar.echo && (key < 0x100))        /* check if echo */
  1056. X      {
  1057. X      waddch(w,key);
  1058. X      wrefresh(w);
  1059. X      }
  1060. X    if (_cursvar.raw || _cursvar.cbreak)    /* if no buffering */
  1061. X      return(key);
  1062. X    if (pindex < _INBUFSIZ-2)            /* if no overflow, */
  1063. X      buffer[pindex++] = key;            /* put data in buffer */
  1064. X    if ((key == '\n') || (key == '\r'))        /* if we got a line */
  1065. X      return(buffer[gindex++]);
  1066. X    } /* while */
  1067. X  } /* wgetch */
  1068. X
  1069. X/****************************************************************/
  1070. X/* Flushinp() kills any pending input characters.        */
  1071. X/****************************************************************/
  1072. X
  1073. Xvoid flushinp()
  1074. X  {
  1075. X  while(_curseskeytst)            /* empty keyboard buffer */
  1076. X    _curseskey();
  1077. X  while(kbhit())            /* empty system's buffers */
  1078. X    getch();
  1079. X  gindex = 1;                /* set indices to kill buffer */
  1080. X  pindex = 0;
  1081. X  ungind = 0;                /* clear ungch array */
  1082. X  } /* flushinp */
  1083. X
  1084. X/****************************************************************/
  1085. X/* Wungetch() pushes back it's argument on the input stream. If    */
  1086. X/* OK, returns 1, otherwise returns 0.                */
  1087. X/****************************************************************/
  1088. X
  1089. Xint    wungetch(ch)
  1090. X  int     ch;
  1091. X  {
  1092. X  if (ungind >= NUNGETCH)        /* pushback stack full */
  1093. X    return(0);
  1094. X  ungch[ungind++] = ch;
  1095. X  return(1);
  1096. X  } /* wungetch() */
  1097. X
  1098. X/****************************************************************/
  1099. X/* Mvgetch() first moves the stdscr cursor to a new location,    */
  1100. X/* then does a wgetch() on stdscr.                */
  1101. X/****************************************************************/
  1102. X
  1103. Xint    mvgetch(y,x)
  1104. X  int y;
  1105. X  int x;
  1106. X  {
  1107. X  wmove(stdscr,y,x);
  1108. X  wgetch(stdscr);
  1109. X  } /* mvgetch */
  1110. X
  1111. X/****************************************************************/
  1112. X/* Mvwgetch() first moves the cursor of window 'win' to a new    */
  1113. X/* location, then does a wgetch() in 'win'.            */
  1114. X/****************************************************************/
  1115. X
  1116. Xint mvwgetch(win,y,x)
  1117. X  WINDOW *win;
  1118. X  int y;
  1119. X  int x;
  1120. X  {
  1121. X  wmove(win,y,x);
  1122. X  wgetch(win);
  1123. X  } /* mvwgetch */
  1124. X
  1125. X/****************************************************************/
  1126. X/* rawgetch() gets a character without any interpretation at    */
  1127. X/* all and returns it. If keypad mode is active for the desig-    */
  1128. X/* nated window, function key translation will be performed.    */
  1129. X/* Otherwise, function keys are ignored.If nodelay mode is    */
  1130. X/* active in the window, then rawgetch() returns -1 if no cha-    */
  1131. X/* racter is available.                        */
  1132. X/****************************************************************/
  1133. X
  1134. Xstatic int rawgetch()
  1135. X  {
  1136. X  int c;
  1137. X
  1138. X  if (w->_nodelay && !_curseskeytst())
  1139. X    return(-1);
  1140. X  while(1)                      /* loop to get valid char */
  1141. X    {
  1142. X    if ((c = validchar(_curseskey())) >= 0)
  1143. X      return(c);
  1144. X    } /* while */
  1145. X  } /* rawgetch */
  1146. X
  1147. X/****************************************************************/
  1148. X/* Sysgetch() gets a character with normal ^S, ^Q, ^P and ^C    */
  1149. X/* interpretation and returns it. If keypad mode is active for    */
  1150. X/* the designated window, function key translation will be per-    */
  1151. X/* formed. Otherwise, function keys are ignored. If nodelay    */
  1152. X/* mode is active in the window, then sysgetch() returns -1 if    */
  1153. X/* no character is available.                    */
  1154. X/****************************************************************/
  1155. X#undef getch                    /* we use MSC getch() below */
  1156. X
  1157. Xstatic int sysgetch()
  1158. X  {
  1159. X  int c;
  1160. X
  1161. X  if (w->_nodelay && !kbhit())
  1162. X    return(-1);
  1163. X  while(1)
  1164. X    {
  1165. X    c = getch();
  1166. X    if (c)                    /* if not a function key */
  1167. X      return(c & 0xff);                /* avoids sign-extending */
  1168. X    c = getch();
  1169. X    if ((c = validchar(c << 8)) >= 0)        /* get & check next char */
  1170. X      return(c);
  1171. X    } /* while */
  1172. X  } /* sysgetch */
  1173. X
  1174. X/****************************************************************/
  1175. X/* Validchar(c) chacks that 'c' is a valid character, and    */
  1176. X/* if so returns it, with function key translation applied if    */
  1177. X/* 'w' has keypad mode set. If char is invalid, returns -1.    */
  1178. X/****************************************************************/
  1179. X
  1180. Xstatic int validchar(c)
  1181. X  int    c;
  1182. X  {
  1183. X  int *scanp;
  1184. X
  1185. X  if (c == 0x0300)            /* special case, ^@ = NULL */
  1186. X    return(0);
  1187. X  if (!(c & 0xff00))            /* normal character */
  1188. X    return(c);
  1189. X  if (!(w->_keypad))            /* skip f keys if not keypad mode */
  1190. X    return(-1);
  1191. X  c = (c >> 8) & 0xff;
  1192. X  scanp = kptab;
  1193. X  while(*scanp <= c)            /* search for value */
  1194. X    {                    /* (stops on table entry 0x100) */
  1195. X    if (*scanp++ == c)
  1196. X      return(*scanp);            /* found, return it */
  1197. X    scanp++;
  1198. X    }
  1199. X  return(-1);                /* not found, invalid */
  1200. X  } /* validchar */
  1201. X
  1202. X/****************************************************************/
  1203. X/* _cursespendch() returns 1 if there is any character avai-    */
  1204. X/* lable, and 0 if there is none. this is not for programmer    */
  1205. X/* usage, but for the updatew routines.                */
  1206. X/****************************************************************/
  1207. X
  1208. Xbool    _cursespendch()
  1209. X  {
  1210. X  if (ungind)                /* ungotten char */
  1211. X    return(TRUE);
  1212. X  if (pindex > gindex)            /* buffered char */
  1213. X    return(TRUE);
  1214. X  if (_cursvar.raw)            /* raw mode test */
  1215. X    return(_curseskeytest());
  1216. X  return(kbhit());            /* normal mode test */
  1217. X  } /* _cursespendch */
  1218. FRIDAY_NIGHT
  1219. echo extracting - charins.c
  1220. sed 's/^X//' > charins.c << 'FRIDAY_NIGHT'
  1221. X/****************************************************************/
  1222. X/* Winsch() routine of the PCcurses package            */
  1223. X/*                                */
  1224. X/****************************************************************/
  1225. X/* This version of curses is based on ncurses, a curses version    */
  1226. X/* originally written by Pavel Curtis at Cornell University.    */
  1227. X/* I have made substantial changes to make it run on IBM PC's,    */
  1228. X/* and therefore consider myself free to make it public domain.    */
  1229. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1230. X/****************************************************************/
  1231. X/* 1.0:    Release:                    870515    */
  1232. X/****************************************************************/
  1233. X
  1234. X#include <curses.h>
  1235. X#include <curspriv.h>
  1236. X
  1237. X/****************************************************************/
  1238. X/* Winsch() inserts character 'c' at the cursor position in    */
  1239. X/* window 'win'. The cursor is advanced.            */
  1240. X/****************************************************************/
  1241. X
  1242. Xint    winsch(win, c)
  1243. X  WINDOW    *win;
  1244. X  char    c;
  1245. X  {
  1246. X  int        *temp1;
  1247. X  int        *temp2;
  1248. X  int        *end;
  1249. X  int         x = win->_curx;
  1250. X  int         y = win->_cury;
  1251. X  int         maxx = win->_maxx;
  1252. X
  1253. X  if((c < ' ') && (c == '\n' || c == '\r' || c == '\t' || c == '\b'))
  1254. X    return(waddch(win, c));
  1255. X  end = &win->_line[y][x];
  1256. X  temp1 = &win->_line[y][maxx];
  1257. X  temp2 = temp1 - 1;
  1258. X  if(c < ' ')                 /* if CTRL-char make space for 2 */
  1259. X    temp2--;
  1260. X  while (temp1 > end)
  1261. X    *temp1-- = *temp2--;
  1262. X  win->_maxchng[y] = maxx;
  1263. X  if ((win->_minchng[y] == _NO_CHANGE) || (win->_minchng[y] > x))
  1264. X    win->_minchng[y] = x;
  1265. X  return(waddch(win, c));        /* fixes CTRL-chars too */
  1266. X  } /* winsch */
  1267. X
  1268. X/****************************************************************/
  1269. X/* Insch() inserts character 'c' at the cursor position in    */
  1270. X/* stdscr. The cursor is advanced.                */
  1271. X/****************************************************************/
  1272. X
  1273. Xint insch(c)
  1274. X  char c;
  1275. X  {
  1276. X  winsch(stdscr,c);
  1277. X  } /* insch */
  1278. X
  1279. X/****************************************************************/
  1280. X/* Mvinsch() moves the stdscr cursor to a new position, then    */
  1281. X/* inserts character 'c' at the cursor position in stdscr. The    */
  1282. X/* cursor is advanced.                        */
  1283. X/****************************************************************/
  1284. X
  1285. Xint mvinsch(y,x,c)
  1286. X  int  y;
  1287. X  int  x;
  1288. X  char c;
  1289. X  {
  1290. X  if (wmove(stdscr,y,x) == ERR)
  1291. X    return(ERR);
  1292. X  return(winsch(stdscr,c));
  1293. X  } /* mvinsch */
  1294. X
  1295. X/****************************************************************/
  1296. X/* Mvwinsch() moves the cursor of window 'win' to a new posi-    */
  1297. X/* tion, then inserts character 'c' at the cursor position in    */
  1298. X/* window 'win'. The cursor is advanced.            */
  1299. X/****************************************************************/
  1300. X
  1301. Xint mvwinsch(win,y,x,c)
  1302. X  WINDOW *win;
  1303. X  int  y;
  1304. X  int  x;
  1305. X  char c;
  1306. X  {
  1307. X  if (wmove(win,y,x) == ERR)
  1308. X    return(ERR);
  1309. X  return(winsch(win,c));
  1310. X  } /* mvwinsch */
  1311. FRIDAY_NIGHT
  1312. echo extracting - charpick.c
  1313. sed 's/^X//' > charpick.c << 'FRIDAY_NIGHT'
  1314. X/****************************************************************/
  1315. X/* Winch() routine of the PCcurses package            */
  1316. X/*                                */
  1317. X/****************************************************************/
  1318. X/* This version of curses is based on ncurses, a curses version    */
  1319. X/* originally written by Pavel Curtis at Cornell University.    */
  1320. X/* I have made substantial changes to make it run on IBM PC's,    */
  1321. X/* and therefore consider myself free to make it public domain.    */
  1322. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1323. X/****************************************************************/
  1324. X/* 1.0:    Release:                    870515    */
  1325. X/****************************************************************/
  1326. X
  1327. X#include <curses.h>
  1328. X#include <curspriv.h>
  1329. X
  1330. X/****************************************************************/
  1331. X/* Winch(win) returns the character at the current position in    */
  1332. X/* window 'win'.                        */
  1333. X/****************************************************************/
  1334. X
  1335. Xint    winch(win)
  1336. X  WINDOW    *win;
  1337. X  {
  1338. X  return((win->_line[win->_cury][win->_curx]) & 0xff);
  1339. X  } /* winch */
  1340. X
  1341. X/****************************************************************/
  1342. X/* Inch() returns the character at the current cursor position    */
  1343. X/* in stdscr.                            */
  1344. X/****************************************************************/
  1345. X
  1346. Xint inch()
  1347. X  {
  1348. X  return((stdscr->_line[stdscr->_cury][stdscr->_curx]) & 0xff);
  1349. X  } /* inch */
  1350. X
  1351. X/****************************************************************/
  1352. X/* Mvinch() moves the stdscr cursor to a new position, then    */
  1353. X/* returns the character at that position.            */
  1354. X/****************************************************************/
  1355. X
  1356. Xint mvinch(y,x)
  1357. X  int  y;
  1358. X  int  x;
  1359. X  {
  1360. X  if (wmove(stdscr,y,x) == ERR)
  1361. X    return(ERR);
  1362. X  return((stdscr->_line[stdscr->_cury][stdscr->_curx]) & 0xff);
  1363. X  } /* mvinch */
  1364. X
  1365. X/****************************************************************/
  1366. X/* Mvwinch() moves the cursor of window 'win' to a new posi-    */
  1367. X/* tion, then returns the character at that position.        */
  1368. X/****************************************************************/
  1369. X
  1370. Xint mvwinch(win,y,x)
  1371. X  WINDOW *win;
  1372. X  int  y;
  1373. X  int  x;
  1374. X  {
  1375. X  if (wmove(win,y,x) == ERR)
  1376. X    return(ERR);
  1377. X  return((win->_line[win->_cury][win->_curx]) & 0xff);
  1378. X  } /* mvwinch */
  1379. FRIDAY_NIGHT
  1380. echo extracting - clrtobot.c
  1381. sed 's/^X//' > clrtobot.c << 'FRIDAY_NIGHT'
  1382. X/****************************************************************/
  1383. X/* Wclrtobot() routine of the PCcurses package            */
  1384. X/*                                */
  1385. X/****************************************************************/
  1386. X/* This version of curses is based on ncurses, a curses version    */
  1387. X/* originally written by Pavel Curtis at Cornell University.    */
  1388. X/* I have made substantial changes to make it run on IBM PC's,    */
  1389. X/* and therefore consider myself free to make it public domain.    */
  1390. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1391. X/****************************************************************/
  1392. X/* 1.0:    Release:                    870515    */
  1393. X/****************************************************************/
  1394. X
  1395. X#include <curses.h>
  1396. X#include <curspriv.h>
  1397. X
  1398. X/****************************************************************/
  1399. X/* Wclrtobot() fills the right half of the cursor line of    */
  1400. X/* window 'win', and all lines below it with blanks.        */
  1401. X/****************************************************************/
  1402. X
  1403. Xint    wclrtobot(win)
  1404. X  WINDOW    *win;
  1405. X  {
  1406. X  int     y;
  1407. X  int   minx;
  1408. X  static int     startx;
  1409. X  static int    *ptr;
  1410. X  static int    *end;
  1411. X  static int    *maxx;
  1412. X  static int     blank;
  1413. X
  1414. X  blank = ' ' | (win->_attrs & ATR_MSK);
  1415. X  startx = win->_curx;
  1416. X  for (y = win->_cury; y <= win->_regbottom; y++)
  1417. X    {
  1418. X    minx = _NO_CHANGE;
  1419. X    end = &win->_line[y][win->_maxx];
  1420. X    for (ptr = &win->_line[y][startx]; ptr <= end; ptr++)
  1421. X      {
  1422. X      if (*ptr != blank)
  1423. X    {
  1424. X    maxx = ptr;
  1425. X    if (minx == _NO_CHANGE)
  1426. X      minx = ptr - win->_line[y];
  1427. X    *ptr = blank;
  1428. X    } /* if */
  1429. X      } /* for */
  1430. X    if (minx != _NO_CHANGE)
  1431. X      {
  1432. X      if ((win->_minchng[y] > minx) ||  (win->_minchng[y] == _NO_CHANGE))
  1433. X    win->_minchng[y] = minx;
  1434. X      if (win->_maxchng[y] < maxx - win->_line[y])
  1435. X    win->_maxchng[y] = maxx - win->_line[y];
  1436. X      } /* if */
  1437. X    startx = 0;
  1438. X    } /* for */
  1439. X  return(OK);
  1440. X  } /* wclrtobot */
  1441. X
  1442. X/****************************************************************/
  1443. X/* Wclrtobot() fills the right half of the cursor line of    */
  1444. X/* stdscr, and all lines below it with blanks.            */
  1445. X/****************************************************************/
  1446. X
  1447. Xint clrbot()
  1448. X  {
  1449. X  return(wclrtobot(stdscr));
  1450. X  } /* clrbot */
  1451. X
  1452. X/****************************************************************/
  1453. X/* Mvclrtobot() moves the cursor to a new position in stdscr    */
  1454. X/* and fills the right half of the cursor line, and all lines    */
  1455. X/* below it with blanks.                    */
  1456. X/****************************************************************/
  1457. X
  1458. Xint mvclrtobot(y,x)
  1459. X  int y;
  1460. X  int x;
  1461. X  {
  1462. X  if (wmove(stdscr,y,x) == ERR)
  1463. X    return(ERR);
  1464. X  return(wclrtobot(stdscr));
  1465. X  } /* mvclrtobot */
  1466. X
  1467. X/****************************************************************/
  1468. X/* Mvwclrtobot() moves the cursor to a new position in window    */
  1469. X/* 'win', and fills the right half of the cursor line, and all    */
  1470. X/* lines below it with blanks.                    */
  1471. X/****************************************************************/
  1472. X
  1473. Xint mvwclrtobot(win,y,x)
  1474. X  WINDOW *win;
  1475. X  int y;
  1476. X  int x;
  1477. X  {
  1478. X  if (wmove(win,y,x) == ERR)
  1479. X    return(ERR);
  1480. X  return(wclrtobot(win));
  1481. X  } /* mvwclrtobot */
  1482. FRIDAY_NIGHT
  1483. echo extracting - clrtoeol.c
  1484. sed 's/^X//' > clrtoeol.c << 'FRIDAY_NIGHT'
  1485. X/****************************************************************/
  1486. X/* Wclrtoeol() routine of the PCcurses package            */
  1487. X/*                                */
  1488. X/****************************************************************/
  1489. X/* This version of curses is based on ncurses, a curses version    */
  1490. X/* originally written by Pavel Curtis at Cornell University.    */
  1491. X/* I have made substantial changes to make it run on IBM PC's,    */
  1492. X/* and therefore consider myself free to make it public domain.    */
  1493. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1494. X/****************************************************************/
  1495. X/* 1.0:    Release:                    870515    */
  1496. X/****************************************************************/
  1497. X
  1498. X#include <curses.h>
  1499. X#include <curspriv.h>
  1500. X
  1501. X/****************************************************************/
  1502. X/* Wclrtoeol() fills the half of the cursor line to the right    */
  1503. X/* of the cursor in window 'win' with blanks.            */
  1504. X/****************************************************************/
  1505. X
  1506. Xint    wclrtoeol(win)
  1507. X   WINDOW    *win;
  1508. X  {
  1509. X  int        *maxx;
  1510. X  int        *ptr;
  1511. X  int        *end;
  1512. X  static int     y;
  1513. X  static int     x;
  1514. X  static int     minx;
  1515. X  static int      blank;
  1516. X  
  1517. X  y = win->_cury;
  1518. X  x = win->_curx;
  1519. X  blank = ' ' | (win->_attrs & ATR_MSK);
  1520. X
  1521. X  end = &win->_line[y][win->_maxx];
  1522. X  minx = _NO_CHANGE;
  1523. X  maxx = &win->_line[y][x];
  1524. X  for (ptr = maxx; ptr <= end; ptr++)
  1525. X    {
  1526. X    if (*ptr != blank)
  1527. X      {
  1528. X      maxx = ptr;
  1529. X      if (minx == _NO_CHANGE)
  1530. X    minx = ptr - win->_line[y];
  1531. X      *ptr = blank;
  1532. X      } /* if */
  1533. X    } /* for */
  1534. X
  1535. X  if (minx != _NO_CHANGE)
  1536. X    {
  1537. X    if (win->_minchng[y] > minx || win->_minchng[y] == _NO_CHANGE)
  1538. X      win->_minchng[y] = minx;
  1539. X    if (win->_maxchng[y] < maxx - win->_line[y])
  1540. X      win->_maxchng[y] = maxx - win->_line[y];
  1541. X    } /* if */
  1542. X  return(OK);
  1543. X  } /* wclrtoeol */
  1544. X
  1545. X/****************************************************************/
  1546. X/* Clrtoeol() fills the half of the cursor line to the right    */
  1547. X/* of the cursor in stdscr with blanks.                */
  1548. X/****************************************************************/
  1549. X
  1550. Xint clrtoeol()
  1551. X  {
  1552. X  return(wclrtoeol(stdscr));
  1553. X  } /* clrtoeol */
  1554. X
  1555. X/****************************************************************/
  1556. X/* Mvclrtoeol() moves the cursor to a new position in stdscr    */
  1557. X/* and fills the right half of the cursor line with blanks.    */
  1558. X/****************************************************************/
  1559. X
  1560. Xint mvcltoreol(y,x)
  1561. X  int y;
  1562. X  int x;
  1563. X  {
  1564. X  if (wmove(stdscr,y,x) == ERR)
  1565. X    return(ERR);
  1566. X  return(wclrtoeol(stdscr));
  1567. X  } /* mvclrtoeol */
  1568. X
  1569. X/****************************************************************/
  1570. X/* Mvwclrtoeol() moves the cursor to a new position in window    */
  1571. X/* 'win', and fills the right half of the cursor line with    */
  1572. X/* blanks.                            */
  1573. X/****************************************************************/
  1574. X
  1575. Xint mvwclrtoeol(win,y,x)
  1576. X  WINDOW *win;
  1577. X  int y;
  1578. X  int x;
  1579. X  {
  1580. X  if (wmove(win,y,x) == ERR)
  1581. X    return(ERR);
  1582. X  return(wclrtoeol(win));
  1583. X  } /* mvwclrtoeol */
  1584. FRIDAY_NIGHT
  1585. echo pccurses.sh.1 completed!
  1586.  
  1587.  
  1588.