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

  1. Article 187 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!clyde!ima!necntc!ncoast!allbery
  4. From: bl@infovax.UUCP (Bj|rn Larsson)
  5. Newsgroups: comp.sources.misc
  6. Subject: PCcurses shar 4
  7. Message-ID: <4272@ncoast.UUCP>
  8. Date: 26 Aug 87 22:54:16 GMT
  9. Date-Received: 27 Aug 87 12:24:44 GMT
  10. Sender: allbery@ncoast.UUCP
  11. Lines: 1257
  12. Approved: allbery@ncoast.UUCP
  13. X-Archive: comp.sources.misc/8708/pc-curses/3
  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.4')
  19. echo extracting - refresh.c
  20. sed 's/^X//' > refresh.c << 'FRIDAY_NIGHT'
  21. X/****************************************************************/
  22. X/* Wrefresh() and wnoutrefresh() routines of the PCcurses    */
  23. X/* package                            */
  24. X/*                                */
  25. X/****************************************************************/
  26. X/* This version of curses is based on ncurses, a curses version    */
  27. X/* originally written by Pavel Curtis at Cornell University.    */
  28. X/* I have made substantial changes to make it run on IBM PC's,    */
  29. X/* and therefore consider myself free to make it public domain.    */
  30. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  31. X/****************************************************************/
  32. X/* 1.0:    Release:                    870515    */
  33. X/****************************************************************/
  34. X
  35. X#include <curses.h>
  36. X#include <curspriv.h>
  37. X
  38. X/****************************************************************/
  39. X/* Wrefresh() updates window win's area of the physical screen.    */
  40. X/****************************************************************/
  41. X
  42. Xvoid wrefresh(win)
  43. X  WINDOW    *win;
  44. X  {
  45. X  if (win == curscr)
  46. X    curscr->_clear = TRUE;
  47. X  else
  48. X    wnoutrefresh(win);
  49. X  doupdate();
  50. X  } /* wrefresh */
  51. X
  52. X/****************************************************************/
  53. X/* Wnoutrefresh() updates the image of the desired screen,    */
  54. X/* without doing physical update (copies window win's image to    */
  55. X/* the _cursvar.tmpwin window, which is hidden from the user).    */
  56. X/****************************************************************/
  57. X
  58. Xvoid wnoutrefresh(win)
  59. X  register WINDOW    *win;
  60. X  {
  61. X  register int      *dst;            /* start destination in temp window */
  62. X  register int    *end;            /* end destination in temp window */
  63. X  register int    *src;            /* source in user window */
  64. X  register int     first;        /* first changed char on line */
  65. X  register int     last;        /* last changed char on line */
  66. X  static   WINDOW *nscr;
  67. X  static   int       begy;        /* window's place on screen */
  68. X  static   int       begx;
  69. X  static   int       i;
  70. X  static   int       j;
  71. X
  72. X  nscr = _cursvar.tmpwin;
  73. X  begy = win->_begy;
  74. X  begx = win->_begx;
  75. X
  76. X  for (i=0, j=begy; i <= win->_maxy; i++, j++)
  77. X    {
  78. X    if (win->_minchng[i] != _NO_CHANGE)
  79. X      {
  80. X      first = win->_minchng[i];
  81. X      last  = win->_maxchng[i];
  82. X      dst   = &(nscr->_line[j][begx + first]);
  83. X      end   = &(nscr->_line[j][begx + last]);
  84. X      src   = &(win->_line[i][first]);
  85. X
  86. X      while (dst <= end)         /* copy user line to temp window */
  87. X    *dst++ = *src++;
  88. X
  89. X      first += begx;            /* nscr's min/max change positions */
  90. X      last  += begx;
  91. X
  92. X      if ((nscr->_minchng[j] == _NO_CHANGE)||(nscr->_minchng[j] > first))
  93. X    nscr->_minchng[j] = first;
  94. X      if (last > nscr->_maxchng[j])
  95. X    nscr->_maxchng[j] = last;
  96. X      
  97. X      win->_minchng[i] = _NO_CHANGE;    /* updated now */
  98. X      } /* if */
  99. X    win->_maxchng[i] = _NO_CHANGE;    /* updated now */
  100. X    } /* for */
  101. X
  102. X  if (win->_clear)
  103. X    {
  104. X    win->_clear = FALSE;
  105. X    nscr->_clear = TRUE;
  106. X    } /* if */
  107. X
  108. X  if (!win->_leave)
  109. X    {
  110. X    nscr->_cury = win->_cury + begy;
  111. X    nscr->_curx = win->_curx + begx;
  112. X    } /* if */
  113. X  } /* wnoutrefresh */
  114. X
  115. X/****************************************************************/
  116. X/* Refresh() updates stdscr's area of the physical screen.    */
  117. X/****************************************************************/
  118. X
  119. Xvoid refresh()
  120. X  {
  121. X  wrefresh(stdscr);
  122. X  } /* refresh */
  123. FRIDAY_NIGHT
  124. echo extracting - scrreg.c
  125. sed 's/^X//' > scrreg.c << 'FRIDAY_NIGHT'
  126. X/****************************************************************/
  127. X/* Wsetscrreg() routine of the PCcurses package            */
  128. X/*                                */
  129. X/****************************************************************/
  130. X/* This version of curses is based on ncurses, a curses version    */
  131. X/* originally written by Pavel Curtis at Cornell University.    */
  132. X/* I have made substantial changes to make it run on IBM PC's,    */
  133. X/* and therefore consider myself free to make it public domain.    */
  134. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  135. X/****************************************************************/
  136. X/* 1.0:    Release:                    870515    */
  137. X/****************************************************************/
  138. X
  139. X#include <curses.h>
  140. X#include <curspriv.h>
  141. X
  142. X/****************************************************************/
  143. X/* Wsetscrreg() set the scrolling region of window 'win' to in-    */
  144. X/* clude all lines between 'top' and 'bottom'.            */
  145. X/****************************************************************/
  146. X
  147. Xint wsetscrreg(win, top, bottom)
  148. X  WINDOW    *win;
  149. X  int         top;
  150. X  int         bottom;
  151. X  {
  152. X  if (  (0 <= top)
  153. X    &&
  154. X    (top <= win->_cury)
  155. X    &&
  156. X    (win->_cury <= bottom)
  157. X    &&
  158. X    (bottom <= win->_maxy)
  159. X     )
  160. X    {
  161. X    win->_regtop = top;
  162. X    win->_regbottom = bottom;
  163. X    return(OK);
  164. X    } /* if */
  165. X  else
  166. X    return(ERR);
  167. X  } /* wsetscrreg */
  168. X
  169. X/****************************************************************/
  170. X/* Setscrreg() set the scrolling region of stdscr to include    */
  171. X/* all lines between 'top' and 'bottom'.            */
  172. X/****************************************************************/
  173. X
  174. Xint setscrreg(top, bottom)
  175. X  int top;
  176. X  int bottom;
  177. X  {
  178. X  return(wsetscrreg(stdscr,top,bottom));
  179. X  } /* setscrreg */
  180. FRIDAY_NIGHT
  181. echo extracting - setterm.c
  182. sed 's/^X//' > setterm.c << 'FRIDAY_NIGHT'
  183. X/****************************************************************/
  184. X/* Raw(), noraw(), echo(), noecho(), nl(), nonl(),  cbreak(),    */
  185. X/* nocbreak(), crmode(), nocrmode() and refrbrk() routines of    */
  186. X/* the PCcurses package.                    */
  187. X/*                                */
  188. X/****************************************************************/
  189. X/* This version of curses is based on ncurses, a curses version    */
  190. X/* originally written by Pavel Curtis at Cornell University.    */
  191. X/* I have made substantial changes to make it run on IBM PC's,    */
  192. X/* and therefore consider myself free to make it public domain.    */
  193. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  194. X/****************************************************************/
  195. X/* 1.0:    Release:                    870515    */
  196. X/****************************************************************/
  197. X
  198. X#include <curses.h>
  199. X#include <curspriv.h>
  200. X
  201. X/****************************************************************/
  202. X/* Raw() and noraw() sets or clears raw mode.            */
  203. X/****************************************************************/
  204. X
  205. Xvoid  raw()
  206. X  {
  207. X  _cursvar.raw = TRUE;
  208. X  _cursesscb(FALSE);            /* disallow ^BREAK on disk I/O */
  209. X  flushinp();
  210. X  } /* raw */
  211. X
  212. Xvoid  noraw()
  213. X  {
  214. X  _cursvar.raw = FALSE;
  215. X  _cursesscb(_cursvar.orgcbr);        /* restore original ^BREAK status */
  216. X  } /* noraw */
  217. X
  218. X/****************************************************************/
  219. X/* Echo() and noecho() sets or clears echo mode.        */
  220. X/****************************************************************/
  221. X
  222. Xvoid  echo()
  223. X  {
  224. X  _cursvar.echo = TRUE;
  225. X  } /* echo */
  226. X
  227. Xvoid  noecho()
  228. X  {
  229. X  _cursvar.echo = FALSE;
  230. X  } /* noecho */
  231. X
  232. X/****************************************************************/
  233. X/* Nl() and nonl() sets or clears autocr mapping mode.        */
  234. X/****************************************************************/
  235. X
  236. Xvoid  nl()
  237. X  {
  238. X  _cursvar.autocr = TRUE;
  239. X  } /* nl */
  240. X
  241. Xvoid  nonl()
  242. X  {
  243. X  _cursvar.autocr = FALSE;
  244. X  } /* nonl */
  245. X
  246. X/****************************************************************/
  247. X/* Cbreak(), nocbreak(), crmode() amd nocrmode()  sets or    */
  248. X/* clears cbreak mode.                        */
  249. X/****************************************************************/
  250. X
  251. Xvoid  cbreak()
  252. X  {
  253. X  _cursvar.cbreak = TRUE;
  254. X  } /* cbreak */
  255. X
  256. Xvoid  nocbreak()
  257. X  {
  258. X  _cursvar.cbreak = FALSE;
  259. X  } /* nocbreak */
  260. X
  261. Xvoid  crmode()
  262. X  {
  263. X  _cursvar.cbreak = TRUE;
  264. X  } /* crmode */
  265. X
  266. Xvoid  nocrmode()
  267. X  {
  268. X  _cursvar.cbreak = FALSE;
  269. X  } /* nocrmode */
  270. X
  271. X/****************************************************************/
  272. X/* Refrbrk() sets or unsets the screen refresh break flag. If    */
  273. X/* this flag is set, and there is any input available, any    */
  274. X/* screen refresh will be prematurely terminated, anticipating    */
  275. X/* more screen updates. This flag is FALSE by default.        */
  276. X/****************************************************************/
  277. X
  278. Xvoid    refrbrk(bf)
  279. X  bool    bf;
  280. X  {
  281. X  _cursvar.refrbrk = bf;
  282. X  } /* refrbrk */
  283. FRIDAY_NIGHT
  284. echo extracting - smaldata.inc
  285. sed 's/^X//' > smaldata.inc << 'FRIDAY_NIGHT'
  286. X    huge_data EQU    0
  287. FRIDAY_NIGHT
  288. echo extracting - stradd.c
  289. sed 's/^X//' > stradd.c << 'FRIDAY_NIGHT'
  290. X/****************************************************************/
  291. X/* Addstr() routines of the PCcurses package            */
  292. X/*                                */
  293. X/****************************************************************/
  294. X/* This version of curses is based on ncurses, a curses version    */
  295. X/* originally written by Pavel Curtis at Cornell University.    */
  296. X/* I have made substantial changes to make it run on IBM PC's,    */
  297. X/* and therefore consider myself free to make it public domain.    */
  298. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  299. X/****************************************************************/
  300. X/* 1.0:    Release:                    870515    */
  301. X/****************************************************************/
  302. X
  303. X#include <curses.h>
  304. X#include <curspriv.h>
  305. X
  306. X/****************************************************************/
  307. X/* Waddstr() inserts string 'str' at the current cursor posi-    */
  308. X/* tion in window 'win', and takes any actions as dictated by    */
  309. X/* the characters.                        */
  310. X/****************************************************************/
  311. X
  312. Xint    waddstr(win, str)
  313. X  WINDOW    *win; 
  314. X  char        *str;
  315. X  {
  316. X  while (*str)
  317. X    {
  318. X    if (waddch(win, *str++) == ERR)
  319. X      return(ERR);
  320. X    }
  321. X  return(OK);
  322. X  } /* waddstr */
  323. X
  324. X/****************************************************************/
  325. X/* Addstr() inserts string 'str' at the current cursor posi-    */
  326. X/* tion in stdscr, and takes any actions as dictated by the    */
  327. X/* characters.                            */
  328. X/****************************************************************/
  329. X
  330. Xint addstr(str)
  331. X  char     *str;
  332. X  {
  333. X  return (waddstr(stdscr,str));
  334. X  } /* addstr */
  335. X
  336. X/****************************************************************/
  337. X/* Mvaddstr() move to a new position in stdscr, then inserts    */
  338. X/* string 'str' at the new position, taking any actions as dic-    */
  339. X/* tated by the characters.                    */
  340. X/****************************************************************/
  341. X
  342. Xint mvaddstr(y,x,str)
  343. X  int     y;
  344. X  int     x;
  345. X  char    *str;
  346. X  {
  347. X  if (wmove(stdscr,y,x) == ERR)
  348. X    return (ERR);
  349. X  return (waddstr(stdscr,str));
  350. X  } /* mvaddstr */
  351. X
  352. X/****************************************************************/
  353. X/* Mvwaddstr() move to a new position in window 'win', then    */
  354. X/* inserts string 'str' at the new position, taking any actions    */
  355. X/* as dictated by the characters.                */
  356. X/****************************************************************/
  357. X
  358. Xint mvwaddstr(win,y,x,str)
  359. X  WINDOW *win;
  360. X  int      y;
  361. X  int      x;
  362. X  char   *str;
  363. X  {
  364. X  if (wmove(win,y,x) == ERR)
  365. X    return (ERR);
  366. X  return (waddstr(win,str));
  367. X  } /* mvwaddstr */
  368. FRIDAY_NIGHT
  369. echo extracting - strget.c
  370. sed 's/^X//' > strget.c << 'FRIDAY_NIGHT'
  371. X/****************************************************************/
  372. X/* Getstr() routines of the PCcurses package            */
  373. X/*                                */
  374. X/****************************************************************/
  375. X/* This version of curses is based on ncurses, a curses version    */
  376. X/* originally written by Pavel Curtis at Cornell University.    */
  377. X/* I have made substantial changes to make it run on IBM PC's,    */
  378. X/* and therefore consider myself free to make it public domain.    */
  379. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  380. X/****************************************************************/
  381. X/* 1.0:    Release:                    870515    */
  382. X/****************************************************************/
  383. X
  384. X#include <curses.h>
  385. X#include <curspriv.h>
  386. X
  387. Xstatic    char    *backchar();
  388. X
  389. Xstatic    bool     oldecho;
  390. Xstatic    bool     oldcbreak;
  391. Xstatic  bool     oldnodelay;
  392. Xstatic    char    *strbeg;
  393. Xstatic    WINDOW  *w;
  394. Xstatic    int     xbeg;
  395. X
  396. X/****************************************************************/
  397. X/* Wgetstr(win,str) reads in a string (terminated by \n or \r)    */
  398. X/* to the buffer pointed to by 'str', and displays the input    */
  399. X/* in window 'win'. The user's erase and kill characters are    */
  400. X/* active.                            */
  401. X/****************************************************************/
  402. X
  403. Xint wgetstr(win,str)
  404. X  WINDOW    *win; 
  405. X  char        *str;
  406. X  {
  407. X  w          = win;
  408. X  strbeg      = str;        /* keep start for backspacing */
  409. X  oldcbreak       = _cursvar.cbreak;    /* remember states */
  410. X  oldecho         = _cursvar.echo;
  411. X  oldnodelay      = w->_nodelay;
  412. X  _cursvar.echo   = FALSE;        /* we do echo ourselves */
  413. X  _cursvar.cbreak = TRUE;        /* no wait for chars */
  414. X  w->_nodelay   = FALSE;        /* don't return 'NOCHARS' */
  415. X  xbeg = w->_curx;            /* remember screen start x-position */
  416. X
  417. X  wrefresh(w);                /* sets cursor at right place */
  418. X  while ((*str = getch()) != '\n')
  419. X    {
  420. X    if (*str == '\r')
  421. X      break;
  422. X    if (*str == _DCCHAR)
  423. X      {
  424. X      if (str > strbeg)
  425. X    str = backchar(str);
  426. X      } /* if */
  427. X    else
  428. X      if (*str == _DLCHAR)
  429. X    while (str > strbeg)
  430. X      str = backchar(str);
  431. X      else
  432. X    {
  433. X    waddch(w,*str++);
  434. X    wrefresh(w);
  435. X    } /* else */
  436. X      } /* while */
  437. X
  438. X  *str = '\0';
  439. X  _cursvar.echo   = oldecho;
  440. X  _cursvar.cbreak = oldcbreak;
  441. X  win->_nodelay   = oldnodelay;
  442. X  return(OK);
  443. X  } /* wgetstr */
  444. X
  445. X/****************************************************************/
  446. X/* Getstr(str) reads in a string (terminated by \n or \r) to    */
  447. X/* the buffer pointed to by 'str', and displays the input in    */
  448. X/* stdscr. The user's erase and kill characters are active.    */
  449. X/****************************************************************/
  450. X
  451. Xint getstr(str)
  452. X  char *str;
  453. X  {
  454. X  return(wgetstr(stdscr,str));
  455. X  } /* getstr */
  456. X
  457. X/****************************************************************/
  458. X/* Mvgetstr(y,x,str) moves the stdscr cursor to a new position,    */
  459. X/* then reads in a string (terminated by \n or \r) to the buf-    */
  460. X/* fer pointed to by 'str', and displays the input in stdscr.    */
  461. X/* The user's erase and kill characters are active.        */
  462. X/****************************************************************/
  463. X
  464. Xint mvgetstr(y,x,str)
  465. X  int y;
  466. X  int x;
  467. X  char *str;
  468. X  {
  469. X  if (wmove(stdscr,y,x) == ERR)
  470. X    return(ERR);
  471. X  return(wgetstr(stdscr,str));
  472. X  } /* mvgetstr */
  473. X
  474. X/****************************************************************/
  475. X/* Mvwgetstr(win,y,x,str) moves the 'win' cursor to a new    */
  476. X/* position, then reads in a string (terminated by \n or \r)    */
  477. X/* to the buffer pointed to by 'str', and displays the input in    */
  478. X/* stdscr. The user's erase and kill characters are active.    */
  479. X/****************************************************************/
  480. X
  481. Xint mvwgetstr(win,y,x,str)
  482. X  WINDOW *win;
  483. X  int      y;
  484. X  int      x;
  485. X  char     *str;
  486. X  {
  487. X  if (wmove(win,y,x) == ERR)
  488. X    return(ERR);
  489. X  return(wgetstr(win,str));
  490. X  } /* mvwgetstr */
  491. X
  492. X/****************************************************************/
  493. X/* Backchar() does a character delete with screen erase, even    */
  494. X/* up to previous lines. It will not back-scroll if the begi-    */
  495. X/* ning of the string has scrolled off the window. Steps back    */
  496. X/* pointer 's', and returns the new value.            */
  497. X/****************************************************************/
  498. X
  499. Xstatic char *backchar(s)
  500. X  char      *s;
  501. X  {
  502. X  static int nbs;
  503. X  static int x;
  504. X  static char *p;
  505. X  static int ts;
  506. X
  507. X  x =  xbeg;
  508. X  ts =  w->_tabsize;
  509. X
  510. X  s--;                        /* step back string */
  511. X  nbs = 1;                    /* step at least one pos */
  512. X  if ((*s < ' ') || (*s == 0x7f))        /* ctrl-char has size 2 */
  513. X    nbs++;
  514. X  if (*s == '\t')                /* tabs are very special */
  515. X    {
  516. X    for (p = strbeg; p < s ;p++)        /* find x-pos of last char */
  517. X      {
  518. X      if (*p == '\t')                /* go to next tab */
  519. X    x = ((x/ts)+1) * ts;
  520. X      else
  521. X    if ((*p < ' ') || (*p == 0x7f))        /* control character */
  522. X      x += 2;
  523. X    else                    /* normal char */
  524. X      x++;
  525. X      if (x > w->_maxx)                /* go to next line? */
  526. X    x = 0;
  527. X      } /* while */
  528. X    if (!(w->_curx))                /* if step-over newline */
  529. X      nbs = w->_maxx+1 - x;
  530. X    else                    /* in-line tab */
  531. X      nbs = w->_curx - x;            /* positions to erase */
  532. X    } /* if */
  533. X
  534. X  while(nbs--)                    /* do so many */
  535. X    {
  536. X    if (w->_curx > 0)                /* if not at line begining */
  537. X      waddstr(w,"\b \b");
  538. X    else
  539. X      if (w->_cury)                /* if not on top line */
  540. X    {
  541. X    mvwaddch(w,w->_cury-1,w->_maxx,' ');    /* put space at line end */
  542. X    wmove(w,w->_cury-1,w->_maxx);        /* and go there again */
  543. X    } /* else */
  544. X    } /* while */
  545. X
  546. X  wrefresh(w);                    /* redraw screen */
  547. X  *(s+1) = '\0';                /* make string terminated */
  548. X  return(s);
  549. X  } /* backchar */
  550. FRIDAY_NIGHT
  551. echo extracting - tabsize.c
  552. sed 's/^X//' > tabsize.c << 'FRIDAY_NIGHT'
  553. X/****************************************************************/
  554. X/* Tabsize() routines of the PCcurses package            */
  555. X/*                                */
  556. X/****************************************************************/
  557. X/* This version of curses is based on ncurses, a curses version    */
  558. X/* originally written by Pavel Curtis at Cornell University.    */
  559. X/* I have made substantial changes to make it run on IBM PC's,    */
  560. X/* and therefore consider myself free to make it public domain.    */
  561. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  562. X/****************************************************************/
  563. X/* 1.0:    Release:                    870515    */
  564. X/****************************************************************/
  565. X
  566. X#include <curses.h>
  567. X#include <curspriv.h>
  568. X
  569. X/****************************************************************/
  570. X/* Wtabsize(win,ts) sets the tabsize of window 'win' to 'ts',    */
  571. X/* and returns the original value.                */
  572. X/****************************************************************/
  573. X
  574. Xint    wtabsize(win,ts)
  575. X  WINDOW    *win;
  576. X  int         ts;
  577. X  {
  578. X  int         origval;
  579. X
  580. X  origval = win->_tabsize;
  581. X  win->_tabsize = ts;
  582. X  return(origval);
  583. X  } /* wtabsize*/
  584. X
  585. X/****************************************************************/
  586. X/* Tabsize(ts) sets the tabsize of stdscr to 'ts', and returns    */
  587. X/* the original value.                        */
  588. X/****************************************************************/
  589. X
  590. Xint    tabsize(ts)
  591. X  int         ts;
  592. X  {
  593. X  int         origval;
  594. X
  595. X  origval = stdscr->_tabsize;
  596. X  stdscr->_tabsize = ts;
  597. X  return(origval);
  598. X  } /* tabsize */
  599. FRIDAY_NIGHT
  600. echo extracting - termmisc.c
  601. sed 's/^X//' > termmisc.c << 'FRIDAY_NIGHT'
  602. X/****************************************************************/
  603. X/* Miscellaneous Terminal routines of the PCcurses package    */
  604. X/*                                */
  605. X/****************************************************************/
  606. X/* This version of curses is based on ncurses, a curses version    */
  607. X/* originally written by Pavel Curtis at Cornell University.    */
  608. X/* I have made substantial changes to make it run on IBM PC's,    */
  609. X/* and therefore consider myself free to make it public domain.    */
  610. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  611. X/****************************************************************/
  612. X/* 1.0:    Release:                    870515    */
  613. X/****************************************************************/
  614. X
  615. X#include <curses.h>
  616. X#include <curspriv.h>
  617. X
  618. X/* static variables or saving terminal modes */
  619. X
  620. Xstatic bool savedacr;
  621. Xstatic bool savedcbr;
  622. Xstatic bool savedecho;
  623. Xstatic bool savedraw;
  624. X
  625. X/****************************************************************/
  626. X/* Fixterm(), resetterm(), saveoldterm, saveterm() gettmode(),    */
  627. X/* setterm() and baudrate() function dummies for compatibility.    */
  628. X/****************************************************************/
  629. X
  630. Xint fixterm()
  631. X  {
  632. X  return(OK);
  633. X  } /* fixterm */
  634. X
  635. Xint resetterm()
  636. X  {
  637. X  return(OK);
  638. X  }
  639. X
  640. Xint saveoldterm()
  641. X  {
  642. X  return(OK);
  643. X  } /* saveoldterm */
  644. X
  645. Xint saveterm()
  646. X  {
  647. X  return(OK);
  648. X  } /* saveterm */
  649. X
  650. Xint gettmode()
  651. X  {
  652. X  return(OK);
  653. X  } /* gettmode */
  654. X
  655. Xint setterm(type)
  656. X  char    *type;
  657. X  {
  658. X  return(OK);
  659. X  } /* setterm */
  660. X
  661. Xint baudrate()
  662. X  {
  663. X  return(19200);
  664. X  } /* baudrate */
  665. X
  666. X/****************************************************************/
  667. X/* Erasechar(), killchar() returns std MSDOS erase chars.    */
  668. X/****************************************************************/
  669. X
  670. Xint erasechar()
  671. X  {
  672. X  return(_DCCHAR);        /* character delete char */
  673. X  } /* erasechar */
  674. X
  675. Xint killchar()
  676. X  {
  677. X  return(_DLCHAR);        /* line delete char */
  678. X  } /* killchar */
  679. X
  680. X/****************************************************************/
  681. X/* Savetty() and resetty() saves and restores the terminal I/O    */
  682. X/* settings.                            */
  683. X/****************************************************************/
  684. X
  685. Xint savetty()
  686. X  {
  687. X  savedacr  = _cursvar.autocr;
  688. X  savedcbr  = _cursvar.cbreak;
  689. X  savedecho = _cursvar.echo;
  690. X  savedraw  = _cursvar.raw;
  691. X  return(OK);
  692. X  } /* savetty */
  693. X
  694. Xint resetty()
  695. X  {
  696. X  _cursvar.autocr = savedacr;
  697. X  _cursvar.cbreak = savedcbr;
  698. X  _cursvar.echo   = savedecho;
  699. X  _cursvar.raw    = savedraw;
  700. X  return(OK);
  701. X  } /* resetty */
  702. X
  703. X/****************************************************************/
  704. X/* Setupterm() sets up the terminal. On a PC, it is always suc-    */
  705. X/* cessful, and returns 1.                    */
  706. X/****************************************************************/
  707. X
  708. Xint setupterm()
  709. X  {
  710. X  return(1);
  711. X  } /* setupterm */
  712. FRIDAY_NIGHT
  713. echo extracting - unctrl.c
  714. sed 's/^X//' > unctrl.c << 'FRIDAY_NIGHT'
  715. X/****************************************************************/
  716. X/* Unctrl() routines of the PCcurses package            */
  717. X/*                                */
  718. X/****************************************************************/
  719. X/* This version of curses is based on ncurses, a curses version    */
  720. X/* originally written by Pavel Curtis at Cornell University.    */
  721. X/* I have made substantial changes to make it run on IBM PC's,    */
  722. X/* and therefore consider myself free to make it public domain.    */
  723. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  724. X/****************************************************************/
  725. X/* 1.0:    Release:                    870515    */
  726. X/****************************************************************/
  727. X
  728. X#include <curses.h>
  729. X#include <curspriv.h>
  730. X
  731. Xstatic char    strbuf[3] = {0,0,0};
  732. X
  733. X/****************************************************************/
  734. X/* Unctrl() returns a char pointer to a string corresponding to    */
  735. X/* argument character 'c'.                    */
  736. X/****************************************************************/
  737. X
  738. Xchar *unctrl(c)
  739. X  char c;
  740. X  {
  741. X  int ic = c;
  742. X  ic &= 0xff;
  743. X  
  744. X  if ((ic >= ' ') && (ic != 0x7f))        /* normal characters */
  745. X    {
  746. X    strbuf[0] = ic;
  747. X    strbuf[1] = '\0';
  748. X    return(strbuf);
  749. X    } /* if */
  750. X  strbuf[0] = '^';                /* '^' prefix */
  751. X  if (c == 0x7f)                /* DEL */
  752. X    strbuf[1] = '?';
  753. X  else                        /* other control */
  754. X    strbuf[1] = ic + '@';
  755. X  return(strbuf);
  756. X  } /* unctrl */
  757. FRIDAY_NIGHT
  758. echo extracting - update.c
  759. sed 's/^X//' > update.c << 'FRIDAY_NIGHT'
  760. X/****************************************************************/
  761. X/* Doupdate() routine of the PCcurses package            */
  762. X/*                                */
  763. X/****************************************************************/
  764. X/* This version of curses is based on ncurses, a curses version    */
  765. X/* originally written by Pavel Curtis at Cornell University.    */
  766. X/* I have made substantial changes to make it run on IBM PC's,    */
  767. X/* and therefore consider myself free to make it public domain.    */
  768. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  769. X/****************************************************************/
  770. X/* 1.0:    Release:                    870515    */
  771. X/****************************************************************/
  772. X
  773. X#include <curses.h>
  774. X#include <curspriv.h>
  775. X
  776. Xstatic void clrupdate();        /* fwd declaration */
  777. Xstatic bool transformline();
  778. Xstatic void clearscreen();
  779. Xstatic void gotoxy();
  780. Xstatic void Putchar();
  781. X
  782. Xstatic WINDOW    *twin;            /* used by many routines */
  783. X
  784. Xstatic    char     atrtab[64] =        /* attribute encoding table. */
  785. X {                    /* feel free to edit if your */
  786. X  7,        /* NORMAL (0) */        /* display board supports all */
  787. X  0x87,        /* BLINK */            /* possible combinations */
  788. X  0,        /* BLANK */
  789. X  0,        /* BLINK & BLANK */
  790. X  0xf,        /* BOLD */
  791. X  0x8f,        /* BOLD & BLINK */
  792. X  0,        /* BOLD & BLANK */
  793. X  0,        /* BOLD & BLINK & BLANK */
  794. X  0x70,        /* REVERSE (8) */
  795. X  0xf0,        /* REVERSE & BLINK */
  796. X  0,        /* REVERSE & BLANK */
  797. X  0,        /* REVERSE & BLINK & BLANK */
  798. X  0x78,        /* REVERSE & BOLD */
  799. X  0xf8,        /* REVERSE & BOLD & BLINK */
  800. X  0,        /* REVERSE & BOLD & BLANK */
  801. X  0,        /* REVERSE & BOLD & BLINK & BLANK */
  802. X  0xf,        /* STANDOUT (10) */
  803. X  0x8f,        /* STANDOUT & BLINK */
  804. X  0,        /* STANDOUT & BLANK */
  805. X  0,        /* STANDOUT & BLINK & BLANK */
  806. X  0xf,        /* STANDOUT & BOLD */
  807. X  0x8f,        /* STANDOUT & BOLD & BLINK */
  808. X  0,        /* STANDOUT & BOLD & BLANK */
  809. X  0,        /* STANDOUT & BOLD & BLINK & BLANK */
  810. X  0x70,        /* STANDOUT & REVERSE (18) */
  811. X  0xf0,        /* STANDOUT & REVERSE & BLINK */
  812. X  0,        /* STANDOUT & REVERSE & BLANK */
  813. X  0,        /* STANDOUT & REVERSE & BLINK & BLANK */
  814. X  0x70,        /* STANDOUT & REVERSE & BOLD */
  815. X  0xf0,        /* STANDOUT & REVERSE & BOLD & BLINK */
  816. X  0,        /* STANDOUT & REVERSE & BOLD & BLANK */
  817. X  0,        /* STANDOUT & REVERSE & BOLD & BLINK & BLANK */
  818. X  1,        /* UNDERLINE (20) */
  819. X  0x81,        /* UNDERLINE & BLINK */
  820. X  0,        /* UNDERLINE & BLANK */
  821. X  0,        /* UNDERLINE & BLINK & BLANK */
  822. X  9,        /* UNDERLINE & BOLD */
  823. X  0x89,        /* UNDERLINE & BOLD & BLINK */
  824. X  0,        /* UNDERLINE & BOLD & BLANK */
  825. X  0,        /* UNDERLINE & BOLD & BLINK & BLANK */
  826. X  0x70,        /* UNDERLINE & REVERSE (28) */
  827. X  0xf0,        /* UNDERLINE & REVERSE & BLINK */
  828. X  0,        /* UNDERLINE & REVERSE & BLANK */
  829. X  0,        /* UNDERLINE & REVERSE & BLINK & BLANK */
  830. X  0x79,        /* UNDERLINE & REVERSE & BOLD */
  831. X  0xf9,     /* UNDERLINE & REVERSE & BOLD & BLINK */
  832. X  0,        /* UNDERLINE & REVERSE & BOLD & BLANK */
  833. X  0,        /* UNDERLINE & REVERSE & BOLD & BLINK & BLANK */
  834. X  9,        /* UNDERLINE & STANDOUT (30) */
  835. X  0x89,        /* UNDERLINE & STANDOUT & BLINK */
  836. X  0,        /* UNDERLINE & STANDOUT & BLANK */
  837. X  0,        /* UNDERLINE & STANDOUT & BLINK & BLANK */
  838. X  9,        /* UNDERLINE & STANDOUT & BOLD */
  839. X  0x89,        /* UNDERLINE & STANDOUT & BOLD & BLINK */
  840. X  0,        /* UNDERLINE & STANDOUT & BOLD & BLANK */
  841. X  0,        /* UNDERLINE & STANDOUT & BOLD & BLINK & BLANK */
  842. X  0x70,        /* UNDERLINE & STANDOUT & REVERSE (38) */
  843. X  0xf0,        /* UNDERLINE & STANDOUT & REVERSE & BLINK */
  844. X  0,        /* UNDERLINE & STANDOUT & REVERSE & BLANK */
  845. X  0,        /* UNDERLINE & STANDOUT & REVERSE & BLINK & BLANK */
  846. X  0x70,        /* UNDERLINE & STANDOUT & REVERSE & BOLD */
  847. X  0xf0,        /* UNDERLINE & STANDOUT & REVERSE & BOLD & BLINK */
  848. X  0,        /* UNDERLINE & STANDOUT & REVERSE & BOLD & BLANK */
  849. X  0,        /* UNDERLINE & STANDOUT & REVERSE & BOLD & BLINK & BLANK */
  850. X  };
  851. X
  852. X/****************************************************************/
  853. X/* Doupdate() updates the physical screen to look like _curs-   */
  854. X/* var.tmpwin if curscr is not 'Clear-marked'. Otherwise it    */
  855. X/* updates the screen to look like curscr.            */
  856. X/****************************************************************/
  857. X
  858. Xvoid doupdate()
  859. X  {
  860. X  register int         i;
  861. X
  862. X  twin   = _cursvar.tmpwin;
  863. X  if (curscr->_clear)
  864. X    clrupdate(curscr);
  865. X  else
  866. X    {
  867. X    if (twin->_clear)
  868. X      clrupdate(twin);
  869. X    else
  870. X      {
  871. X      for (i=0; i < LINES; i++)
  872. X    if (twin->_minchng[i] != _NO_CHANGE)
  873. X      if (transformline(i))
  874. X        break;
  875. X      } /* else */
  876. X    } /* else */
  877. X  curscr->_curx = twin->_curx;
  878. X  curscr->_cury = twin->_cury;
  879. X  gotoxy(curscr->_cury, curscr->_curx);
  880. X  } /* doupdate */
  881. X
  882. X/****************************************************************/
  883. X/* Clrupdate(scr) updates the screen by clearing it and then    */
  884. X/* redraw it in it's entirety. If _cursvar.refrbrk is TRUE, and    */
  885. X/* there is pending input characters, the update will be pre-    */
  886. X/* maturely terminated.                        */
  887. X/****************************************************************/
  888. X
  889. Xstatic void clrupdate(scr)
  890. X  WINDOW    *scr;
  891. X  {
  892. X  register int        *src;
  893. X  register int        *dst;
  894. X  register int         i;
  895. X  register int         j;
  896. X  static   WINDOW    *w;
  897. X
  898. X  w = curscr;
  899. X  
  900. X  if (scr != w)                /* copy scr to curscr */
  901. X    {
  902. X    for (i=0; i < LINES; i++)
  903. X      {
  904. X      src = scr->_line[i];
  905. X      dst = w->_line[i];
  906. X      for (j=0; j < COLS; j++)
  907. X    *dst++ = *src++;
  908. X      } /* for */
  909. X    } /* if */
  910. X  clearscreen();            /* clear physical screen */
  911. X  scr->_clear = FALSE;
  912. X  for (i=0; i < LINES; i++)        /* update physical screen */
  913. X    {
  914. X    src = w->_line[i];
  915. X    for(j=0; j < COLS; j++)
  916. X      {
  917. X      if (*src != (' ' | ATR_NRM))
  918. X    {
  919. X    gotoxy(i,j);
  920. X    Putchar(*src);
  921. X    } /* if */
  922. X      src++;
  923. X      } /* for */
  924. X    if(_cursvar.refrbrk && _cursespendch())
  925. X      return;
  926. X    } /* for */
  927. X  } /* clrupdate */
  928. X
  929. X/****************************************************************/
  930. X/* Transformline() updates the given physical line to look    */
  931. X/* like the corresponding line in _cursvar.tmpwin. Transform-    */
  932. X/* returns 1 if premature refresh end is allowed, and there is    */
  933. X/* an input character pending.                    */
  934. X/****************************************************************/
  935. X
  936. Xstatic bool transformline(lineno)
  937. X  register int    lineno;
  938. X  {
  939. X  register int        *dstp;
  940. X  register int        *srcp;
  941. X  static   int         x;
  942. X  static   int         endx;
  943. X
  944. X  x    = twin->_minchng[lineno];
  945. X  endx = twin->_maxchng[lineno];
  946. X  dstp = curscr->_line[lineno] + x;
  947. X  srcp = twin->_line[lineno] + x;
  948. X  
  949. X  for( ; x <= endx; x++)
  950. X    {
  951. X    if(*dstp != *srcp)
  952. X      {
  953. X      gotoxy(lineno,x);
  954. X      Putchar(*srcp);
  955. X      } /* if */
  956. X    *dstp++ = *srcp++;
  957. X    } /* for */
  958. X  twin->_minchng[lineno] = _NO_CHANGE;
  959. X  twin->_maxchng[lineno] = _NO_CHANGE;
  960. X  return (_cursvar.refrbrk && _cursespendch());
  961. X  } /* transformline */
  962. X
  963. X/****************************************************************/
  964. X/* Clearscreen() clears the physical screen and puts the cursor    */
  965. X/* in the home position.                    */
  966. X/****************************************************************/
  967. X
  968. Xstatic void clearscreen()
  969. X  {
  970. X  _cursesscroll(0,0,LINES-1,COLS-1,0,atrtab[0]);
  971. X  gotoxy(0,0);
  972. X  } /* clearscreen */
  973. X
  974. X/****************************************************************/
  975. X/* Gotoxy() moves the physical cursor to the desired address on    */
  976. X/* the screen. We don't optimize here - on a PC, it takes more    */
  977. X/* time to optimize than to do things directly.            */
  978. X/****************************************************************/
  979. X
  980. Xstatic void gotoxy(row,col)
  981. X  int row, col;
  982. X  {
  983. X  if((_cursvar.cursrow == row) && (_cursvar.curscol == col))
  984. X    return;
  985. X  _cursescursor(0,row,col);
  986. X  _cursvar.cursrow = row;
  987. X  _cursvar.curscol = col;
  988. X  } /* gotoxy */
  989. X
  990. X/****************************************************************/
  991. X/* Putchar() writes a character, with attributes, to the physi-    */
  992. X/* cal screen, but avoids writing to the lower right screen    */
  993. X/* position.                            */
  994. X/****************************************************************/
  995. X
  996. Xstatic void Putchar(ch)
  997. X  int ch;
  998. X  {
  999. X  if ((_cursvar.cursrow < LINES) || (_cursvar.curscol < COLS))
  1000. X    _cursescattr(0,ch,atrtab[(ch >> 8) & 0x3f],1);
  1001. X  } /* Putchar */
  1002. FRIDAY_NIGHT
  1003. echo extracting - winclear.c
  1004. sed 's/^X//' > winclear.c << 'FRIDAY_NIGHT'
  1005. X/****************************************************************/
  1006. X/* Clear() routines of the PCcurses package            */
  1007. X/*                                */
  1008. X/****************************************************************/
  1009. X/* This version of curses is based on ncurses, a curses version    */
  1010. X/* originally written by Pavel Curtis at Cornell University.    */
  1011. X/* I have made substantial changes to make it run on IBM PC's,    */
  1012. X/* and therefore consider myself free to make it public domain.    */
  1013. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1014. X/****************************************************************/
  1015. X/* 1.0:    Release:                    870515    */
  1016. X/****************************************************************/
  1017. X
  1018. X#include <curses.h>
  1019. X#include <curspriv.h>
  1020. X
  1021. X/****************************************************************/
  1022. X/* Wclear() fills all lines of window 'win' with blanks, and    */
  1023. X/* marks the window to be cleared at next refresh operation.    */
  1024. X/****************************************************************/
  1025. X
  1026. Xvoid    wclear(win)
  1027. X  WINDOW    *win;
  1028. X  {
  1029. X  werase(win);
  1030. X  win->_clear = TRUE;
  1031. X  } /* wclear */
  1032. X
  1033. X/****************************************************************/
  1034. X/* Clear() fills all lines of stdscr with blanks, and marks    */
  1035. X/* marks sdtscr to be cleared at next refresh operation.    */
  1036. X/****************************************************************/
  1037. X
  1038. Xvoid clear()
  1039. X  {
  1040. X  werase(stdscr);
  1041. X  stdscr->_clear = TRUE;
  1042. X  } /* clear */
  1043. FRIDAY_NIGHT
  1044. echo extracting - windel.c
  1045. sed 's/^X//' > windel.c << 'FRIDAY_NIGHT'
  1046. X/****************************************************************/
  1047. X/* Delwin() routine of the PCcurses package.            */
  1048. X/*                                */
  1049. X/****************************************************************/
  1050. X/* This version of curses is based on ncurses, a curses version    */
  1051. X/* originally written by Pavel Curtis at Cornell University.    */
  1052. X/* I have made substantial changes to make it run on IBM PC's,    */
  1053. X/* and therefore consider myself free to make it public domain.    */
  1054. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1055. X/****************************************************************/
  1056. X/* 1.0:    Release:                    870515    */
  1057. X/****************************************************************/
  1058. X
  1059. X#include <curses.h>
  1060. X#include <curspriv.h>
  1061. X
  1062. X/****************************************************************/
  1063. X/* Delwin() deallocates all data allocated by 'win'. If 'win'    */
  1064. X/* is a subwindow, it uses the original window's lines for sto-    */
  1065. X/* rage, and thus the line arrays are not deallocated.        */
  1066. X/****************************************************************/
  1067. X
  1068. Xvoid delwin(win)
  1069. X  WINDOW    *win;
  1070. X  {
  1071. X  int         i;
  1072. X
  1073. X  if (! (win->_flags & _SUBWIN))    /* subwindow uses 'parent's' lines */
  1074. X    {
  1075. X    for (i = 0; i <= win->_maxy  &&  win->_line[i]; i++)
  1076. X      free(win->_line[i]);
  1077. X    }
  1078. X  free(win->_minchng);
  1079. X  free(win->_maxchng);
  1080. X  free(win->_line);
  1081. X  free(win);
  1082. X  } /* delwin */
  1083. FRIDAY_NIGHT
  1084. echo extracting - winerase.c
  1085. sed 's/^X//' > winerase.c << 'FRIDAY_NIGHT'
  1086. X/****************************************************************/
  1087. X/*                                */
  1088. X/* Erase() routines of the PCcurses package            */
  1089. X/*                                */
  1090. X/****************************************************************/
  1091. X/* This version of curses is based on ncurses, a curses version    */
  1092. X/* originally written by Pavel Curtis at Cornell University.    */
  1093. X/* I have made substantial changes to make it run on IBM PC's,    */
  1094. X/* and therefore consider myself free to make it public domain.    */
  1095. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1096. X/****************************************************************/
  1097. X/* 1.0:    Release:                    870515    */
  1098. X/****************************************************************/
  1099. X
  1100. X#include <curses.h>
  1101. X#include <curspriv.h>
  1102. X
  1103. X/****************************************************************/
  1104. X/* Werase() fills all lines of window 'win' with blanks and po-    */
  1105. X/* sitions the cursor at home in the scroll region.        */
  1106. X/****************************************************************/
  1107. X
  1108. Xvoid    werase(win)
  1109. X  WINDOW    *win;
  1110. X  {
  1111. X  int        *end;
  1112. X  int        *start;
  1113. X  short         y;
  1114. X  static   int     blank;
  1115. X  
  1116. X  blank = ' ' | (win->_attrs & ATR_MSK);
  1117. X
  1118. X  for (y = win->_regtop; y <= win->_regbottom; y++)    /* clear all lines */
  1119. X    {
  1120. X    start = win->_line[y];
  1121. X    end = &start[win->_maxx];
  1122. X    while (start <= end)                /* clear all line */
  1123. X      *start++ = blank;
  1124. X    win->_minchng[y] = 0;
  1125. X    win->_maxchng[y] = win->_maxx;
  1126. X    }
  1127. X  win->_cury = win->_regtop;                /* cursor home */
  1128. X  win->_curx = 0;
  1129. X  } /* werase */
  1130. X
  1131. X/****************************************************************/
  1132. X/* Erase() fills all lines of stdscr with blanks and positions    */
  1133. X/* the cursor at home in the scroll region.            */
  1134. X/****************************************************************/
  1135. X
  1136. Xvoid erase()
  1137. X  {
  1138. X  werase(stdscr);
  1139. X  } /* erase */
  1140. FRIDAY_NIGHT
  1141. echo extracting - winmove.c
  1142. sed 's/^X//' > winmove.c << 'FRIDAY_NIGHT'
  1143. X/****************************************************************/
  1144. X/* Mvwin() routine of the PCcurses package            */
  1145. X/*                                */
  1146. X/****************************************************************/
  1147. X/* This version of curses is based on ncurses, a curses version    */
  1148. X/* originally written by Pavel Curtis at Cornell University.    */
  1149. X/* I have made substantial changes to make it run on IBM PC's,    */
  1150. X/* and therefore consider myself free to make it public domain.    */
  1151. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1152. X/****************************************************************/
  1153. X/* 1.0:    Release:                    870515    */
  1154. X/****************************************************************/
  1155. X
  1156. X#include <curses.h>
  1157. X#include <curspriv.h>
  1158. X
  1159. X/****************************************************************/
  1160. X/* Mvwin() moves window 'win' to position (begx, begy) on the    */
  1161. X/* screen.                            */
  1162. X/****************************************************************/
  1163. X
  1164. Xint    mvwin(win, begy, begx)
  1165. X  WINDOW    *win;
  1166. X  int         begy, begx;
  1167. X  {
  1168. X  if ((begy + win->_maxy) > (LINES-1) || (begx + win->_maxx) > (COLS-1))
  1169. X    return(ERR);
  1170. X  win->_begy = begy;
  1171. X  win->_begx = begx;
  1172. X  touchwin(win);
  1173. X  return(OK);
  1174. X  } /* mvwin */
  1175. FRIDAY_NIGHT
  1176. echo extracting - winscrol.c
  1177. sed 's/^X//' > winscrol.c << 'FRIDAY_NIGHT'
  1178. X/****************************************************************/
  1179. X/* Scroll() routine of the PCcurses package            */
  1180. X/*                                */
  1181. X/****************************************************************/
  1182. X/* This version of curses is based on ncurses, a curses version    */
  1183. X/* originally written by Pavel Curtis at Cornell University.    */
  1184. X/* I have made substantial changes to make it run on IBM PC's,    */
  1185. X/* and therefore consider myself free to make it public domain.    */
  1186. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1187. X/****************************************************************/
  1188. X/* 1.0:    Release:                    870515    */
  1189. X/****************************************************************/
  1190. X
  1191. X#include <curses.h>
  1192. X#include <curspriv.h>
  1193. X
  1194. X/****************************************************************/
  1195. X/* Scroll() scrolls the scrolling region of 'win', but only if    */
  1196. X/* scrolling is allowed and if the cursor is inside the scrol-    */
  1197. X/* ling region.                            */
  1198. X/****************************************************************/
  1199. X
  1200. Xvoid    scroll(win)
  1201. X  WINDOW    *win;
  1202. X  {
  1203. X  int         i;
  1204. X  int        *ptr;
  1205. X  int        *temp;
  1206. X  static   int     blank;
  1207. X
  1208. X  blank = ' ' | (win->_attrs & ATR_MSK);
  1209. X  if  (       (!win->_scroll)            /* check if window scrolls */
  1210. X    || (win->_cury < win->_regtop)        /* and cursor in region */
  1211. X        || (win->_cury > win->_regbottom)
  1212. X      )
  1213. X    return;
  1214. X
  1215. X  temp = win->_line[win->_regtop];
  1216. X  for (i = win->_regtop; i < win->_regbottom; i++)
  1217. X    {
  1218. X    win->_line[i] = win->_line[i+1];        /* re-arrange line pointers */
  1219. X    win->_minchng[i] = 0;
  1220. X    win->_maxchng[i] = win->_maxx;
  1221. X    }
  1222. X  for (ptr = temp; ptr - temp <= win->_maxx; ptr++)
  1223. X    *ptr = blank;                /* make a blank line */
  1224. X  win->_line[win->_regbottom] = temp;
  1225. X  if (win->_cury > win->_regtop)        /* if not on top line */
  1226. X    win->_cury--;                /* cursor scrolls too */
  1227. X  win->_minchng[win->_regbottom] = 0;
  1228. X  win->_maxchng[win->_regbottom] = win->_maxx;
  1229. X  } /* scroll */
  1230. FRIDAY_NIGHT
  1231. echo extracting - wintouch.c
  1232. sed 's/^X//' > wintouch.c << 'FRIDAY_NIGHT'
  1233. X/****************************************************************/
  1234. X/* Touchwin() routine of the PCcurses package            */
  1235. X/*                                */
  1236. X/****************************************************************/
  1237. X/* This version of curses is based on ncurses, a curses version    */
  1238. X/* originally written by Pavel Curtis at Cornell University.    */
  1239. X/* I have made substantial changes to make it run on IBM PC's,    */
  1240. X/* and therefore consider myself free to make it public domain.    */
  1241. X/*        Bjorn Larsson (...mcvax!enea!infovax!bl)    */
  1242. X/****************************************************************/
  1243. X/* 1.0:    Release:                    870515    */
  1244. X/****************************************************************/
  1245. X
  1246. X#include <curses.h>
  1247. X#include <curspriv.h>
  1248. X
  1249. X/****************************************************************/
  1250. X/* Touchwin() marks all lines of window 'win' as changed, from    */
  1251. X/* the first to the last character on the line.            */
  1252. X/****************************************************************/
  1253. X
  1254. Xvoid touchwin(win)
  1255. X  WINDOW    *win;
  1256. X  {
  1257. X  int    y;
  1258. X  int  maxy;
  1259. X  int  maxx;
  1260. X
  1261. X  maxy = win->_maxy;
  1262. X  maxx = win->_maxx;
  1263. X
  1264. X  for (y = 0; y <= maxy; y++)
  1265. X    {
  1266. X    win->_minchng[y] = 0;
  1267. X    win->_maxchng[y] = maxx;
  1268. X    } /* for */
  1269. X  } /* touchwin */
  1270. FRIDAY_NIGHT
  1271. echo pccurses.sh.4 completed!
  1272.  
  1273.  
  1274.