]> Zhao Yanbai Git Server - minix.git/commitdiff
import elf-only -lcurses
authorBen Gras <ben@minix3.org>
Thu, 21 Jul 2011 14:29:08 +0000 (16:29 +0200)
committerBen Gras <ben@minix3.org>
Mon, 25 Jul 2011 09:08:17 +0000 (11:08 +0200)
. abandons mixer, gomoku, talk, talkd, top from base system
. compile top with clang so no ack-compiled program
  needs -lcurses any more

232 files changed:
commands/Makefile
commands/gomoku/Makefile [deleted file]
commands/gomoku/gomoku.c [deleted file]
commands/life/Makefile [deleted file]
commands/life/life.c [deleted file]
commands/mixer/Makefile [deleted file]
commands/mixer/mixer.c [deleted file]
commands/talk/Makefile [deleted file]
commands/talk/net.c [deleted file]
commands/talk/net.h [deleted file]
commands/talk/proto.c [deleted file]
commands/talk/proto.h [deleted file]
commands/talk/screen.c [deleted file]
commands/talk/screen.h [deleted file]
commands/talk/talk.c [deleted file]
commands/talk/talk.h [deleted file]
commands/talkd/Makefile [deleted file]
commands/talkd/finduser.c [deleted file]
commands/talkd/finduser.h [deleted file]
commands/talkd/net.c [deleted file]
commands/talkd/net.h [deleted file]
commands/talkd/process.c [deleted file]
commands/talkd/process.h [deleted file]
commands/talkd/talk.h [deleted file]
commands/talkd/talkd.c [deleted file]
commands/talkd/talkd.h [deleted file]
commands/top/Makefile [deleted file]
common/include/Makefile.inc
common/include/curses.h [deleted file]
etc/mtree/minix.tree
include/Makefile
lib/Makefile
lib/libcurses/EXAMPLES/Makefile [new file with mode: 0644]
lib/libcurses/EXAMPLES/ex1.c [new file with mode: 0644]
lib/libcurses/EXAMPLES/view.c [new file with mode: 0644]
lib/libcurses/Makefile
lib/libcurses/PSD.doc/Makefile [new file with mode: 0644]
lib/libcurses/PSD.doc/Master [new file with mode: 0644]
lib/libcurses/PSD.doc/appen.A [new file with mode: 0644]
lib/libcurses/PSD.doc/appen.B [new file with mode: 0644]
lib/libcurses/PSD.doc/appen.C [new file with mode: 0644]
lib/libcurses/PSD.doc/c_macros [new file with mode: 0644]
lib/libcurses/PSD.doc/doc.I [new file with mode: 0644]
lib/libcurses/PSD.doc/doc.II [new file with mode: 0644]
lib/libcurses/PSD.doc/doc.III [new file with mode: 0644]
lib/libcurses/PSD.doc/doc.IV [new file with mode: 0644]
lib/libcurses/PSD.doc/ex1.c [new file with mode: 0644]
lib/libcurses/PSD.doc/ex2.c [new file with mode: 0644]
lib/libcurses/PSD.doc/fns.doc [new file with mode: 0644]
lib/libcurses/PSD.doc/intro.0 [new file with mode: 0644]
lib/libcurses/PSD.doc/intro.1 [new file with mode: 0644]
lib/libcurses/PSD.doc/intro.2 [new file with mode: 0644]
lib/libcurses/PSD.doc/intro.3 [new file with mode: 0644]
lib/libcurses/PSD.doc/intro.4 [new file with mode: 0644]
lib/libcurses/PSD.doc/intro.5 [new file with mode: 0644]
lib/libcurses/PSD.doc/intro.6 [new file with mode: 0644]
lib/libcurses/PSD.doc/life.c [new file with mode: 0644]
lib/libcurses/PSD.doc/macros [new file with mode: 0644]
lib/libcurses/PSD.doc/twinkle1.c [new file with mode: 0644]
lib/libcurses/PSD.doc/twinkle2.c [new file with mode: 0644]
lib/libcurses/PSD.doc/win_st.c [new file with mode: 0644]
lib/libcurses/acs.c [new file with mode: 0644]
lib/libcurses/add_wch.c [new file with mode: 0644]
lib/libcurses/add_wchstr.c [new file with mode: 0644]
lib/libcurses/addbytes.c [new file with mode: 0644]
lib/libcurses/addch.c [new file with mode: 0644]
lib/libcurses/addchnstr.c [new file with mode: 0644]
lib/libcurses/addnstr.c [new file with mode: 0644]
lib/libcurses/addwstr.c [new file with mode: 0644]
lib/libcurses/attributes.c [new file with mode: 0644]
lib/libcurses/background.c [new file with mode: 0644]
lib/libcurses/beep.c [deleted file]
lib/libcurses/bell.c [new file with mode: 0644]
lib/libcurses/border.c [new file with mode: 0644]
lib/libcurses/box.c [new file with mode: 0644]
lib/libcurses/cchar.c [new file with mode: 0644]
lib/libcurses/charpick.c [deleted file]
lib/libcurses/chgat.c [new file with mode: 0644]
lib/libcurses/clear.c [new file with mode: 0644]
lib/libcurses/clearok.c [new file with mode: 0644]
lib/libcurses/clrtobot.c [new file with mode: 0644]
lib/libcurses/clrtoeol.c [new file with mode: 0644]
lib/libcurses/color.c [new file with mode: 0644]
lib/libcurses/copywin.c [new file with mode: 0644]
lib/libcurses/cr_put.c [new file with mode: 0644]
lib/libcurses/ctrace.c [new file with mode: 0644]
lib/libcurses/cur_hash.c [new file with mode: 0644]
lib/libcurses/curs_set.c
lib/libcurses/curses.3 [new file with mode: 0644]
lib/libcurses/curses.c [new file with mode: 0644]
lib/libcurses/curses.h [new file with mode: 0644]
lib/libcurses/curses_addch.3 [new file with mode: 0644]
lib/libcurses/curses_addchstr.3 [new file with mode: 0644]
lib/libcurses/curses_addstr.3 [new file with mode: 0644]
lib/libcurses/curses_attributes.3 [new file with mode: 0644]
lib/libcurses/curses_background.3 [new file with mode: 0644]
lib/libcurses/curses_border.3 [new file with mode: 0644]
lib/libcurses/curses_chgat.3 [new file with mode: 0644]
lib/libcurses/curses_clear.3 [new file with mode: 0644]
lib/libcurses/curses_color.3 [new file with mode: 0644]
lib/libcurses/curses_cursor.3 [new file with mode: 0644]
lib/libcurses/curses_default_colors.3 [new file with mode: 0644]
lib/libcurses/curses_delch.3 [new file with mode: 0644]
lib/libcurses/curses_deleteln.3 [new file with mode: 0644]
lib/libcurses/curses_echochar.3 [new file with mode: 0644]
lib/libcurses/curses_fileio.3 [new file with mode: 0644]
lib/libcurses/curses_inch.3 [new file with mode: 0644]
lib/libcurses/curses_input.3 [new file with mode: 0644]
lib/libcurses/curses_insdelln.3 [new file with mode: 0644]
lib/libcurses/curses_insertch.3 [new file with mode: 0644]
lib/libcurses/curses_insertln.3 [new file with mode: 0644]
lib/libcurses/curses_keyname.3 [new file with mode: 0644]
lib/libcurses/curses_line.3 [new file with mode: 0644]
lib/libcurses/curses_pad.3 [new file with mode: 0644]
lib/libcurses/curses_print.3 [new file with mode: 0644]
lib/libcurses/curses_private.h [new file with mode: 0644]
lib/libcurses/curses_refresh.3 [new file with mode: 0644]
lib/libcurses/curses_scanw.3 [new file with mode: 0644]
lib/libcurses/curses_screen.3 [new file with mode: 0644]
lib/libcurses/curses_scroll.3 [new file with mode: 0644]
lib/libcurses/curses_standout.3 [new file with mode: 0644]
lib/libcurses/curses_termcap.3 [new file with mode: 0644]
lib/libcurses/curses_touch.3 [new file with mode: 0644]
lib/libcurses/curses_tty.3 [new file with mode: 0644]
lib/libcurses/curses_underscore.3 [new file with mode: 0644]
lib/libcurses/curses_window.3 [new file with mode: 0644]
lib/libcurses/cursesio.c [deleted file]
lib/libcurses/curspriv.h [deleted file]
lib/libcurses/delch.c [new file with mode: 0644]
lib/libcurses/deleteln.c [new file with mode: 0644]
lib/libcurses/delwin.c [new file with mode: 0644]
lib/libcurses/echo_wchar.c [new file with mode: 0644]
lib/libcurses/echochar.c [new file with mode: 0644]
lib/libcurses/endwin.c [deleted file]
lib/libcurses/erase.c [new file with mode: 0644]
lib/libcurses/fileio.c [new file with mode: 0644]
lib/libcurses/fileio.h [new file with mode: 0644]
lib/libcurses/flash.c [deleted file]
lib/libcurses/flushok.c [new file with mode: 0644]
lib/libcurses/fullname.c [new file with mode: 0644]
lib/libcurses/genfileioh.awk [new file with mode: 0644]
lib/libcurses/get_wch.c [new file with mode: 0644]
lib/libcurses/get_wstr.c [new file with mode: 0644]
lib/libcurses/getch.c [new file with mode: 0644]
lib/libcurses/getstr.c [new file with mode: 0644]
lib/libcurses/getyx.c [new file with mode: 0644]
lib/libcurses/id_subwins.c [new file with mode: 0644]
lib/libcurses/idcok.c [new file with mode: 0644]
lib/libcurses/idlok.c [new file with mode: 0644]
lib/libcurses/in_wch.c [new file with mode: 0644]
lib/libcurses/in_wchstr.c [new file with mode: 0644]
lib/libcurses/inch.c [new file with mode: 0644]
lib/libcurses/inchstr.c [new file with mode: 0644]
lib/libcurses/initscr.c
lib/libcurses/ins_wch.c [new file with mode: 0644]
lib/libcurses/ins_wstr.c [new file with mode: 0644]
lib/libcurses/insch.c [new file with mode: 0644]
lib/libcurses/insdelln.c [new file with mode: 0644]
lib/libcurses/insertln.c [new file with mode: 0644]
lib/libcurses/insstr.c [new file with mode: 0644]
lib/libcurses/instr.c [new file with mode: 0644]
lib/libcurses/inwstr.c [new file with mode: 0644]
lib/libcurses/keymap.h [new file with mode: 0644]
lib/libcurses/keyname.c [new file with mode: 0644]
lib/libcurses/keypad.c [new file with mode: 0644]
lib/libcurses/leaveok.c [new file with mode: 0644]
lib/libcurses/line.c [new file with mode: 0644]
lib/libcurses/longname.c
lib/libcurses/meta.c [new file with mode: 0644]
lib/libcurses/move.c
lib/libcurses/mvcursor.c [deleted file]
lib/libcurses/mvwin.c [new file with mode: 0644]
lib/libcurses/newwin.c
lib/libcurses/nodelay.c [new file with mode: 0644]
lib/libcurses/notimeout.c [new file with mode: 0644]
lib/libcurses/options.c [deleted file]
lib/libcurses/overlay.c
lib/libcurses/overwrite.c [new file with mode: 0644]
lib/libcurses/pause.c [new file with mode: 0644]
lib/libcurses/printw.c [new file with mode: 0644]
lib/libcurses/prntscan.c [deleted file]
lib/libcurses/putchar.c [new file with mode: 0644]
lib/libcurses/refresh.c
lib/libcurses/resize.c [new file with mode: 0644]
lib/libcurses/scanw.c [new file with mode: 0644]
lib/libcurses/screen.c [new file with mode: 0644]
lib/libcurses/scroll.c [new file with mode: 0644]
lib/libcurses/scrollok.c [new file with mode: 0644]
lib/libcurses/scrreg.c [deleted file]
lib/libcurses/setterm.c
lib/libcurses/shlib_version [new file with mode: 0644]
lib/libcurses/standout.c [new file with mode: 0644]
lib/libcurses/tabsize.c [deleted file]
lib/libcurses/termmisc.c [deleted file]
lib/libcurses/timeout.c [new file with mode: 0644]
lib/libcurses/toucholap.c [new file with mode: 0644]
lib/libcurses/touchwin.c [new file with mode: 0644]
lib/libcurses/tscroll.c [new file with mode: 0644]
lib/libcurses/tstp.c [new file with mode: 0644]
lib/libcurses/tty.c [new file with mode: 0644]
lib/libcurses/unctrl.c
lib/libcurses/unctrl.h [new file with mode: 0644]
lib/libcurses/underscore.c [new file with mode: 0644]
lib/libcurses/update.c [deleted file]
lib/libcurses/waddch.c [deleted file]
lib/libcurses/waddstr.c [deleted file]
lib/libcurses/wbox.c [deleted file]
lib/libcurses/wclear.c [deleted file]
lib/libcurses/wclrtobot.c [deleted file]
lib/libcurses/wclrtoeol.c [deleted file]
lib/libcurses/wdelch.c [deleted file]
lib/libcurses/wdeleteln.c [deleted file]
lib/libcurses/werase.c [deleted file]
lib/libcurses/wgetch.c [deleted file]
lib/libcurses/wgetstr.c [deleted file]
lib/libcurses/windel.c [deleted file]
lib/libcurses/winmove.c [deleted file]
lib/libcurses/winsch.c [deleted file]
lib/libcurses/winscrol.c [deleted file]
lib/libcurses/winsertln.c [deleted file]
lib/libcurses/wintouch.c [deleted file]
man/man1/Makefile
man/man1/top.1 [deleted file]
man/man3/Makefile
man/man3/curses.3 [deleted file]
share/mk/Makefile
share/mk/bsd.doc.mk [new file with mode: 0644]
tools/nbsd_ports
usr.bin/Makefile
usr.bin/Makefile.inc
usr.bin/top/Makefile [new file with mode: 0644]
usr.bin/top/top.c [moved from commands/top/top.c with 98% similarity]

index 268baa6258503e85a439546c0902a50cf19c8321..14adf80753ca4508e8d5f29c2acbe04688216833 100644 (file)
@@ -12,10 +12,10 @@ SUBDIR=     aal add_route adduser advent arp ash at autil awk \
        dhrystone diff dirname  dis386 dis88 diskctl du dumpcore \
        ed eject elle elvis env expand factor file \
        find finger fingerd fix fold format fortune fsck.mfs \
-       ftp101 ftpd200 gcov-pull getty grep gomoku head hexdump host \
+       ftp101 ftpd200 gcov-pull getty grep head hexdump host \
        hostaddr id ifconfig ifdef install \
        intr ipcrm ipcs irdpd isoread join kill last leave \
-       less lex life loadkeys loadramdisk logger login look lp \
+       less lex loadkeys loadramdisk logger login look lp \
        lpd ls lspci M mail make  MAKEDEV man \
        mdb mdocml mesg mined ackmkdep mkdir mkfifo mkfs.mfs mknod \
        mkproto modem mount mt netconf newroot nice acknm nohup \
@@ -27,8 +27,8 @@ SUBDIR=       aal add_route adduser advent arp ash at autil awk \
        rotate rsh rshd sed service setup shar acksize \
        sleep slip sort spell split srccrc ackstrip \
        stty su sum svclog swapfs swifi sync synctree sysenv \
-       syslogd tail talk talkd tar tcpd tcpdp tcpstat tee telnet \
-       telnetd term termcap tget time tinyhalt top touch tr \
+       syslogd tail tar tcpd tcpdp tcpstat tee telnet \
+       telnetd term termcap tget time tinyhalt touch tr \
        truncate tsort ttt tty udpstat umount uname unexpand \
        unstack update uud uue version vol wc \
        whereis which who write writeisofs fetch \
@@ -41,7 +41,7 @@ SUBDIR += elf2aout
 
 .if ${ARCH} == "i386"
 SUBDIR+=       atnormalize dosread fdisk loadfont \
-       mixer autopart part partition playwave postmort \
+       autopart part partition playwave postmort \
        recwave repartition screendump padtext
 SUBDIR+=       acd asmconv gas2ack
 .endif
diff --git a/commands/gomoku/Makefile b/commands/gomoku/Makefile
deleted file mode 100644 (file)
index 71e41aa..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-PROG=  gomoku
-MAN=
-
-DPADD+= ${LIBCURSES}
-LDADD+= -lcurses
-
-.include <bsd.prog.mk>
diff --git a/commands/gomoku/gomoku.c b/commands/gomoku/gomoku.c
deleted file mode 100644 (file)
index 3c2996e..0000000
+++ /dev/null
@@ -1,739 +0,0 @@
-/* gomoku - 5 in a row game            Author: ? */
-
-/* This program plays a very old Japanese game called GO-MOKU,
-   perhaps better known as  5-in-line.   The game is played on
-   a board with 19 x 19 squares, and the object of the game is
-   to get 5 stones in a row.
-*/
-
-#include <sys/types.h>
-#include <curses.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-/* Size of the board */
-#define SIZE 19
-
-/* Importance of attack (1..16) */
-#define AttackFactor 4
-
-/* Value of having 0, 1,2,3,4 or 5 pieces in line */
-int Weight[7] = {0, 0, 4, 20, 100, 500, 0};
-
-#define Null 0
-#define Horiz 1
-#define DownLeft 2
-#define DownRight 3
-#define Vert 4
-
-/* The two players */
-#define Empty 0
-#define Cross 1
-#define Nought 2
-
-char PieceChar[Nought + 1] = {' ', 'X', '0'};
-
-int Board[SIZE + 1][SIZE + 1];/* The board */
-int Player;                    /* The player whose move is next */
-int TotalLines;                        /* The number of Empty lines left */
-int GameWon;                   /* Set if one of the players has won */
-
-int Line[4][SIZE + 1][SIZE + 1][Nought + 1];
-
-/* Value of each square for each player */
-int Value[SIZE + 1][SIZE + 1][Nought + 1];
-
-int X, Y;                      /* Move coordinates */
-char Command;                  /* Command from keyboard */
-int AutoPlay = FALSE;          /* The program plays against itself */
-
-_PROTOTYPE(void Initialize, (void));
-_PROTOTYPE(int Abort, (char *s));
-_PROTOTYPE(void WriteLetters, (void));
-_PROTOTYPE(void WriteLine, (int j, int *s));
-_PROTOTYPE(void WriteBoard, (int N, int *Top, int *Middle, int *Bottom));
-_PROTOTYPE(void SetUpScreen, (void));
-_PROTOTYPE(void GotoSquare, (int x, int y));
-_PROTOTYPE(void PrintMove, (int Piece, int X, int Y));
-_PROTOTYPE(void ClearMove, (void));
-_PROTOTYPE(void PrintMsg, (char *Str));
-_PROTOTYPE(void ClearMsg, (void));
-_PROTOTYPE(void WriteCommand, (char *S));
-_PROTOTYPE(void ResetGame, (int FirstGame));
-_PROTOTYPE(int OpponentColor, (int Player));
-_PROTOTYPE(void BlinkRow, (int X, int Y, int Dx, int Dy, int Piece));
-_PROTOTYPE(void BlinkWinner, (int Piece, int X, int Y, int WinningLine));
-_PROTOTYPE(int Random, (int x));
-_PROTOTYPE(void Add, (int *Num));
-_PROTOTYPE(void Update, (int Lin[], int Valu[], int Opponent));
-_PROTOTYPE(void MakeMove, (int X, int Y));
-_PROTOTYPE(int GameOver, (void));
-_PROTOTYPE(void FindMove, (int *X, int *Y));
-_PROTOTYPE(char GetChar, (void));
-_PROTOTYPE(void ReadCommand, (int X, int Y, char *Command));
-_PROTOTYPE(void InterpretCommand, (int Command));
-_PROTOTYPE(void PlayerMove, (void));
-_PROTOTYPE(void ProgramMove, (void));
-_PROTOTYPE(int main, (void));
-
-/* Set terminal to raw mode. */
-void Initialize()
-{
-  srand(getpid() + 13);                /* Initialize the random seed with our pid */
-  initscr();
-  raw();
-  noecho();
-  clear();
-}
-
-/* Reset terminal and exit from the program. */
-int Abort(s)
-char *s;
-{
-  move(LINES - 1, 0);
-  refresh();
-  endwin();
-  exit(0);
-}
-
-/* Set up the screen ----------------------------------------------- */
-
-/* Write the letters */
-void WriteLetters()
-{
-  int i;
-
-  addch(' ');
-  addch(' ');
-  for (i = 1; i <= SIZE; i++) printw(" %c", 'A' + i - 1);
-  addch('\n');
-}
-
-/* Write one line of the board */
-void WriteLine(j, s)
-int j;
-int *s;
-{
-  int i;
-
-  printw("%2d ", j);
-  addch(s[0]);
-  for (i = 2; i <= SIZE - 1; i++) {
-       addch(s[1]);
-       addch(s[2]);
-  }
-  addch(s[1]);
-  addch(s[3]);
-  printw(" %-2d\n", j);
-}
-
-/* Print the Empty board and the border */
-void WriteBoard(N, Top, Middle, Bottom)
-int N;
-int *Top, *Middle, *Bottom;
-{
-  int j;
-
-  move(1, 0);
-  WriteLetters();
-  WriteLine(N, Top);
-  for (j = N - 1; j >= 2; j--) WriteLine(j, Middle);
-  WriteLine(1, Bottom);
-  WriteLetters();
-}
-
-/* Sets up the screen with an Empty board */
-void SetUpScreen()
-{
-  int top[4], middle[4], bottom[4];
-
-  top[0] = ACS_ULCORNER;
-  top[1] = ACS_HLINE;
-  top[2] = ACS_TTEE;
-  top[3] = ACS_URCORNER;
-
-  middle[0] = ACS_LTEE;
-  middle[1] = ACS_HLINE;
-  middle[2] = ACS_PLUS;
-  middle[3] = ACS_RTEE;
-
-  bottom[0] = ACS_LLCORNER;
-  bottom[1] = ACS_HLINE;
-  bottom[2] = ACS_BTEE;
-  bottom[3] = ACS_LRCORNER;
-
-  WriteBoard(SIZE, top, middle, bottom);
-}
-
-/* Show moves ----------------------------------------------- */
-
-void GotoSquare(x, y)
-int x, y;
-{
-  move(SIZE + 2 - y, 1 + x * 2);
-}
-
-/* Prints a move */
-void PrintMove(Piece, X, Y)
-int Piece;
-int X, Y;
-{
-  move(22, 49);
-  printw("%c %c %d", PieceChar[Piece], 'A' + X - 1, Y);
-  clrtoeol();
-  GotoSquare(X, Y);
-  addch(PieceChar[Piece]);
-  GotoSquare(X, Y);
-  refresh();
-}
-
-/* Clears the line where a move is displayed */
-void ClearMove()
-{
-  move(22, 49);
-  clrtoeol();
-}
-
-/* Message handling ---------------------------------------------- */
-
-/* Prints a message */
-void PrintMsg(Str)
-char *Str;
-{
-  mvprintw(23, 1, "%s", Str);
-}
-
-/* Clears the message about the winner */
-void ClearMsg()
-{
-  move(23, 1);
-  clrtoeol();
-}
-
-/* Highlights the first letter of S */
-void WriteCommand(S)
-char *S;
-{
-  standout();
-  addch(*S);
-  standend();
-  printw("%s", S + 1);
-}
-
-/* Display the board ----------------------------------------------- */
-
-/* Resets global variables to start a new game */
-void ResetGame(FirstGame)
-int FirstGame;
-{
-  int I, J;
-  int C, D;
-
-  SetUpScreen();
-  if (FirstGame) {
-       move(1, 49);
-       addstr("G O M O K U");
-       move(3, 49);
-       WriteCommand("Newgame    ");
-       WriteCommand("Quit ");
-       move(5, 49);
-       WriteCommand("Auto");
-       move(7, 49);
-       WriteCommand("Play");
-       move(9, 49);
-       WriteCommand("Hint");
-       move(14, 60);
-       WriteCommand("Left, ");
-       WriteCommand("Right, ");
-       move(16, 60);
-       WriteCommand("Up, ");
-       WriteCommand("Down");
-       move(18, 60);
-       standout();
-       addstr("SPACE");
-       move(20, 49);
-       WriteCommand(" NOTE: Use Num Lock & arrows");
-       standend();
-       mvaddstr(14, 49, "7  8  9");
-       mvaddch(15, 52, ACS_UARROW);
-       mvaddch(16, 49, '4');
-       addch(ACS_LARROW);
-       mvaddch(16, 54, ACS_RARROW);
-       addch('6');
-       mvaddch(17, 52, ACS_DARROW);
-       mvaddstr(18, 49, "1  2  3");
-       FirstGame = FALSE;
-  } else {
-       ClearMsg();
-       ClearMove();
-  }
-
-  /* Clear tables */
-  for (I = 1; I <= SIZE; I++) for (J = 1; J <= SIZE; J++) {
-               Board[I][J] = Empty;
-               for (C = Cross; C <= Nought; C++) {
-                       Value[I][J][C] = 0;
-                       for (D = 0; D <= 3; D++) Line[D][I][J][C] = 0;
-               }
-       }
-
-  /* Cross starts */
-  Player = Cross;
-  /* Total number of lines */
-  TotalLines = 2 * 2 * (SIZE * (SIZE - 4) + (SIZE - 4) * (SIZE - 4));
-  GameWon = FALSE;
-}
-
-int OpponentColor(Player)
-int Player;
-{
-  if (Player == Cross)
-       return Nought;
-  else
-       return Cross;
-}
-
-/* Blink the row of 5 stones */
-void BlinkRow(X, Y, Dx, Dy, Piece)
-int X, Y, Dx, Dy, Piece;
-{
-  int I;
-
-  attron(A_BLINK);
-  for (I = 1; I <= 5; I++) {
-       GotoSquare(X, Y);
-       addch(PieceChar[Piece]);
-       X = X - Dx;
-       Y = Y - Dy;
-  }
-  attroff(A_BLINK);
-}
-
-/* Prints the 5 winning stones in blinking color */
-void BlinkWinner(Piece, X, Y, WinningLine)
-int Piece, X, Y, WinningLine;
-{
-  /* Used to store the position of the winning move */
-  int XHold, YHold;
-  /* Change in X and Y */
-  int Dx, Dy;
-
-  /* Display winning move */
-  PrintMove(Piece, X, Y);
-  /* Preserve winning position */
-  XHold = X;
-  YHold = Y;
-  switch (WinningLine) {
-      case Horiz:
-       {
-               Dx = 1;
-               Dy = 0;
-               break;
-       }
-
-      case DownLeft:
-       {
-               Dx = 1;
-               Dy = 1;
-               break;
-       }
-
-      case Vert:
-       {
-               Dx = 0;
-               Dy = 1;
-               break;
-       }
-
-      case DownRight:
-       {
-               Dx = -1;
-               Dy = 1;
-               break;
-       }
-  }
-
-  /* Go to topmost, leftmost */
-  while (Board[X + Dx][Y + Dy] != Empty && Board[X + Dx][Y + Dy] == Piece) {
-       X = X + Dx;
-       Y = Y + Dy;
-  }
-  BlinkRow(X, Y, Dx, Dy, Piece);
-  /* Restore winning position */
-  X = XHold;
-  Y = YHold;
-  /* Go back to winning square */
-  GotoSquare(X, Y);
-}
-
-/* Functions for playing a game -------------------------------- */
-
-int Random(x)
-int x;
-{
-  return((rand() / 19) % x);
-}
-
-/* Adds one to the number of pieces in a line */
-void Add(Num)
-int *Num;
-{
-  /* Adds one to the number.     */
-  *Num = *Num + 1;
-  /* If it is the first piece in the line, then the opponent cannot use
-   * it any more.  */
-  if (*Num == 1) TotalLines = TotalLines - 1;
-  /* The game is won if there are 5 in line. */
-  if (*Num == 5) GameWon = TRUE;
-}
-
-/* Updates the value of a square for each player, taking into
-   account that player has placed an extra piece in the square.
-   The value of a square in a usable line is Weight[Lin[Player]+1]
-   where Lin[Player] is the number of pieces already placed
-in the line */
-void Update(Lin, Valu, Opponent)
-int Lin[];
-int Valu[];
-int Opponent;
-{
-  /* If the opponent has no pieces in the line, then simply update the
-   * value for player */
-  if (Lin[Opponent] == 0)
-       Valu[Player] += Weight[Lin[Player] + 1] - Weight[Lin[Player]];
-  else
-       /* If it is the first piece in the line, then the line is
-        * spoiled for the opponent */
-  if (Lin[Player] == 1) Valu[Opponent] -= Weight[Lin[Opponent] + 1];
-}
-
-/* Performs the move X,Y for player, and updates the global variables
-(Board, Line, Value, Player, GameWon, TotalLines and the screen) */
-void MakeMove(X, Y)
-int X, Y;
-{
-  int Opponent;
-  int X1, Y1;
-  int K, L, WinningLine;
-
-  WinningLine = Null;
-  Opponent = OpponentColor(Player);
-  GameWon = FALSE;
-
-  /* Each square of the board is part of 20 different lines. The adds
-   * one to the number of pieces in each of these lines. Then it
-   * updates the value for each of the 5 squares in each of the 20
-   * lines. Finally Board is updated, and the move is printed on the
-   * screen. */
-
-  /* Horizontal lines, from left to right */
-  for (K = 0; K <= 4; K++) {
-       X1 = X - K;             /* Calculate starting point */
-       Y1 = Y;
-       if ((1 <= X1) && (X1 <= SIZE - 4)) {    /* Check starting point */
-               Add(&Line[0][X1][Y1][Player]);  /* Add one to line */
-               if (GameWon && (WinningLine == Null))   /* Save winning line */
-                       WinningLine = Horiz;
-               for (L = 0; L <= 4; L++)        /* Update value for the
-                                                * 5 squares in the line */
-                       Update(Line[0][X1][Y1], Value[X1 + L][Y1], Opponent);
-       }
-  }
-
-  for (K = 0; K <= 4; K++) {   /* Diagonal lines, from lower left to
-                                * upper right */
-       X1 = X - K;
-       Y1 = Y - K;
-       if ((1 <= X1) && (X1 <= SIZE - 4) &&
-           (1 <= Y1) && (Y1 <= SIZE - 4)) {
-               Add(&Line[1][X1][Y1][Player]);
-               if (GameWon && (WinningLine == Null))   /* Save winning line */
-                       WinningLine = DownLeft;
-               for (L = 0; L <= 4; L++)
-                       Update(Line[1][X1][Y1], Value[X1 + L][Y1 + L], Opponent);
-       }
-  }                            /* for */
-
-  for (K = 0; K <= 4; K++) {   /* Diagonal lines, down right to upper left */
-       X1 = X + K;
-       Y1 = Y - K;
-       if ((5 <= X1) && (X1 <= SIZE) &&
-           (1 <= Y1) && (Y1 <= SIZE - 4)) {
-               Add(&Line[3][X1][Y1][Player]);
-               if (GameWon && (WinningLine == Null))   /* Save winning line */
-                       WinningLine = DownRight;
-               for (L = 0; L <= 4; L++)
-                       Update(Line[3][X1][Y1], Value[X1 - L][Y1 + L], Opponent);
-       }
-  }                            /* for */
-
-  for (K = 0; K <= 4; K++) {   /* Vertical lines, from down to up */
-       X1 = X;
-       Y1 = Y - K;
-       if ((1 <= Y1) && (Y1 <= SIZE - 4)) {
-               Add(&Line[2][X1][Y1][Player]);
-               if (GameWon && (WinningLine == Null))   /* Save winning line */
-                       WinningLine = Vert;
-               for (L = 0; L <= 4; L++)
-                       Update(Line[2][X1][Y1], Value[X1][Y1 + L], Opponent);
-       }
-  }
-
-  Board[X][Y] = Player;                /* Place piece in board */
-  if (GameWon)
-       BlinkWinner(Player, X, Y, WinningLine);
-  else
-       PrintMove(Player, X, Y);/* Print move on screen */
-  Player = Opponent;           /* The opponent is next to move */
-}
-
-int GameOver()
-/* A game is over if one of the players have
-won, or if there are no more Empty lines */
-{
-  return(GameWon || (TotalLines <= 0));
-}
-
-/* Finds a move X,Y for player, simply by picking the one with the
-highest value */
-void FindMove(X, Y)
-int *X, *Y;
-{
-  int Opponent;
-  int I, J;
-  int Max, Valu;
-
-  Opponent = OpponentColor(Player);
-  Max = -10000;
-  /* If no square has a high value then pick the one in the middle */
-  *X = (SIZE + 1) / 2;
-  *Y = (SIZE + 1) / 2;
-  if (Board[*X][*Y] == Empty) Max = 4;
-  /* The evaluation for a square is simply the value of the square for
-   * the player (attack points) plus the value for the opponent
-   * (defense points). Attack is more important than defense, since it
-   * is better to get 5 in line yourself than to prevent the op- ponent
-   * from getting it. */
-
-  /* For all Empty squares */
-  for (I = 1; I <= SIZE; I++) for (J = 1; J <= SIZE; J++)
-               if (Board[I][J] == Empty) {
-                       /* Calculate evaluation */
-                       Valu = Value[I][J][Player] * (16 + AttackFactor) / 16 + Value[I][J][Opponent] + Random(4);
-                       /* Pick move with highest value */
-                       if (Valu > Max) {
-                               *X = I;
-                               *Y = J;
-                               Max = Valu;
-                       }
-               }
-}
-
-char GetChar()
-/* Get a character from the keyboard */
-{
-  int c;
-
-  c = getch();
-  if (c < 0) abort();
-  if (c == '\033') {   /* arrow key */
-       if ((c = getch()) == '[') {
-               c = getch();
-               switch (c) {
-               case 'A': c = 'U'; break;
-               case 'B': c = 'D'; break;
-               case 'C': c = 'R'; break;
-               case 'D': c = 'L'; break;
-               default:
-                       c = '?';
-                       break;
-               }
-       }
-       else
-               c = '?';
-  }
-  if (islower(c))
-       return toupper(c);
-  else
-       return c;
-}
-
-/* Reads in a valid command character */
-void ReadCommand(X, Y, Command)
-int X, Y;
-char *Command;
-{
-  int ValidCommand;
-
-  do {
-       ValidCommand = TRUE;
-       GotoSquare(X, Y);       /* Goto square */
-       refresh();
-       *Command = GetChar();   /* Read from keyboard */
-       switch (*Command) {
-           case '\n':          /* '\n', '\r' or space means place a */
-           case '\r':
-           case ' ':
-               *Command = 'E';
-               break;          /* stone at the cursor position  */
-
-           case 'L':
-           case 'R':
-           case 'U':
-           case 'D':
-           case '7':
-           case '9':
-           case '1':
-           case '3':
-           case 'N':
-           case 'Q':
-           case 'A':
-           case 'P':
-           case 'H':
-               break;
-
-           case '8':   *Command = 'U'; break;
-           case '2':   *Command = 'D'; break;
-           case '4':   *Command = 'L'; break;
-           case '6':   *Command = 'R'; break;
-           default:
-               {
-                       if (GameOver())
-                               *Command = 'P';
-                       else
-                               ValidCommand = FALSE;
-                       break;
-               }
-       }
-  } while (!ValidCommand);
-}
-
-void InterpretCommand(Command)
-char Command;
-{
-  int Temp;
-
-  switch (Command) {
-      case 'N':{               /* Start new game */
-               ResetGame(FALSE);       /* ResetGame but only redraw
-                                        * the board */
-               X = (SIZE + 1) / 2;
-               Y = X;
-               break;
-       }
-      case 'H':
-       FindMove(&X, &Y);
-       break;                  /* Give the user a hint */
-      case 'L':
-       X = (X + SIZE - 2) % SIZE + 1;
-       break;                  /* Left  */
-      case 'R':
-       X = X % SIZE + 1;
-       break;                  /* Right */
-      case 'D':
-       Y = (Y + SIZE - 2) % SIZE + 1;
-       break;                  /* Down  */
-      case 'U':
-       Y = Y % SIZE + 1;
-       break;                  /* Up    */
-      case '7':{
-               if ((X == 1) || (Y == SIZE)) {  /* Move diagonally    *//* t
-                                                * owards upper left */
-                       Temp = X;
-                       X = Y;
-                       Y = Temp;
-               } else {
-                       X = X - 1;
-                       Y = Y + 1;
-               }
-               break;
-       }
-      case '9':{               /* Move diagonally    */
-               if (X == SIZE) {/* toward upper right */
-                       X = (SIZE - Y) + 1;
-                       Y = 1;
-               } else if (Y == SIZE) {
-                       Y = (SIZE - X) + 1;
-                       X = 1;
-               } else {
-                       X = X + 1;
-                       Y = Y + 1;
-               }
-               break;
-       }
-      case '1':{               /* Move diagonally   */
-               if (Y == 1) {   /* toward lower left */
-                       Y = (SIZE - X) + 1;
-                       X = SIZE;
-               } else if (X == 1) {
-                       X = (SIZE - Y) + 1;
-                       Y = SIZE;
-               } else {
-                       X = X - 1;
-                       Y = Y - 1;
-               }
-               break;
-       }
-      case '3':{               /* Move diagonally    */
-               if ((X == SIZE) || (Y == 1)) {  /* toward lower right */
-                       Temp = X;
-                       X = Y;
-                       Y = Temp;
-               } else {
-                       X = X + 1;
-                       Y = Y - 1;
-               }
-               break;
-       }
-      case 'A':
-       AutoPlay = TRUE;
-       break;                  /* Auto play mode */
-  }                            /* case */
-}                              /* InterpretCommand */
-
-void PlayerMove()
-/* Enter and make a move */
-{
-  if (Board[X][Y] == Empty) {
-       MakeMove(X, Y);
-       if (GameWon) PrintMsg("Congratulations, You won!");
-       Command = 'P';
-  }
-  refresh();
-}                              /* PlayerMove */
-
-void ProgramMove()
-/* Find and perform programs move */
-{
-  do {
-       if (GameOver()) {
-               AutoPlay = FALSE;
-               if ((Command != 'Q') && (!GameWon)) PrintMsg("Tie game!");
-       } else {
-               FindMove(&X, &Y);
-               MakeMove(X, Y);
-               if (GameWon) PrintMsg("I won!");
-       }
-       refresh();
-  } while (AutoPlay);
-}
-
-int main()
-{
-  Initialize();
-  ResetGame(TRUE);             /* ResetGame and draw the entire screen */
-  refresh();
-  X = (SIZE + 1) / 2;          /* Set starting position to */
-  Y = X;                       /* the middle of the board  */
-  do {
-       ReadCommand(X, Y, &Command);
-       if (GameOver())
-               if (Command != 'Q') Command = 'N';
-       InterpretCommand(Command);
-       if (Command == 'E') PlayerMove();
-       if (Command == 'P' || Command == 'A') ProgramMove();
-  } while (Command != 'Q');
-  Abort("Good bye!");
-  return(0);
-}
diff --git a/commands/life/Makefile b/commands/life/Makefile
deleted file mode 100644 (file)
index 43e00bd..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-PROG=  life
-MAN=
-
-DPADD+= ${LIBCURSES}
-LDADD+= -lcurses
-
-.include <bsd.prog.mk>
diff --git a/commands/life/life.c b/commands/life/life.c
deleted file mode 100644 (file)
index 31bfbcd..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-/* life - Conway's game of life                Author: Jim King */
-
-/* clife.c - curses life simulator.  Translated from Pascal to C implementing
- *           curses Oct 1988 by pulsar@lsrhs, not jek5036@ritvax.isc.rit.edu
- *           life needs about 18kb stack space on MINIX.
- *
- * Flags:      -d  draw your own screen using arrows and space bar
- *             -p  print statistics on the bottom line during the game
- */
-
-#include <sys/types.h>
-#include <signal.h>
-#include <time.h>
-#include <curses.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-
-#if __minix_vmd                /* Use a more random rand(). */
-#define srand(seed)    srandom(seed)
-#define rand()         random()
-#endif
-
-/* A value of -1 will make it go forever */
-/* A value of 0 will make it exit immediately */
-#define        REPSTOP         -1      /* number of repetitions before stop */
-
-int present[23][80];           /* screen 1 cycle ago */
-int past[23][80];              /* screen this cycle */
-int total;                     /* total # of changes */
-int icnt;                      /* counter to check for repetition */
-int maxrow = 22;               /* some defines to represent the screen */
-int maxcol = 79;
-int minrow = 0;
-int mincol = 0; 
-int pri = 0;                   /* flag for printing stats on bottom line */
-int draw = 0;                  /* flag for drawing your own screen */
-int i, j, k;                   /* loop counters */
-int cycle;                     /* current cycle # */
-int changes;                   /* # of changes this cycle (live + die) */
-int die;                       /* number of deaths this cycle */
-int live;                      /* number of births this cycle */
-
-WINDOW *mns;                   /* Main Screen */
-WINDOW *info;                  /* Bottom line */
-
-_PROTOTYPE(void cleanup, (int s));
-_PROTOTYPE(void initialize, (void));
-_PROTOTYPE(void makscr, (void));
-_PROTOTYPE(void update, (void));
-_PROTOTYPE(void print, (void));
-_PROTOTYPE(int main, (int ac, char *av[]));
-
-/* Cleanup - cleanup then exit */
-void cleanup(s)
-int s;
-{
-  move(23, 0);                 /* go to bottom of screen */
-  refresh();                   /* update cursor */
-
-  endwin();                    /* shutdown curses */
-  exit(1);                     /* exit */
-}
-
-/* Initialize - init windows, variables, and signals */
-
-void initialize()
-{
-  srand(getpid());             /* init random seed */
-  initscr();                   /* init curses */
-  noecho();
-  curs_set(0);
-  signal(SIGINT, cleanup);     /* catch ^C */
-  mns = newwin(maxrow, maxcol, 0, 0);  /* new window */
-  scrollok(mns, FALSE);
-  info = newwin(1, 80, 23, 0);
-  scrollok(info, FALSE);
-  wclear(mns);
-  wclear(info);
-  wmove(info, 0, 0);
-  wrefresh(info);
-  if (!draw) {                 /* if no draw, make random pattern */
-       for (j = 0; j < maxrow; j++) {
-               for (k = 0; k < maxcol; k++) {
-                       present[j][k] = rand() % 2;
-                       if (present[j][k] == 1) changes++, live++;
-               }
-       }
-  }
-}
-
-/* Makscr - make your own screen using arrow keys and space bar */
-void makscr()
-{
-  int curx, cury;              /* current point on screen */
-  char c;                      /* input char */
-
-  wclear(info);
-  wmove(info, 0, 0);
-  wprintw(info, "Use arrow keys to move, space to place / erase, ^D to start", NULL);
-  wrefresh(info);
-  curx = cury = 1;
-  wmove(mns, cury - 1, curx - 1);
-  wrefresh(mns);
-  noecho();
-  for (;;) {
-       c = wgetch(mns);
-       if (c == '\004')
-               break;
-       else if (c == ' ') {
-               if (present[cury][curx]) {
-                       --present[cury][curx];
-                       changes++;
-                       die++;
-                       mvwaddch(mns, cury, curx, ' ');
-               } else {
-                       ++present[cury][curx];
-                       changes++;
-                       live++;
-                       mvwaddch(mns, cury, curx, '*');
-               }
-       } else if (c == '\033') {
-               wgetch(mns);
-               switch (wgetch(mns)) {
-                   case 'A':   --cury; break;
-                   case 'B':   ++cury; break;
-                   case 'C':   ++curx; break;
-                   case 'D':   --curx; break;
-                   default:    break;
-               }
-       }
-       if (cury > maxrow) cury = minrow;
-       if (cury < minrow) cury = maxrow;
-       if (curx > maxcol) curx = mincol;
-       if (curx < mincol) curx = maxcol;
-       wmove(mns, cury, curx);
-       wrefresh(mns);
-  }
-  wclear(info);
-}
-
-/* Update rules:  2 or 3 adjacent alive --- stay alive
- *                3 adjacent alive -- dead to live
- *                all else die or stay dead
- */
-void update()
-{                              /* Does all mathmatical calculations */
-  int howmany, w, x, y, z;
-  changes = die = live = 0;
-  for (j = 0; j < maxrow; j++) {
-       for (k = 0; k < maxcol; k++) {
-               w = j - 1;
-               x = j + 1;
-               y = k - 1;
-               z = k + 1;
-
-               howmany = (past[w][y] + past[w][k] + past[w][z] +
-                          past[j][y] + past[j][z] + past[x][y] +
-                          past[x][k] + past[x][z]);
-
-               switch (howmany) {
-                   case 0:
-                   case 1:
-                   case 4:
-                   case 5:
-                   case 6:
-                   case 7:
-                   case 8:
-                       present[j][k] = 0;
-                       if (past[j][k]) changes++, die++;
-                       break;
-                   case 3:
-                       present[j][k] = 1;
-                       if (!past[j][k]) changes++, live++;
-                       break;
-                   default:    break;
-               }
-       }
-  }
-  if (live == die)
-       ++icnt;
-  else
-       icnt = 0;
-
-  if (icnt == REPSTOP) cleanup(0);
-}
-
-/* Print - updates the screen according to changes from past to present */
-void print()
-{      
-/* Updates the screen, greatly improved using curses */
-  if (pri) {
-       wmove(info, 0, 0);
-       total += changes;
-       cycle++;
-       wprintw(info, "Cycle %5d | %5d changes: %5d died + %5d born = %5u total changes", (char *) cycle, changes, die, live, total);
-       wclrtoeol(info);
-  }
-  for (j = 1; j < maxrow; j++) {
-       for (k = 1; k < maxcol; k++) {
-               if (present[j][k] != past[j][k] && present[j][k] == 1) {
-                       wmove(mns, j, k);
-                       wprintw(mns, "*", NULL);
-               } else if (present[j][k] != past[j][k] && present[j][k] == 0) {
-                       wmove(mns, j, k);
-                       wprintw(mns, " ", NULL);
-               }
-       }
-  }
-  if (pri) wrefresh(info);
-  wrefresh(mns);
-}
-
-/* Main - main procedure */
-int main(ac, av)
-int ac;
-char *av[];
-{
-  if (ac > 1) {
-       for (j = 1; j < ac; j++) {
-               switch (av[j][1]) {
-                   case 'd':   ++draw; break;
-                   case 'p':   ++pri;  break;
-                   default:
-                       fprintf(stderr, "%s: usage: %s [-d] [-p]\n", av[0], av[0]);
-                       exit(1);
-               }
-       }
-  }
-
-  initialize();
-  if (draw) makscr();
-
-  for (;;) {
-       print();
-       for (j = 0; j < maxrow; j++) {
-               for (k = 0; k < maxcol; k++) past[j][k] = present[j][k];
-       }
-       update();
-  }
-}
diff --git a/commands/mixer/Makefile b/commands/mixer/Makefile
deleted file mode 100644 (file)
index 306ca14..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-PROG=  mixer
-MAN=
-
-DPADD+= ${LIBCURSES}
-LDADD+= -lcurses
-
-.include <bsd.prog.mk>
diff --git a/commands/mixer/mixer.c b/commands/mixer/mixer.c
deleted file mode 100644 (file)
index a026997..0000000
+++ /dev/null
@@ -1,658 +0,0 @@
-/*   
- *  mixer
- *
- *  Michel R. Prevenier.
- */
-
-#include <sys/types.h>
-#include <errno.h>
-#include <curses.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <minix/sound.h>
-
-#define CURS_CTRL      '\033'
-#define ESCAPE         27
-#define UP             'A'
-#define DOWN           'B'
-#define LEFT           'D'
-#define RIGHT          'C'
-#define SPACE          ' '
-
-
-_PROTOTYPE ( int main, (int arg, char **argv));
-_PROTOTYPE ( void usage, (void));
-_PROTOTYPE ( void non_interactive, (void));
-_PROTOTYPE ( void setup_screen, (void));
-_PROTOTYPE ( int read_settings, (void));
-_PROTOTYPE ( int write_settings, (void));
-_PROTOTYPE ( void rdwr_levels, (int flag));
-_PROTOTYPE ( void rdwr_inputs, (int flag));
-_PROTOTYPE ( void rdwr_outputs, (int flag));
-_PROTOTYPE ( void create_slider, (int x, int y, enum Device device));
-_PROTOTYPE ( void show_inputs, (int x, int y));
-_PROTOTYPE ( void show_outputs, (int x, int y));
-_PROTOTYPE ( char *d_name, (enum Device device, char *name));
-_PROTOTYPE ( void user_interface, (void));
-_PROTOTYPE ( void terminate, (int s));
-
-WINDOW *main_win;
-int old_stdin;
-int fd;
-char name[9];
-char *file_name;
-struct volume_level levels[9];
-struct inout_ctrl inputs_left[9];
-struct inout_ctrl inputs_right[9];
-struct inout_ctrl outputs[9];
-
-
-void usage()
-{
-  fprintf(stderr, "Usage: mixer [-r]\n");
-  exit(-1);
-}
-
-
-void terminate(s)
-int s;
-{
-  /* Restore terminal parameters and exit */
-
-  (void) fcntl(0,F_SETFL,old_stdin);
-  move(23, 0);                 
-  refresh();                   
-  resetty();
-  endwin();                    
-  exit(1);             
-}
-
-
-int write_settings()
-{
-  /* Write the current mixer settings to $HOME/.mixer */
-
-  int fd;
-
-  if ((fd = creat(file_name, 0x124)) > 0)
-  {
-    write(fd, levels, sizeof(levels));
-    write(fd, inputs_left, sizeof(inputs_left));
-    write(fd, inputs_right, sizeof(inputs_right));
-    write(fd, outputs, sizeof(outputs));
-    close(fd);
-    return 1;
-  }
-
-  return 0;
-}
-
-
-int read_settings()
-{
-  /* Restore mixer settings saved in $HOME/.mixer */
-
-  int fd;
-
-  if ((fd = open(file_name, O_RDONLY)) > 0)
-  {
-    read(fd, levels, sizeof(levels));
-    read(fd, inputs_left, sizeof(inputs_left));
-    read(fd, inputs_right, sizeof(inputs_right));
-    read(fd, outputs, sizeof(outputs));
-    close(fd);
-    rdwr_levels(1);
-    rdwr_outputs(1);
-    rdwr_inputs(1);
-    return 1;
-  }
-  return 0;
-}
-
-
-void rdwr_levels(flag)
-int flag;             /* 0 = read, 1 = write */
-{
-  /* Get or set mixer settings */
-
-  int i;
-  int cmd;
-  cmd = (flag == 0 ? MIXIOGETVOLUME : MIXIOSETVOLUME);  
-  
-  for(i = Master; i <= Bass; i++)
-    (void) (ioctl(fd, cmd, &levels[i])); 
-}    
-
-
-void rdwr_inputs(flag)
-int flag;              /* 0 = read, 1 = write */
-{
-  /* Get or set input settings */
-
-  int i;
-  int cmd_left, cmd_right;
-  
-  cmd_left = (flag == 0 ? MIXIOGETINPUTLEFT : MIXIOSETINPUTLEFT);  
-  cmd_right = (flag == 0 ? MIXIOGETINPUTRIGHT : MIXIOSETINPUTRIGHT);  
-
-  for(i = Fm; i <= Mic; i++)
-  {
-    (void) (ioctl(fd, cmd_left, &inputs_left[i])); 
-    (void) (ioctl(fd, cmd_right, &inputs_right[i])); 
-  }
-}
-
-
-void rdwr_outputs(flag)
-int flag;               /* 0 = read, 1 = write */
-{
-  /* Get or set output settings */
-
-  int i;
-  int cmd; 
-
-  cmd = (flag == 0 ? MIXIOGETOUTPUT : MIXIOSETOUTPUT);  
-
-  for(i = Cd; i <= Mic; i++)
-    (void) (ioctl(fd, cmd, &outputs[i])); 
-}
-
-
-int main(argc, argv)
-int argc;
-char **argv;
-
-{
-  int i;
-  char *home_ptr;
-  int fd2;
-
-  /* Open mixer */
-  if ((fd = open("/dev/mixer",O_RDONLY)) < 0)
-  {
-    fprintf(stderr, "Cannot open /dev/mixer\n");
-    exit(-1);
-  }
-
-  /* Get user's home directory and construct the $HOME/.mixer
-   * file name 
-   */
-  home_ptr = getenv("HOME");
-  file_name = malloc(strlen(home_ptr)+strlen("mixer.ini\0"));
-  if (file_name == (char *)0) 
-  {
-    fprintf(stderr, "Not enough memory\n");
-    exit(-1);
-  }
-  strncpy(file_name, home_ptr, strlen(home_ptr));
-  strncpy(file_name+strlen(home_ptr), "/.mixer\0", 9);
-
-  /* Fill in the device numbers */    
-  for(i = Master; i <= Bass; i++) 
-  {
-    levels[i].device = i;
-    inputs_left[i].device = i;
-    inputs_right[i].device = i;
-    outputs[i].device = i;
-  }
-
-  /* Get arguments */
-  if (argc > 1)
-  {
-    if (strncmp(argv[1], "-r", 2) == 0)
-    {
-      if (read_settings())
-      {
-        printf("Mixer settings restored\n");
-        exit(0);
-      }
-      else
-      {
-        fprintf(stderr, "Could not restore mixer settings\n");
-        exit(-1);
-      }
-    } 
-    else usage();
-  }
-
-  /* Initialize windows. */
-  (void) initscr();
-  signal(SIGINT, terminate);
-  old_stdin = fcntl(0,F_GETFL);
-  cbreak();
-  noecho();
-  main_win = newwin(23,80,0,0);
-  scrollok(main_win, FALSE);
-
-  /* Read all current mixer settings */
-  rdwr_levels(0);
-  rdwr_inputs(0);
-  rdwr_outputs(0);
-
-  /* Set up the user screen and handle user input */
-  setup_screen();
-  user_interface();
-}
-
-
-void user_interface()
-{
-  /* This is the user interface. */
-  char c;
-  int x,y;
-  int right;
-  int input_scr, input_pos;
-  int output_scr, output_pos;
-  int max_level;
-  enum Device device;
-  int fd2;
-  device = Master;
-  right = 0;
-  input_scr = 0;
-  output_scr = 0;
-  input_pos = 0;
-  output_pos = 0;
-
-  while(1)
-  {
-    if (input_scr)
-    {
-      y = device + 9;
-      x = 51 + input_pos + (device == Mic ? 2 : 0);
-    }
-    else if (output_scr)
-    {
-      y = device + 15;
-      x = 53 + output_pos + (device == Mic ? 4 : 0);
-    }
-    else
-    {
-      y = (device != Speaker ? 2 : 1) + 
-          (device - (device < Treble ? 0 : Treble)) * 3 + 
-          (right == 0 ? 0 : 1);
-      if (!right)
-        x = 9 + levels[device].left / (device < Speaker ? 2 : 1 ) +
-              (device > Speaker ? 39 : 0);
-      else
-        x = 9 + levels[device].right / (device < Speaker ? 2 : 1) +
-              (device > Speaker ? 39 : 0);
-    }
-    
-    wmove(main_win,y,x);
-    wrefresh(main_win);
-    c = wgetch(main_win);
-
-    switch(c)
-    {
-      case CURS_CTRL:
-      {
-        (void) wgetch(main_win);
-        c = wgetch(main_win);
-        
-        switch(c)
-        { 
-          case DOWN: 
-          {
-           if (output_scr) 
-           {
-             if (device < Mic)
-             {
-                device++;
-                if (device == Mic) output_pos = 0;
-             }
-           }
-           else if (right || input_scr)
-           {
-             if (!input_scr)
-             {
-               if (device < Bass) 
-               {
-                 device++;         
-                 right = 0;
-               }
-               else
-               {  
-                 input_scr = 1;
-                 input_pos = 0;
-                 device = Fm;
-               }
-             }
-             else
-             {
-               if (device < Mic) 
-               {
-                 device++;
-                 if (device == Mic && input_pos > 8) input_pos = 8;
-               }
-               else 
-               { 
-                 device = Cd; 
-                 output_scr = 1; 
-                 input_scr = 0; 
-                 output_pos = 0; 
-               }
-             }
-           }
-           else 
-           {
-             if (device != Mic && device != Speaker)  right = 1;
-             else { device++; right = 0; }
-           }
-          };break;
-          case UP: 
-          {
-           if (output_scr) 
-           {
-             if (device > Cd) device--;
-             else 
-             {
-               device = Mic; 
-               output_scr = 0;
-               input_scr = 1;
-             }
-           }
-           else if (!right || input_scr)
-           {
-             if (input_scr)
-             {
-               if (device > Fm) device--;
-               else 
-               {
-                 input_scr = 0;
-                 device = Bass;
-                 right = 1;
-               }
-             }
-             else 
-             {
-               if (device > Master) 
-               {
-                 device--;         
-                 if (device != Mic && device != Speaker) right = 1;
-               }
-             }
-           }
-           else 
-             right = 0;
-          };break;
-          case RIGHT: 
-          {
-            if (output_scr) 
-            {
-              if (output_pos < 8 && device != Mic) output_pos = 8;
-            }
-            else if (!input_scr)
-            {
-              if (device < Speaker) max_level = 31;
-              else if (device > Speaker) max_level = 15;
-              else max_level = 4;
-
-              if (!right) 
-              {
-                if (levels[device].left < max_level) levels[device].left+=
-                  (device < Speaker ? 2 : 1);
-              }
-              else
-              {
-                if (levels[device].right < max_level) levels[device].right+=
-                  (device < Speaker ? 2 : 1);
-              }
-              ioctl(fd, MIXIOSETVOLUME, &levels[device]); 
-              ioctl(fd, MIXIOGETVOLUME, &levels[device]); 
-              create_slider(1 + (device < Treble ? 0 : 39), 
-                            (device - (device < Treble ? 0 : Treble))*3 +
-                            (device != Speaker ? 2 : 1), device);
-            }
-            else
-            {
-              if ((device != Mic && input_pos < 12) ||
-                  (device == Mic && input_pos < 8))
-                input_pos += (4 + (device == Mic ? 4 : 0));
-            }
-          };break;
-          case LEFT: 
-          {
-            if (output_scr)
-            {
-              if (output_pos > 0) output_pos = 0;
-            }
-            else if (!input_scr)
-            {
-              if (!right)
-              {
-                if (levels[device].left > 0) levels[device].left-=
-                  (device < Speaker ? 2 : 1);
-              }
-              else
-              {
-                if (levels[device].right > 0) levels[device].right-=
-                  (device < Speaker ? 2 : 1);
-              }
-              ioctl(fd, MIXIOSETVOLUME, &levels[device]); 
-              ioctl(fd, MIXIOGETVOLUME, &levels[device]); 
-              create_slider(1 + (device < Treble ? 0 : 39), 
-                            (device - (device < Treble ? 0 : Treble))*3 +
-                            (device != Speaker ? 2 : 1), device);
-            }
-            else
-            {
-              if (input_pos > 0) 
-                input_pos -= (4 + (device == Mic ? 4 : 0));
-            } 
-          };break;
-        } 
-      };break;
-    case SPACE:
-      {
-        if (output_scr)
-        {
-          switch(output_pos)
-          {
-            case 0:
-            case 4:
-            {
-              outputs[device].left = 
-               (outputs[device].left == ON ? OFF : ON);
-              ioctl(fd, MIXIOSETOUTPUT, &outputs[device]);
-            };break;
-            case 8:
-            {
-              outputs[device].right = 
-               (outputs[device].right == ON ? OFF : ON);
-              ioctl(fd, MIXIOSETOUTPUT, &outputs[device]);
-            };break;
-          }
-          ioctl(fd, MIXIOGETOUTPUT, &outputs[device]);
-          show_outputs(41,16);
-        }
-        else if (input_scr)
-        { 
-          switch(input_pos)
-          {
-            case 0:
-            {
-              inputs_left[device].left = 
-               (inputs_left[device].left == ON ? OFF : ON);
-              ioctl(fd, MIXIOSETINPUTLEFT, &inputs_left[device]);
-            };break;
-            case 4:
-            {
-              inputs_left[device].right = 
-               (inputs_left[device].right == ON ? OFF : ON);
-              ioctl(fd, MIXIOSETINPUTLEFT, &inputs_left[device]);
-            };break;
-            case 8:
-            {
-              inputs_right[device].left = 
-               (inputs_right[device].left == ON ? OFF : ON);
-              ioctl(fd, MIXIOSETINPUTRIGHT, &inputs_right[device]);
-            };break;
-            case 12:
-            {
-              inputs_right[device].right = 
-               (inputs_right[device].right == ON ? OFF : ON);
-              ioctl(fd, MIXIOSETINPUTRIGHT, &inputs_right[device]);
-            };break;
-          }
-          ioctl(fd, MIXIOGETINPUTLEFT, &inputs_left[device]);
-          ioctl(fd, MIXIOGETINPUTRIGHT, &inputs_right[device]);
-          show_inputs(41,8);
-        }
-      };break;
-      case 's':
-      {
-        if (write_settings())  
-          mvwprintw(main_win,22,28, "mixer settings saved");
-        else
-          mvwprintw(main_win,22,28, "error: file not saved");
-        wrefresh(main_win);
-        sleep(1);
-        mvwprintw(main_win,22,28, "                           ");
-      };break;
-      case 'r':
-      {
-        if (read_settings())
-          mvwprintw(main_win,22,28, "mixer settings restored");
-        else
-          mvwprintw(main_win,22,28, "error: could not open");
-        wrefresh(main_win);
-        sleep(1);
-        setup_screen();
-      };break;
-      case 'e': terminate(1);
-    }
-  } 
-}
-
-
-char *d_name(device, name)
-enum Device device;
-char *name;
-{
-  /* Convert the device number to a name */
-
-  switch (device)
-  {
-    case Master:       strncpy(name, "Master  \0", 9);break;
-    case Dac:          strncpy(name, "Dac     \0", 9);break;
-    case Fm:           strncpy(name, "Fm      \0", 9);break;
-    case Cd:           strncpy(name, "CD      \0", 9);break;
-    case Line:         strncpy(name, "Line    \0", 9);break;
-    case Mic:          strncpy(name, "Mic     \0", 9);break;
-    case Speaker:      strncpy(name, "Speaker \0", 9);break;
-    case Treble:       strncpy(name, "Treble  \0", 9);break;
-    case Bass:         strncpy(name, "Bass    \0", 9);break;
-  }
-  return name;
-}
-
-
-void create_slider(x, y, device)
-int x;
-int y;
-enum Device device;
-{
-  /* Create a slider on the screen */
-
-  int left;
-  int right;
-  int i;
-
-  mvwprintw(main_win,y,x, "%s", d_name(device, name));
-
-  left = levels[device].left / (device < Speaker ? 2 : 1); 
-  right = levels[device].right / (device < Speaker ? 2 : 1); 
-
-  for (i = 0; i < 16; i++)
-  {
-    if (device != Speaker || i < 4)
-      mvwprintw(main_win,y,x+i+8, (i == left ? "*" : "-"));
-    if (device < Mic || device > Speaker) 
-      mvwprintw(main_win,y+1,x+i+8, (i == right ? "*" : "-"));
-  }
-
-  if (device < Mic || device > Speaker)
-  {
-    mvwprintw(main_win,y,x+i+10, "left");
-    mvwprintw(main_win,y+1,x+i+10, "right");
-  }
-  wrefresh(main_win);
-} 
-  
-void show_inputs(x,y)
-int x;
-int y;
-{
-  /* Show the input settings */
-
-  int i;
-
-  mvwprintw(main_win,y,x,  "             Rec-In  ");
-  mvwprintw(main_win,y+1,x,"          left    right");
-  mvwprintw(main_win,y+2,x,"          l   r   l   r");
-  for (i = Fm; i <= Line; i++)
-  {
-    mvwprintw(main_win,y+i+1,x,  "%s  %d   %d   %d   %d", 
-      d_name(i, (char *)name),
-      (inputs_left[i].left == ON ? 1 : 0),
-      (inputs_left[i].right == ON ? 1 : 0),
-      (inputs_right[i].left == ON ? 1 : 0),
-      (inputs_right[i].right == ON ? 1 : 0));
-  }
-  mvwprintw(main_win,y+i+1,x,  "%s    %d       %d", 
-    d_name(Mic, (char *)name),
-    (inputs_left[Mic].left == ON ? 1 : 0),
-    (inputs_right[Mic].left == ON ? 1 : 0));
-  wrefresh(main_win);
-}
-
-void show_outputs(x,y)
-int x;
-int y;
-{
-  /* Show the output settings */
-
-  int i;
-
-  mvwprintw(main_win,y,x,      "            Mix-Out  ");
-  mvwprintw(main_win,y+1,x,    "          left    right");
-  for (i = Cd; i <= Line; i++)
-  {
-    mvwprintw(main_win,y+i-1,x,"%s    %d       %d", 
-      d_name(i, (char *)name),
-      (outputs[i].left == ON ? 1 : 0),
-      (outputs[i].right == ON ? 1 : 0));
-  }
-  mvwprintw(main_win,y+i-1,x,"%s        %d", 
-    d_name(Mic, (char *)name),
-    (outputs[Mic].left == ON ? 1 : 0));
-
-  wrefresh(main_win);
-}
-
-
-void setup_screen()
-{
-  int i;
-
-  wclear(main_win);
-  mvwprintw(main_win,0,23,"------- Mixer Controls -------");
-  wrefresh(main_win);
-  for(i = 0; i <= Speaker; i++)
-   create_slider(1, i*3+(i <= Mic ? 2 : 1), i);
-
-   create_slider(40, 2, Treble);
-   create_slider(40, 5, Bass);
-   show_inputs(41,8);
-   show_outputs(41,16);
-}
diff --git a/commands/talk/Makefile b/commands/talk/Makefile
deleted file mode 100644 (file)
index bc1d015..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# Makefile for talk
-#
-# 08/01/96                     Michael Temari, <temari@ix.netcom.com>
-#
-
-PROG=  talk
-SRCS=  talk.c screen.c net.c proto.c
-MAN=
-
-DPADD+= ${LIBCURSES}
-LDADD+= -lcurses
-
-.include <bsd.prog.mk>
diff --git a/commands/talk/net.c b/commands/talk/net.c
deleted file mode 100644 (file)
index eee4acf..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-/* net.c Copyright Michael Temari 08/01/1996 All Rights Reserved */
-
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <signal.h>
-#include <net/netlib.h>
-#include <net/hton.h>
-#include <net/gen/netdb.h>
-#include <net/gen/in.h>
-#include <net/gen/inet.h>
-#include <net/gen/tcp.h>
-#include <net/gen/tcp_io.h>
-#include <net/gen/udp.h>
-#include <net/gen/udp_io.h>
-#include <net/gen/udp_hdr.h>
-
-#include "talk.h"
-#include "net.h"
-
-_PROTOTYPE(void TimeOut, (int sig));
-
-static unsigned char buffer[8192];
-
-static int udp_ctl;
-int tcp_fd;
-
-static udpport_t ntalk_port;
-
-char luser[USER_SIZE+1], ruser[USER_SIZE+1];
-char lhost[HOST_SIZE+1], rhost[HOST_SIZE+1];
-char ltty[TTY_SIZE+1], rtty[TTY_SIZE+1];
-udpport_t ctlport;
-tcpport_t dataport;
-ipaddr_t laddr, raddr;
-
-int NetInit()
-{
-int s;
-struct servent *servent;
-char *udp_device;
-char *tcp_device;
-nwio_udpopt_t udpopt;
-nwio_tcpconf_t tcpconf;
-
-   if((udp_device = getenv("UDP_DEVICE")) == (char *)NULL)
-       udp_device = UDP_DEVICE;
-
-   if((udp_ctl = open(udp_device, O_RDWR)) < 0) {
-       fprintf(stderr, "talk: Could not open %s: %s\n",
-               udp_device, strerror(errno));
-       return(-1);
-   }
-
-   if((servent = getservbyname("ntalk", "udp")) == (struct servent *)NULL) {
-       fprintf(stderr, "talk: Could not find ntalk udp service\n");
-       close(udp_ctl);
-       return(-1);
-   }
-
-   ntalk_port = (udpport_t)servent->s_port;
-
-   udpopt.nwuo_flags = NWUO_NOFLAGS;
-   udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SEL | NWUO_EN_LOC;
-   udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_SET | NWUO_RA_SET;
-   udpopt.nwuo_flags |= NWUO_RWDATONLY | NWUO_DI_IPOPT;
-   udpopt.nwuo_remaddr = raddr;
-   udpopt.nwuo_remport = ntalk_port;
-
-   s = ioctl(udp_ctl, NWIOSUDPOPT, &udpopt);
-   if(s < 0) {
-       perror("talk: ioctl NWIOSUDPOPT");
-       close(udp_ctl);
-       return(-1);
-   }
-
-   s = ioctl(udp_ctl, NWIOGUDPOPT, &udpopt);
-   if(s < 0) {
-       perror("talk: ioctl NWIOGUDPOPT");
-       close(udp_ctl);
-       return(-1);
-   }
-   laddr = udpopt.nwuo_locaddr;
-   ctlport = udpopt.nwuo_locport;
-
-   if((tcp_device = getenv("TCP_DEVICE")) == (char *)NULL)
-       tcp_device = TCP_DEVICE;
-
-   if((tcp_fd = open(tcp_device, O_RDWR)) < 0) {
-       fprintf(stderr, "talk: Could not open %s: %s\n",
-               tcp_device, strerror(errno));
-       close(udp_ctl);
-       return(-1);
-   }
-
-   tcpconf.nwtc_flags = NWTC_NOFLAGS;
-   tcpconf.nwtc_flags |= NWTC_LP_SEL | NWTC_SET_RA | NWTC_UNSET_RP;
-   tcpconf.nwtc_remaddr = raddr;
-
-   s = ioctl(tcp_fd, NWIOSTCPCONF, &tcpconf);
-   if(s < 0) {
-       perror("talk: ioctl NWIOSTCPCONF");
-       close(udp_ctl);
-       close(tcp_fd);
-       return(-1);
-   }
-
-   s = ioctl(tcp_fd, NWIOGTCPCONF, &tcpconf);
-   if(s < 0) {
-       perror("talk: ioctl NWIOGTCPCONF");
-       close(udp_ctl);
-       close(tcp_fd);
-       return(-1);
-   }
-
-   dataport = tcpconf.nwtc_locport;
-
-   return(0);
-}
-
-int getreply(reply, timeout)
-struct talk_reply *reply;
-int timeout;
-{
-int s;
-int terrno;
-udp_io_hdr_t *udp_io_hdr;
-
-   signal(SIGALRM, TimeOut);
-   alarm(timeout);
-   s = read(udp_ctl, buffer, sizeof(buffer));
-   terrno = errno;
-   alarm(0);
-   errno = terrno;
-   if(s < 0 && errno == EINTR)
-       return(1);
-   if(s < 0) {
-       perror("talk: Read error in getreply");
-       return(-1);
-   }
-
-   if(s == sizeof(struct talk_reply))
-       memcpy((char *)reply, buffer, s);
-
-   return(0);
-}
-
-int sendrequest(request, here)
-struct talk_request *request;
-int here;
-{
-int s;
-nwio_udpopt_t udpopt;
-udp_io_hdr_t *udp_io_hdr;
-
-   udpopt.nwuo_flags = NWUO_NOFLAGS;
-   udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SET | NWUO_EN_LOC;
-   udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_SET | NWUO_RA_SET;
-   udpopt.nwuo_flags |= NWUO_RWDATONLY | NWUO_DI_IPOPT;
-   udpopt.nwuo_locport = ctlport;
-   if(here)
-       udpopt.nwuo_remaddr = laddr;
-   else
-       udpopt.nwuo_remaddr = raddr;
-   udpopt.nwuo_remport = ntalk_port;
-
-   s = ioctl(udp_ctl, NWIOSUDPOPT, &udpopt);
-   if(s < 0) {
-       perror("talk: ioctl NWIOSUDPOPT");
-       return(-1);
-   }
-
-   s = ioctl(udp_ctl, NWIOGUDPOPT, &udpopt);
-   if(s < 0) {
-       perror("talk: ioctl NWIOGUDPOPT");
-       return(-1);
-   }
-
-   s = write(udp_ctl, request, sizeof(struct talk_request));
-   if(s < 0) {
-       perror("talk: write error in sendrequest");
-       return(-1);
-   }
-
-   if(s != sizeof(struct talk_request)) {
-       fprintf(stderr, "talk: sendrequest size mismatch %d %d\n", s, sizeof(struct talk_request));
-       return(-1);
-   }
-
-   return(0);
-}
-
-void TimeOut(int sig)
-{
-}
-
-int NetConnect(u16_t port)
-{
-   int s;
-   nwio_tcpconf_t tcpconf;
-   nwio_tcpcl_t tcpcopt;
-
-   tcpconf.nwtc_flags = NWTC_NOFLAGS;
-   tcpconf.nwtc_flags |= NWTC_LP_SET | NWTC_SET_RA | NWTC_SET_RP;
-   tcpconf.nwtc_locport = dataport;
-   tcpconf.nwtc_remaddr = raddr;
-   tcpconf.nwtc_remport = port;
-
-   s = ioctl(tcp_fd, NWIOSTCPCONF, &tcpconf);
-   if(s < 0) {
-       perror("talk: ioctl NWIOSTCPCONF");
-       return(-1);
-   }
-
-   s = ioctl(tcp_fd, NWIOGTCPCONF, &tcpconf);
-   if(s < 0) {
-       perror("talk: ioctl NWIOGTCPCONF");
-       return(-1);
-   }
-
-   tcpcopt.nwtcl_flags = 0;
-
-   s = ioctl(tcp_fd, NWIOTCPCONN, &tcpcopt);
-   if(s < 0 && errno == ECONNREFUSED)
-       return(1);
-   if(s < 0) {
-       perror("talk: ioctl NWIOTCPCONN");
-       return(-1);
-   }
-
-   return(0);
-}
-
-int NetListen(timeout)
-int timeout;
-{
-int s;
-nwio_tcpcl_t tcplopt;
-int terrno;
-
-   tcplopt.nwtcl_flags = 0;
-
-   signal(SIGALRM, TimeOut);
-   alarm(timeout);
-   s = ioctl(tcp_fd, NWIOTCPLISTEN, &tcplopt);
-   terrno = errno;
-   alarm(0);
-   errno = terrno;
-
-   if(s < 0 && errno == EINTR)
-       return(1);
-
-   if(s < 0) {
-       perror("talk: ioctl NWIOTCPLISTEN");
-       return(-1);
-   }
-
-   return(0);
-}
diff --git a/commands/talk/net.h b/commands/talk/net.h
deleted file mode 100644 (file)
index 8d7d725..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/* net.h Copyright Michael Temari 08/01/1996 All Rights Reserved */
-
-extern char luser[], ruser[];
-extern char lhost[], rhost[];
-extern char ltty[], rtty[];
-extern udpport_t ctlport;
-extern tcpport_t dataport;
-extern ipaddr_t laddr, raddr;
-extern int tcp_fd;
-
-_PROTOTYPE(int NetInit, (void));
-_PROTOTYPE(int getreply, (struct talk_reply *reply, int timeout));
-_PROTOTYPE(int sendrequest, (struct talk_request *request, int here));
-_PROTOTYPE(int NetConnect, (u16_t port));
-_PROTOTYPE(int NetListen, (int timeout));
diff --git a/commands/talk/proto.c b/commands/talk/proto.c
deleted file mode 100644 (file)
index 0e79a16..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-/* proto.c Copyright Michael Temari 08/01/1996 All Rights Reserved */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <net/hton.h>
-#include <net/gen/socket.h>
-#include <net/gen/in.h>
-#include <net/gen/inet.h>
-#include <net/gen/tcp.h>
-#include <net/gen/udp.h>
-
-#include "talk.h"
-#include "proto.h"
-#include "net.h"
-#include "screen.h"
-
-_PROTOTYPE(static int TalkChk, (int gotreply, struct talk_reply *reply, char *msg));
-_PROTOTYPE(static int TalkTrans, (int type, long id, struct talk_reply *reply, int here));
-
-static char *AnswerMsgs[] = {
-       "Success",
-       "User Not Logged In",
-       "Failure",
-       "Remote Does Not Know who we are",
-       "User is not accepting calls",
-       "Are request was not know",
-       "Incorrect Version",
-       "Bad Address",
-       "Bad Control Address"
-};
-
-static int TalkChk(gotreply, reply, msg)
-int gotreply;
-struct talk_reply *reply;
-char *msg;
-{
-   if(!gotreply) {
-       ScreenMsg(msg);
-       return(-1);
-   }
-   if(reply->answer == SUCCESS) return(0);
-   if(reply->answer < (sizeof(AnswerMsgs) / sizeof(AnswerMsgs[0])))
-       ScreenMsg(AnswerMsgs[reply->answer]);
-   else
-       ScreenMsg("Bad Answer");
-
-   return(-1);
-}
-
-static int TalkTrans(type, id, reply, here)
-int type;
-long id;
-struct talk_reply *reply;
-int here;
-{
-struct talk_request request;
-int tries;
-int gotreply;
-
-   memset(&request, 0, sizeof(request));
-
-   request.version = TALK_VERSION;
-   request.type = type;
-   request.id = id;
-   request.addr.sa_family = htons(AF_INET);
-   request.addr.sin_port = dataport;
-   request.addr.sin_addr = laddr;
-   request.ctl_addr.sa_family = htons(AF_INET);
-   request.ctl_addr.sin_port = ctlport;
-   request.ctl_addr.sin_addr = laddr;
-   request.pid = getpid();
-   strncpy(request.luser, luser, USER_SIZE);
-   strncpy(request.ruser, ruser, USER_SIZE);
-   strncpy(request.rtty,  rtty,  TTY_SIZE);
-
-   tries = 0;
-   gotreply = 0;
-   while(!ScreenDone && tries++ < 3 && !gotreply) {
-       if(!sendrequest(&request, here))
-               if(!getreply(reply, 5))
-                       gotreply = 1;
-       if(!gotreply) continue;
-       if(reply->version != request.version ||
-          reply->type    != request.type)
-               gotreply = 0;
-   }
-   return(gotreply);
-}
-
-int TalkInit()
-{
-struct talk_reply reply;
-long id = 0;
-long rid;
-int s;
-int ring;
-char buff[32];
-
-   /* Check if someone was calling us */
-   ScreenMsg("Initiating Talk Protocol");
-
-   /* Check is someone was calling us */
-   s = TalkTrans(LOOK_UP, ++id, &reply, 0);
-
-   /* Someone was calling us */
-   if(s && reply.answer == SUCCESS) {
-       s = NetConnect(reply.addr.sin_port);
-       if(s == 1) {
-               ScreenMsg("Your party has hung up");
-               TalkTrans(DELETE, reply.id, &reply, 0);
-       }
-       return(s == 0 ? 0 : -1);
-   }
-
-   ScreenMsg("Ringing User");
-
-   ring = 0;
-   while(!ScreenDone && ring++ < 5) {
-       if(TalkChk(TalkTrans(ANNOUNCE, -1, &reply, 0),
-                       &reply, "No response to are ring"))
-               return(-1);
-       rid = reply.id;
-       sprintf(buff, "Ring #%d", ring);
-       ScreenMsg(buff);
-       if(ring == 1) {
-               if(TalkChk(TalkTrans(LEAVE_INVITE, ++id, &reply, 1),
-                               &reply, "Could not leave are invitaion locally"))
-                       return(-1);
-       }
-       s = NetListen(RING_WAIT);
-       if(s <= 0) {
-               TalkTrans(DELETE, reply.id, &reply, 1);
-               TalkTrans(DELETE, rid, &reply, 0);
-               return(s);
-       }
-   }
-
-   return(-1);
-}
diff --git a/commands/talk/proto.h b/commands/talk/proto.h
deleted file mode 100644 (file)
index 27442bc..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-/* proto.h Copyright Michael Temari 08/01/1996 All Rights Reserved */
-
-_PROTOTYPE(int TalkInit, (void));
diff --git a/commands/talk/screen.c b/commands/talk/screen.c
deleted file mode 100644 (file)
index c7f6893..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-/* screen.c Copyright Michael Temari 08/01/1996 All Rights Reserved */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <signal.h>
-#include <ctype.h>
-#include <string.h>
-#include <unistd.h>
-#include <curses.h>
-
-#include "screen.h"
-
-_PROTOTYPE(void gotsig, (int sig));
-_PROTOTYPE(static char *delword, (WINDOW *w));
-
-struct {
-       WINDOW *win;
-       char erase;
-       char kill;
-       char werase;
-} window[2];
-
-static char line[80+1];
-
-int ScreenDone = 0;
-
-static WINDOW *dwin;
-
-void gotsig(sig)
-int sig;
-{
-   ScreenDone = 1;
-   signal(sig, gotsig);
-}
-
-int ScreenInit()
-{
-int i;
-
-   if(initscr() == (WINDOW *)NULL) {
-       fprintf(stderr, "talk: Could not initscr\n");
-       return(-1);
-   }
-   signal(SIGINT, gotsig);
-   signal(SIGQUIT, gotsig);
-   signal(SIGPIPE, gotsig);
-   signal(SIGHUP, gotsig);
-   clear();
-   refresh();
-   noecho();
-   cbreak();
-
-   /* local window */
-   window[LOCALWIN].win = newwin(LINES / 2, COLS, 0, 0);
-   scrollok(window[LOCALWIN].win, TRUE);
-   wclear(window[LOCALWIN].win);
-
-   /* divider between windows */
-   dwin = newwin(1, COLS, LINES / 2, 0);
-   i = COLS;
-   while(i-- > 0)
-       waddch(dwin, '-');
-   wrefresh(dwin);
-
-   /* remote window */
-   window[REMOTEWIN].win = newwin(LINES - (LINES / 2) - 1, COLS, LINES / 2 + 1, 0);
-   scrollok(window[REMOTEWIN].win, TRUE);
-   wclear(window[REMOTEWIN].win);
-
-   return(0);
-}
-
-void ScreenMsg(msg)
-char *msg;
-{
-WINDOW *w;
-
-   w =window[LOCALWIN].win;
-
-   wmove(w, 0, 0);
-
-   if(*msg != '\0') {
-       wprintw(w, "[%s]", msg);
-       wclrtoeol(w);
-   } else
-       werase(w);
-
-   wrefresh(w);
-}
-
-void ScreenWho(user, host)
-char *user;
-char *host;
-{
-   if(*host != '\0') {
-       wmove(dwin, 0, (COLS - (1 + strlen(user) + 1 + strlen(host) + 1)) / 2);
-       wprintw(dwin, " %s@%s ", user, host);
-   } else {
-       wmove(dwin, 0, (COLS - (1 + strlen(user) + 1)) / 2);
-       wprintw(dwin, " %s ", user);
-   }
-   wrefresh(dwin);
-}
-
-void ScreenEdit(lcc, rcc)
-char lcc[];
-char rcc[];
-{
-   window[LOCALWIN].erase   = lcc[0];
-   window[LOCALWIN].kill    = lcc[1];
-   window[LOCALWIN].werase  = lcc[2];
-   window[REMOTEWIN].erase  = rcc[0];
-   window[REMOTEWIN].kill   = rcc[1];
-   window[REMOTEWIN].werase = rcc[2];
-}
-
-void ScreenPut(data, len, win)
-char *data;
-int len;
-int win;
-{
-WINDOW *w;
-unsigned char ch;
-int r, c;
-
-   w = window[win].win;
-
-   while(len-- > 0) {
-       ch = *data++;
-       /* new line CR, NL */
-       if(ch == '\r' || ch == '\n') {
-               waddch(w, '\n');
-       } else
-       /* erase a character, BS, DEL  */
-       if(ch == 0x08 || ch == 0x7f || ch == window[win].erase) {
-               getyx(w, r, c);
-               if(c > 0)
-                       c--;
-               wmove(w, r, c);
-               waddch(w, ' ');
-               wmove(w, r, c);
-       } else
-       /* erase line CTL-U */
-       if(ch == 0x15 || ch == window[win].kill) {
-               getyx(w, r, c);
-               wmove(w, r, 0);
-               wclrtoeol(w);
-       } else
-       /* refresh CTL-L */
-       if(ch == 0x0c) {
-               if(win == LOCALWIN) {
-                       touchwin(w);
-                       wrefresh(w);
-                       touchwin(window[REMOTEWIN].win);
-                       wrefresh(window[REMOTEWIN].win);
-               }
-       } else
-       /* bell CTL-G */
-       if(ch == 0x07) {
-               putchar(ch);
-       }
-       else
-       /* erase last word CTL-W */
-       if(ch == 0x17 || ch == window[win].werase) {
-               (void) delword(w);
-       } else {
-               getyx(w, r, c);
-               if(1 || isprint(ch)) {
-                       if(ch != ' ' && c == (COLS - 1))
-                               wprintw(w, "\n%s", delword(w));
-                       waddch(w, ch);
-               }
-       }
-   }
-   wrefresh(w);
-}
-
-static char *delword(w)
-WINDOW *w;
-{
-int r, c;
-int i = 0;
-char ch;
-char *p = &line[80];
-
-   *p-- = '\0';
-   getyx(w, r, c);
-   if(c == 0) return NULL;
-   while(c >= 0) {
-       c--;
-       ch = mvwinch(w, r, c);
-       if(ch == ' ') break;
-       *p-- = ch;
-       i = 1;
-       waddch(w, ' ');
-   }
-   c += i;
-   wmove(w, r, c);
-   return(++p);
-}
-
-void ScreenEnd()
-{
-   move(LINES - 1, 0);
-   refresh();
-   endwin();
-}
diff --git a/commands/talk/screen.h b/commands/talk/screen.h
deleted file mode 100644 (file)
index a01eb41..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/* screen.h Copyright Michael Temari 08/01/1996 All Rights Reserved */
-
-_PROTOTYPE(int ScreenInit, (void));
-_PROTOTYPE(void ScreenMsg, (char *msg));
-_PROTOTYPE(void ScreenWho, (char *user, char *host));
-_PROTOTYPE(void ScreenEdit, (char lcc[], char rcc[]));
-_PROTOTYPE(void ScreenPut, (char *data, int len, int mywin));
-_PROTOTYPE(void ScreenEnd, (void));
-
-extern int ScreenDone;
-
-#define        LOCALWIN        0
-#define        REMOTEWIN       1
diff --git a/commands/talk/talk.c b/commands/talk/talk.c
deleted file mode 100644 (file)
index 832922f..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-/* talk.c Copyright Michael Temari 08/01/1996 All Rights Reserved */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <signal.h>
-#include <utmp.h>
-#include <termios.h>
-#include <net/gen/netdb.h>
-#include <net/hton.h>
-#include <net/gen/socket.h>
-#include <net/gen/in.h>
-#include <net/gen/inet.h>
-#include <net/gen/tcp.h>
-#include <net/gen/udp.h>
-
-#include "talk.h"
-#include "proto.h"
-#include "net.h"
-#include "screen.h"
-
-_PROTOTYPE(int main, (int argc, char *argv[]));
-_PROTOTYPE(void DoTalk, (void));
-
-int main(argc, argv)
-int argc;
-char *argv[];
-{
-char *p;
-struct hostent *hp;
-struct stat st;
-struct utmp utmp;
-int slot;
-FILE *fp;
-
-   if(argc < 2 || argc > 3) {
-       fprintf(stderr, "Usage: talk user[@host] [tty]\n");
-       return(-1);
-   }
-
-   /* get local host name */
-   if(gethostname(lhost, HOST_SIZE) < 0) {
-       fprintf(stderr, "talk: Error getting local host name\n");
-       return(-1);
-   }
-
-   /* get local user name and tty */
-   if((slot = ttyslot()) < 0) {
-       fprintf(stderr, "talk: You are not on a terminal\n");
-       return(-1);
-   }
-   if((fp = fopen(UTMP, "r")) == (FILE *)NULL) {
-       fprintf(stderr, "talk: Could not open %s\n", UTMP);
-       return(-1);
-   }
-   if(fseek(fp, (off_t) sizeof(utmp) * slot, SEEK_SET)) {
-       fprintf(stderr, "talk: Could not seek %s\n", UTMP);
-       fclose(fp);
-       return(-1);
-   }
-   if(fread((char *)&utmp, sizeof(utmp), 1 , fp) != 1) {
-       fprintf(stderr, "talk: Could not read %s\n", UTMP);
-       fclose(fp);
-       return(-1);
-   }
-   fclose(fp);
-#ifdef __NBSD_LIBC
-   strncpy(luser, utmp.ut_name, USER_SIZE < sizeof(utmp.ut_name) ?
-                               USER_SIZE : sizeof(utmp.ut_name));
-#else
-   strncpy(luser, utmp.ut_user, USER_SIZE < sizeof(utmp.ut_user) ?
-                               USER_SIZE : sizeof(utmp.ut_user));
-#endif
-   luser[USER_SIZE] = '\0';
-
-   /* get local tty */
-   if((p = ttyname(0)) == (char *)NULL) {
-       fprintf(stderr, "talk: You are not on a terminal\n");
-       return(-1);
-   }
-   strncpy(ltty, p+5, TTY_SIZE);
-   ltty[TTY_SIZE] = '\0';
-
-   /* check if local tty is going to be writable */
-   if(stat(p, &st) < 0) {
-       perror("talk: Could not stat local tty");
-       return(-1);
-   }
-   if((st.st_mode & S_IWGRP) == 0) {
-       fprintf(stderr, "talk: Your terminal is not writable.  Use: mesg y\n");
-       return(-1);
-   }
-
-   /* get remote user and host name */
-   if((p = strchr(argv[1], '@')) != (char *)NULL)
-       *p++ = '\0';
-   else
-       p = lhost;
-   strncpy(ruser, argv[1], USER_SIZE);
-   ruser[USER_SIZE] = '\0';
-   strncpy(rhost, p, HOST_SIZE);
-   rhost[HOST_SIZE] = '\0';
-
-   /* get remote tty */
-   if(argc > 2)
-       strncpy(rtty, argv[2], TTY_SIZE);
-   else
-       rtty[0] = '\0';
-   rtty[TTY_SIZE] = '\0';
-
-   if((hp = gethostbyname(rhost)) == (struct hostent *)NULL) {
-       fprintf(stderr, "talk: Could not determine address of %s\n", rhost);
-       return(-1);
-   }
-   memcpy((char *)&raddr, (char *)hp->h_addr, hp->h_length);
-
-   if(NetInit()) {
-       fprintf(stderr, "talk: Error in NetInit\n");
-       return(-1);
-   }
-
-   if(ScreenInit())
-       return(-1);
-
-   if(!TalkInit())
-       DoTalk();
-
-   ScreenEnd();
-
-   return(0);
-}
-
-struct pdata {
-       int win;
-       int len;
-       char buffer[64];
-} pdata;
-
-void DoTalk()
-{
-int s;
-int s2;
-int kid;
-int pfd[2];
-int win;
-int len;
-struct termios termios;
-char lcc[3];
-char rcc[3];
-
-   ScreenMsg("");
-   ScreenWho(ruser, rhost);
-
-   /* Get and send edit characters */
-   s = tcgetattr(0, &termios);
-   if(s < 0) {
-       perror("talk: tcgetattr");
-       return;
-   }
-   lcc[0] = termios.c_cc[VERASE];
-   lcc[1] = termios.c_cc[VKILL];
-   lcc[2] = 0x17; /* Control - W */
-   s = write(tcp_fd, lcc, sizeof(lcc));
-   if(s != sizeof(lcc)) {
-       ScreenMsg("Connection Closing due to error");
-       return;
-   }
-   s = read(tcp_fd, rcc, sizeof(rcc));
-   if(s != sizeof(rcc)) {
-       ScreenMsg("Connection Closing due to error");
-       return;
-   }
-   ScreenEdit(lcc, rcc);
-
-   s = pipe(pfd);
-   if(s < 0) {
-       ScreenMsg("Could not create pipes");
-       return;
-   }
-
-   if((kid = fork()) < 0) {
-       ScreenMsg("Could not fork");
-       close(pfd[0]);
-       close(pfd[1]);
-       return;
-   }
-
-   if(kid == 0) {
-       close(tcp_fd);
-       close(pfd[1]);
-       while(1) {
-               s = read(pfd[0], &pdata, sizeof(pdata));
-               if(s != sizeof(pdata)) {
-                       close(pfd[0]);
-                       exit(-1);
-               }
-               ScreenPut(pdata.buffer, pdata.len, pdata.win);
-       }
-   }
-
-   close(pfd[0]);
-
-   if((kid = fork()) < 0) {
-       ScreenMsg("Could not fork");
-       close(pfd[1]);
-       return;
-   }
-
-   if(kid == 0) {
-       pdata.win = REMOTEWIN;
-       while(!ScreenDone) {
-               s = read(tcp_fd, pdata.buffer, sizeof(pdata.buffer));
-               if(s <= 0)
-                       break;
-               pdata.len = s;
-               write(pfd[1], &pdata, sizeof(pdata));
-       }
-       close(pfd[1]);
-       close(tcp_fd);
-       kill(getppid(), SIGINT);
-       exit(-1);
-   }
-
-   pdata.win = LOCALWIN;
-   while(!ScreenDone) {
-       s = read(0, pdata.buffer, sizeof(pdata.buffer));
-       if(s <= 0)
-               break;
-       pdata.len = s;
-       write(pfd[1], &pdata, sizeof(pdata));
-       s2 = write(tcp_fd, pdata.buffer, s);
-       if(s2 != s)
-               break;
-   }
-   kill(kid, SIGINT);
-   close(pfd[1]);
-   close(tcp_fd);
-   return;
-}
diff --git a/commands/talk/talk.h b/commands/talk/talk.h
deleted file mode 100644 (file)
index e7ecbab..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* talk.h Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-#define        USER_SIZE       12
-#define        TTY_SIZE        16
-#define        HOST_SIZE       255
-
-struct osockaddr {
-       u16_t sa_family;
-       u16_t sin_port;
-       ipaddr_t sin_addr;
-       char junk[8];
-};
-
-struct talk_request {
-       u8_t version;
-       u8_t type;
-       u8_t answer;
-       u8_t junk;
-       u32_t id;
-       struct osockaddr addr;
-       struct osockaddr ctl_addr;
-       long pid;
-       char    luser[USER_SIZE];
-       char    ruser[USER_SIZE];
-       char    rtty[TTY_SIZE];
-};
-
-struct talk_reply {
-       u8_t version;
-       u8_t type;
-       u8_t answer;
-       u8_t junk;
-       u32_t id;
-       struct osockaddr addr;
-};
-
-#define        TALK_VERSION    1
-
-/* message type values */
-#define LEAVE_INVITE   0       /* leave invitation with server */
-#define LOOK_UP                1       /* check for invitation by callee */
-#define DELETE         2       /* delete invitation by caller */
-#define ANNOUNCE       3       /* announce invitation by caller */
-
-/* answer values */
-#define SUCCESS                0       /* operation completed properly */
-#define NOT_HERE       1       /* callee not logged in */
-#define FAILED         2       /* operation failed for unexplained reason */
-#define MACHINE_UNKNOWN        3       /* caller's machine name unknown */
-#define PERMISSION_DENIED 4    /* callee's tty doesn't permit announce */
-#define UNKNOWN_REQUEST        5       /* request has invalid type value */
-#define        BADVERSION      6       /* request has invalid protocol version */
-#define        BADADDR         7       /* request has invalid addr value */
-#define        BADCTLADDR      8       /* request has invalid ctl_addr value */
-
-#define MAX_LIFE       60      /* max time daemon saves invitations */
-#define RING_WAIT      30      /* time to wait before resending invitation */
diff --git a/commands/talkd/Makefile b/commands/talkd/Makefile
deleted file mode 100644 (file)
index 367e369..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# Makefile for talkd
-#
-# 07/22/96                     Michael Temari, <temari@ix.netcom.com>
-#
-
-PROG=  talkd
-SRCS=  talkd.c net.c process.c finduser.c
-MAN=
-
-.include <bsd.prog.mk>
diff --git a/commands/talkd/finduser.c b/commands/talkd/finduser.c
deleted file mode 100644 (file)
index 7bb0145..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/* finduser.c Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <time.h>
-#include <utmp.h>
-#include <net/gen/in.h>
-
-#include "talk.h"
-#include "finduser.h"
-
-int find_user(name, tty)
-char *name;
-char *tty;
-{
-int fd;
-int ret;
-struct utmp utmp;
-
-   /* Now find out if the requested user is logged in. */
-   if((fd = open(UTMP, O_RDONLY)) < 0) {
-       perror("talkd: opening UTMP file");
-       return(FAILED);
-   }
-
-   ret = NOT_HERE;
-
-   while(read(fd, &utmp, sizeof(struct utmp)) == sizeof(struct utmp)) {
-       if(utmp.ut_type != USER_PROCESS) continue;
-#ifdef __NBSD_LIBC
-       if(strncmp(utmp.ut_name, name, sizeof(utmp.ut_name))) continue;
-#else
-       if(strncmp(utmp.ut_user, name, sizeof(utmp.ut_user))) continue;
-#endif
-       if(*tty && strncmp(utmp.ut_line, tty, sizeof(utmp.ut_line))) continue;
-       strcpy(tty, utmp.ut_line);
-       ret = SUCCESS;
-       break;
-   }
-
-   close(fd);
-
-   return(ret);
-}
diff --git a/commands/talkd/finduser.h b/commands/talkd/finduser.h
deleted file mode 100644 (file)
index 7fd68bd..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-/* finduser.h Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-_PROTOTYPE(int find_user, (char *name, char *tty));
diff --git a/commands/talkd/net.c b/commands/talkd/net.c
deleted file mode 100644 (file)
index 4eb136c..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-/* net.c Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <net/netlib.h>
-#include <net/hton.h>
-#include <net/gen/netdb.h>
-#include <net/gen/in.h>
-#include <net/gen/udp.h>
-#include <net/gen/udp_io.h>
-#include <net/gen/udp_hdr.h>
-
-#include "talk.h"
-#include "talkd.h"
-#include "net.h"
-
-static unsigned char buffer[8192];
-
-static int udp_in;
-static int udp_out;
-
-static udpport_t ntalk_port;
-
-int NetInit()
-{
-int s;
-struct servent *servent;
-char *udp_device;
-nwio_udpopt_t udpopt;
-
-   if((udp_device = getenv("UDP_DEVICE")) == (char *)NULL)
-       udp_device = UDP_DEVICE;
-
-   if((udp_in = open(udp_device, O_RDWR)) < 0) {
-       fprintf(stderr, "talkd: Could not open %s: %s\n",
-               udp_device, strerror(errno));
-       return(-1);
-   }
-
-   if((udp_out = open(udp_device, O_RDWR)) < 0) {
-       fprintf(stderr, "talkd: Could not open %s: %s\n",
-               udp_device, strerror(errno));
-       close(udp_in);
-       return(-1);
-   }
-
-   if((servent = getservbyname("ntalk", "udp")) == (struct servent *)NULL) {
-       fprintf(stderr, "talkd: Could not find ntalk udp service\n");
-       close(udp_in);
-       close(udp_out);
-       return(-1);
-   }
-
-   ntalk_port = (udpport_t)servent->s_port;
-
-   udpopt.nwuo_flags = NWUO_NOFLAGS;
-   udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SET | NWUO_EN_LOC;
-   udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_ANY | NWUO_RA_ANY;
-   udpopt.nwuo_flags |= NWUO_RWDATALL | NWUO_DI_IPOPT;
-   udpopt.nwuo_locport = ntalk_port;
-
-   s = ioctl(udp_in, NWIOSUDPOPT, &udpopt);
-   if(s < 0) {
-       perror("talkd: ioctl NWIOSUDPOPT");
-       close(udp_in);
-       close(udp_out);
-       return(-1);
-   }
-
-   s = ioctl(udp_in, NWIOGUDPOPT, &udpopt);
-   if(s < 0) {
-       perror("talkd: ioctl NWIOGUDPOPT");
-       close(udp_in);
-       close(udp_out);
-       return(-1);
-   }
-
-   return(0);
-}
-
-int getrequest(request)
-struct talk_request *request;
-{
-int s;
-udp_io_hdr_t *udp_io_hdr;
-
-   s = read(udp_in, buffer, sizeof(buffer));
-   if(s < 0) {
-       perror("talkd: Read error in getrequest");
-       return(-1);
-   }
-   if(s < sizeof(udp_io_hdr_t)) {
-       fprintf(stderr, "talkd: Packet size read %d is smaller the udp_io_hdr\n", s);
-       return(-1);
-   }
-   udp_io_hdr = (udp_io_hdr_t *)buffer;
-   s = s - sizeof(udp_io_hdr_t);
-
-   /* why is uih_data_len already in host order??? */
-
-   if(udp_io_hdr->uih_data_len != s) {
-       fprintf(stderr, "talkd: Size mismatch Packet %d  Udp Data %d\n",
-               s, udp_io_hdr->uih_data_len);
-       return(-1);
-   }
-
-   if(s != sizeof(struct talk_request)) {
-       fprintf(stderr, "talkd: Size mismatch in request %d %d\n",
-                       s, sizeof(struct talk_request));
-       return(-1);
-   }
-
-   memcpy((char *)request, buffer + sizeof(udp_io_hdr_t), s);
-
-   if(opt_d) {
-       fprintf(stderr, "Request: ");
-       fprintf(stderr, "%02x %02x %02x %02x ",
-       request->version, request->type, request->answer, request->junk);
-       fprintf(stderr, "%08lx ", request->id);
-       fprintf(stderr, "%04x %08lx:%04x\n",
-               request->addr.sa_family, request->addr.sin_addr, request->addr.sin_port);
-       fprintf(stderr, "                     %08lx ", request->pid);
-       fprintf(stderr, "%04x %08lx:%04x\n",
-               request->ctl_addr.sa_family, request->ctl_addr.sin_addr, request->ctl_addr.sin_port);
-       fprintf(stderr, "          %-12.12s %-12.12s %-16.16s\n",
-               request->luser, request->ruser, request->rtty);
-   }
-
-   return(0);
-}
-
-int sendreply(request, reply)
-struct talk_request *request;
-struct talk_reply *reply;
-{
-int s;
-nwio_udpopt_t udpopt;
-udp_io_hdr_t *udp_io_hdr;
-
-   udpopt.nwuo_flags = NWUO_NOFLAGS;
-   udpopt.nwuo_flags |= NWUO_COPY | NWUO_LP_SET | NWUO_EN_LOC;
-   udpopt.nwuo_flags |= NWUO_DI_BROAD | NWUO_RP_SET | NWUO_RA_SET;
-   udpopt.nwuo_flags |= NWUO_RWDATONLY | NWUO_DI_IPOPT;
-   udpopt.nwuo_locport = ntalk_port;
-   udpopt.nwuo_remaddr = request->ctl_addr.sin_addr;
-   udpopt.nwuo_remport = request->ctl_addr.sin_port;
-
-   s = ioctl(udp_out, NWIOSUDPOPT, &udpopt);
-   if(s < 0) {
-       perror("talkd: ioctl NWIOSUDPOPT");
-       return(-1);
-   }
-
-   s = ioctl(udp_out, NWIOGUDPOPT, &udpopt);
-   if(s < 0) {
-       perror("talkd: ioctl NWIOGUDPOPT");
-       return(-1);
-   }
-
-   if(opt_d) {
-       fprintf(stderr, "Reply:   ");
-       fprintf(stderr, "%02x %02x %02x %02x ",
-               reply->version, reply->type, reply->answer, reply->junk);
-       fprintf(stderr, "%08lx ", reply->id);
-       fprintf(stderr, "%04x %08lx:%04x",
-               reply->addr.sa_family, reply->addr.sin_addr, reply->addr.sin_port);
-       fprintf(stderr, "\n");
-   }
-
-   s = write(udp_out, reply, sizeof(struct talk_reply));
-   if(s < 0) {
-       perror("talkd: write");
-       return(-1);
-   }
-   if(s != sizeof(struct talk_reply)) {
-       fprintf(stderr, "talkd: write size mismatch %d %d\n",
-               s, sizeof(struct talk_reply));
-       return(-1);
-   }
-       
-   return(0);
-}
diff --git a/commands/talkd/net.h b/commands/talkd/net.h
deleted file mode 100644 (file)
index 9254d3c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/* net.h Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-_PROTOTYPE(int NetInit, (void));
-_PROTOTYPE(int getrequest, (struct talk_request *request));
-_PROTOTYPE(int sendreply, (struct talk_request *request, struct talk_reply *reply));
diff --git a/commands/talkd/process.c b/commands/talkd/process.c
deleted file mode 100644 (file)
index 02715c5..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-/* process.c Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <ctype.h>
-#include <time.h>
-#include <net/hton.h>
-#include <net/gen/socket.h>
-#include <net/gen/in.h>
-#include <net/gen/netdb.h>
-
-#include "talk.h"
-#include "talkd.h"
-#include "process.h"
-#include "finduser.h"
-
-struct entry {
-       struct entry *prev;
-       struct talk_request rq;
-       time_t expire;
-       struct entry *next;
-};
-
-_PROTOTYPE(static int announce, (struct talk_request *request, char *rhost));
-_PROTOTYPE(static struct talk_request *lookup, (struct talk_request *request, int type));
-_PROTOTYPE(static int addreq, (struct talk_request *request));
-_PROTOTYPE(static delete_invite, (long id));
-_PROTOTYPE(static long nextid, (void));
-_PROTOTYPE(static void delete, (struct entry *e));
-
-static struct entry *entry = (struct entry *)NULL;
-
-int processrequest(request, reply)
-struct talk_request *request;
-struct talk_reply *reply;
-{
-char *p;
-struct talk_request *rq;
-struct hostent *hp;
-
-   reply->version = TALK_VERSION;
-   reply->type = request->type;
-   reply->answer = 0;
-   reply->junk = 0;
-   reply->id = htonl(0);
-
-
-   /* check version */
-   if(request->version != TALK_VERSION) {
-       reply->answer = BADVERSION;
-       return(0);
-   }
-
-   /* check address family */
-   if(ntohs(request->addr.sa_family) != AF_INET) {
-       reply->answer = BADADDR;
-       return(0);
-   }
-
-   /* check control address family */
-   if(ntohs(request->ctl_addr.sa_family) != AF_INET) {
-       reply->answer = BADCTLADDR;
-       return(0);
-   }
-
-   /* check local name */
-   p = request->luser;
-   while(*p)
-       if(!isprint(*p)) {
-               reply->answer = FAILED;
-               return(0);
-       } else
-               p++;
-
-   switch(request->type) {
-       case ANNOUNCE:
-               reply->answer = find_user(request->ruser, request->rtty);
-               if(reply->answer != SUCCESS) break;
-               hp = gethostbyaddr((char *)&request->ctl_addr.sin_addr, sizeof(ipaddr_t), AF_INET);
-               if(hp == (struct hostent *)NULL) {
-                       reply->answer = MACHINE_UNKNOWN;
-                       break;
-               }
-               if((rq = lookup(request, 1)) == (struct talk_request *)NULL) {
-                       reply->id = addreq(request);
-                       reply->answer = announce(request, hp->h_name);
-                       break;
-               }
-               if(ntohl(request->id) > ntohl(rq->id)) {
-                       rq->id = nextid();
-                       reply->id = rq->id;
-                       reply->answer = announce(request, hp->h_name);
-               } else {
-                       reply->id = rq->id;
-                       reply->answer = SUCCESS;
-               }
-               break;
-       case LEAVE_INVITE:
-               rq = lookup(request, 1);
-               if(rq == (struct talk_request *)NULL)
-                       reply->id = addreq(request);
-               else {
-                       reply->id = rq->id;
-                       reply->answer = SUCCESS;
-               }
-               break;
-       case LOOK_UP:
-               if((rq = lookup(request, 0)) == (struct talk_request *)NULL)
-                       reply->answer = NOT_HERE;
-               else {
-                       reply->id = rq->id;
-                       memcpy((char *)&reply->addr, (char *)&rq->addr, sizeof(reply->addr));
-                       reply->answer = SUCCESS;
-               }
-               break;
-       case DELETE:
-               reply->answer = delete_invite(request->id);
-               break;
-       default:
-               reply->answer = UNKNOWN_REQUEST;
-   }
-
-   return(0);
-}
-
-static int announce(request, rhost)
-struct talk_request *request;
-char *rhost;
-{
-char tty[5+TTY_SIZE+1];
-struct stat st;
-FILE *fp;
-time_t now;
-struct tm *tm;
-
-   sprintf(tty, "/dev/%s", request->rtty);
-
-   if(stat(tty, &st) < 0)
-       return(PERMISSION_DENIED);
-
-   if(!(st.st_mode & S_IWGRP))
-       return(PERMISSION_DENIED);
-
-   if((fp = fopen(tty, "w")) == (FILE *)NULL)
-       return(PERMISSION_DENIED);
-
-   (void) time(&now);
-
-   tm = localtime(&now);
-
-   fprintf(fp, "\007\007\007\rtalkd: Message from talkd@%s at %d:%02d:%02d\r\n",
-               myhostname, tm->tm_hour, tm->tm_min, tm->tm_sec);
-   fprintf(fp, "talkd: %s@%s would like to talk to you\r\n",
-               request->luser, rhost);
-   fprintf(fp, "talkd: to answer type:  talk %s@%s\r\n",
-               request->luser, rhost);
-
-   fclose(fp);
-
-   return(SUCCESS);
-}
-
-static struct talk_request *lookup(request, type)
-struct talk_request *request;
-int type;
-{
-time_t now;
-struct entry *e;
-
-   (void) time(&now);
-
-   for(e = entry; e != (struct entry *)NULL; e = e->next) {
-       if(now > e->expire) {
-               delete(e);
-               continue;
-       }
-       if(type == 0) {
-               if(!strncmp(request->luser, e->rq.ruser, USER_SIZE) &&
-                  !strncmp(request->ruser, e->rq.luser, USER_SIZE) &&
-                  e->rq.type == LEAVE_INVITE)
-                       return(&e->rq);
-       } else {
-               if(request->type == e->rq.type &&
-                  request->pid == e->rq.pid &&
-                  !strncmp(request->luser, e->rq.luser, USER_SIZE) &&
-                  !strncmp(request->ruser, e->rq.ruser, USER_SIZE)) {
-                       e->expire = now + MAX_LIFE;
-                       return(&e->rq);
-               }
-       }
-   }
-   return((struct talk_request *)NULL);
-}
-
-static int addreq(request)
-struct talk_request *request;
-{
-time_t now;
-struct entry *e;
-
-   (void) time(&now);
-   request->id = nextid();
-   e = (struct entry *) malloc(sizeof(struct entry));
-   if(e == (struct entry *)NULL) {
-       fprintf(stderr, "talkd: out of memory in insert table\n");
-       exit(1);
-   }
-   e->expire = now + MAX_LIFE;
-   memcpy((char *)&e->rq, (char *)request, sizeof(struct talk_request));
-   e->next = entry;
-   if(e->next != (struct entry *)NULL)
-       e->next->prev = e;
-   e->prev = (struct entry *)NULL;
-   entry = e;
-   return(request->id);
-}
-
-static int delete_invite(id)
-long id;
-{
-time_t now;
-struct entry *e;
-
-   (void) time(&now);
-
-   for(e = entry; e != (struct entry *)NULL; e = e->next) {
-       if(now > e->expire) {
-               delete(e);
-               continue;
-       }
-       if(e->rq.id == id) {
-               delete(e);
-               return(SUCCESS);
-       }
-   }
-   return(NOT_HERE);
-}
-
-static void delete(e)
-struct entry *e;
-{
-   if(e == (struct entry *)NULL) return;
-
-   if(entry == e)
-       entry = e->next;
-   else
-       if(e->prev != (struct entry *)NULL)
-               e->prev->next = e->next;
-
-   if(e->next != (struct entry *)NULL)
-       e->next->prev = e->prev;
-
-   free((char *)e);
-
-   return;
-}
-
-static long nextid()
-{
-static long id = 0;
-
-   id++;
-   if(id <= 0) id = 1;
-   return(htonl(id));
-}
diff --git a/commands/talkd/process.h b/commands/talkd/process.h
deleted file mode 100644 (file)
index 79e02d2..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-/* process.h Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-_PROTOTYPE(int processrequest, (struct talk_request *request, struct talk_reply *reply));
diff --git a/commands/talkd/talk.h b/commands/talkd/talk.h
deleted file mode 100644 (file)
index e7ecbab..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/* talk.h Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-#define        USER_SIZE       12
-#define        TTY_SIZE        16
-#define        HOST_SIZE       255
-
-struct osockaddr {
-       u16_t sa_family;
-       u16_t sin_port;
-       ipaddr_t sin_addr;
-       char junk[8];
-};
-
-struct talk_request {
-       u8_t version;
-       u8_t type;
-       u8_t answer;
-       u8_t junk;
-       u32_t id;
-       struct osockaddr addr;
-       struct osockaddr ctl_addr;
-       long pid;
-       char    luser[USER_SIZE];
-       char    ruser[USER_SIZE];
-       char    rtty[TTY_SIZE];
-};
-
-struct talk_reply {
-       u8_t version;
-       u8_t type;
-       u8_t answer;
-       u8_t junk;
-       u32_t id;
-       struct osockaddr addr;
-};
-
-#define        TALK_VERSION    1
-
-/* message type values */
-#define LEAVE_INVITE   0       /* leave invitation with server */
-#define LOOK_UP                1       /* check for invitation by callee */
-#define DELETE         2       /* delete invitation by caller */
-#define ANNOUNCE       3       /* announce invitation by caller */
-
-/* answer values */
-#define SUCCESS                0       /* operation completed properly */
-#define NOT_HERE       1       /* callee not logged in */
-#define FAILED         2       /* operation failed for unexplained reason */
-#define MACHINE_UNKNOWN        3       /* caller's machine name unknown */
-#define PERMISSION_DENIED 4    /* callee's tty doesn't permit announce */
-#define UNKNOWN_REQUEST        5       /* request has invalid type value */
-#define        BADVERSION      6       /* request has invalid protocol version */
-#define        BADADDR         7       /* request has invalid addr value */
-#define        BADCTLADDR      8       /* request has invalid ctl_addr value */
-
-#define MAX_LIFE       60      /* max time daemon saves invitations */
-#define RING_WAIT      30      /* time to wait before resending invitation */
diff --git a/commands/talkd/talkd.c b/commands/talkd/talkd.c
deleted file mode 100644 (file)
index b7afb88..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/* talkd.c Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <net/gen/in.h>
-
-#include "talk.h"
-#include "talkd.h"
-#include "net.h"
-#include "process.h"
-
-_PROTOTYPE(int main, (int argc, char *argv[]));
-
-int opt_d = 0;
-char myhostname[HOST_SIZE+1];
-
-int main(argc, argv)
-int argc;
-char *argv[];
-{
-struct talk_request request;
-struct talk_reply reply;
-
-   if(argc > 1)
-       if(strcmp(argv[1], "-d") || argc > 2) {
-               fprintf(stderr, "Usage: talkd [-d]\n");
-               return(-1);
-       } else
-               opt_d = 1;
-
-   if(getuid() != 0) {
-       fprintf(stderr, "talkd: Must be run as super user\n");
-       return(-1);
-   }
-
-   if(gethostname(myhostname, HOST_SIZE) < 0) {
-       fprintf(stderr, "talkd: Error getting hostname\n");
-       return(-1);
-   }
-
-   if(NetInit()) {
-       fprintf(stderr, "talkd: Error in NetInit\n");
-       return(-1);
-   }
-
-   while(getrequest(&request) == 0) {
-       if(processrequest(&request, &reply)) break;
-       if(sendreply(&request, &reply)) break;
-   }
-
-   return(-1);
-}
diff --git a/commands/talkd/talkd.h b/commands/talkd/talkd.h
deleted file mode 100644 (file)
index 075d973..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/* talkd.h Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-extern int opt_d;      /* debug option */
-extern char myhostname[];
diff --git a/commands/top/Makefile b/commands/top/Makefile
deleted file mode 100644 (file)
index 75cd7e3..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-PROG=  top
-MAN=
-
-DPADD+= ${LIBCURSES}
-LDADD+= -lcurses
-
-.include <bsd.prog.mk>
index 15bfd7098f01972ee46bffbef24dea567fe81cc7..399e62ca731a986b1122648f8bdac375b1f22662 100644 (file)
@@ -2,7 +2,7 @@
 
 .PATH: ${MINIXSRCDIR}/common/include
 
-INCS+=         curses.h env.h fetch.h hgfs.h lib.h libutil.h timers.h
+INCS+=  env.h fetch.h hgfs.h lib.h libutil.h timers.h
 
 INCS+=         minix/acpi.h minix/ansi.h minix/audio_fw.h minix/bitmap.h \
        minix/callnr.h minix/com.h minix/compiler.h minix/config.h \
diff --git a/common/include/curses.h b/common/include/curses.h
deleted file mode 100644 (file)
index af1b0b3..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-/* curses.h - defines macros and prototypes for curses */
-
-#ifndef _CURSES_H
-#define _CURSES_H
-
-#include <termios.h>
-#include <stdarg.h>
-#include <stdio.h>
-
-typedef int bool;
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-#ifndef FALSE
-#define FALSE 0
-#endif
-#ifndef ERR
-#define ERR (-1)       /* general error flag */
-#endif
-#ifndef OK
-#define OK 0           /* general OK flag */
-#endif
-
-/* Macros. */
-#define box(win,vc,hc) wbox(win,0,0,0,0,vc,hc)
-#define addch(ch) waddch(stdscr,ch)
-#define mvaddch(y,x,ch) (wmove(stdscr,y,x)==ERR?ERR:waddch(stdscr,ch))
-#define mvwaddch(win,y,x,ch) (wmove(win,y,x)==ERR?ERR:waddch(win,ch))
-#define getch() wgetch(stdscr)
-#define mvgetch(y,x) (wmove(stdscr,y,x)==ERR?ERR:wgetch(stdscr))
-#define mvwgetch(win,y,x) (wmove(win,y,x)==ERR?ERR:wgetch(win))
-#define addstr(str) waddstr(stdscr,str)
-#define mvaddstr(y,x,str) (wmove(stdscr,y,x)==ERR?ERR:waddstr(stdscr,str))
-#define mvwaddstr(win,y,x,str) (wmove(win,y,x)==ERR?ERR:waddstr(win,str))
-#define getstr(str) wgetstr(stdscr,str)
-#define mvgetstr(y,x,str) (wmove(stdscr,y,x)==ERR?ERR:wgetstr(stdscr,str))
-#define mvwgetstr(win,y,x,str) (wmove(win,y,x)==ERR?ERR:wgetstr(win,str))
-#define move(y,x) wmove(stdscr,y,x)
-#define clear() wclear(stdscr)
-#define erase() werase(stdscr)
-#define clrtobot() wclrtobot(stdscr)
-#define mvclrtobot(y,x) (wmove(stdscr,y,x)==ERR?ERR:wclrtobot(stdscr))
-#define mvwclrtobot(win,y,x) (wmove(win,y,x)==ERR?ERR:wclrtobot(win))
-#define clrtoeol() wclrtoeol(stdscr)
-#define mvclrtoeol(y,x) (wmove(stdscr,y,x)==ERR?ERR:wclrtoeol(stdscr))
-#define mvwclrtoeol(win,y,x) (wmove(win,y,x)==ERR?ERR:wclrtoeol(win))
-#define insertln() winsertln(stdscr)
-#define mvinsertln(y,x) (wmove(stdscr,y,x)==ERR?ERR:winsertln(stdscr))
-#define mvwinsertln(win,y,x) (wmove(win,y,x)==ERR?ERR:winsertln(win))
-#define deleteln() wdeleteln(stdscr)
-#define mvdeleteln(y,x) (wmove(stdscr,y,x)==ERR?ERR:wdeleteln(stdscr))
-#define mvwdeleteln(win,y,x) (wmove(win,y,x)==ERR?ERR:wdeleteln(win))
-#define refresh() wrefresh(stdscr)
-#define inch() winch(stdscr)
-#define insch(ch) winsch(stdscr,ch)
-#define mvinsch(y,x,ch) (wmove(stdscr,y,x)==ERR?ERR:winsch(stdscr,ch))
-#define mvwinsch(win,y,x,ch) (wmove(win,y,x)==ERR?ERR:winsch(win,ch))
-#define delch() wdelch(stdscr)
-#define mvdelch(y,x) (wmove(stdscr,y,x)==ERR?ERR:wdelch(stdscr))
-#define mvwdelch(win,y,x) (wmove(win,y,x)==ERR?ERR:wdelch(win))
-#define standout() wstandout(stdscr)
-#define wstandout(win) ((win)->_attrs |= A_STANDOUT)
-#define standend() wstandend(stdscr)
-#define wstandend(win) ((win)->_attrs &= ~A_STANDOUT)
-#define attrset(attrs) wattrset(stdscr, attrs)
-#define wattrset(win, attrs) ((win)->_attrs = (attrs))
-#define attron(attrs) wattron(stdscr, attrs)
-#define wattron(win, attrs) ((win)->_attrs |= (attrs))
-#define attroff(attrs) wattroff(stdscr,attrs)
-#define wattroff(win, attrs) ((win)->_attrs &= ~(attrs))
-#define resetty() tcsetattr(1, TCSANOW, &_orig_tty)
-#define getyx(win,y,x) (y = (win)->_cury, x = (win)->_curx)
-
-/* Video attribute definitions. */
-#define        A_BLINK        0x0100
-#define        A_BLANK        0
-#define        A_BOLD         0x0200
-#define        A_DIM          0
-#define        A_PROTECT      0
-#define        A_REVERSE      0x0400
-#define        A_STANDOUT     0x0800
-#define        A_UNDERLINE    0x1000
-#define        A_ALTCHARSET   0x2000
-
-/* Type declarations. */
-typedef struct {
-  int     _cury;                       /* current pseudo-cursor */
-  int     _curx;
-  int      _maxy;                      /* max coordinates */
-  int      _maxx;
-  int      _begy;                      /* origin on screen */
-  int      _begx;
-  int     _flags;                      /* window properties */
-  int     _attrs;                      /* attributes of written characters */
-  int      _tabsize;                   /* tab character size */
-  bool    _clear;                      /* causes clear at next refresh */
-  bool    _leave;                      /* leaves cursor as it happens */
-  bool    _scroll;                     /* allows window scrolling */
-  bool    _nodelay;                    /* input character wait flag */
-  bool    _keypad;                     /* flags keypad key mode active */
-  int    **_line;                      /* pointer to line pointer array */
-  int    *_minchng;                    /* First changed character in line */
-  int    *_maxchng;                    /* Last changed character in line */
-  int     _regtop;                     /* Top/bottom of scrolling region */
-  int     _regbottom;
-} WINDOW;
-
-/* External variables */
-extern int LINES;                      /* terminal height */
-extern int COLS;                       /* terminal width */
-extern bool NONL;                      /* \n causes CR too ? */
-extern WINDOW *curscr;                 /* the current screen image */
-extern WINDOW *stdscr;                 /* the default screen window */
-extern struct termios _orig_tty, _tty;
-
-extern unsigned int ACS_ULCORNER;      /* terminal dependent block grafic */
-extern unsigned int ACS_LLCORNER;      /* charcters.  Forget IBM, we are */
-extern unsigned int ACS_URCORNER;      /* independent of their charset. :-) */
-extern unsigned int ACS_LRCORNER;
-extern unsigned int ACS_RTEE;
-extern unsigned int ACS_LTEE;
-extern unsigned int ACS_BTEE;
-extern unsigned int ACS_TTEE;
-extern unsigned int ACS_HLINE;
-extern unsigned int ACS_VLINE;
-extern unsigned int ACS_PLUS;
-extern unsigned int ACS_S1;
-extern unsigned int ACS_S9;
-extern unsigned int ACS_DIAMOND;
-extern unsigned int ACS_CKBOARD;
-extern unsigned int ACS_DEGREE;
-extern unsigned int ACS_PLMINUS;
-extern unsigned int ACS_BULLET;
-extern unsigned int ACS_LARROW;
-extern unsigned int ACS_RARROW;
-extern unsigned int ACS_DARROW;
-extern unsigned int ACS_UARROW;
-extern unsigned int ACS_BOARD;
-extern unsigned int ACS_LANTERN;
-extern unsigned int ACS_BLOCK;
-
-_PROTOTYPE( char *unctrl, (int _c) );
-_PROTOTYPE( int baudrate, (void));
-_PROTOTYPE( void beep, (void));
-_PROTOTYPE( void cbreak, (void));
-_PROTOTYPE( void clearok, (WINDOW *_win, bool _flag) );
-_PROTOTYPE( void clrscr, (void));
-_PROTOTYPE( void curs_set, (int _visibility) );
-_PROTOTYPE( void delwin, (WINDOW *_win) );
-_PROTOTYPE( void doupdate, (void));
-_PROTOTYPE( void echo, (void));
-_PROTOTYPE( int endwin, (void));
-_PROTOTYPE( int erasechar, (void));
-_PROTOTYPE( void fatal, (char *_s) );
-_PROTOTYPE( int fixterm, (void));
-_PROTOTYPE( void flash, (void));
-_PROTOTYPE( void gettmode, (void));
-_PROTOTYPE( void idlok, (WINDOW *_win, bool _flag) );
-_PROTOTYPE( WINDOW *initscr, (void));
-_PROTOTYPE( void keypad, (WINDOW *_win, bool _flag) );
-_PROTOTYPE( int killchar, (void));
-_PROTOTYPE( void leaveok, (WINDOW *_win, bool _flag) );
-_PROTOTYPE( char *longname, (void));
-_PROTOTYPE( void meta, (WINDOW *_win, bool _flag) );
-_PROTOTYPE( int mvcur, (int _oldy, int _oldx, int _newy, int _newx) );
-_PROTOTYPE( int mvinch, (int _y, int _x) );
-_PROTOTYPE( int mvprintw, (int _y, int _x, const char *_fmt, ...) );
-_PROTOTYPE( int mvscanw, (int _y, int _x, const char *_fmt, ...) );
-_PROTOTYPE( int mvwin, (WINDOW *_win, int _begy, int _begx) );
-_PROTOTYPE( int mvwinch, (WINDOW *_win, int _y, int _x) );
-_PROTOTYPE( int mvwprintw, (WINDOW *_win, int _y, int _x, const char *_fmt,
-                                                                       ...) );
-_PROTOTYPE( int mvwscanw, (WINDOW *_win, int _y, int _x, const char *_fmt,
-                                                                       ...) );
-_PROTOTYPE( WINDOW *newwin, (int _num_lines, int _num_cols, int _y, int _x));
-_PROTOTYPE( void nl, (void));
-_PROTOTYPE( void nocbreak, (void));
-_PROTOTYPE( void nodelay, (WINDOW *_win, bool _flag) );
-_PROTOTYPE( void noecho, (void));
-_PROTOTYPE( void nonl, (void));
-_PROTOTYPE( void noraw, (void));
-_PROTOTYPE( void outc, (int _c) );
-_PROTOTYPE( void  overlay, (WINDOW *_win1, WINDOW *_win2) );
-_PROTOTYPE( void  overwrite, (WINDOW *_win1, WINDOW *_win2) );
-_PROTOTYPE( void poscur, (int _r, int _c) );
-_PROTOTYPE( int printw, (const char *_fmt, ...) );
-_PROTOTYPE( void raw, (void));
-_PROTOTYPE( int resetterm, (void));
-_PROTOTYPE( int saveoldterm, (void));
-_PROTOTYPE( int saveterm, (void));
-_PROTOTYPE( int savetty, (void));
-_PROTOTYPE( int scanw, (const char *_fmt, ...) );
-_PROTOTYPE( void scroll, (WINDOW *_win) );
-_PROTOTYPE( void scrollok, (WINDOW *_win, bool _flag) );
-_PROTOTYPE( int setscrreg, (int _top, int _bottom) );
-_PROTOTYPE( int setterm, (char *_type) );
-_PROTOTYPE( int setupterm, (void));
-_PROTOTYPE( WINDOW *subwin, (WINDOW *_orig, int _nlines, int _ncols, int _y,
-                                       int _x));
-_PROTOTYPE( int tabsize, (int _ts) );
-_PROTOTYPE( void touchwin, (WINDOW *_win) );
-_PROTOTYPE( int waddch, (WINDOW *_win, int _c) );
-_PROTOTYPE( int waddstr, (WINDOW *_win, char *_str) );
-_PROTOTYPE( int wbox, (WINDOW *_win, int _ymin, int _xmin, int _ymax,
-                               int _xmax, unsigned int _v, unsigned int _h) );
-_PROTOTYPE( void wclear, (WINDOW *_win) );
-_PROTOTYPE( int wclrtobot, (WINDOW *_win) );
-_PROTOTYPE( int wclrtoeol, (WINDOW *_win) );
-_PROTOTYPE( int wdelch, (WINDOW *_win) );
-_PROTOTYPE( int wdeleteln, (WINDOW *_win) );
-_PROTOTYPE( void werase, (WINDOW *_win) );
-_PROTOTYPE( int wgetch, (WINDOW *_win) );
-_PROTOTYPE( int wgetstr, (WINDOW *_win, char *_str) );
-_PROTOTYPE( int winch, (WINDOW *_win) );
-_PROTOTYPE( int winsch, (WINDOW *_win, int _c) );
-_PROTOTYPE( int winsertln, (WINDOW *_win) );
-_PROTOTYPE( int wmove, (WINDOW *_win, int _y, int _x) );
-_PROTOTYPE( void wnoutrefresh, (WINDOW *_win) );
-_PROTOTYPE( int wprintw, (WINDOW *_win, const char *_fmt, ...));
-_PROTOTYPE( void wrefresh, (WINDOW *_win) );
-_PROTOTYPE( int wscanw, (WINDOW *_win, const char *_fmt, ...));
-_PROTOTYPE( int wsetscrreg, (WINDOW *_win, int _top, int _bottom) );
-_PROTOTYPE( int wtabsize, (WINDOW *_win, int _ts) );
-
-#endif /* _CURSES_H */
index b8ccec598c10aed2626621ef4853eb66f40b13e7..5963990b4b2fe3bf93513f46da3d367b30dc0d37 100644 (file)
@@ -72,6 +72,9 @@
 700  root    operator  /usr/preserve
 755  root    operator  /usr/run
 755  root    operator  /usr/share
+755  root    operator  /usr/share/doc
+755  root    operator  /usr/share/doc/psd
+755  root    operator  /usr/share/doc/psd/19.curses
 755  root    operator  /usr/share/mk
 755  root    operator  /usr/share/terminfo
 755  root    operator  /usr/share/zoneinfo
index 4ed6f85fa7ec372b5642663151d2576b252febb3..1d3026ef7818271f3225c9b0e05b1c8e3bfdff0d 100644 (file)
@@ -1,7 +1,7 @@
 # Doing a make includes builds /usr/include
 
 INCS=  alloca.h a.out.h ar.h assert.h configfile.h ctype.h \
-       curses.h dirent.h env.h err.h errno.h fcntl.h fenv.h \
+       dirent.h env.h err.h errno.h fcntl.h fenv.h \
        float.h fnmatch.h fts.h getopt.h glob.h grp.h ifaddrs.h \
        inttypes.h libgen.h libutil.h limits.h locale.h \
        mathconst.h math.h midiparser.h netdb.h pwd.h regex.h \
index 6f383260874b3f3be51237abf61d0e7a4b38066f..afa06c13bcc764345d8d0c6ecd7fc90cc77909bf 100644 (file)
@@ -14,14 +14,14 @@ LIBCOMPAT_DIR?=
 LIBMINLIB_DIR?=
 LIBASYN_DIR?=
 
-SUBDIR= csu ${LIBCOMPAT_DIR} ${LIBC_DIR} libcurses libdriver libnetdriver \
+SUBDIR= csu ${LIBCOMPAT_DIR} ${LIBC_DIR} libdriver libnetdriver \
        libedit ${LIBM_DIR} libsys libtimers libutil libbz2 libl libhgfs  \
        libz libfetch libarchive libvtreefs libaudiodriver libmthread     \
        libexec libdevman libusb ${LIBMINLIB_DIR} ${LIBASYN_DIR}          \
        libddekit
 
 .if defined(NBSD_LIBC) && (${NBSD_LIBC} != "no")
-SUBDIR+= libelf libminc libcrypt libterminfo
+SUBDIR+= libelf libminc libcrypt libterminfo libcurses
 .endif
 
 .if ${COMPILER_TYPE} == "ack"
diff --git a/lib/libcurses/EXAMPLES/Makefile b/lib/libcurses/EXAMPLES/Makefile
new file mode 100644 (file)
index 0000000..b3759fd
--- /dev/null
@@ -0,0 +1,54 @@
+#$Id: Makefile,v 1.2 2007/05/28 15:01:58 blymn Exp $
+#$Log: Makefile,v $
+#Revision 1.2  2007/05/28 15:01:58  blymn
+#Merge in wide curses code done as a Summer of Code project by
+#Ruibiao Qiu.
+#
+#Revision 1.1.2.2  2007/01/31 10:08:47  blymn
+#Fix up build errors.
+#
+#Revision 1.1.2.1  2007/01/21 12:05:54  blymn
+#Merge wide curses.
+#
+#Revision 1.1  2007/01/21 11:38:59  blymn
+#Wide curses merge
+#
+#Revision 1.1  2005/08/31 14:52:08  ruibiao
+#
+#A patach for the current source
+#
+#Revision 1.2  2005/08/23 21:29:08  ruibiao
+#
+#Changed to the right libraries
+#
+#Revision 1.1  2005/08/23 16:38:22  ruibiao
+#
+#Initial version, to build all versions of file views and the unit tester
+#
+
+RM = /bin/rm -f
+CFLAGS =
+
+.if defined(DEBUG)
+CFLAGS+= -g
+.endif
+
+all: wcview nwview ccview tcview ncview ex1
+
+wcview: view.c
+       gcc -DHAVE_WCHAR -o wcview view.c -I.. $(CFLAGS) -lcurses -Wl,-rpath,.. -L..
+
+nwview: view.c
+       gcc -DHAVE_WCHAR -o nwview view.c -DNCURSES -I/usr/pkg/include $(CFLAGS) -lcurses -Wl,-rpath,/usr/pkg/lib -L/usr/pkg/lib
+
+ccview: view.c
+       gcc -o ccview view.c -I.. $(CFLAGS) -lcurses -Wl,-rpath,.. -L..
+
+tcview: view.c
+       gcc -o tcview view.c -L/usr/lib -Wl,-rpath,/usr/lib $(CFLAGS) -lcurses
+
+ncview: view.c
+       gcc -o ncview view.c -I/usr/pkg/include -DNCURSES -L/usr/pkg/lib -Wl,-rpath,/usr/pkg/lib $(CFLAGS) -lncurses
+
+ex1: ex1.c
+       gcc -DHAVE_WCHAR -o ex1 ex1.c -I.. $(CFLAGS) -lcurses -Wl,-rpath,.. -L..
diff --git a/lib/libcurses/EXAMPLES/ex1.c b/lib/libcurses/EXAMPLES/ex1.c
new file mode 100644 (file)
index 0000000..e71ed33
--- /dev/null
@@ -0,0 +1,342 @@
+/*     $NetBSD: ex1.c,v 1.5 2007/05/28 15:01:58 blymn Exp $    */
+
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright (c) 1992, 1993\n\
+       The Regents of the University of California.  All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)ex1.c      8.1 (Berkeley) 6/4/93";
+#endif /* not lint */
+#include <sys/types.h>
+#include <curses.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <locale.h>
+#include <assert.h>
+
+#define YSIZE 4
+#define XSIZE 30
+
+void quit( int );
+
+main()
+{
+       int i, j, c, n = 0, ac = 0;
+       size_t len;
+       char id[100];
+       FILE *fp;
+       char *s;
+    cchar_t cc, ncc, cstr[ 128 ], icc, icstr[ 128 ], bcc;
+    int wc_on = 0, wgc_on = 0;
+    char mbs[] = "´ó";
+    char mbstr[] = "´óѧ֮µÀ£¬ÔÚÃ÷Ã÷µÂ£¬ÔÚÇ×Ãñ£¬ÔÚÖ¹ÓÚÖÁÉÆ¡£ (Liji)";
+    wchar_t wstr[ 128 ], owstr[ 4 ], gwstr[ 128 ], iwstr[ 128 ];
+    int wslen = 0;
+    wint_t wc;
+    char nostr[ 128 ];
+    attr_t al[ 15 ] = { WA_BLINK,
+                        WA_BOLD,
+                        WA_DIM,
+                        WA_LOW,
+                        WA_TOP,
+                        WA_INVIS,
+                        WA_HORIZONTAL,
+                        WA_VERTICAL,
+                        WA_LEFT,
+                        WA_RIGHT,
+                        WA_PROTECT,
+                        WA_REVERSE,
+                        WA_STANDOUT,
+                        WA_UNDERLINE };
+
+    fprintf( stderr, "Current locale: %s\n", setlocale(LC_ALL, ""));
+    if (( wslen =  mbstowcs( &cc.vals[ 0 ], mbs, strlen( mbs ))) < 0 ) {
+        fprintf( stderr, "mbstowcs() failed\n" );
+        return -1;
+    }
+    fprintf( stderr, "WC string length: %d\n", wslen );
+    fprintf( stderr, "WC width: %d\n", wcwidth( cc.vals[ 0 ]));
+    cc.elements = ncc.elements = 8;
+    cc.attributes = ncc.attributes = 0;
+    ncc.vals[ 0 ] = 0xda00;
+    cc.vals[ 1 ] = ncc.vals[ 1 ] = 0xda01;
+    cc.vals[ 2 ] = ncc.vals[ 2 ] = 0xda02;
+    cc.vals[ 3 ] = ncc.vals[ 3 ] = 0xda03;
+    cc.vals[ 4 ] = ncc.vals[ 4 ] = 0xda04;
+    cc.vals[ 5 ] = ncc.vals[ 5 ] = 0xda05;
+    cc.vals[ 6 ] = ncc.vals[ 6 ] = 0xda06;
+    cc.vals[ 7 ] = ncc.vals[ 7 ] = 0xda07;
+
+    if (( wslen =  mbstowcs( wstr, mbstr, strlen( mbstr ))) < 0 ) {
+        fprintf( stderr, "mbstowcs() failed\n" );
+        return -1;
+    }
+
+    for ( i = 0; i < wslen; i++ ) {
+        cstr[ i ].vals[ 0 ] = wstr[ i ];
+    }
+    cstr[ wslen ].vals[ 0 ] = 0;
+
+    bcc.elements = 8;
+    bcc.attributes = 0;
+    bcc.vals[ 0 ] = L'_';
+    bcc.vals[ 1 ] = 0xda01;
+    bcc.vals[ 2 ] = 0xda02;
+    bcc.vals[ 3 ] = 0xda03;
+    bcc.vals[ 4 ] = 0xda04;
+    bcc.vals[ 5 ] = 0xda05;
+    bcc.vals[ 6 ] = 0xda06;
+    bcc.vals[ 7 ] = 0xda07;
+
+       initscr();                      /* Always call initscr() first */
+       signal(SIGINT, quit);           /* Make sure wou have a 'cleanup' fn */
+       crmode();                       /* We want cbreak mode */
+       noecho();                       /* We want to have control of chars */
+       delwin(stdscr);                 /* Create our own stdscr */
+       stdscr = newwin(YSIZE, XSIZE, 1, 1);
+       flushok(stdscr, TRUE);          /* Enable flushing of stdout */
+       scrollok(stdscr, TRUE);         /* Enable scrolling */
+       erase();                        /* Initially, clear the screen */
+
+       standout();
+       move(0,0);
+       while (1) {
+        if ( !wgc_on ) {
+                   c = getchar();
+                   switch(c) {
+                       case 'q':               /* Quit on 'q' */
+                               quit( 0 );
+                               break;
+                case 'p':
+                    keypad( stdscr, TRUE );
+                    break;
+                case 'P':
+                    keypad( stdscr, FALSE );
+                    break;
+                case 'g':
+                    wgc_on = 1;
+                    echo();
+                    break;
+                case 'b':
+                    get_wstr( gwstr );
+                    move( 1, 0 );
+                    addstr( "Input:" );
+                    addwstr( gwstr );
+                    refresh();
+                    break;
+                case 'h':
+                    move( 0, 0 );
+                    in_wch( &icc );
+                    move( 1, 0 );
+                    add_wch( &icc );
+                    refresh();
+                    break;
+                case 'y':
+                    move( 0, 0 );
+                    in_wchstr( icstr );
+                    move( 1, 0 );
+                    add_wchstr( icstr );
+                    refresh();
+                    break;
+                case 'u':
+                    move( 0, 0 );
+                    inwstr( iwstr );
+                    move( 1, 0 );
+                    addwstr( iwstr );
+                    refresh();
+                    break;
+                case 'i':
+                    move( 0, 0 );
+                    hline_set( &cc, 20 );
+                    move( 0, 0 );
+                    vline_set( &cc, 20 );
+                    refresh();
+                    break;
+                case 'o':
+                    clrtobot();
+                    refresh();
+                    break;
+                       case 's':               /* Go into standout mode on 's' */
+                               standout();
+                               break;
+                       case 'e':               /* Exit standout mode on 'e' */
+                               standend();
+                               break;
+                       case 'r':               /* Force a refresh on 'r' */
+                               wrefresh(curscr);
+                               break;
+                       case 'w':               /* Turn on/off add_wch() tests */
+                    wc_on = 1 - wc_on;
+                    break;
+                case 'd':
+                    add_wchstr(( const cchar_t *)&cstr );
+                    refresh();
+                    break;
+                case 'c':
+                    addwstr(( const wchar_t *)&wstr );
+                    refresh();
+                    break;
+                case 'z':
+                    move( 0, 1 );
+                    if ( wc_on )
+                        add_wch( &cc );
+                    else
+                        addch( c );
+                    refresh();
+                    break;
+                case 'x':
+                    move( 0, 3 );
+                    if ( wc_on )
+                        add_wch( &cc );
+                    else
+                        addch( c );
+                    refresh();
+                    break;
+                case 'n':
+                    add_wch( &ncc );
+                    refresh();
+                    break;
+                case 'm':
+                    //border( 0, 0, 0, 0, 0, 0, 0, 0 );
+                    border_set( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL );
+                    refresh();
+                    break;
+                case 'j':
+                    box_set( stdscr, &cc, &cc );
+                    refresh();
+                    break;
+                case 'k':
+                    erase();
+                    refresh();
+                    break;
+                case '1':
+                    move( 0, 0 );
+                    clrtoeol();
+                    refresh();
+                    break;
+                case '2':
+                    move( 0, 0 );
+                    sprintf( nostr, "Orig:%x", al[ ac ]);
+                    addstr( nostr );
+                    ac = ( ac + 1 ) % 16;
+                    bcc.attributes = al[ ac ];
+                    bkgrnd( &bcc );
+                    move( 1, 0 );
+                    sprintf( nostr, "New:%x", al[ ac ]);
+                    //addstr( nostr );
+                    insstr( nostr );
+                    refresh();
+                    break;
+                case 'v':
+                    if ( wc_on )
+                        ins_wch( &cc );
+                    else
+                        insch( c );
+                    refresh();
+                    break;
+                case 'f':
+                    ins_wstr(( const wchar_t *)&wstr );
+                    refresh();
+                    break;
+                case 't':
+                    for ( i = 0; i < 4; i++ ) {
+                        owstr[ i ] = wstr[ i + 5 ];
+                        wstr[ i + 5 ] = i + 0xda05;
+                    }
+                    ins_wstr(( const wchar_t *)&wstr );
+                    refresh();
+                    for ( i = 0; i < 4; i++ )
+                        wstr[ i + 5 ] = owstr[ i ];
+                    break;
+                       default:                /* By default output the character */
+                    if ( wc_on )
+                        add_wch( &cc );
+                    else {
+                        if ( c < 0x7F )
+                            addch( c );
+                        else {
+                            addstr( keyname( c ));
+                        }
+                    }
+                    refresh();
+                   }
+        } else {
+            get_wch( &wc );
+            switch ( wc ) {
+                case L'w':
+                    wgc_on = 0;
+                    noecho();
+                    break;
+                case L'q':
+                    quit( 0 );
+                    break;
+                case L't':
+                    notimeout( stdscr, TRUE );
+                    break;
+                case L'T':
+                    notimeout( stdscr, FALSE );
+                    break;
+                case L'd':
+                    nodelay( stdscr, TRUE );
+                    break;
+                case L'D':
+                    nodelay( stdscr, FALSE );
+                    break;
+                case L'p':
+                    keypad( stdscr, TRUE );
+                    break;
+                case L'P':
+                    keypad( stdscr, FALSE );
+                    break;
+                default:
+                    break;
+            }
+        }
+       }
+}
+
+void quit( int sig )
+{
+       erase();                /* Terminate by erasing the screen */
+       refresh();
+       endwin();               /* Always end with endwin() */
+       delwin(curscr);         /* Return storage */
+       delwin(stdscr);
+       putchar('\n');
+       exit( sig );
+}
+
diff --git a/lib/libcurses/EXAMPLES/view.c b/lib/libcurses/EXAMPLES/view.c
new file mode 100644 (file)
index 0000000..74df2a8
--- /dev/null
@@ -0,0 +1,527 @@
+/*
+ * view.c -- a silly little viewer program
+ *
+ * written by Eric S. Raymond <esr@snark.thyrsus.com> December 1994
+ * to test the scrolling code in ncurses.
+ *
+ * modified by Thomas Dickey <dickey@clark.net> July 1995 to demonstrate
+ * the use of 'resizeterm()', and May 2000 to illustrate wide-character
+ * handling.
+ *
+ * Takes a filename argument.  It's a simple file-viewer with various
+ * scroll-up and scroll-down commands.
+ *
+ * n   -- scroll one line forward
+ * p   -- scroll one line back
+ *
+ * Either command accepts a numeric prefix interpreted as a repeat count.
+ * Thus, typing `5n' should scroll forward 5 lines in the file.
+ *
+ * The way you can tell this is working OK is that, in the trace file,
+ * there should be one scroll operation plus a small number of line
+ * updates, as opposed to a whole-page update.  This means the physical
+ * scroll operation worked, and the refresh() code only had to do a
+ * partial repaint.
+ *
+ * $Id: view.c,v 1.2 2007/05/28 15:01:58 blymn Exp $
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <signal.h>
+#ifdef NCURSES
+#define _XOPEN_SOURCE_EXTENDED
+#include <ncurses.h>
+#include <term.h>
+#else
+#include <curses.h>
+#endif /* NCURSES */
+#include <locale.h>
+#include <assert.h>
+#include <ctype.h>
+#include <termios.h>
+#include <util.h>
+#include <unistd.h>
+#ifdef HAVE_WCHAR
+#include <wchar.h>
+#endif /* HAVE_WCHAR */
+#ifdef DEBUG
+#include <syslog.h>
+#endif /* DEBUG */
+
+#define UChar(c)    ((unsigned char)(c))
+#define SIZEOF(table)  (sizeof(table)/sizeof(table[0]))
+#define typeMalloc(type,n) (type *) malloc((n) * sizeof(type))
+
+#define my_pair 1
+
+#undef CURSES_CH_T
+#ifdef HAVE_WCHAR
+#define CURSES_CH_T cchar_t
+#else
+#define CURSES_CH_T chtype
+#endif /* HAVE_WCHAR */
+
+static void finish(int sig);
+static void show_all(const char *tag);
+
+static int shift = 0;
+static bool try_color = FALSE;
+
+static char *fname;
+static CURSES_CH_T **my_lines;
+static CURSES_CH_T **lptr;
+static unsigned num_lines;
+
+static void usage(void)
+{
+    static const char *msg[] = {
+           "Usage: view [options] file"
+           ,""
+           ,"Options:"
+           ," -c       use color if terminal supports it"
+           ," -i       ignore INT, QUIT, TERM signals"
+           ," -n NUM   specify maximum number of lines (default 1000)"
+#if defined(KEY_RESIZE)
+           ," -r       use old-style sigwinch handler rather than KEY_RESIZE"
+#endif
+#ifdef TRACE
+           ," -t       trace screen updates"
+           ," -T NUM   specify trace mask"
+#endif
+    };
+    size_t n;
+    for (n = 0; n < SIZEOF(msg); n++)
+           fprintf(stderr, "%s\n", msg[n]);
+    exit( 1 );
+}
+
+static int ch_len(CURSES_CH_T * src)
+{
+    int result = 0;
+
+#ifdef HAVE_WCHAR
+    while (getcchar(src++, NULL, NULL, NULL, NULL) > 0)
+           result++;
+#else
+    while (*src++)
+       result++;
+#endif
+    return result;
+}
+
+/*
+ * Allocate a string into an array of chtype's.  If UTF-8 mode is
+ * active, translate the string accordingly.
+ */
+static CURSES_CH_T * ch_dup(char *src)
+{
+    unsigned len = strlen(src);
+    CURSES_CH_T *dst = typeMalloc(CURSES_CH_T, len + 1);
+    unsigned j, k;
+#ifdef HAVE_WCHAR
+    wchar_t wstr[CCHARW_MAX + 1];
+    wchar_t wch;
+    int l = 0;
+    mbstate_t state;
+    size_t rc;
+    int width;
+#endif
+
+#ifdef HAVE_WCHAR
+    mbrtowc( NULL, NULL, 1, &state );
+#endif
+    for (j = k = 0; j < len; j++) {
+#ifdef HAVE_WCHAR
+           rc = mbrtowc(&wch, src + j, len - j, &state);
+#ifdef DEBUG
+        syslog( LOG_INFO, "[ch_dup]mbrtowc() returns %d", rc );
+#endif /* DEBUG */
+           if (rc == (size_t) -1 || rc == (size_t) -2)
+               break;
+           j += rc - 1;
+           if ((width = wcwidth(wch)) < 0)
+               break;
+           if ((width > 0 && l > 0) || l == CCHARW_MAX) {
+               wstr[l] = L'\0';
+               l = 0;
+               if (setcchar(dst + k, wstr, 0, 0, NULL) != OK)
+                       break;
+               ++k;
+           }
+           if (width == 0 && l == 0)
+               wstr[l++] = L' ';
+           wstr[l++] = wch;
+#ifdef DEBUG
+        syslog( LOG_INFO, "[ch_dup]wch=%x", wch );
+#endif /* DEBUG */
+#else
+           dst[k++] = src[j];
+#endif
+    }
+#ifdef HAVE_WCHAR
+    if (l > 0) {
+           wstr[l] = L'\0';
+           if (setcchar(dst + k, wstr, 0, 0, NULL) == OK)
+               ++k;
+    }
+    setcchar(dst + k, L"", 0, 0, NULL);
+#else
+    dst[k] = 0;
+#endif
+    return dst;
+}
+
+int main(int argc, char *argv[])
+{
+    int MAXLINES = 1000;
+    FILE *fp;
+    char buf[BUFSIZ];
+    int i;
+    int my_delay = 0;
+    CURSES_CH_T **olptr;
+    int length = 0;
+    int value = 0;
+    bool done = FALSE;
+    bool got_number = FALSE;
+    const char *my_label = "Input";
+#ifdef HAVE_WCHAR
+    cchar_t icc;
+#endif /* HAVE_WCHAR */
+
+    setlocale(LC_ALL, "");
+
+    (void) signal(SIGINT, finish);     /* arrange interrupts to terminate */
+
+    while ((i = getopt(argc, argv, "cin:rtT:")) != EOF) {
+           switch (i) {
+               case 'c':
+                   try_color = TRUE;
+                   break;
+               case 'i':
+                   signal(SIGINT, SIG_IGN);
+                   signal(SIGQUIT, SIG_IGN);
+                   signal(SIGTERM, SIG_IGN);
+                   break;
+               case 'n':
+                   if ((MAXLINES = atoi(optarg)) < 1)
+                       usage();
+                   break;
+#ifdef TRACE
+               case 'T':
+                   trace(atoi(optarg));
+                   break;
+               case 't':
+                   trace(TRACE_CALLS);
+                   break;
+#endif
+               default:
+                   usage();
+           }
+    }
+    if (optind + 1 != argc)
+           usage();
+
+    if ((my_lines = typeMalloc(CURSES_CH_T *, MAXLINES + 2)) == 0)
+           usage();
+
+    fname = argv[optind];
+    if ((fp = fopen(fname, "r")) == 0) {
+           perror(fname);
+           exit( 1 );
+    }
+
+    /* slurp the file */
+    num_lines = 0;
+    for (lptr = &my_lines[0]; (lptr - my_lines) < MAXLINES; lptr++) {
+           char temp[BUFSIZ], *s, *d;
+           int col;
+
+           if (fgets(buf, sizeof(buf), fp) == 0)
+               break;
+
+           /* convert tabs so that shift will work properly */
+           for (s = buf, d = temp, col = 0; (*d = *s) != '\0'; s++) {
+               if (*d == '\n') {
+                       *d = '\0';
+                       break;
+               } else if (*d == '\t') {
+                       col = (col | 7) + 1;
+                       while ((d - temp) != col)
+                           *d++ = ' ';
+               } else
+#ifdef HAVE_WCHAR
+                       col++, d++;
+#else
+                   if (isprint(UChar(*d))) {
+                           col++;
+                           d++;
+                   } else {
+                           sprintf(d, "\\%03o", UChar(*s));
+                           d += strlen(d);
+                           col = (d - temp);
+                   }
+#endif
+           }
+           *lptr = ch_dup(temp);
+           num_lines++;
+    }
+    (void) fclose(fp);
+    length = lptr - my_lines;
+
+    (void) initscr();          /* initialize the curses library */
+    keypad(stdscr, TRUE);      /* enable keyboard mapping */
+    (void) nonl();      /* tell curses not to do NL->CR/NL on output */
+    (void) cbreak(); /* take input chars one at a time, no wait for \n */
+    (void) noecho();           /* don't echo input */
+    nodelay(stdscr, TRUE);
+    idlok(stdscr, TRUE);       /* allow use of insert/delete line */
+
+    if (try_color) {
+           if (has_colors()) {
+               start_color();
+               init_pair(my_pair, COLOR_WHITE, COLOR_BLUE);
+               bkgd(COLOR_PAIR(my_pair));
+           } else {
+               try_color = FALSE;
+           }
+    }
+
+    lptr = my_lines;
+    while (!done) {
+           int n;
+#ifdef HAVE_WCHAR
+        wint_t c = 0;
+        int ret;
+#else
+        int c = 0;
+#endif /* HAVE_WCHAR */
+
+           if (!got_number)
+               show_all(my_label);
+
+           n = 0;
+           for (;;) {
+            c = 0;
+#ifdef HAVE_WCHAR
+            ret = get_wch( &c );
+            if ( ret == ERR ) {
+                   if (!my_delay)
+                           napms(50);
+                continue;
+            }
+#ifdef DEBUG
+            else if ( ret == KEY_CODE_YES )
+                syslog( LOG_INFO, "[main]Func key(%x)", c );
+            else
+                syslog( LOG_INFO, "[main]c=%x", c );
+#endif /* DEBUG */
+#else
+               c = getch();
+#ifdef DEBUG
+            syslog( LOG_INFO, "[main]c='%c'", c );
+#endif /* DEBUG */
+#endif /* HAVE_WCHAR */
+               if ((c < 127) && isdigit(c)) {
+                       if (!got_number) {
+                           mvprintw(0, 0, "Count: ");
+                           clrtoeol();
+                       }
+                       addch(c);
+                       value = 10 * value + (c - '0');
+                       got_number = TRUE;
+               } else
+                       break;
+           }
+           if (got_number && value) {
+               n = value;
+           } else {
+               n = 1;
+           }
+
+#ifdef HAVE_WCHAR
+           if (ret != ERR)
+            my_label = key_name( c );
+        else
+               if (!my_delay)
+                       napms(50);
+#else
+           if (c != ERR)
+               my_label = keyname(c);
+#endif /* HAVE_WCHAR */
+           switch (c) {
+               case KEY_DOWN:
+#ifdef HAVE_WCHAR
+            case L'n':
+#else
+               case 'n':
+#endif /* HAVE_WCHAR */
+                   olptr = lptr;
+                   for (i = 0; i < n; i++)
+                           if ((lptr - my_lines) < (length - LINES + 1))
+                               lptr++;
+                           else
+                               break;
+                   wscrl(stdscr, lptr - olptr);
+                   break;
+
+               case KEY_UP:
+#ifdef HAVE_WCHAR
+            case L'p':
+#else
+               case 'p':
+#endif /* HAVE_WCHAR */
+                   olptr = lptr;
+                   for (i = 0; i < n; i++)
+                           if (lptr > my_lines)
+                               lptr--;
+                           else
+                               break;
+                   wscrl(stdscr, lptr - olptr);
+                   break;
+
+#ifdef HAVE_WCHAR
+            case L'h':
+#else
+               case 'h':
+#endif /* HAVE_WCHAR */
+               case KEY_HOME:
+                   lptr = my_lines;
+                   break;
+
+#ifdef HAVE_WCHAR
+            case L'e':
+#else
+               case 'e':
+#endif /* HAVE_WCHAR */
+               case KEY_END:
+                   if (length > LINES)
+                           lptr = my_lines + length - LINES + 1;
+                   else
+                           lptr = my_lines;
+                   break;
+
+#ifdef HAVE_WCHAR
+            case L'r':
+#else
+               case 'r':
+#endif /* HAVE_WCHAR */
+               case KEY_RIGHT:
+                   shift += n;
+                   break;
+
+#ifdef HAVE_WCHAR
+            case L'l':
+#else
+               case 'l':
+#endif /* HAVE_WCHAR */
+               case KEY_LEFT:
+                   shift -= n;
+                   if (shift < 0) {
+                           shift = 0;
+                           beep();
+                   }
+                   break;
+
+#ifdef HAVE_WCHAR
+            case L'q':
+#else
+               case 'q':
+#endif /* HAVE_WCHAR */
+                   done = TRUE;
+                   break;
+
+#ifdef KEY_RESIZE
+               case KEY_RESIZE:
+                //refresh();
+                   break;
+#endif
+#ifdef HAVE_WCHAR
+               case L's':
+#else
+            case 's':
+#endif /* HAVE_WCHAR */
+                   if (got_number) {
+                           halfdelay(my_delay = n);
+                   } else {
+                           nodelay(stdscr, FALSE);
+                           my_delay = -1;
+                   }
+                   break;
+#ifdef HAVE_WCHAR
+            case L' ':
+#else
+               case ' ':
+#endif /* HAVE_WCHAR */
+                   nodelay(stdscr, TRUE);
+                   my_delay = 0;
+                   break;
+#ifndef HAVE_WCHAR
+               case ERR:
+                   if (!my_delay)
+                           napms(50);
+                   break;
+#endif /* HAVE_WCHAR */
+               default:
+                   beep();
+                   break;
+           }
+           if (c >= KEY_MIN || (c > 0 && !isdigit(c))) {
+               got_number = FALSE;
+               value = 0;
+           }
+    }
+
+    finish(0);                 /* we're done */
+}
+
+static void finish(int sig)
+{
+    endwin();
+    exit(sig != 0 ?  1 : 0 );
+}
+
+static void show_all(const char *tag)
+{
+    int i;
+    char temp[BUFSIZ];
+    CURSES_CH_T *s;
+    time_t this_time;
+
+    sprintf(temp, "%s (%3dx%3d) col %d ", tag, LINES, COLS, shift);
+    i = strlen(temp);
+    sprintf(temp + i, "view %.*s", (int) (sizeof(temp) - 7 - i), fname);
+    move(0, 0);
+    printw("%.*s", COLS, temp);
+    clrtoeol();
+    this_time = time((time_t *) 0);
+    strcpy(temp, ctime(&this_time));
+    if ((i = strlen(temp)) != 0) {
+           temp[--i] = 0;
+           if (move(0, COLS - i - 2) != ERR)
+               printw("  %s", temp);
+    }
+
+    scrollok(stdscr, FALSE);   /* prevent screen from moving */
+    for (i = 1; i < LINES; i++) {
+           move(i, 0);
+           printw("%3ld:", (long) (lptr + i - my_lines));
+           clrtoeol();
+           if ((s = lptr[i - 1]) != 0) {
+                   if (i < num_lines) {
+                           int len = ch_len(s);
+                           if (len > shift) {
+#ifdef HAVE_WCHAR
+                                   add_wchstr(s + shift);
+#else
+                                   addchstr(s + shift);
+#endif
+                           }
+                   }
+           }
+    }
+    setscrreg(1, LINES - 1);
+    scrollok(stdscr, TRUE);
+    refresh();
+}
index f2f945b3d58baa91192a852ecd5601b2bc55ba3c..3f696e2d0279cbdc56a39fa10a17b7fcb67b4be2 100644 (file)
-# Makefile for libcurses
-
-LIB=           curses
-
-SRCS=  \
-       beep.c \
-       charpick.c \
-       curs_set.c \
-       cursesio.c \
-       endwin.c \
-       flash.c \
-       initscr.c \
-       longname.c \
-       move.c \
-       mvcursor.c \
-       newwin.c \
-       options.c \
-       overlay.c \
-       prntscan.c \
-       refresh.c \
-       scrreg.c \
-       setterm.c \
-       tabsize.c \
-       termmisc.c \
-       unctrl.c \
-       update.c \
-       waddch.c \
-       waddstr.c \
-       wbox.c \
-       wclear.c \
-       wclrtobot.c \
-       wclrtoeol.c \
-       wdelch.c \
-       wdeleteln.c \
-       werase.c \
-       wgetch.c \
-       wgetstr.c \
-       windel.c \
-       winmove.c \
-       winsch.c \
-       winscrol.c \
-       winsertln.c \
-       wintouch.c
+#      $NetBSD: Makefile,v 1.64 2010/02/03 15:34:40 roy Exp $
+#      @(#)Makefile    8.2 (Berkeley) 1/2/94
+
+.include <bsd.own.mk>
+
+WARNS= 2
+
+CPPFLAGS+=-I${.CURDIR} -I${NETBSDSRCDIR}/lib/libterminfo
+.if defined(DEBUG_CURSES)
+CPPFLAGS+=-g -DDEBUG
+.endif
+.if defined(SMALL)
+CPPFLAGS+=-DSMALL
+.endif
+LIB=   curses
+SRCS=  acs.c addbytes.c addch.c addchnstr.c addnstr.c attributes.c \
+       background.c bell.c border.c box.c chgat.c clear.c clearok.c \
+       clrtobot.c clrtoeol.c color.c copywin.c cr_put.c \
+       ctrace.c cur_hash.c curs_set.c \
+       curses.c delch.c deleteln.c delwin.c echochar.c erase.c fileio.c \
+       flushok.c fullname.c getch.c getstr.c getyx.c id_subwins.c idlok.c \
+       idcok.c inch.c inchstr.c initscr.c insch.c insdelln.c insertln.c \
+       instr.c keypad.c keyname.c leaveok.c line.c meta.c move.c \
+       mvwin.c newwin.c nodelay.c notimeout.c overlay.c overwrite.c pause.c \
+       printw.c putchar.c refresh.c resize.c scanw.c screen.c scroll.c \
+       scrollok.c setterm.c standout.c timeout.c toucholap.c touchwin.c \
+       tstp.c tty.c unctrl.c underscore.c
+
+MAN=   curses.3 curses_addch.3 curses_addchstr.3 curses_addstr.3 \
+       curses_attributes.3 curses_background.3 curses_border.3 \
+       curses_chgat.3 curses_clear.3 curses_color.3 \
+       curses_cursor.3 curses_default_colors.3 \
+       curses_delch.3 curses_deleteln.3 curses_echochar.3 curses_fileio.3 \
+       curses_inch.3 curses_input.3 curses_insertch.3 curses_insertln.3 \
+       curses_insdelln.3 curses_keyname.3 curses_line.3 curses_pad.3 \
+       curses_print.3 curses_refresh.3 curses_scanw.3 curses_screen.3 \
+       curses_scroll.3 curses_standout.3 curses_termcap.3 curses_touch.3 \
+       curses_tty.3 curses_underscore.3 curses_window.3
+INCS=  curses.h unctrl.h
+INCSDIR=/usr/include
+
+LIBDPLIBS+=    terminfo        ${.CURDIR}/../libterminfo
+
+.if !defined(DISABLE_WCHAR)
+CPPFLAGS+=-DHAVE_WCHAR
+SRCS+= cchar.c add_wch.c add_wchstr.c addwstr.c echo_wchar.c ins_wch.c \
+       insstr.c ins_wstr.c get_wch.c get_wstr.c in_wch.c in_wchstr.c \
+       inwstr.c
+.else
+CPPFLAGS+=-DDISABLE_WCHAR
+.endif
+
+MLINKS+= curses_addch.3 addch.3 curses_addchstr.3 addchnstr.3 \
+        curses_addchstr.3 addchstr.3 curses_addstr.3 addnstr.3 \
+        curses_addstr.3 addstr.3 \
+        curses_default_colors.3 assume_default_colors.3 \
+        curses_attributes.3 attr_get.3 curses_attributes.3 attr_off.3 \
+        curses_attributes.3 attr_on.3 curses_attributes.3 attr_set.3 \
+        curses_attributes.3 attron.3 curses_attributes.3 attroff.3 \
+        curses_attributes.3 attrset.3 curses_tty.3 beep.3 \
+        curses_background.3 bkgd.3 curses_background.3 bkgdset.3 \
+        curses_border.3 border.3 curses_border.3 box.3 \
+        curses_chgat.3 chgat.3 curses_chgat.3 mvchgat.3 \
+        curses_chgat.3 mvwchgat.3 curses_chgat.3 wchgat.3 \
+        curses_color.3 can_change_color.3 curses_tty.3 cbreak.3 \
+        curses_clear.3 clear.3 curses_clear.3 clearok.3 \
+        curses_clear.3 clrtobot.3 curses_clear.3 clrtoeol.3 \
+        curses_color.3 color_content.3 curses_attributes.3 color_set.3 \
+        curses_window.3 copywin.3 curses_tty.3 curs_set.3 \
+        curses_tty.3 delay_output.3  curses_tty.3 def_prog_mode.3 \
+        curses_tty.3 def_shell_mode.3 curses_delch.3 delch.3 \
+        curses_deleteln.3 deleteln.3 curses_screen.3 delscreen.3 \
+        curses_window.3 delwin.3 curses_window.3 derwin.3 \
+        curses_refresh.3 doupdate.3 curses_window.3 dupwin.3 \
+        curses_tty.3 echo.3 curses_echochar.3 echochar.3 \
+        curses_screen.3 endwin.3 curses_clear.3 erase.3 \
+        curses_tty.3 erasechar.3 \
+        curses_tty.3 flash.3 curses_tty.3 flushinp.3 \
+        curses_refresh.3 flushok.3 \
+        curses_termcap.3 fullname.3 curses_attributes.3 getattrs.3  \
+        curses_background.3 getbkgd.3 curses_termcap.3 getcap.3 \
+        curses_input.3 getch.3 curses_cursor.3 getcury.3 \
+        curses_cursor.3 getcurx.3 curses_cursor.3 getbegy.3 \
+        curses_cursor.3 getbegx.3 curses_cursor.3 getmaxx.3 \
+        curses_cursor.3 getmaxy.3 curses_cursor.3 getmaxyx.3 \
+        curses_input.3 getnstr.3 \
+        curses_cursor.3 getpary.3 curses_cursor.3 getparx.3 \
+        curses_cursor.3 getparyx.3 curses_fileio.3 getwin.3 \
+        curses_input.3 getstr.3 \
+        curses_tty.3 gettmode.3 curses_cursor.3 getyx.3 \
+        curses_color.3 has_colors.3 curses_tty.3 has_ic.3 \
+        curses_tty.3 halfdelay.3 curses_tty.3 has_il.3 \
+        curses_line.3 hline.3 curses_tty.3 idcok.3 \
+        curses_tty.3 idlok.3 curses_inch.3 inch.3 \
+        curses_inch.3 inchnstr.3 curses_inch.3 inchstr.3 \
+        curses_inch.3 innstr.3 curses_color.3 init_color.3 \
+        curses_color.3 init_pair.3 curses_screen.3 initscr.3 \
+        curses_insertch.3 insch.3 curses_insdelln.3 insdelln.3 \
+        curses_insertln.3 insertln.3 curses_inch.3 instr.3 \
+        curses_tty.3 intrflush.3 curses_touch.3 is_linetouched.3 \
+        curses_touch.3 is_wintouched.3 curses_screen.3 isendwin.3 \
+        curses_keyname.3 keyname.3 \
+        curses_input.3 keypad.3 curses_tty.3 killchar.3 \
+        curses_refresh.3 leaveok.3 curses_termcap.3 longname.3 \
+        curses_tty.3 meta.3 curses_cursor.3 move.3 \
+        curses_addch.3 mvaddch.3 curses_addchstr.3 mvaddchnstr.3 \
+        curses_addchstr.3 mvaddchstr.3 curses_addstr.3 mvaddnstr.3 \
+        curses_addstr.3 mvaddstr.3 \
+        curses_cursor.3 mvcur.3 curses_window.3 mvderwin.3 \
+        curses_input.3 mvgetch.3 \
+        curses_input.3 mvgetnstr.3 curses_input.3 mvgetstr.3 \
+        curses_line.3 mvhline.3 curses_print.3 mvprintw.3 \
+        curses_line.3 mvvline.3 curses_addch.3 mvwaddch.3 \
+        curses_addchstr.3 mvwaddchnstr.3 curses_addchstr.3 mvwaddchstr.3 \
+        curses_addstr.3 mvwaddnstr.3 curses_addstr.3 mvwaddstr.3 \
+        curses_input.3 mvwgetch.3 \
+        curses_input.3 mvwgetnstr.3 curses_input.3 mvwgetstr.3 \
+        curses_line.3 mvwhline.3 curses_window.3 mvwin.3 \
+        curses_inch.3 mvinchnstr.3 \
+        curses_inch.3 mvinchstr.3 curses_inch.3 mvinnstr.3 \
+        curses_inch.3 mvinstr.3 curses_inch.3 mvwinchnstr.3 \
+        curses_inch.3 mvwinchstr.3 curses_inch.3 mvwinnstr.3 \
+        curses_inch.3 mvwinstr.3 curses_print.3 mvwprintw.3 \
+        curses_line.3 mvwvline.3 curses_tty.3 napms.3 \
+        curses_pad.3 newpad.3 curses_screen.3 newterm.3 \
+        curses_window.3 newwin.3 curses_tty.3 nl.3 \
+        curses_tty.3 nocbreak.3 curses_input.3 nodelay.3 \
+        curses_tty.3 noecho.3 curses_tty.3 nonl.3 \
+        curses_tty.3 noqiflush.3 \
+        curses_tty.3 noraw.3 curses_input.3 notimeout.3 \
+        curses_window.3 overlay.3 curses_window.3 overwrite.3 \
+        curses_color.3 pair_content.3 curses_echochar.3 pechochar.3 \
+        curses_pad.3 pnoutrefresh.3 \
+        curses_pad.3 prefresh.3 curses_print.3 printw.3 \
+        curses_fileio.3 putwin.3 curses_tty.3 qiflush.3 \
+        curses_tty.3 raw.3 curses_refresh.3 refresh.3 \
+        curses_tty.3 reset_prog_mode.3 curses_tty.3 reset_shell_mode.3 \
+        curses_tty.3 resetty.3 curses_screen.3 resizeterm.3 \
+        curses_tty.3 savetty.3 curses_scanw.3 scanw.3 \
+        curses_scroll.3 scrl.3 curses_scroll.3 scroll.3 \
+        curses_scroll.3 scrollok.3 curses_scroll.3 setscrreg.3 \
+        curses_screen.3 set_term.3 curses_screen.3 setterm.3 \
+        curses_standout.3 standend.3 curses_standout.3 standout.3 \
+        curses_color.3 start_color.3 curses_pad.3 subpad.3 \
+        curses_window.3 subwin.3 curses_input.3 timeout.3 \
+        curses_touch.3 touchline.3 curses_touch.3 touchoverlap.3 \
+        curses_touch.3 touchwin.3 curses_print.3 unctrl.3 \
+        curses_underscore.3 underend.3 curses_underscore.3 underscore.3 \
+        curses_input.3 ungetch.3 curses_touch.3 untouchwin.3 \
+        curses_default_colors.3 use_default_colors.3 curses_line.3 vline.3 \
+        curses_addch.3 waddch.3 curses_addchstr.3 waddchnstr.3 \
+        curses_addchstr.3 waddchstr.3 curses_addstr.3 waddnstr.3 \
+        curses_addstr.3 waddstr.3 \
+        curses_attributes.3 wattr_get.3 curses_attributes.3 wattr_off.3 \
+        curses_attributes.3 wattr_on.3 curses_attributes.3 wattr_set.3 \
+        curses_attributes.3 wattron.3 curses_attributes.3 wattroff.3 \
+        curses_attributes.3 wattrset.3 curses_background.3 wbkgd.3 \
+        curses_background.3 wbkgdset.3 curses_border.3 wborder.3 \
+        curses_clear.3 wclear.3 curses_clear.3 wclrtobot.3 \
+        curses_clear.3 wclrtoeol.3 curses_attributes.3 wcolor_set.3 \
+        curses_delch.3 wdelch.3 curses_deleteln.3 wdeleteln.3 \
+        curses_echochar.3 wechochar.3 \
+        curses_clear.3 werase.3 curses_input.3 wgetch.3 \
+        curses_input.3 wgetnstr.3 curses_input.3 wgetstr.3 \
+        curses_line.3 whline.3 curses_inch.3 winch.3 \
+        curses_inch.3 winchnstr.3 curses_inch.3 winchstr.3 \
+        curses_inch.3 winnstr.3 curses_insertch.3 winsch.3 \
+        curses_insdelln.3 winsdelln.3 curses_insertln.3 winsertln.3 \
+        curses_inch.3 winstr.3 curses_cursor.3 wmove.3 \
+        curses_refresh.3 wnoutrefresh.3 curses_print.3 wprintw.3 \
+        curses_refresh.3 wrefresh.3 curses_window.3 wresize.3 \
+        curses_scanw.3 wscanw.3 curses_scroll.3 wscrl.3 \
+        curses_scroll.3 wsetscrreg.3 curses_standout.3 wstandend.3 \
+        curses_standout.3 wstandout.3 curses_input.3 wtimeout.3 \
+        curses_touch.3 wtouchln.3 curses_underscore.3 wunderend.3 \
+        curses_underscore.3 wunderscore.3 curses_line.3 wvline.3
+
+.if make(install)
+SUBDIR+= PSD.doc
+.endif
+
+fileio.h: shlib_version genfileioh.awk
+       ${TOOL_AWK} -f ${.CURDIR}/genfileioh.awk < ${.CURDIR}/shlib_version > ${.CURDIR}/fileio.h
 
 .include <bsd.lib.mk>
+.include <bsd.subdir.mk>
diff --git a/lib/libcurses/PSD.doc/Makefile b/lib/libcurses/PSD.doc/Makefile
new file mode 100644 (file)
index 0000000..0bf9ac9
--- /dev/null
@@ -0,0 +1,40 @@
+#      $NetBSD: Makefile,v 1.10 2003/07/10 10:34:22 lukem Exp $
+#      from: @(#)Makefile      8.2 (Berkeley) 5/23/94
+
+DIR=   psd/19.curses
+SRCS=  Master
+MACROS=        -me
+OTHER= appen.A appen.B appen.C doc.I doc.II doc.III doc.IV fns.doc \
+       intro.0 intro.1 intro.3 intro.4 intro.5 intro.6 \
+       macros c_macros
+CEXAMPLES= ex1.gr ex2.gr life.gr twinkle1.gr twinkle2.gr win_st.gr
+TBLFILES=  intro.2.tbl
+EXTRA= ${OTHER} ${CEXAMPLES:R:S/$/.c/g} ${TBLFILES:R}
+
+CLEANFILES+= ${CEXAMPLES} ${TBLFILES}
+
+.SUFFIXES:
+.SUFFIXES: .c .gr
+
+#
+# this section formats C input source into nice troffable (or nroffable)
+# versions.  It uses the capabilites of "vgrind", which sets keywords in
+# bold font, and comments in italics.
+#
+
+
+# Don't re-run vgrind unless you want to patch the output files.
+# XXXBUILDSH: can we use TOOL_VGRIND here ?
+VFONT= /usr/libexec/vfontedpr
+.c.gr:
+       ${VFONT} ${.IMPSRC} | grep -v "^'wh" > ${.TARGET}
+
+paper.ps: ${SRCS} ${OTHER} ${CEXAMPLES} ${TBLFILES}
+       ${TOOL_SOELIM} -I${.CURDIR} Master | \
+           ${TOOL_ROFF_PS} ${MACROS} > ${.TARGET}
+
+# Unfortunately our make doesn't handle single-suffix rules.
+intro.2.tbl: intro.2
+       ${TOOL_TBL} ${.ALLSRC} > ${.TARGET}
+
+.include <bsd.doc.mk>
diff --git a/lib/libcurses/PSD.doc/Master b/lib/libcurses/PSD.doc/Master
new file mode 100644 (file)
index 0000000..0af37df
--- /dev/null
@@ -0,0 +1,52 @@
+.\"    $NetBSD: Master,v 1.5 2003/08/07 16:44:26 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)Master      8.2 (Berkeley) 5/24/94
+.\"
+.ds Ln Screen Package
+.so macros
+.so c_macros
+.so intro.0
+.pn 3
+.bp
+.so intro.1
+.so intro.2.tbl
+.so intro.3
+.so intro.4
+.so intro.5
+.so intro.6
+.bp
+.so appen.A
+.pn 2
+.oh '\*(Ln''PSD:19-%'
+.eh 'PSD:19-%''\*(Ln'
+.bp
+.bi Contents
+.sp
+.xp
diff --git a/lib/libcurses/PSD.doc/appen.A b/lib/libcurses/PSD.doc/appen.A
new file mode 100644 (file)
index 0000000..c707d85
--- /dev/null
@@ -0,0 +1,77 @@
+.\"    $NetBSD: appen.A,v 1.7 2003/08/07 16:44:26 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)appen.A     8.1 (Berkeley) 6/8/93
+.\"
+.ie t .oh '\*(Ln Appendix A''PS1:19-%'
+.eh 'PS1:19-%''\*(Ln Appendix A'
+.el .he ''\fIAppendix A\fR''
+.bp
+.(x
+.ti 0
+.b "Appendix A"
+.)x
+.sh 1 "Examples" 1
+.pp
+Here we present a few examples
+of how to use the package.
+They attempt to be representative,
+though not comprehensive.
+Further examples can be found in the games section
+of the source tree and in various utilities that use the screen such as
+.i systat(1) .
+.pp
+The following examples are intended to demonstrate
+the basic structure of a program
+using the package.
+An additional, more comprehensive, program can be found in
+the source code in the
+\fIexamples\fP subdirectory.
+.sh 2 "Simple Character Output"
+.pp
+This program demonstrates how to set up a window and output characters to it.
+Also, it demonstrates how one might control the output to the window.
+If you run this program, you will get a demonstration of the character output
+chracteristics discussed in the above Character Output section.
+.(l I
+.so ex1.gr
+.)l
+.sh 2 "Twinkle"
+.pp
+This is a moderately simple program which prints
+patterns on the screen.
+It switches between patterns of asterisks,
+putting them on one by one in random order,
+and then taking them off in the same fashion.
+It is more efficient to write this
+using only the motion optimization,
+as is demonstrated below.
+.(l I
+.so twinkle1.gr
+.)l
diff --git a/lib/libcurses/PSD.doc/appen.B b/lib/libcurses/PSD.doc/appen.B
new file mode 100644 (file)
index 0000000..5a41fe0
--- /dev/null
@@ -0,0 +1,199 @@
+.\"    $NetBSD: appen.B,v 1.5 2003/08/07 16:44:26 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)appen.B     8.1 (Berkeley) 6/8/93
+.\"
+.ie t .oh '\*(Ln Appendix B''PS1:19-%'
+.eh 'PS1:19-%''\*(Ln Appendix B'
+.el .he ''\fIAppendix B\fR''
+.bp
+.(x
+.ti 0
+.b "Appendix B"
+.)x
+.nr $1 0
+.sh 1 "The WINDOW structure"
+.pp
+The WINDOW structure is defined as follows:
+.(l I
+.so win_st.gr
+.)l
+.pp
+.Vn \*_cury \\*
+.(f
+\**
+All variables not normally accessed directly by the user
+are named with an initial
+.Bq \*_
+to avoid conflicts with the user's variables.
+.)f
+and
+.Vn \*_curx
+are the current \*y for the window.
+New characters added to the screen
+are added at this point.
+.Vn \*_maxy
+and
+.Vn \*_maxx
+are the maximum values allowed for
+.Vn \*_cury\*,\*_curx ). (
+.Vn \*_begy
+and
+.Vn \*_begx
+are the starting \*y on the terminal for the window,
+.i i.e. ,
+the window's home.
+.Vn \*_cury ,
+.Vn \*_curx ,
+.Vn \*_maxy ,
+and
+.Vn \*_maxx
+are measured relative to
+.Vn \*_begy\*,\*_begx ), (
+not the terminal's home.
+.pp
+.Vn \*_clear
+tells if a clear-screen sequence is to be generated
+on the next
+.Fn refresh
+call.
+This is only meaningful for screens.
+The initial clear-screen for the first
+.Fn refresh
+call is generated by initially setting clear to be TRUE for
+.Vn curscr ,
+which always generates a clear-screen if set,
+irrelevant of the dimensions of the window involved.
+.Vn \*_leave
+is TRUE if the current \*y and the cursor
+are to be left after the last character changed on the terminal,
+or not moved if there is no change.
+.Vn \*_scroll
+is TRUE
+if scrolling is allowed.
+.pp
+.Vn \*_y
+is a pointer to an array of lines which describe the terminal.
+Thus:
+.(l
+\*_y[i]
+.)l
+.lp
+is a pointer to the
+.Vn i th
+line, and
+.(l
+\*_y[i][j]
+.)l
+.lp
+is the
+.Vn j th
+character on the
+.Vn i th
+line.
+.Vn \*_flags
+can have one or more values
+or'd into it.
+.pp
+For windows that are not subwindows,
+.Vn \*_orig
+is
+NULL .
+For subwindows,
+it points to the main window
+to which the window is subsidiary.
+.Vn \*_nextp
+is a pointer in a circularly linked list
+of all the windows which are subwindows of the same main window,
+plus the main window itself.
+.pp
+.Vn \*_firstch
+and
+.Vn \*_lastch
+are
+.Fn malloc ed
+arrays which contain the index of the
+first and last changed characters
+on the line.
+.Vn \*_ch\*_off
+is the x offset for the window
+in the
+.Vn \*_firstch
+and
+.Vn \*_lastch
+arrays for this window.
+For main windows,
+this is always 0;
+for subwindows
+it is the difference between the starting point of the main window
+and that of the subindow,
+so that change markers can be set relative to the main window.
+This makes these markers global in scope.
+.pp
+All subwindows share the appropriate portions of
+.Vn _y ,
+.Vn _firstch ,
+.Vn _lastch ,
+and
+.Vn _insdel
+with their main window.
+.pp
+.b \*_ENDLINE
+says that the end of the line for this window
+is also the end of a screen.
+.b \*_FULLWIN
+says that this window is a screen.
+.b \*_SCROLLWIN
+indicates that the last character of this screen
+is at the lower right-hand corner of the terminal;
+.i i.e. ,
+if a character was put there,
+the terminal would scroll.
+.b \*_FULLLINE
+says that the width of a line is the same as the width of the terminal.
+If
+.b \*_FLUSH
+is set,
+it says that
+.Fn fflush "" "" stdout
+should be called at the end of each
+.Fn refresh
+.b \*_STANDOUT
+says that all characters added to the screen
+are in standout mode.
+.b \*_INSDEL
+is reserved for future use,
+and is set by
+.Fn idlok .
+.Vn \*_firstch
+is set to
+.b \*_NOCHANGE
+for lines on which there has been no change
+since the last
+.Fn refresh .
diff --git a/lib/libcurses/PSD.doc/appen.C b/lib/libcurses/PSD.doc/appen.C
new file mode 100644 (file)
index 0000000..ce12a2e
--- /dev/null
@@ -0,0 +1,126 @@
+.\"    $NetBSD: appen.C,v 1.7 2003/08/07 16:44:26 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)appen.C     8.1 (Berkeley) 6/8/93
+.\"
+.ie t .oh '\*(Ln Appendix A''PS1:19-%'
+.eh 'PS1:19-%''\*(Ln Appendix A'
+.el .he ''\fIAppendix A\fR''
+.bp
+.(x
+.ti 0
+.b "Appendix A"
+.)x
+.sh 1 "Examples" 1
+.pp
+Here we present a few examples
+of how to use the package.
+They attempt to be representative,
+though not comprehensive.
+Further examples can be found in the games section
+of the source tree and in various utilities that use the screen such as
+.i systat(1) .
+.sh 2 "Screen Updating"
+.pp
+The following examples are intended to demonstrate
+the basic structure of a program
+using the screen updating sections of the package.
+Several of the programs require calculational sections
+which are irrelevant of to the example,
+and are therefore usually not included.
+It is hoped that the data structure definitions
+give enough of an idea to allow understanding
+of what the relevant portions do.
+.sh 3 "Simple Character Output"
+.pp
+This program demonstrates how to set up a window and output characters to it.
+Also, it demonstrates how one might control the output to the window.
+If you run this program, you will get a demonstration of the character output
+chracteristics discussed in the above Character Output section.
+.(l I
+.so t2.gr
+.)l
+.sh 3 "A Small Screen Manipulator"
+.pp
+The next example follows the lines of the previous one but extends then to
+demonstrate the various othe uses of the package.
+Make sure you understand how this program works as it encompasses most of
+anything you will need to do with the package.
+.(l I
+.so t3.gr
+.)l
+.sh 3 "Twinkle"
+.pp
+This is a moderately simple program which prints
+patterns on the screen.
+It switches between patterns of asterisks,
+putting them on one by one in random order,
+and then taking them off in the same fashion.
+It is more efficient to write this
+using only the motion optimization,
+as is demonstrated below.
+.(l I
+.so twinkle1.gr
+.)l
+.sh 3 "Life"
+.pp
+This program fragment models the famous computer pattern game of life
+(Scientific American, May, 1974).
+The calculational routines create a linked list of structures
+defining where each piece is.
+Nothing here claims to be optimal,
+merely demonstrative.
+This code, however,
+is a very good place to use the screen updating routines,
+as it allows them to worry about what the last position looked like,
+so you don't have to.
+It also demonstrates some of the input routines.
+.(l I
+.so life.gr
+.)l
+.sh 2 "Motion optimization"
+.pp
+The following example shows how motion optimization
+is written on its own.
+Programs which flit from one place to another without
+regard for what is already there
+usually do not need the overhead of both space and time
+associated with screen updating.
+They should instead use motion optimization.
+.sh 3 "Twinkle"
+.pp
+The
+.b twinkle
+program
+is a good candidate for simple motion optimization.
+Here is how it could be written
+(only the routines that have been changed are shown):
+.(l
+.so twinkle2.gr
+.)l
diff --git a/lib/libcurses/PSD.doc/c_macros b/lib/libcurses/PSD.doc/c_macros
new file mode 100644 (file)
index 0000000..ba03936
--- /dev/null
@@ -0,0 +1,68 @@
+.\"    $NetBSD: c_macros,v 1.5 2003/08/07 16:44:26 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)c_macros    8.1 (Berkeley) 6/4/93
+.\"
+'ie t 'ds _ \d\(mi\u
+'el 'ds _ _
+'tr *\(**
+'ps 9p
+'vs 10p
+'ds - \(mi
+'ds /* \\h'\\w' 'u-\\w'/'u'/*
+'bd B 3
+'bd S B 3
+'nr cm 0
+'nf
+'de ()
+'pn 1
+..
+'de +C
+'nr cm 1
+'ft 2
+'ds +K
+'ds -K
+..
+'de -C
+'nr cm 0
+'ft 1
+.ie t 'ds +K \f3
+.el 'ds +K \fI
+'ds -K \fP
+..
+'+C
+'-C
+'am +C
+'ne 3
+..
+'de -F
+'rm =f
+..
+'ft 1
+'lg 0
diff --git a/lib/libcurses/PSD.doc/doc.I b/lib/libcurses/PSD.doc/doc.I
new file mode 100644 (file)
index 0000000..01bb3fc
--- /dev/null
@@ -0,0 +1,347 @@
+.\"    $NetBSD: doc.I,v 1.5 2003/08/07 16:44:27 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)doc.I       8.1 (Berkeley) 6/4/93
+.\"
+.Ds
+.Fd addch ch \*m
+char   ch;
+.Fd waddch win\*,ch
+WINDOW *win;
+char   ch;
+.De
+Add the character
+.Vn ch
+on the window
+at the current \*y.
+If the character is a newline
+(\'\en\')
+the line will be cleared to the end,
+and the current \*y will be changed to the
+beginning off the next line
+if newline mapping is on,
+or to the next line at the same x co-ordinate
+if it is off.
+A return
+(\'\er\')
+will move to the beginning of the line on the window.
+Tabs
+(\'\et\')
+will be expanded into spaces
+in the normal tabstop positions of
+every eight characters.
+\*(Es
+.Ds
+.Fd addstr str \*m
+char   *str;
+.Fd waddstr win\*,str
+WINDOW *win;
+char   *str;
+.De
+Add the string pointed to by
+.Vn str
+on the window at the current \*y.
+\*(Es
+In this case, it will put on as much as it can.
+.Ds
+.Fd box win\*,vert\*,hor
+WINDOW *win;
+char   vert\*,hor;
+.De
+.Pp
+Draws a box around the window using
+.Vn vert
+as the character for drawing the vertical sides, and
+.Vn hor
+for drawing the horizontal lines.
+If scrolling is not allowed,
+and the window encompasses the lower right-hand corner of the terminal,
+the corners are left blank to avoid a scroll.
+.Ds
+.Fd clear "" \*m
+.Fd wclear win
+WINDOW *win;
+.De
+Resets the entire window to blanks.
+If
+.Vn win
+is a screen,
+this sets the clear flag,
+which will cause a clear-screen sequence to be sent
+on the next
+.Fn refresh
+call.
+This also moves the current \*y
+to (0\*,0).
+.Ds
+.Fd clearok scr\*,boolf \*m
+WINDOW *scr;
+bool   boolf;
+.De
+Sets the clear flag for the screen
+.Vn scr .
+If
+.Vn boolf
+is TRUE,
+this will force a clear-screen to be printed on the next
+.Fn refresh ,
+or stop it from doing so if
+.Vn boolf
+is FALSE.
+This only works on screens,
+and,
+unlike
+.Fn clear ,
+does not alter the contents of the screen.
+If
+.Vn scr
+is
+.Vn curscr ,
+the next
+.Fn refresh
+call will cause a clear-screen,
+even if the window passed to
+.Fn refresh
+is not a screen.
+.Ds
+.Fd clrtobot "" \*m
+.Fd wclrtobot win
+WINDOW *win;
+.De
+Wipes the window clear from the current \*y to the bottom.
+This does not force a clear-screen sequence on the next refresh
+under any circumstances.
+\*(Nm
+.Ds
+.Fd clrtoeol "" \*m
+.Fd wclrtoeol win
+WINDOW *win;
+.De
+Wipes the window clear from the current \*y to the end of the line.
+\*(Nm
+.Ds
+.Fd delch
+.Fd wdelch win
+WINDOW *win;
+.De
+Delete the character at the current \*y.
+Each character after it on the line shifts to the left,
+and the last character becomes blank.
+.Ds
+.Fd deleteln
+.Fd wdeleteln win
+WINDOW *win;
+.De
+Delete the current line.
+Every line below the current one will move up,
+and the bottom line will become blank.
+The current \*y will remain unchanged.
+.Ds
+.Fd erase "" \*m
+.Fd werase win
+WINDOW *win;
+.De
+Erases the window to blanks without setting the clear flag.
+This is analagous to
+.Fn clear ,
+except that it never causes a clear-screen sequence to be generated
+on a
+.Fn refresh .
+\*(Nm
+.Ds
+.Fd flushok win\*,boolf \*m
+WINDOW *win;
+bool   boolf;
+.De
+Normally,
+.Fn refresh
+.Fn fflush 's
+.Vn stdout
+when it is finished.
+.Fn flushok
+allows you to control this.
+if
+.Vn boolf
+is TRUE
+(\c
+.i i.e. ,
+non-zero)
+it will do the
+.Fn fflush ;
+if it is FALSE.
+it will not.
+.Ds
+.Fd idlok win\*,boolf
+WINDOW *win;
+bool   boolf;
+.De
+Reserved for future use.
+This will eventually signal to
+.Fn refresh
+that it is all right to use the insert and delete line sequences
+when updating the window.
+.Ds
+.Fd insch c
+char   c;
+.Fd winsch win\*,c
+WINDOW *win;
+char   c;
+.De
+Insert
+.Vn c
+at the current \*y
+Each character after it shifts to the right,
+and the last character disappears.
+\*(Es
+.Ds
+.Fd insertln
+.Fd winsertln win
+WINDOW *win;
+.De
+Insert a line above the current one.
+Every line below the current line
+will be shifted down,
+and the bottom line will disappear.
+The current line will become blank,
+and the current \*y will remain unchanged.
+.Ds
+.Fd move y\*,x \*m
+int    y\*,x;
+.Fd wmove win\*,y\*,x
+WINDOW *win;
+int    y\*,x;
+.De
+Change the current \*y of the window to
+.Vn y\*,x ). (
+\*(Es
+.Ds
+.Fd overlay win1\*,win2
+WINDOW *win1\*,*win2;
+.De
+Overlay
+.Vn win1
+on
+.Vn win2 .
+The contents of
+.Vn win1 ,
+insofar as they fit,
+are placed on
+.Vn win2
+at their starting \*y.
+This is done non-destructively,
+i.e., blanks on
+.Vn win1
+leave the contents of the space on
+.Vn win2
+untouched.
+.Ds
+.Fd overwrite win1\*,win2
+WINDOW *win1\*,*win2;
+.De
+Overwrite
+.Vn win1
+on
+.Vn win2 .
+The contents of
+.Vn win1 ,
+insofar as they fit,
+are placed on
+.Vn win2
+at their starting \*y.
+This is done destructively,
+.i i.e. ,
+blanks on
+.Vn win1
+become blank on
+.Vn win2 .
+.Ds
+.Fd printw fmt\*,arg1\*,arg2\*,...
+char   *fmt;
+.Fd wprintw win\*,fmt\*,arg1\*,arg2\*,...
+WINDOW *win;
+char   *fmt;
+.De
+Performs a
+.Fn printf
+on the window starting at the current \*y.
+It uses
+.Fn addstr
+to add the string on the window.
+It is often advisable to use the field width options of
+.Fn printf
+to avoid leaving things on the window from earlier calls.
+\*(Es
+.Ds
+.Fd refresh "" \*m
+.Fd wrefresh win
+WINDOW *win;
+.De
+Synchronize the terminal screen with the desired window.
+If the window is not a screen,
+only that part covered by it is updated.
+\*(Es
+In this case, it will update whatever it can
+without causing the scroll.
+.sp
+As a special case,
+if
+.Fn wrefresh
+is called with the window
+.Vn curscr
+the screen is cleared
+and repainted as it is currently.
+This is very useful for allowing the redrawing of the screen
+when the user has garbage dumped on his terminal.
+.Ds
+.Fd standout "" \*m
+.Fd wstandout win
+WINDOW *win;
+.Fd standend "" \*m
+.Fd wstandend win
+WINDOW *win;
+.De
+Start and stop putting characters onto
+.i win
+in standout mode.
+.Fn standout
+causes any characters added to the window
+to be put in standout mode on the terminal
+(if it has that capability).
+.Fn standend
+stops this.
+The sequences
+.Vn SO
+and
+.Vn SE
+(or
+.Vn US
+and
+.Vn UE
+if they are not defined)
+are used (see Appendix A).
diff --git a/lib/libcurses/PSD.doc/doc.II b/lib/libcurses/PSD.doc/doc.II
new file mode 100644 (file)
index 0000000..7209da0
--- /dev/null
@@ -0,0 +1,140 @@
+.\"    $NetBSD: doc.II,v 1.5 2003/08/07 16:44:27 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)doc.II      8.1 (Berkeley) 6/4/93
+.\"
+.Ds
+.Fd cbreak "" \*m
+.Fd nocbreak "" \*m
+.Fd crmode "" \*m
+.Fd nocrmode "" \*m
+.De
+Set or unset the terminal to/from cbreak mode.
+The misnamed macros
+.Fn crmode
+and
+.Fn nocrmode
+are retained for backwards compatibility
+with ealier versions of the library.
+.Ds
+.Fd echo "" \*m
+.Fd noecho "" \*m
+.De
+Sets the terminal to echo or not echo characters.
+.Ds
+.Fd getch "" \*m
+.Fd wgetch win
+WINDOW *win;
+.De
+Gets a character from the terminal and (if necessary)
+echos it on the window.
+\*(Es
+Otherwise, the character gotten is returned.
+If
+.i noecho
+has been set, then the window is left unaltered.
+In order to retain control of the terminal,
+it is necessary to have one of
+.i noecho ,
+.i cbreak ,
+or
+.i rawmode
+set.
+If you do not set one,
+whatever routine you call to read characters will set
+.i cbreak
+for you,
+and then reset to the original mode when finished.
+.Ds
+.Fd getstr str \*m
+char   *str;
+.Fd wgetstr win\*,str
+WINDOW *win;
+char   *str;
+.De
+Get a string through the window
+and put it in the location pointed to by
+.Vn str ,
+which is assumed to be large enough to handle it.
+It sets tty modes if necessary,
+and then calls
+.Fn getch
+(or
+.Fn wgetch ) "" win
+to get the characters needed to fill in the string
+until a newline or EOF is encountered.
+The newline stripped off the string.
+\*(Es
+.Ds
+.Fd \*_putchar c
+char   c;
+.De
+Put out a character using the
+.Fn putchar
+macro.
+This function is used to output every character
+that
+.b curses
+generates.
+Thus,
+it can be redefined by the user who wants to do non-standard things
+with the output.
+It is named with an initial \*(lq\*_\*(rq
+because it usually should be invisible to the programmer.
+.Ds
+.Fd raw "" \*m
+.Fd noraw "" \*m
+.De
+Set or unset the terminal to/from raw mode.
+On version 7
+.Un \**
+.(f
+\**
+.Un
+is a trademark of Bell Laboratories.
+.)f
+this also turns of newline mapping
+(see
+.Fn nl ).
+.Ds
+.Fd scanw fmt\*,arg1\*,arg2\*,...
+char   *fmt;
+.Fd wscanw win\*,fmt\*,arg1\*,arg2\*,...
+WINDOW *win;
+char   *fmt;
+.De
+Perform a
+.Fn scanf
+through the window using
+.Vn fmt .
+It does this using consecutive
+.Fn getch 's
+(or
+.Fn wgetch 's). "" win
+\*(Es
diff --git a/lib/libcurses/PSD.doc/doc.III b/lib/libcurses/PSD.doc/doc.III
new file mode 100644 (file)
index 0000000..94d4dd2
--- /dev/null
@@ -0,0 +1,341 @@
+.\"    $NetBSD: doc.III,v 1.5 2003/08/07 16:44:27 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)doc.III     8.1 (Berkeley) 6/4/93
+.\"
+.Ds
+.Fd baudrate "" \*m
+.De
+Returns the output baud rate of the terminal.
+This is a system dependent constant
+(defined in
+.b <sys/tty.h>
+on BSD systems,
+which is included by
+.b <curses.h> ).
+.Ds
+.Fd delwin win
+WINDOW *win;
+.De
+Deletes the window from existence.
+All resources are freed for future use by
+.b calloc (3).
+If a window has a
+.Fn subwin
+allocated window inside of it,
+deleting the outer window
+the subwindow is not affected,
+even though this does invalidate it.
+Therefore,
+subwindows should be deleted before their
+outer windows are.
+.Ds
+.Fd endwin
+.De
+Finish up window routines before exit.
+This restores the terminal to the state it was before
+.Fn initscr
+(or
+.Fn gettmode
+and
+.Fn setterm )
+was called.
+It should always be called before exiting.
+It does not exit.
+This is especially useful for resetting tty stats
+when trapping rubouts via
+.b signal (2).
+.Ds
+.Fd erasechar "" \*m
+.De
+Returns the erase character
+for the terminal,
+.i i.e. ,
+the character used by the user to erase a single character from the input.
+.Ds
+.Fd getcap str "" "char *"
+char   *str;
+.De
+Return a pointer to the
+.b termcap
+capability described by
+.Vn str
+(see
+.b termcap (5)
+for details).
+.Ds
+.Fd getyx win\*,y\*,x \*m
+WINDOW *win;
+int    y\*,x;
+.De
+Puts the current \*y of
+.Vn win
+in the variables
+.Vn y
+and
+.Vn x .
+Since it is a macro,
+not a function,
+you do not pass the address
+of
+.Vn y
+and
+.Vn x .
+.Ds
+.Fd inch "" \*m
+.Fd winch win \*m
+WINDOW *win;
+.De
+Returns the character at the current \*(y
+on the given window.
+This does not make any changes to the window.
+.Ds
+.Fd initscr
+.De
+Initialize the screen routines.
+This must be called before any of the screen routines are used.
+It initializes the terminal-type data and such,
+and without it none of the routines can operate.
+If standard input is not a tty,
+it sets the specifications to the terminal
+whose name is pointed to by
+.Vn Def\*_term
+(initialy "dumb").
+If the boolean
+.Vn My\*_term
+is true,
+.Vn Def\*_term
+is always used.
+If the system supports the
+.b TIOCGWINSZ
+.Fn ioctl "" "" 2
+call,
+it is used to get the number of lines and columns for the terminal,
+otherwise it is taken from the
+.b termcap
+description.
+.Ds
+.Fd killchar "" \*m
+.De
+Returns the line kill character
+for the terminal,
+.i i.e. ,
+the character used by the user to erase an entire line from the input.
+.Ds
+.Fd leaveok win\*,boolf \*m
+WINDOW *win;
+bool   boolf;
+.De
+Sets the boolean flag for leaving the cursor after the last change.
+If
+.Vn boolf
+is TRUE,
+the cursor will be left after the last update on the terminal,
+and the current \*y for
+.Vn win
+will be changed accordingly.
+If it is FALSE,
+it will be moved to the current \*y.
+This flag
+(initialy FALSE)
+retains its value until changed by the user.
+.Ds
+.Fd longname termbuf\*,name
+char   *termbuf\*,*name;
+.Fd fullname termbuf\*,name
+char   *termbuf\*,*name;
+.De
+.Fn longname
+fills in
+.Vn name
+with the long name of the terminal described by the
+.b termcap
+entry in
+.Vn termbuf .
+It is generally of little use,
+but is nice for telling the user in a readable format what terminal
+we think he has.
+This is available in the global variable
+.Vn ttytype .
+.Vn termbuf
+is usually set via the termlib routine
+.Fn tgetent .
+.Fn fullname
+is the same as
+.Fn longname ,
+except that it gives the fullest name given in the entry,
+which can be quite verbose.
+.Ds
+.Fd mvwin win\*,y\*,x
+WINDOW *win;
+int    y, x;
+.De
+Move the home position of the window
+.Vn win
+from its current starting coordinates
+to
+.Vn y\*,x ). (
+If that would put part or all of the window
+off the edge of the terminal screen,
+.Fn mvwin
+returns ERR and does not change anything.
+For subwindows,
+.Fn mvwin
+also returns ERR if you attempt to move it off its main window.
+If you move a main window,
+all subwindows are moved along with it.
+.Ds
+.Fd newwin lines\*,cols\*,begin\*_y\*,begin\*_x "" "WINDOW *"
+int    lines\*,cols\*,begin\*_y\*,begin\*_x;
+.De
+Create a new window with
+.Vn lines
+lines and
+.Vn cols
+columns starting at position
+.Vn begin\*_y\*,begin\*_x ). (
+If either
+.Vn lines
+or
+.Vn cols
+is 0 (zero),
+that dimension will be set to
+.Vn "LINES \- begin\*_y" ) (
+or
+.Vn "COLS \- begin\*_x" ) (
+respectively.
+Thus, to get a new window of dimensions
+.Vn LINES
+\(mu
+.Vn COLS ,
+use
+.Fn newwin . "" 0\*,0\*,0\*,0
+.Ds
+.Fd nl "" \*m
+.Fd nonl "" \*m
+.De
+Set or unset the terminal to/from nl mode,
+.i i.e. ,
+start/stop the system from mapping
+.b <RETURN>
+to
+.b <LINE-FEED> .
+If the mapping is not done,
+.Fn refresh
+can do more optimization,
+so it is recommended, but not required, to turn it off.
+.Ds
+.Fd scrollok win\*,boolf \*m
+WINDOW *win;
+bool   boolf;
+.De
+Set the scroll flag for the given window.
+If
+.Vn boolf
+is FALSE, scrolling is not allowed.
+This is its default setting.
+.Ds
+.Fd touchline win\*,y\*,startx\*,endx
+WINDOW *win;
+int    y\*,startx\*,endx;
+.De
+This function performs a function similar to
+.Fn touchwin
+on a single line.
+It marks the first change for the given line
+to be
+.Vn startx ,
+if it is before the current first change mark,
+and
+the last change mark is set to be
+.Vn endx
+if it is currently less than
+.Vn endx .
+.Ds
+.Fd touchoverlap win1\*,win2
+WINDOW *win1, *win2;
+.De
+Touch the window
+.Vn win2
+in the area which overlaps with
+.Vn win1 .
+If they do not overlap,
+no changes are made.
+.Ds
+.Fd touchwin win
+WINDOW *win;
+.De
+Make it appear that the every location on the window
+has been changed.
+This is usually only needed for refreshes with overlapping windows.
+.Ds
+.Fd subwin win\*,lines\*,cols\*,begin\*_y\*,begin\*_x "" "WINDOW *"
+WINDOW *win;
+int    lines\*,cols\*,begin\*_y\*,begin\*_x;
+.De
+Create a new window with
+.Vn lines
+lines and
+.Vn cols
+columns starting at position
+.Vn begin\*_y\*,begin\*_x ) (
+inside the window
+.i win .
+This means that any change made to either window
+in the area covered
+by the subwindow will be made on both windows.
+.Vn begin\*_y\*,begin\*_x
+are specified relative to the overall screen,
+not the relative (0\*,0) of
+.Vn win .
+If either
+.Vn lines
+or
+.Vn cols
+is 0 (zero),
+that dimension will be set to
+.Vn "LINES \- begin\*_y" ) (
+or
+.Vn "COLS \- begin\*_x" ) (
+respectively.
+.Ds
+.Fd unctrl ch \*m
+char   ch;
+.De
+This is actually a debug function for the library,
+but it is of general usefulness.
+It returns a string which is a representation of
+.Vn ch .
+Control characters become their upper-case equivalents preceded by a "^".
+Other letters stay just as they are.
+To use
+.Fn unctrl ,
+you may have to have
+.b #include\ <unctrl.h>
+in your file.
diff --git a/lib/libcurses/PSD.doc/doc.IV b/lib/libcurses/PSD.doc/doc.IV
new file mode 100644 (file)
index 0000000..8f60c0e
--- /dev/null
@@ -0,0 +1,108 @@
+.\"    $NetBSD: doc.IV,v 1.5 2003/08/07 16:44:27 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)doc.IV      8.1 (Berkeley) 6/4/93
+.\"
+.Ds
+.Fd gettmode
+.De
+Get the tty stats.
+This is normally called by
+.Fn initscr .
+.Ds
+.Fd mvcur lasty\*,lastx\*,newy\*,newx
+int    lasty\*,lastx\*,newy\*,newx;
+.De
+Moves the terminal's cursor from
+.Vn lasty\*,lastx ) (
+to
+.Vn newy\*,newx ) (
+in an approximation of optimal fashion.
+This routine uses the functions borrowed from
+.i ex
+version 2.6.
+It is possible to use this optimization
+without the benefit of the screen routines.
+With the screen routines, this should not be called by the user.
+.Fn move
+and
+.Fn refresh
+should be used to move the cursor position,
+so that the routines know what's going on.
+.Ds
+.Fd scroll win
+WINDOW *win;
+.De
+Scroll the window upward one line.
+This is normally not used by the user.
+.Ds
+.Fd savetty "" \*m
+.Fd resetty "" \*m
+.De
+.Fn savetty
+saves the current tty characteristic flags.
+.Fn resetty
+restores them to what
+.Fn savetty
+stored.
+These functions are performed automatically by
+.Fn initscr
+and
+.Fn endwin .
+.Ds
+.Fd setterm name
+char   *name;
+.De
+Set the terminal characteristics to be those of the terminal named
+.Vn name ,
+getting the terminal size from the
+.b TIOCGWINSZ
+.Fn ioctl "" "" 2
+if it exists,
+otherwise from the environment.
+This is normally called by
+.Fn initscr .
+.Ds
+.Fd tstp
+.De
+If the new
+.b tty (4)
+driver is in use,
+this function
+will save the current tty state
+and then put the process to sleep.
+When the process gets restarted,
+it restores the tty state
+and then calls
+.Fn wrefresh "" "" curscr
+to redraw the screen.
+.Fn initscr
+sets the signal
+SIGTSTP
+to trap to this routine.
diff --git a/lib/libcurses/PSD.doc/ex1.c b/lib/libcurses/PSD.doc/ex1.c
new file mode 100644 (file)
index 0000000..27f2583
--- /dev/null
@@ -0,0 +1,100 @@
+.\"    $NetBSD: ex1.c,v 1.6 2003/08/07 16:44:27 agc Exp $
+.\"
+.\" Copyright (c) 1992, 1993
+.\"     The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)ex1.c      8.1 (Berkeley) 6/8/93
+.\"
+#include <sys/types.h>
+#include <curses.h>
+#include <stdio.h>
+#include <signal.h>
+
+
+#define YSIZE 10
+#define XSIZE 20
+
+int quit();
+
+main()
+{
+       int i, j, c;
+       size_t len;
+       char id[100];
+       FILE *fp;
+       char *s;
+
+       initscr();                      /* Always call initscr() first */
+       signal(SIGINT, quit);           /* Make sure wou have a 'cleanup' fn */
+       crmode();                       /* We want cbreak mode */
+       noecho();                       /* We want to have control of chars */
+       delwin(stdscr);                 /* Create our own stdscr */
+       stdscr = newwin(YSIZE, XSIZE, 10, 35);
+       flushok(stdscr, TRUE);          /* Enable flushing of stdout */
+       scrollok(stdscr, TRUE);         /* Enable scrolling */
+       erase();                        /* Initially, clear the screen */
+
+       standout();
+       move(0,0);
+       while (1) {
+               c = getchar();
+               switch(c) {
+               case 'q':               /* Quit on 'q' */
+                       quit();
+                       break;
+               case 's':               /* Go into standout mode on 's' */
+                       standout();
+                       break;
+               case 'e':               /* Exit standout mode on 'e' */
+                       standend();
+                       break;
+               case 'r':               /* Force a refresh on 'r' */
+                       wrefresh(curscr);
+                       break;
+               default:                /* By default output the character */
+                       addch(c);
+                       refresh();
+               }
+       }
+}
+
+
+int
+quit()
+{
+       erase();                /* Terminate by erasing the screen */
+       refresh();
+       endwin();               /* Always end with endwin() */
+       delwin(curscr);         /* Return storage */
+       delwin(stdscr);
+       putchar('\n');
+       exit(0);
+}
+
+
+
+
diff --git a/lib/libcurses/PSD.doc/ex2.c b/lib/libcurses/PSD.doc/ex2.c
new file mode 100644 (file)
index 0000000..f2e6e7d
--- /dev/null
@@ -0,0 +1,208 @@
+.\"    $NetBSD: ex2.c,v 1.7 2003/08/07 16:44:27 agc Exp $
+.\"
+.\" Copyright (c) 1992, 1993
+.\"     The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)ex2.c      8.1 (Berkeley) 6/8/93
+.\"
+#include <curses.h>
+#include <stdio.h>
+#include <signal.h>
+
+#define YSIZE LINES
+#define XSIZE COLS
+
+static int quit();
+
+/*
+ * This program fills the screen up with characters and the allows the user to
+ * manipulate the text on the screen using some basic commands.
+ * Nothing fancy, just a demonstration of the elementary features of the
+ * curses(3) package.
+ */
+main()
+{
+       int i, j, c, n, d = 0;
+       char id[100];
+       int hh = 0;
+       int curx, cury, base, arg;
+
+       initscr();
+       signal(SIGINT, quit);
+       crmode();
+       noecho();
+       nonl();
+       delwin(stdscr);
+       stdscr = newwin(YSIZE, XSIZE, 0, 0);
+       flushok(stdscr, TRUE);
+       scrollok(stdscr, TRUE);
+       erase();
+       refresh();
+
+       move(0,0);
+       refresh();
+       for (i = 0; i < YSIZE + 2; i++) {
+               (void)snprintf(id, sizeof id, "%d: ", i);
+               addstr(id);
+               for (j = 0; j < XSIZE - strlen(id); j++)
+                       addch('0' + (i % 10));
+       }
+       c = getchar();
+       base = 2;
+       curx = cury = 0;
+       move(0, 0);
+       refresh();
+
+       /*
+        * The screen manipulator has the following commands:
+        * 'D' - clear to the end of the current line.
+        * 'B' - clear to the bottom of the screen.
+        * 'E' - erase the screen.
+        * 's' - enter standout mode.
+        * 'e' - exit standout mode.
+        * 'd' n - delete n lines below cursor line.
+        * 'i' n - insert n lines below cursor line.
+        * 'q' - quit.
+        * 'f' - move cursor one position to the right.
+        * 'b' - move cursor one position to the left.
+        * 'n' - move cursor one line down.
+        * 'p' - move cursor one line up.
+        * 'h' - home cusor.
+        * 'l' - force refresh.
+        * 'r' - simulate a carriage return.
+        *
+        * All other characters are ignored.
+        */
+       for(;;) {
+               switch(c = getchar()) {
+               case 'D':
+                       clrtoeol();
+                       refresh();
+                       continue;
+               case 'B':
+                       clrtobot();
+                       refresh();
+                       continue;
+               case 'E':
+                       erase();
+                       refresh();
+                       continue;
+               case 's':
+                       standout();
+                       continue;
+               case 'e':
+                       standend();
+                       continue;
+               case 'd':
+                       arg = getchar() - '0';
+                       for (i = 0; i < arg; i++)
+                               deleteln();
+                       refresh();
+                       continue;
+               case 'i':
+                       arg = getchar() - '0';
+                       for (i = 0; i < arg; i++)
+                               insertln();
+                       refresh();
+                       continue;
+               case 'q':
+                       quit();
+               case 'f':
+                       if (curx < XSIZE - 1)
+                               curx++;
+                       else {
+                               cury++;
+                               curx = 0;
+                       }
+                       break;
+               case 'b':
+                       if (curx == 0) {
+                               cury--;
+                               curx = XSIZE - 1;
+                       } else
+                               curx--;
+                       break;
+               case 'n':
+                       cury++;
+                       break;
+               case 'p':
+                       cury--;
+                       break;
+               case 'h':
+                       curx = cury = 0;
+                       break;
+               case 'l':
+                       wrefresh(curscr);
+                       continue;
+               case 'r':   /* return */
+               {
+                       int x, y;
+                       getyx(stdscr, y, x);
+                       move(y+1, 0);
+                       insertln();
+                       move(y, x);
+                       clrtoeol();
+                       refresh();
+                       continue;
+               }
+               default:
+                       continue;
+               }
+
+               if (cury < 0) {
+                       base--;
+                       move(0, 0);
+                       insertln();
+                       (void)snprintf(id, sizeof id, "%d: ", base);
+                       addstr(id);
+                       for (j = 0; j < XSIZE - strlen(id) - 2; j++)
+                               addch('0' + (base % 10));
+                       cury++;
+               } else if (cury >= YSIZE) {
+                       move(0, 0);
+                       deleteln();
+                       move(YSIZE - 1, 0);
+                       (void)snprintf(id, sizeof id, "%d: ", base + YSIZE);
+                       addstr(id);
+                       for (j = 0; j < XSIZE - strlen(id) - 2; j++)
+                               addch('0' + ((base + YSIZE) % 10));
+                       cury--;
+                       base++;
+               }
+               move(cury, curx);
+               refresh();
+       }
+}
+
+int
+quit()
+{
+       erase();
+       refresh();
+       endwin();
+       exit(0);
+}
diff --git a/lib/libcurses/PSD.doc/fns.doc b/lib/libcurses/PSD.doc/fns.doc
new file mode 100644 (file)
index 0000000..8880dcf
--- /dev/null
@@ -0,0 +1,1757 @@
+.\" Copyright (c) 1992, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)fns.doc    8.2 (Berkeley) 6/1/94
+.\"
+.Ds
+.Fn addbytes "char *str" "int len"
+.De
+This function is the low level character output function.
+.Vn Len
+characters of the string
+.Vn str
+are output to the current \*y position of the window.
+.Ds
+.Fn addch "chtype ch" \(dg
+.De
+Add the character
+.Vn ch
+on the window
+at the current \*y.
+If the character is a newline
+(\'\en\')
+the line will be cleared to the end,
+and the current \*y will be changed to the
+beginning off the next line
+if newline mapping is on,
+or to the next line at the same x co-ordinate
+if it is off.
+A return
+(\'\er\')
+will move to the beginning of the line on the window.
+Tabs
+(\'\et\')
+will be expanded into spaces
+in the normal tabstop positions of
+every eight characters.
+\*(Es
+.Ds
+.Fn addchstr "chtype *str" \(dg
+.De
+Add the characters and attributes in the string pointed to by
+.Vn str
+on the window at the current \*y.
+\*(Es
+In this case, it will put on as much as it can.
+.Ds
+.Fn addchnstr "chtype *str" "int len" \(dg
+.De
+Add no more than
+.Vn len
+characters and attributes of the string pointed to by
+.Vn str
+on the window at the current \*y.
+\*(Es
+In this case, it will put on as much as it can.
+.Ds
+.Fn addstr "char *str" \(dg
+.De
+Add the string pointed to by
+.Vn str
+on the window at the current \*y.
+\*(Es
+In this case, it will put on as much as it can.
+.Ds
+.Fn addnstr "char *str" "int len" \(dg
+.De
+Add no more than
+.Vn len
+characters of the string pointed to by
+.Vn str
+on the window at the current \*y.
+\*(Es
+In this case, it will put on as much as it can.
+.Ds
+.Fn assume_default_colors "short fore" "short back"
+.De
+Set the curses default foreground and background colors to
+.Vn fore
+and
+.Vn back .
+.Ds
+.Fn attr_get "attr_t *attr" "short *pair" "void *opt" \(dg
+.De
+Get the attributes and colour pair for the window.
+Either
+.Vn attr
+or
+.Vn pair
+may be NULL.
+The
+.Vn opt
+argument is not used.
+.Ds
+.Fn attr_off "attr_t attr" "void *opt" \(dg
+.De
+Remove character attributes set by
+.Fn attr_on
+or
+.Fn attr_set .
+.Ds
+.Fn attr_on "attr_t attr" "void *opt" \(dg
+.De
+Add character attributes for any characters
+added to the window (if it has that capability).
+The attributes that can be set are \fBA_UNDERLINE\fR,
+\fBA_REVERSE\fR, \fBA_BLINK\fR, \fBA_DIM\fR,
+\fBA_BOLD\fR, \fBA_BLANK\fR, \fBA_PROTECT\fB,
+\fBA_ALTCHARSET\fR and \fBCOLOR_PAIR(n)\fR.
+.Ds
+.Fn attr_set "attr_t attr" "short pair" "void *opt" \(dg
+.De
+Set character attributes and color pair for any characters
+added to the window (if it has that capability).
+.Ds
+.Fn attroff "int attribute" \(dg
+.De
+Remove character attributes set by
+.Fn attron
+or
+.Fn attrset .
+To clear all character attributes, use
+.Fn attroff "A_ATTRIBUTES" .
+.Fn attroff "A_STANDOUT"
+is equivalent to
+.Fn standend .
+.Fn attroff "A_UNDERLINE"
+is equivalent to
+.Fn underend .
+.Ds
+.Fn attron "int attribute" \(dg
+.De
+Add character attributes for any characters
+added to the window (if it has that capability).
+.Fn attron "A_STANDOUT"
+is equivalent to
+.Fn standout .
+.Fn attron "A_UNDERLINE"
+is equivalent to
+.Fn underscore .
+.Ds
+.Fn attrset "int attribute" \(dg
+.De
+Set character attributes for any characters
+added to the window (if it has that capability).
+.Ds
+.Fn baudrate "" \(dg
+.De
+Returns the output baud rate of the terminal.
+This is a system dependent constant
+(defined in
+.b <sys/tty.h>
+on BSD systems,
+which is included by
+.b <curses.h> ).
+.Ds
+.Fn beep ""
+.De
+Sound the terminal bell.  If the terminal has no bell capability,
+but has the ability to flash the screen, do that instead.  See also
+.Fn flash
+.Ds
+.Fn bkgd "chtype ch"
+.De
+Sets the background rendition to
+.Vn ch .
+.Ds
+.Fn bkgdset "chtype ch"
+.De
+Sets the background rendition to
+.Vn ch 
+and applies this rendition to the window.
+.Ds
+.Fn border "chtype left" "chtype right" "chtype top" "chtype bottom" "chtype topleft" "chtype topright" "chtype botleft" "chtype botright"
+.De
+.Pp
+Draws a border around the window using the characters:
+.Vn left
+for drawing the left side, 
+.Vn right
+for drawing the left side, 
+.Vn top
+for drawing the top edge, 
+.Vn bottom
+for drawing the top edge, 
+.Vn topleft
+for drawing the top-left corner, 
+.Vn topright
+for drawing the top-right corner, 
+.Vn botleft
+for drawing the bottom-left corner, and 
+.Vn botright
+for drawing the bottom-right corner.  If scrolling is not allowed,
+and the window encompasses the lower right-hand corner of the terminal,
+the corners are left blank to avoid a scroll.
+.Ds
+.Fn box "WINDOW win" "chtype vert" "chtype hor"
+.De
+.Pp
+Draws a box around the window using
+.Vn vert
+as the character for drawing the vertical sides, and
+.Vn hor
+for drawing the horizontal lines.
+If scrolling is not allowed,
+and the window encompasses the lower right-hand corner of the terminal,
+the corners are left blank to avoid a scroll.
+.Ds
+.Fn can_change_color ""
+.De
+Check if terminal can change colors.
+.Ds
+.Fn cbreak ""
+.De
+Set the terminal to cbreak mode.
+.Ds
+.Fn clear "" \(dg
+.De
+Resets the entire window to blanks.
+If
+.Vn win
+is a screen,
+this sets the clear flag,
+which will cause a clear-screen sequence to be sent
+on the next
+.Fn refresh
+call.
+This also moves the current \*y
+to (0\*,0).
+.Ds
+.Fn clearok "WINDOW *scr" "int boolf" \(dg
+.De
+Sets the clear flag for the screen
+.Vn scr .
+If
+.Vn boolf
+is non-zero,
+this will force a clear-screen to be printed on the next
+.Fn refresh ,
+or stop it from doing so if
+.Vn boolf
+is 0.
+This only works on screens,
+and,
+unlike
+.Fn clear ,
+does not alter the contents of the screen.
+If
+.Vn scr
+is
+.Vn curscr ,
+the next
+.Fn refresh
+call will cause a clear-screen,
+even if the window passed to
+.Fn refresh
+is not a screen.
+.Ds
+.Fn clrtobot "" \(dg
+.De
+Wipes the window clear from the current \*y to the bottom.
+This does not force a clear-screen sequence on the next refresh
+under any circumstances.
+\*(Nm
+.Ds
+.Fn clrtoeol "" \(dg
+.De
+Wipes the window clear from the current \*y to the end of the line.
+\*(Nm
+.Ds
+.Fn color_content "short color" "short *red" "short *green" "short *blue"
+.De
+Get the red, green and blue values of color
+.Vn color .
+.Ds
+.Fn color_set "short pair" "void *opt" \(dg
+.De
+Set color pair for any characters added to the window (if it has
+that capability).
+.Ds
+.Fn copywin "const WINDOW *src" "WINDOW *dst" "int sminrow" "int smincol" "int dminrow" "int dmincol" "int dmaxrow" "int dmaxcol" "int overlay"
+.De
+Copies the contents of the window
+.Vn src
+starting at (
+.Vn sminrow ,
+.Vn smincol )
+to the destination window
+.Vn dst
+starting at (
+.Vn dminrow ,
+.Vn dmincol )
+and ending at either the end of the source window or (
+.Vn dmaxrow ,
+.Vn dmaxcol )
+whichever is the lesser.  The parameter
+.Vn overlay
+determines the nature of the copy.  If 
+.Vn overlay
+is TRUE then only the non-space characters from
+.Vn src
+are copied to
+.Vn dst .
+If 
+.Vn overlay
+is FALSE then all characters are copied from
+.Vn src
+to
+.Vn dst.
+.Ds
+.Fn curs_set "int visibility"
+.De
+Sets the visibility of the screen cursor.  The parameter
+.Vn visibility
+can be one of three values, 0 means make the cursor invisible, 1 means
+set the cursor to normal visibility and 2 sets the cursor to high
+visibility.  In all cases the old mode of the cursor is returned if
+the call was successful and
+.b ERR
+is returned if the terminal cannot support the requested visibility
+mode.
+.Ds
+.Fn crmode "" \(dg
+.De
+Identical to
+.Fn cbreak .
+The misnamed macro
+.Fn crmode
+and
+.Fn nocrmode
+is retained for backwards compatibility
+with ealier versions of the library.
+.Ds
+.Fn delay_output "int ms"
+.De
+Pause output for
+.Vn ms
+milliseconds using the terminal pad character.
+.Ds
+.Fn def_prog_mode ""
+.De
+Save the current terminal modes as the \'in curses\' state for use with
+.Fn reset_prog_mode .
+.Ds
+.Fn def_shell_mode ""
+.De
+Save the current terminal modes as the \'not in curses\' state for use with
+.Fn reset_shell_mode .
+.Ds
+.Fn define_key "char *sequence" "int key_symbol" 
+.De
+Assigns the character sequence given in
+.Vn sequence
+to the key symbol
+.Vn key_symbol .
+If 
+.Fn keypad
+has set been set TRUE and the character sequence is found in the input
+stream then the key symbol defined will be returned.  Normally the
+sequences are found in the
+.b termcap
+database but this function allows extensions to be added by the
+application.  If 
+.Vn sequence
+is a NULL pointer then all the sequences associated with
+.Vn key_symbol
+will be removed, including any definitions inserted by
+.b termcap .
+.Ds
+.Fn delch ""
+.De
+Delete the character at the current \*y.
+Each character after it on the line shifts to the left,
+and the last character becomes blank.
+.Ds
+.Fn deleteln ""
+.De
+Delete the current line.
+Every line below the current one will move up,
+and the bottom line will become blank.
+The current \*y will remain unchanged.
+.Ds
+.Fn delscreen "SCREEN *screen"
+.De
+Delete the screen and frees all associated resources.
+.Ds
+.Fn delwin "WINDOW *win"
+.De
+Deletes the window from existence.
+All resources are freed for future use by
+.b calloc (3).
+If a window has a
+.Fn subwin
+allocated window inside of it,
+deleting the outer window
+the subwindow is not affected,
+even though this does invalidate it.
+Therefore,
+subwindows should be deleted before their
+outer windows are.
+.Ds
+.Fn derwin "WINDOW *orig" "int nlines" "int ncols" "int by" "int bx"
+.De
+Performs a function very similar to that of
+.Fn subwin .
+The difference being that with
+.Fn derwin
+the origin of the child window given by (
+.Vn by ,
+.Vn bx )
+is relative to the origin of the parent window
+.Vn orig
+instead of being absolute screen coordinates as they are in
+.Fn subwin .
+.Ds
+.Fn doupdate ""
+.De
+Synchronize the terminal screen with the virtual screen that
+has had window contents added to it by calls to
+.Fn wnoutrefresh .
+.Ds
+.Fn dupwin "WINDOW *win"
+.De
+Creates an exact copy of the window
+.Vn win .
+.Ds
+.Fn echo "" \(dg
+.De
+Sets the terminal to echo characters.
+.Ds
+.Fn echochar "const chtype ch" \(dg
+.De
+Add the character
+.Vn ch
+on the window
+at the current \*y and immediately refresh the window.
+.Ds
+.Fn endwin ""
+.De
+Finish up window routines before exit.
+This restores the terminal to the state it was before
+.Fn initscr
+(or
+.Fn gettmode
+and
+.Fn setterm )
+was called.
+It should always be called before exiting and before the final calls to
+.Fn delwin .
+It does not exit.
+This is especially useful for resetting tty stats
+when trapping rubouts via
+.b signal (2).
+.Ds
+.Fn erase "" \(dg
+.De
+Erases the window to blanks without setting the clear flag.
+This is analagous to
+.Fn clear ,
+except that it never causes a clear-screen sequence to be generated
+on a
+.Fn refresh .
+\*(Nm
+.Ds
+.Fn erasechar "" \(dg
+.De
+Returns the erase character
+for the terminal,
+.i i.e. ,
+the character used by the user to erase a single character from the input.
+.Ds
+.Fn flash ""
+.De
+Flash the terminal screen.  If the terminal has no flash capability,
+but has the ability to sound the bell, do that instead.  See also
+.Fn bell
+.Ds
+.Fn flushinp ""
+.De
+Throw away any input that has been typed by the user but has not yet
+been read by the program.
+.Ds
+.Fn flushok "WINDOW *win" "int boolf"
+.De
+Normally,
+.Fn refresh
+.Fn fflush 's
+.Vn stdout
+when it is finished.
+.Fn flushok
+allows you to control this.
+if
+.Vn boolf
+is non-zero
+(\c
+.i i.e. ,
+non-zero)
+it will do the
+.Fn fflush ,
+otherwise it will not.
+.Ds
+.Fn getattrs "WINDOW *win"
+.De
+Gets the attributes for
+.Vn win .
+.Ds
+.Fn getbkgd "WINDOW *win"
+.De
+Gets the background rendition for
+.Vn win .
+.Ds
+.Fn getcap "char *name"
+.De
+Get the terminal capability
+.Vn name .
+.Ds
+.Fn getch "" \(dg
+.De
+Gets a character from the terminal and (if necessary)
+echos it on the window.
+\*(Es
+Otherwise, the character gotten is returned.
+If
+.i noecho
+has been set, then the window is left unaltered.
+In order to retain control of the terminal,
+it is necessary to have one of
+.i noecho ,
+.i cbreak ,
+or
+.i rawmode
+set.
+If you do not set one,
+whatever routine you call to read characters will set
+.i cbreak
+for you,
+and then reset to the original mode when finished.
+.Ds
+.Fn getcury "WINDOW *win"
+.De
+Get current y position on
+.Vn win .
+.Ds
+.Fn getcurx "WINDOW *win"
+.De
+Get current x position on
+.Vn win .
+.Ds
+.Fn getbegy "WINDOW *win"
+.De
+Get start y position on
+.Vn win .
+.Ds
+.Fn getbegx "WINDOW *win"
+.De
+Get start x position on
+.Vn win .
+.Ds
+.Fn getmaxy "WINDOW *win"
+.De
+Get maximum y position on
+.Vn win .
+.Ds
+.Fn getmaxx "WINDOW *win"
+.De
+Get maximum x position on
+.Vn win .
+.Ds
+.Fn getnstr "char *str" \(dg
+.De
+Get a string through the window
+and put it in the location pointed to by
+.Vn str .
+A maximum of
+.Vn n
+characters is returned (including the trailing null).
+It sets tty modes if necessary,
+and then calls
+.Fn getch
+(or
+.Fn wgetch )
+to get the characters needed to fill in the string
+until a newline or EOF is encountered.
+The newline stripped off the string.
+\*(Es
+.Ds
+.Fn getstr "char *str" \(dg
+.De
+Get a string through the window
+and put it in the location pointed to by
+.Vn str ,
+which is assumed to be large enough to handle it.
+It sets tty modes if necessary,
+and then calls
+.Fn getch
+(or
+.Fn wgetch )
+to get the characters needed to fill in the string
+until a newline or EOF is encountered.
+The newline stripped off the string.
+\*(Es
+.Ds
+.Fn getparx "WINDOW *win"
+.De
+Returns the x location of the given subwindow relative to the parent
+window.  If the window is not a subwindow then -1 is returned.
+.Ds
+.Fn getpary "WINDOW *win"
+.De
+Returns the y location of the given subwindow relative to the parent
+window.  If the window is not a subwindow then -1 is returned.
+.Ds
+.Fn getpary "WINDOW *win" "int y" "int x"
+.De
+Is a macro that sets the 
+.Vn y
+and
+.Vn x
+parameters to the respective coordinates of the top left hand corner
+of the subwindow relative to the parent window.  If the given window
+.Vn win
+is not a subwindow then both
+.Vn y
+and 
+.Vn x
+will be set to -1.
+.Ds
+.Fn gettmode ""
+.De
+Get the tty stats.
+This is normally called by
+.Fn initscr .
+.Ds 
+.Fn getwin "FILE *fp"
+.De
+Creates a window from a file written by
+.Fn putwin .
+.Ds
+.Fn getyx "WINDOW *win" "int y" "int x"
+.De
+Puts the current \*y of
+.Vn win
+in the variables
+.Vn y
+and
+.Vn x .
+Since it is a macro,
+not a function,
+you do not pass the address
+of
+.Vn y
+and
+.Vn x .
+.Ds
+.Fn halfdelay "int timeout"
+.De
+Sets the terminal into a mode similar to that done by
+.Fn cbreak
+with the exception that the input routines will wait for
+.Vn timeout
+number of tenths of a second, if at this time there is no input then
+ERR will be returned.
+.Ds
+.Fn has_colors ""
+.De
+Check if terminal has colors.
+.Ds
+.Fn hline "chtype ch" "int count"
+.De
+Draw a horizontal line of the character ch starting at the current
+cursor position and moving towards the rightmost column.  At most
+.Vn count
+characters will be written, less if the edge of the screen is reached
+before 
+.Vn count
+is reached.
+.Ds
+.Fn idcok "WINDOW *win" "int boolf"
+.De
+Reserved for future use.
+This will eventually signal to
+.Fn refresh
+that it is all right to use the insert and delete char sequences
+when updating the window.
+.Ds
+.Fn idlok "WINDOW *win" "int boolf"
+.De
+Reserved for future use.
+This will eventually signal to
+.Fn refresh
+that it is all right to use the insert and delete line sequences
+when updating the window.
+.ne 1i
+.Ds
+.Fn inch "" \(dg
+.De
+Returns the character at the current position on the given window.
+This does not make any changes to the window.
+.Ds
+.Fn inchnstr "chtype *chstr" "int n"
+.De
+Get an array of at most
+.Vn n
+characters and renditions starting at the current cursor position and
+ending at the end of the line and put it in the location pointed to by
+.Vn chstr .
+.Ds
+.Fn inchstr "chtype *chstr"
+.De
+Get an array of characters and renditions starting at the current cursor
+position and ending at the end of the line and put it in the location
+pointed to by
+.Vn chstr ,
+which is assumed to be large enough to handle it.
+.Ds
+.Fn innstr "char *str" "int n"
+.De
+Get a string of at most
+.Vn n
+characters starting at the current cursor position and ending at the end
+of the line and put it in the location pointed to by
+.Vn str .
+.Ds
+.Fn init_color "short color" "short red" "short green" "short blue"
+.De
+Set the red, green and blue values of color
+.Vn color .
+.Ds
+.Fn init_pair "short pair" "short fore" "short back"
+.De
+Set the foreground and background colors of pair
+.Vn pair .
+.Ds
+.Fn initscr ""
+.De
+Initialize the screen routines.
+This must be called before any of the screen routines are used.
+It initializes the terminal-type data and such,
+and without it none of the routines can operate.
+If standard input is not a tty,
+it sets the specifications to the terminal
+whose name is pointed to by
+.Vn Def\*_term
+(initially "dumb").
+If the boolean
+.Vn My\*_term
+is non-zero,
+.Vn Def\*_term
+is always used.
+If the system supports the
+.b TIOCGWINSZ
+.i ioctl(2)
+call,
+it is used to get the number of lines and columns for the terminal,
+otherwise it is taken from the
+.b termcap
+description.
+.Ds
+.Fn insch "char c"
+.De
+Insert
+.Vn c
+at the current \*y
+Each character after it shifts to the right,
+and the last character disappears.
+\*(Es
+.Ds
+.Fn insdelln "int n"
+.De
+If
+.Vn n
+is positive insert
+.Vn n
+lines above the current one.
+Every line below the current line
+will be shifted down,
+and the last
+.Vn n
+lines will disappear.
+If
+.Vn n
+is negative, delete
+.Vn n
+lines starting from the current one.
+The last
+.Vn n
+lines are cleared.
+The current \*y will remain unchanged.
+.Ds
+.Fn insertln ""
+.De
+Insert a line above the current one.
+Every line below the current line
+will be shifted down,
+and the bottom line will disappear.
+The current line will become blank,
+and the current \*y will remain unchanged.
+.Ds
+.Fn instr "char *str"
+.De
+Get an string starting at the current cursor position and ending at the
+end of the line and put it in the location pointed to by
+.Vn str ,
+which is assumed to be large enough to handle it.
+.Ds
+.Fn is_linetouched "WINDOW *win" "int line"
+.De
+Returns TRUE if 
+.Vn line
+in the window
+.Vn win
+has been modified since the last call to
+.Fn wrefresh .
+.Ds
+.Fn is_wintouched "WINDOW *win" "int line"
+.De
+Returns TRUE if the window
+.Vn win
+has been modified since the last call to
+.Fn wrefresh .
+.Ds
+.Fn isendwin ""
+.De
+Returns TRUE if
+.Fn endwin
+has been called without a subsequent call to
+.Fn wrefresh ,
+and FALSE otherwise.
+.Ds
+.Fn intrflush "WINDOW *win" "int boolf"
+.De
+Sets the terminal flush on interrupt mode.  If
+.Vn boolf
+is non-zero, flushing of the output buffer will occur when an
+interrupt key is pressed.  The default is inherited from the
+terminal settings.
+.Ds
+.Fn keyok "int key_symbol" "bool flag"
+.De
+Controls the recognition of the key symbol
+.Vn key_symbol .
+By setting
+.Vn flag
+to FALSE the recognition of any sequence of characters
+that have been associated with the key symbol will be disabled.
+By default, this flag is TRUE so sequences will be recognised.
+.Ds
+.Fn keyname "int key"
+.De
+Returns a description of the key
+.Vn key .
+.Ds
+.Fn keypad "WINDOW *win" "int boolf"
+.De
+Sets the boolean flag for interpretation of escape sequences.  If
+.Vn boolf
+is non-zero, escape sequences from terminal keypad and function
+keys will be interpreted by the library.  Escape sequences are not
+interpreted by default.  The include file
+.b <curses.h>
+contains the list of recognised keypad and function keys.  See also
+.Fn notimeout .
+.Ds
+.Fn killchar "" \(dg
+.De
+Returns the line kill character
+for the terminal,
+.i i.e. ,
+the character used by the user to erase an entire line from the input.
+.Ds
+.Fn leaveok "WINDOW *win" "int boolf" \(dg
+.De
+Sets the boolean flag for leaving the cursor after the last change.
+If
+.Vn boolf
+is non-zero,
+the cursor will be left after the last update on the terminal,
+and the current \*y for
+.Vn win
+will be changed accordingly.
+If
+.Vn boolf
+ is 0 the cursor will be moved to the current \*y.
+This flag
+(initially 0)
+retains its value until changed by the user.
+.Ds
+.Fn longname "" \(dg
+.De
+Returns a string containing the verbose description of the terminal.
+.Ds
+.Fn meta "WINDOW *win" "bool bf"
+.De
+Manipulates the meta mode on terminals that support this capability.
+Note that 
+.Vn win
+is always ignored.
+.Ds
+.Fn move "int y" "int x"
+.De
+Change the current \*y of the window to
+.Vn y\*,x ). (
+\*(Es
+.Ds
+.Fn mvaddch "int y" "int x" "chtype ch"
+.De
+Moves the cursor to the position
+.Vn (y ,
+.Vn x )
+and then adds a character in the same manner as
+.Fn addch .
+.Ds
+.Fn mvaddchstr "int y" "int x" "chtype *str" \(dg
+.De
+Moves the cursor to the position
+.Vn (y ,
+.Vn x )
+and then adds characters and attributes in the same manner as
+.Fn addchstr .
+.Ds
+.Fn mvaddchnstr "int y" "int x" "chtype *str" \(dg
+.De
+Moves the cursor to the position
+.Vn (y ,
+.Vn x )
+and then adds characters and attributes in the same manner as
+.Fn addchnstr .
+.Ds
+.Fn mvaddstr "int y" "int x" "char *str" \(dg
+.De
+Moves the cursor to the position
+.Vn (y ,
+.Vn x )
+and then adds a string in the same manner as
+.Fn addstr .
+.Ds
+.Fn mvaddnstr "int y" "int x" "char *str" \(dg
+.De
+Moves the cursor to the position
+.Vn (y ,
+.Vn x )
+and then adds a string in the same manner as
+.Fn addnstr .
+.Ds
+.Fn mvcur "int lasty" "int lastx" "int newy" "int newx"
+.De
+Moves the terminal's cursor from
+.Vn lasty\*,lastx ) (
+to
+.Vn newy\*,newx ) (
+in an approximation of optimal fashion.
+This routine uses the functions borrowed from
+.i ex
+version 2.6.
+It is possible to use this optimization
+without the benefit of the screen routines.
+With the screen routines, this should not be called by the user.
+.Fn move
+and
+.Fn refresh
+should be used to move the cursor position,
+so that the routines know what's going on.
+.Ds
+.Fn mvderwin "WINDOW *win" "int y" "int x"
+.De
+Moves the subwindow
+.Vn win
+to the location
+.Vn y\*,x ) (
+where the location is relative to the top left hand corner of the
+parent window.  This call will return ERR if 
+.Vn win
+is not a subwindow or if the relocated window would lie outside the
+parent window.
+.Ds
+.Fn mvhline "int y" "int x" "chtype ch" "int count"
+.De
+Moves the cursor to the position
+.Vn (y ,
+.Vn x )
+and then draws a horizontal line in the same manner as
+.Fn hline .
+.Ds
+.Fn mvprintw "int y" "int x" "const char *fmt" "..."
+.De
+Equivalent to:
+.(l
+move(y, x);
+printw(fmt, ...);
+.)l
+.Ds
+.Fn mvscanw "int y" "int x" "const char *fmt" "..."
+.De
+Equivalent to:
+.(l
+move(y, x);
+scanw(fmt, ...);
+.)l
+.Ds
+.Fn mvvline "int y" "int x" "chtype ch" "int count"
+.De
+Moves the cursor to the position
+.Vn (y ,
+.Vn x )
+and then draws a vertical line in the same manner as
+.Fn vline .
+.Ds
+.Fn mvwhline "WINDOW *win" "int y" "int x" "chtype ch" "int count"
+.De
+Moves the cursor to the position
+.Vn (y ,
+.Vn x )
+on window 
+.Vn win
+and then draws a horizontal line in the same manner as
+.Fn whline .
+.Ds
+.Fn mvwvline "WINDOW *win" "int y" "int x" "chtype ch" "int count"
+.De
+Moves the cursor to the position
+.Vn (y ,
+.Vn x )
+on window 
+.Vn win
+and then draws a horizontal line in the same manner as
+.Fn wvline .
+.Ds
+.Fn mvwin "WINDOW *win" "int y" "int x"
+.De
+Move the home position of the window
+.Vn win
+from its current starting coordinates
+to
+.Vn y\*,x ). (
+If that would put part or all of the window
+off the edge of the terminal screen,
+.Fn mvwin
+returns ERR and does not change anything.
+For subwindows,
+.Fn mvwin
+also returns ERR if you attempt to move it off its main window.
+If you move a main window,
+all subwindows are moved along with it.
+.Ds
+.Fn mvwprintw "WINDOW *win" "int y" "int x" "const char *fmt" "..."
+.De
+Equivalent to:
+.(l
+wmove(win, y, x);
+printw(fmt, ...);
+.)l
+.Ds
+.Fn mvwscanw "WINDOW *win" "int y" "int x" "const char *fmt" "..."
+.De
+Equivalent to:
+.(l
+wmove(win, y, x);
+scanw(fmt, ...);
+.)l
+.Ds
+.Fn napms "int ms"
+.De
+Sleep for
+.Vn ms
+milliseconds.
+.Ds
+.Ft "WINDOW *"
+.Fn newpad "int lines" "int cols"
+.De
+Create a new pad with
+.Vn lines
+lines and
+.Vn cols
+columns.
+.Ds
+.Ft "SCREEN *"
+.Fn newterm "char *type" "FILE *outfd" "FILE *infd"
+.De
+Iinitialise the curses subsystem to use the terminal of type
+.Vn type
+connected via the input and output streams
+.Vn infd,outfd. 
+The 
+.Fn newterm
+is used in multi-terminal applications and returns a pointer to a
+.Ft "SCREEN"
+structure that holds the state for that particular terminal.  The
+application may swap between the terminals by calling the
+.Fn set_term
+function.  If the 
+.Vn type
+parameter is NULL then the $TERM variable is used as the terminal type.
+.Ds
+.Ft "WINDOW *"
+.Fn newwin "int lines" "int cols" "int begin_y" "int begin_x"
+.De
+Create a new window with
+.Vn lines
+lines and
+.Vn cols
+columns starting at position
+.Vn begin\*_y\*,begin\*_x ). (
+If either
+.Vn lines
+or
+.Vn cols
+is 0 (zero),
+that dimension will be set to
+.Vn "LINES \- begin\*_y" ) (
+or
+.Vn "COLS \- begin\*_x" ) (
+respectively.
+Thus, to get a new window of dimensions
+.Vn LINES
+\(mu
+.Vn COLS ,
+use
+.Fn newwin 0 0 0 0 .
+.Ds
+.Fn nl ""
+.De
+Set the terminal to nl mode,
+.i i.e. ,
+start/stop the system from mapping
+.b <RETURN>
+to
+.b <LINE-FEED> .
+If the mapping is not done,
+.Fn refresh
+can do more optimization,
+so it is recommended, but not required, to turn it off.
+.Ds
+.Fn no_color_video ""
+.De
+Return attributes that cannot be combined with color.
+.Ds
+.Fn nocbreak ""
+.De
+Unset the terminal from cbreak mode.
+.Ds
+.Fn nocrmode "" \(dg
+.De
+Identical to
+.Fn nocbreak .
+The misnamed macro
+.Fn nocrmode
+is retained for backwards compatibility
+with ealier versions of the library.
+.Ds
+.Fn nodelay "WINDOW *win1" "int boolf"
+.De
+Sets the boolean flag for non-blocking
+.Fn getch .
+If
+.Vn boolf
+is non-zero,
+.Fn getch
+will return ERR is no input is waiting.  The default
+is to for
+.Fn getch
+to block indefinitely.  See also
+.Fn timeout .
+.Ds
+.Fn noecho "" \(dg
+.De
+Turn echoing of characters off.
+.Ds
+.Fn nonl ""
+.De
+Unset the terminal to from nl mode.  See
+.Fn nl .
+.ne 1i
+.Ds
+.Fn noqiflush \(dg
+.De
+Unset the terminal flush on interrupt mode.
+This is equivalent to
+.Fn intrflush stdscr FALSE .
+.Ds
+.Fn noraw ""
+.De
+Unset the terminal from raw mode.  See
+.Fn raw .
+.Ds
+.Fn notimeout "WINDOW *win1" "int boolf"
+.De
+Sets the boolean flag for inter-key timeouts
+for escape sequences interpreted when
+.Fn keypad
+is set.
+By default,
+.Fn keypad
+sets a timer while waiting for the next character of
+an escape sequence.
+If
+.Vn boolf
+is non-zero,
+.Fn getch
+will wait indefinitely between escape sequence characters,
+or until a delay set by
+.Fn timeout
+expires.
+.Ds
+.Fn overlay "WINDOW *win1" "WINDOW *win2"
+.De
+Overlay
+.Vn win1
+on
+.Vn win2 .
+The contents of
+.Vn win1 ,
+insofar as they fit,
+are placed on
+.Vn win2
+at their starting \*y.
+This is done non-destructively,
+i.e., blanks on
+.Vn win1
+leave the contents of the space on
+.Vn win2
+untouched.  Note that all non-blank characters are overwritten
+destructively in the overlay.
+.Ds
+.Fn overwrite "WINDOW *win1" "WINDOW *win2"
+.De
+Overwrite
+.Vn win1
+on
+.Vn win2 .
+The contents of
+.Vn win1 ,
+insofar as they fit,
+are placed on
+.Vn win2
+at their starting \*y.
+This is done destructively,
+.i i.e. ,
+blanks on
+.Vn win1
+become blank on
+.Vn win2 .
+.Ds
+.Fn pair_content "short pair" "short *fore" "short *back"
+.De
+Get the foreground and background colors of pair
+.Vn pair .
+.Ds
+.Fn pechochar "const chtype ch" \(dg
+.De
+Add the character
+.Vn ch
+on the pad
+at the current \*y and immediately refresh the pad.
+.Ds 
+.Fn pnoutrefresh "WINDOW *pad" "int pbeg_y" "int pbeg_x" "int sbeg_y" "int sbeg_x" "int smax_y" "int smax_x"
+.De    
+Add the pad contents to a virtual screen.  Several pads can be added
+before a call to
+.Fn doupdate ,
+thus allowing the screen to updated in an efficient manner.
+.Ds
+.Fn prefresh "WINDOW *pad" "int pbeg_y" "int pbeg_x" "int sbeg_y" "int sbeg_x" "int smax_y" "int smax_x"
+.De 
+Synchronize the terminal screen with the desired pad.
+.Ds
+.Fn printw "char *fmt" "..."
+.De
+Performs a
+.Fn printf
+on the window starting at the current \*y.
+It uses
+.Fn addstr
+to add the string on the window.
+It is often advisable to use the field width options of
+.Fn printf
+to avoid leaving things on the window from earlier calls.
+\*(Es
+.Ds 
+.Fn putwin "WINDOW *win" "FILE *fp"
+.De
+Writes the window data to a file.
+.Ds
+.Fn qiflush \(dg
+.De
+Set the terminal flush on interrupt mode.
+This is equivalent to
+.Fn intrflush stdscr TRUE .
+.Ds
+.Fn raw ""
+.De
+Set the terminal to raw mode.
+On version 7
+.Un \**
+.(f
+\**
+.Un
+is a trademark of Unix System Laboratories.
+.)f
+this also turns off newline mapping
+(see
+.Fn nl ).
+.Ds
+.Fn redrawwin "WINDOW *win" \(dg
+.De
+Mark the entire window as having been corrupted.
+This is equivalent to the
+.Fn touchwin
+function.
+.Ds
+.Fn refresh "" \(dg
+.De
+Synchronize the terminal screen with the desired window.
+If the window is not a screen,
+only that part covered by it is updated.
+\*(Es
+In this case, it will update whatever it can
+without causing the scroll.
+.sp
+As a special case,
+if
+.Fn wrefresh
+is called with the window
+.Vn curscr
+the screen is cleared
+and repainted as it is currently.
+This is very useful for allowing the redrawing of the screen
+when the user has garbage dumped on his terminal.
+.Ds
+.Fn reset_prog_mode ""
+.De
+Restore the terminal to the \'in curses\' state.
+.Ds
+.Fn reset_shell_mode ""
+.De
+Restore the terminal to the \'not in curses\' state.
+.Ds
+.Fn resetty "" \(dg
+.De
+.Fn resetty
+restores them to what
+.Fn savetty
+stored.
+These functions are performed automatically by
+.Fn initscr
+and
+.Fn endwin .
+This function should not be used by the user.
+.Ds
+.Fn resizeterm "int lines" "int columns" \(dg
+.De
+Resizes the curses terminal to the given size.  All internal curses
+structures are resized to the new dimensions and all curses windows that
+would have boundaries outside the new terminal size will be resized to fit
+within the new boundaries.  All windows will be cleared and it is expected
+that the application will redraw the window contents.
+.Ds
+.Fn savetty "" \(dg
+.De
+.Fn savetty
+saves the current tty characteristic flags. See
+.Fn resetty .
+This function should not be used by the user.
+.Ds
+.Fn scanw "char *fmt" "..."
+.De
+Perform a
+.Fn scanf
+through the window using
+.Vn fmt .
+It does this using consecutive calls to
+.Fn getch
+(or
+.Fn wgetch ).
+\*(Es
+.ne 1i
+.Ds
+.Fn scrl "int n"
+.De
+Scroll the window by
+.Vn n
+lines. If
+.Vn n
+is positive, scroll upward, otherwise
+scroll downward.
+.Ds
+.Fn scroll "WINDOW *win"
+.De
+Scroll the window upward one line.
+This is normally not used by the user.
+.Ds
+.Fn scrollok "WINDOW *win" "int boolf" \(dg
+.De
+Set the scroll flag for the given window.
+If
+.Vn boolf
+is 0, scrolling is not allowed.
+This is its default setting.
+.Ds
+.Ft "SCREEN *"
+.Fn set_term "SCREEN *new"
+.De
+Sets the current screen for input and output to be the one given.  The 
+.Vn new
+structure must be one that has been previously created by the 
+.Fn newterm
+function.  The 
+.Fn set_term
+function returns the previous screen on successful completion.
+.Ds
+.Fn standend "" \(dg
+.De
+End standout mode initiated by
+.Fn standout .
+This function is provided for compatibility
+with older curses implementations.
+.Ds
+.Fn standout "" \(dg
+.De
+Causes any characters added to the window
+to be put in standout mode on the terminal
+(if it has that capability).  This function
+is provided for compatibility with older curses
+implementations.  A larger range of character
+attributes supported by modern terminals can be
+accessed using
+.Fn attron
+and
+.Fn attrset .
+.Ds
+.Fn start_color ""
+.De
+Initialize the color routines. 
+This must be called before any of the color routines are used.
+The terminal is setup to use the curses default colors of white foreground
+on black background, unless
+.Fn assume_default_colors
+or
+.Fn use_default_colors
+are called.
+.Ds
+.Ft "WINDOW *"
+.Fn subpad "WINDOW *win" "int lines" "int cols" "int begin_y" "int begin_x"
+.De
+Create a new pad with
+.Vn lines
+lines and
+.Vn cols
+columns starting at position
+.Vn begin\*_y\*,begin\*_x ) (
+inside the pad
+.i win .
+This means that any change made to either pad
+in the area covered
+by the subpad will be made on both pads.
+.Vn begin\*_y\*,begin\*_x
+are specified relative to the relative (0\*,0) of
+.Vn win .
+.Ds
+.Ft "WINDOW *"
+.Fn subwin "WINDOW *win" "int lines" "int cols" "int begin_y" "int begin_x"
+.De
+Create a new window with
+.Vn lines
+lines and
+.Vn cols
+columns starting at position
+.Vn begin\*_y\*,begin\*_x ) (
+inside the window
+.i win .
+This means that any change made to either window
+in the area covered
+by the subwindow will be made on both windows.
+.Vn begin\*_y\*,begin\*_x
+are specified relative to the overall screen,
+not the relative (0\*,0) of
+.Vn win .
+If either
+.Vn lines
+or
+.Vn cols
+is 0 (zero),
+that dimension will be set to
+.Vn "LINES \- begin\*_y" ) (
+or
+.Vn "COLS \- begin\*_x" ) (
+respectively.
+.Ds
+.Fn termattrs ""
+.De
+Returns the attributes that can be applied to the screen.
+.Ds
+.Fn term_attrs ""
+.De
+Returns the wide attributes that can be applied to the screen.
+.Ds
+.Fn timeout "int delay" \(dg
+.De
+Sets blocking or non-blocking
+.Fn getch .
+If
+.Vn delay
+is positive,
+.Fn getch
+will block for
+.Vn delay
+milliseconds before returning.  If
+.Vn delay
+is zero,
+.Fn getch
+will return ERR is no input is waiting.  If
+.Vn delay
+is negative,
+.Fn getch
+will block indefinitely.  See also
+.Fn keypad ,
+.Fn nodelay
+and
+.Fn notimeout .
+.Ds
+.Fn touchline "WINDOW *win" "int y" "int startx" "int endx"
+.De
+This function performs a function similar to
+.Fn touchwin
+on a single line.
+It marks the first change for the given line
+to be
+.Vn startx ,
+if it is before the current first change mark,
+and
+the last change mark is set to be
+.Vn endx
+if it is currently less than
+.Vn endx .
+.Ds
+.Fn touchoverlap "WINDOW *win1" "WINDOW *win2"
+.De
+Touch the window
+.Vn win2
+in the area which overlaps with
+.Vn win1 .
+If they do not overlap,
+no changes are made.
+.Ds
+.Fn touchwin "WINDOW *win"
+.De
+Make it appear that the every location on the window
+has been changed.
+This is usually only needed for refreshes with overlapping windows.
+.Ds
+.Fn tstp
+.De
+This function
+will save the current tty state
+and then put the process to sleep.
+When the process gets restarted,
+it restores the saved tty state
+and then calls
+.Fn wrefresh "curscr"
+to redraw the screen.
+.Fn Initscr
+sets the signal
+SIGTSTP
+to trap to this routine.
+.Ds
+.Fn unctrl "char *ch" \(dg
+.De
+Returns a string which is an ASCII representation of
+.Vn ch .
+Characters are 8 bits long.
+.Ds
+.Fn unctrllen "char *ch" \(dg
+.De
+Returns the length of the ASCII representation of
+.Vn ch .
+.ne 1i
+.Ds
+.Fn underend "" \(dg
+.De
+End underscore mode initiated by
+.Fn underscore .
+This is equivalent to
+.Fn attroff "A_UNDERLINE" .
+.Ds
+.Fn underscore "" \(dg
+.De
+Causes any characters added to the window
+to be put in underscore mode on the terminal
+(if it has that capability).
+This is equivalent to
+.Fn attron "A_UNDERLINE" .
+.Ds
+.Fn ungetch "int c"
+.De
+Places the contents of
+.Vn c
+converted to a character back into the input queue.  Only one
+character of push back before a subsequent call to
+.Fn getch
+or
+.Fn wgetch
+is guaranteed to function correctly.  The results of attempting more
+than one character of push back is undefined.
+.Ds
+.Fn untouchwin "WINDOW *win"
+.De
+Make the window appear to have not been updated even if it has been.
+.Ds
+.Fn use_default_colors ""
+.De
+Use the terminal foreground and background colors as the curses default
+foreground and background colors.
+.Ds
+.Fn vline "chtype ch" "int count"
+.De
+Draws a vertical line of character
+.Vn ch
+starting at the current cursor location and moving towards the bottom
+of the screen.  At most
+.Vn count
+characters are drawn, less if the bottom of the screen is reached
+before
+.Vn count
+expires.
+.Ds
+.Fn vwprintw "WINDOW *win" "const char *fmt" "va_list ap"
+.De
+Identical to
+.Fn printw
+except that it takes both a window specification and a pointer to a variable
+length argument list.
+.Ds
+.Fn vwscanw "WINDOW *win" "const char *fmt" "va_list ap"
+.De
+Identical to
+.Fn scanw
+except that it takes both a window specification and a pointer to a variable
+length argument list.
+.Ds
+.Fn wnoutrefresh "WINDOW *win"
+.De
+Add the window contents to a virtual screen.  Several windows can be added
+before a call to
+.Fn doupdate ,
+thus allowing the screen to updated in an efficient manner.
+.Ds
+.Fn wredrawln "WINDOW *win" "int line" "int n" \(dg
+.De
+Mark
+.Vn n
+lines starting at
+.Vn line
+in the window as corrupted.
+This is equivalent to
+.Fn wtouchln "win" "line" "n" "1" .
+.Ds
+.Fn wresize "WINDOW *win" "int lines" "int columns"
+.De
+Resize the specified window to the given dimensions.  The window will be
+cleared and the application is expected to redraw the window contents.
+.Ds
+.Fn wtouchln "WINDOW *win" "int line" "int n" "int changed"
+.De
+If 
+.Vn changed
+is 1 then 
+.Vn n
+lines starting at
+.Vn line
+in the window are touched.  If
+.Vn changed
+is 0 then 
+.Vn n
+lines starting at
+.Vn line
+in the window are untouched.
+.sp 2
+.pp
+\fIThe following functions differ from the standard functions only in their
+specification of a window, rather than the use of the default
+.Vn stdscr.\fP
+.Ds
+.Fn waddbytes "WINDOW *win" "char* str" "int len"
+.Fn waddch "WINDOW *win" "chtype ch"
+.Fn waddchnstr "WINDOW *win" "chtype *str" "int len"
+.Fn waddchstr "WINDOW *win" "chtype *str" "int len"
+.Fn waddnstr "WINDOW *win" "char *str" "int len"
+.Fn waddstr "WINDOW *win" "char *str"
+.Fn wattroff "WINDOW *win" "int attr"
+.Fn wattron "WINDOW *win" "int attr"
+.Fn wattrset "WINDOW *win" "int attr"
+.Fn wbkgd "WINDOW *win" "chtype ch"
+.Fn wbkgdset "WINDOW *win" "chtype ch"
+.Fn wborder "WINDOW *win" "chtype left" "chtype right" "chtype top" "chtype bottom" "chtype topleft" "chtype topright" "chtype botleft" "chtype botright"
+.Fn wclear "WINDOW *win"
+.Fn wclrtobot "WINDOW *win"
+.Fn wclrtoeol "WINDOW *win"
+.Fn wdelch "WINDOW *win"
+.Fn wdeleteln "WINDOW *win"
+.Fn wechochar "WINDOW *win" "chtype ch"
+.Fn werase "WINDOW *win"
+.Fn wgetch "WINDOW *win"
+.Fn wgetnstr "WINDOW *win" "char *str" "int len"
+.Fn wgetstr "WINDOW *win" "char *str"
+.Fn whline "WINDOW *win" "chtype ch" "int count"
+.Fn winch "WINDOW *win" \(dg
+.Fn winchnstr "WINDOW *win" "chtype *chstr" "int n"
+.Fn winchstr "WINDOW *win" "chtype *chstr"
+.Fn winnstr "WINDOW *win" "char *str" "int n"
+.Fn winsch "WINDOW *win" "char c"
+.Fn winsdelln "WINDOW *win" "int n"
+.Fn winsertln "WINDOW *win"
+.Fn winstr "WINDOW *win" "char *str"
+.Fn wmove "WINDOW *win" "int y" int x"
+.Fn wprintw "WINDOW *win" "char *fmt" "..."
+.Fn wrefresh "WINDOW *win"
+.Fn wscanw "WINDOW *win" "char *fmt" "..."
+.Fn wscrl "WINDOW *win" "int n"
+.Fn wstandend "WINDOW *win"
+.Fn wstandout "WINDOW *win"
+.Fn wtimeout "WINDOW *win" "int delay"
+.Fn wunderend "WINDOW *win"
+.Fn wunderscore "WINDOW *win"
+.Fn wvline "WINDOW *win" "chtype ch" "int count"
+.Fn mvwaddch "WINDOW *win" "int y" "int x" "chtype ch"
+.Fn mvwaddchstr "WINDOW *win" "int y" "int x" "chtype *str" \(dg
+.Fn mvwaddchnstr "WINDOW *win" "int y" "int x" "chtype *str" \(dg
+.Fn mvwaddnstr "WINDOW *win" "int y" "int x" "char *str" "int len"
+.Fn mvwaddstr "WINDOW *win" "int y" "int x" "char *str"
+.Fn mvwgetnstr "WINDOW *win" "int y" "int x" "char *str" "int len"
+.Fn mvwgetstr "WINDOW *win" "int y" "int x" "char *str"
+.Fn mvwhline "WINDOW *win" "int y" "int x" "chtype ch" "int count"
+.Fn mvwvline "WINDOW *win" "int y" "int x" "chtype ch" "int count"
+
+.Dg
diff --git a/lib/libcurses/PSD.doc/intro.0 b/lib/libcurses/PSD.doc/intro.0
new file mode 100644 (file)
index 0000000..ae6b808
--- /dev/null
@@ -0,0 +1,104 @@
+.\"    $NetBSD: intro.0,v 1.6 2003/08/07 16:44:27 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)intro.0     8.1 (Berkeley) 6/4/93
+.\"
+.tp
+.(l C
+.ps 12
+.ft B
+Screen Updating and Cursor Movement Optimization:
+.fl
+A Library Package
+.ft
+.ps
+.sp
+.i "Kenneth C. R. C. Arnold"
+.i "Elan Amir"
+.sp
+Computer Science Division
+Department of Electrical Engineering and Computer Science
+University of California, Berkeley
+Berkeley, California  94720
+.sp 3
+.bi ABSTRACT
+.sp 2
+.)l
+.(q
+.pp
+This document describes a package of C library functions
+which allow the user to:
+.ie t .ip \ \ \ \(bu
+.el .ip 1)
+update a screen with reasonable optimization,
+.ie t .ip \ \ \ \(bu
+.el .ip 2)
+get input from the terminal
+in a screen-oriented fashion,
+and
+.ie t .ip \ \ \ \(bu
+.el .ip 3)
+independent from the above, move the cursor optimally
+from one point to another.
+.pp
+These routines all use the
+\*(tc \*(db to describe the capabilities of the terminal.
+.)q
+.b Acknowledgements
+.pp
+This package would not exist
+without the work of Bill Joy,
+who,
+in writing his editor,
+created the capability to generally describe terminals,
+wrote the routines which read this \*(db,
+and, most importantly,
+those which implement optimal cursor movement,
+which routines I have simply lifted nearly intact.
+Doug Merritt and Kurt Shoens also were extremely important,
+as were both willing to waste time listening to me rant and rave.
+The help and/or support of
+Ken Abrams,
+Alan Char,
+Mark Horton,
+and
+Joe Kalash,
+was, and is,
+also greatly appreciated.
+.i "Ken Arnold    16 April 1986"
+.pp
+The help and/or support of Kirk McKusick and Keith Bostic (public vi!)
+was invaluable in bringing the package ``into the 90's'', which now
+includes completely new data structures and screen refresh optimization
+routines.
+.i "Elan Amir   29 December 1992"
+
+
+
+
diff --git a/lib/libcurses/PSD.doc/intro.1 b/lib/libcurses/PSD.doc/intro.1
new file mode 100644 (file)
index 0000000..14d1e39
--- /dev/null
@@ -0,0 +1,247 @@
+.\"    $NetBSD: intro.1,v 1.7 2003/08/07 16:44:27 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)intro.1     8.1 (Berkeley) 6/4/93
+.\"
+.bp
+.sh 1 Overview
+.pp
+In making available the generalized terminal descriptions in \*(tc,
+much information was made available to the programmer,
+but little work was taken out of one's hands.
+The purpose of this package is to allow the C programmer
+to do the most common type of terminal dependent functions,
+those of movement optimization and optimal screen updating,
+without doing any of the dirty work,
+and with nearly as much ease as is necessary to simply print
+or read things.
+.sh 2 "Terminology"
+.pp
+In this document, the following terminology is used:
+.de Ip
+.sp
+.in 5n
+.ti 0n
+.b "\\$1" :
+..
+.Ip window
+An internal representation
+containing an image of what a section of the terminal screen may look like
+at some point in time.
+This subsection can either encompass the entire terminal screen,
+or any smaller portion down to a single character within that screen.
+.Ip terminal
+Sometimes called
+.b terminal
+.b screen .
+The package's idea of what the terminal's screen currently looks like,
+.i i.e. ,
+what the user sees now.
+This is a special
+.i screen :
+.Ip screen
+This is a subset of windows which are as large as the terminal screen,
+.i i.e. ,
+they start at the upper left hand corner
+and encompass the lower right hand corner.
+One of these,
+.Vn stdscr ,
+is automatically provided for the programmer.
+.rm Ip
+.sh 2 "Compiling Applications"
+.pp
+In order to use the library,
+it is necessary to have certain types and variables defined.
+Therefore, the programmer must have a line:
+.(l
+.b "#include <curses.h>"
+.)l
+at the top of the program source.
+Compilations should have the following form:
+.(l
+.ie t \fBcc\fR [ \fIflags\fR ] file ... \fB\-lcurses \-ltermcap\fR
+.el \fIcc\fR [ flags ] file ... \fI\-lcurses \-ltermcap\fR
+.)l
+.sh 2 "Screen Updating"
+.pp
+In order to update the screen optimally,
+it is necessary for the routines to know what the screen currently looks like
+and what the programmer wants it to look like next.
+For this purpose,
+a data type
+(structure)
+named
+.Vn WINDOW
+is defined
+which describes a window image to the routines,
+including its starting position on the screen
+(the \*y of the upper left hand corner)
+and its size.
+One of these
+(called
+.Vn curscr
+for
+.i "current screen" )
+is a screen image of what the terminal currently looks like.
+Another screen
+(called
+.Vn stdscr ,
+for
+.i "standard screen" )
+is provided
+by default
+to make changes on.
+.pp
+A window is a purely internal representation.
+It is used to build and store
+a potential image of a portion of the terminal.
+It doesn't bear any necessary relation
+to what is really on the terminal screen.
+It is more like an array of characters on which to make changes.
+.pp
+When one has a window which describes
+what some part the terminal should look like,
+the routine
+.Fn refresh
+(or
+.Fn wrefresh
+if the window is not
+.Vn stdscr )
+is called.
+.Fn refresh
+makes the terminal,
+in the area covered by the window,
+look like that window.
+Note, therefore, that changing something on a window
+.i does
+.bi not
+.i "change the terminal" .
+Actual updates to the terminal screen
+are made only by calling
+.Fn refresh
+or
+.Fn wrefresh .
+This allows the programmer to maintain several different ideas
+of what a portion of the terminal screen should look like.
+Also, changes can be made to windows in any order,
+without regard to motion efficiency.
+Then, at will,
+the programmer can effectively say
+.q "make it look like this" ,
+and the package will execute the changes in an optimal way.
+.sh 2 "Naming Conventions"
+.pp
+As hinted above,
+the routines can use several windows,
+but two are always available:
+.Vn curscr ,
+which is the image of what the terminal looks like at present,
+and
+.Vn stdscr ,
+which is the image of what the programmer wants the terminal to look like next.
+The user should not access
+.Vn curscr
+directly.
+Changes should be made to
+the appropriate screen,
+and then the routine
+.Fn refresh
+(or
+.Fn wrefresh )
+should be called.
+.pp
+Many functions are set up to deal with
+.Vn stdscr
+as a default screen.
+For example, to add a character to
+.Vn stdscr ,
+one calls
+.Fn addch
+with the desired character.
+If a different window is to be used,
+the routine
+.Fn waddch
+(for
+.b w indow-specific
+.Fn addch )
+is provided\**.
+.(f
+\**
+Actually,
+.Fn addch
+is really a
+.q #define
+macro with arguments,
+as are most of the "functions" which act upon
+.Vn stdscr .
+.)f
+This convention of prepending function names with a
+.Bq w
+when they are to be applied to specific windows
+is consistent.
+The only routines which do
+.i not
+do this are those
+to which a window must always be specified.
+.pp
+In order to move the current \*y from one point to another,
+the routines
+.Fn move
+and
+.Fn wmove
+are provided.
+However,
+it is often desirable to first move and then perform some I/O operation.
+In order to avoid clumsiness,
+most I/O routines can be preceded by the prefix
+.Bq mv
+and the desired \*y can then be added to the arguments to the function.
+For example,
+the calls
+.(l
+move(y\*,x);
+addch(ch);
+.)l
+can be replaced by
+.(l
+mvaddch(y\*,x\*,ch);
+.)l
+and
+.(l
+wmove(win\*,y\*,x);
+waddch(win\*,ch);
+.)l
+can be replaced by
+.(l
+mvwaddch(win\*,y\*,x\*,ch);
+.)l
+Note that the window description pointer
+.Vn win ) (
+comes before the added \*y.
+If a window pointer is needed, it is always the first parameter passed.
diff --git a/lib/libcurses/PSD.doc/intro.2 b/lib/libcurses/PSD.doc/intro.2
new file mode 100644 (file)
index 0000000..be3d468
--- /dev/null
@@ -0,0 +1,82 @@
+.\"    $NetBSD: intro.2,v 1.8 2003/08/07 16:44:28 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)intro.2     8.1 (Berkeley) 6/4/93
+.\"
+.sh 1 Variables
+.pp
+Many variables which are used to describe the terminal environment
+are available to the programmer.
+They are:
+.(b
+.TS
+expand;
+lw(6m) lw(8n) lw(50n).
+type   name    description
+_
+WINDOW *       curscr  T{
+.fi
+current version of the screen (terminal screen).
+T}
+WINDOW *       stdscr  T{
+standard screen.
+Most updates are usually done here.
+T}
+char * Def\*_term      T{
+default terminal type if type cannot be determined
+T}
+bool   My\*_term       T{
+use the terminal specification in \fIDef\*_term\fR as terminal,
+irrelevant of real terminal type
+T}
+char * ttytype T{
+full name of the current terminal.
+T}
+int    LINES   T{
+number of lines on the terminal
+T}
+int    COLS    T{
+number of columns on the terminal
+T}
+int    COLORS  T{
+number of colors on the terminal
+T}
+int    COLOR_PAIRS     T{
+number of color pairs on the terminal
+T}
+int    ERR     T{
+error flag returned by routines on a fail.
+T}
+int    OK      T{
+flag returned by routines upon success.
+T}
+.TE
+.fi
+.)b
+.lp
diff --git a/lib/libcurses/PSD.doc/intro.3 b/lib/libcurses/PSD.doc/intro.3
new file mode 100644 (file)
index 0000000..2d67b82
--- /dev/null
@@ -0,0 +1,228 @@
+.\"    $NetBSD: intro.3,v 1.9 2003/11/02 11:16:03 wiz Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)intro.3     8.1 (Berkeley) 6/4/93
+.\"
+.sh 1 Usage
+.pp
+This is a description of how to actually use the screen package.
+For simplicity, we assume all updating, reading, etc.
+is applied to
+.Vn stdscr ,
+although a different window can of course be specified.
+.sh 2 "Initialization"
+.pp
+In order to use the screen package,
+the routines must know about terminal characteristics,
+and the space for
+.Vn curscr
+and
+.Vn stdscr
+must be allocated.
+These functions are performed by
+.Fn initscr .
+Since it must allocate space for the windows,
+it can overflow core when attempting to do so.
+On this rather rare occasion,
+.Fn initscr
+returns ERR.
+.Fn initscr
+must
+.bi always
+be called before any of the routines which affect windows are used.
+If it is not,
+the program will core dump as soon as either
+.Vn curscr
+or
+.Vn stdscr
+are referenced.
+However, it is usually best to wait to call it
+until after you are sure you will need it,
+like after checking for startup errors.
+Terminal status changing routines
+like
+.Fn nl
+and
+.Fn cbreak
+should be called after
+.Fn initscr .
+.pp
+After the initial window allocation done by
+.Fn initscr ,
+specific window characteristics can be set.
+Scrolling can be enabled by calling
+.Fn scrollok .
+If you want the cursor to be left after the last change, use
+.Fn leaveok .
+If this isn't done,
+.Fn refresh
+will move the cursor to the window's current \*y after updating it.
+Additional windows can be created by using the functions
+.Fn newwin
+and
+.Fn subwin .
+.Fn delwin
+allows you to delete an existing window.
+The variables
+.Vn LINES
+and
+.Vn COLS
+control the size of the terminal.
+They are initially implicitly set by
+.Fn initscr ,
+but can be altered explicitly by the user followed by a call to
+.Fn initscr .
+Note that any call to
+.Fn initscr ,
+will always delete any existing
+.Vn stdscr
+and/or
+.Vn curscr
+before creating new ones so this change is best done before the initial call to
+.Fn initscr .
+.pp
+.sh 2 "Output"
+.pp
+The basic functions
+used to change what will go on a window are
+.Fn addch
+and
+.Fn move .
+.Fn addch
+adds a character at the current \*y,
+returning ERR if it would cause the window to illegally scroll,
+.i i.e. ,
+printing a character in the lower right-hand corner
+of a terminal which automatically scrolls
+if scrolling is not allowed.
+.Fn move
+changes the current \*y to whatever you want them to be.
+It returns ERR if you try to move off the window.
+As mentioned above, you can combine the two into
+.Fn mvaddch
+to do both things in one call.
+.pp
+The other output functions
+(such as
+.Fn addstr
+and
+.Fn printw )
+all call
+.Fn addch
+to add characters to the window.
+.pp
+After a change has been made to the window,
+you must call
+.Fn refresh .
+when you want the portion of the terminal covered by the window
+to reflect the change.
+In order to optimize finding changes,
+.Fn refresh
+assumes that any part of the window not changed
+since the last
+.Fn refresh
+of that window has not been changed on the terminal,
+.i i.e. ,
+that you have not refreshed a portion of the terminal
+with an overlapping window.
+If this is not the case,
+the routines
+.Fn touchwin ,
+.Fn touchline ,
+and
+.Fn touchoverlap
+are provided to make it look like a desired part of window has been changed,
+thus forcing
+.Fn refresh
+to check that whole subsection of the terminal for changes.
+.pp
+If you call
+.Fn wrefresh
+with
+.Vn curscr ,
+it will make the screen look like the image of
+.Vn curscr .
+This is useful for implementing a command
+which would redraw the screen in case it got messed up.
+.sh 2 Input
+.pp
+Input is essentially a mirror image of output.
+The complementary function to
+.Fn addch
+is
+.Fn getch
+which,
+if echo is set,
+will call
+.Fn addch
+to echo the character.
+Since the screen package needs to know what is on the terminal at all times,
+if characters are to be echoed,
+the tty must be in raw or cbreak mode.
+If it is not,
+.Fn getch
+sets it to be cbreak,
+and then reads in the character.
+.sh 2 "Termination"
+.pp
+In order to perform certain optimizations,
+and,
+on some terminals,
+to work at all,
+some things must be done
+before the screen routines start up.
+These functions are performed in
+.Fn getttmode
+and
+.Fn setterm ,
+which are called by
+.Fn initscr .
+In order to clean up after the routines,
+the routine
+.Fn endwin
+is provided.
+It restores tty modes to what they were
+when
+.Fn initscr
+was first called.
+The terminal state module uses the variable
+.Vn curses_termios
+to save the original terminal state which is then restored upon a call to
+.Fn endwin .
+Thus,
+anytime after the call to initscr,
+.Fn endwin
+should be called before exiting.
+Note however, that
+.Fn endwin
+should always be called
+.b before
+the final calls to
+.Fn delwin ,
+which free the storage of the windows.
diff --git a/lib/libcurses/PSD.doc/intro.4 b/lib/libcurses/PSD.doc/intro.4
new file mode 100644 (file)
index 0000000..af62690
--- /dev/null
@@ -0,0 +1,67 @@
+.\"    $NetBSD: intro.4,v 1.5 2003/08/07 16:44:28 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)intro.4     8.1 (Berkeley) 6/4/93
+.\"
+.sh 1 "Cursor Movement Optimizations"
+.pp
+One of the most difficult things to do properly is motion optimization.
+After using
+.Fn gettmode
+and
+.Fn setterm
+to get the terminal descriptions,
+the function
+.Fn mvcur
+deals with this task.
+It usage is simple:
+simply tell it where you are now and where you want to go.
+For example
+.(l
+mvcur(0\*,0\*,LINES/2\*,COLS/2);
+.)l
+.lp
+would move the cursor from the home position (0\*,0)
+to the middle of the screen.
+If you wish to force absolute addressing,
+you can use the function
+.Fn tgoto
+from the
+.b termlib (7)
+routines,
+or you can tell
+.Fn mvcur
+that you are impossibly far away,
+For example,
+to absolutely address the lower left hand corner of the screen
+from anywhere
+just claim that you are in the upper right hand corner:
+.(l
+mvcur(0\*,COLS\-1\*,LINES\-1\*,0);
+.)l
diff --git a/lib/libcurses/PSD.doc/intro.5 b/lib/libcurses/PSD.doc/intro.5
new file mode 100644 (file)
index 0000000..50bd75a
--- /dev/null
@@ -0,0 +1,90 @@
+.\"    $NetBSD: intro.5,v 1.8 2003/11/02 11:16:03 wiz Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)intro.5     8.1 (Berkeley) 6/4/93
+.\"
+.sh 1 "Character Output and Scrolling"
+.pp
+The character output policy deals with the following problems.
+First, where is the location of the cursor after a character is printed, and
+secondly, when does the screen scroll if scrolling is enabled.
+.pp
+In the normal case the characters are output as expected, with the cursor
+occupying the position of the next character to be output.
+However, when the
+cursor is on the last column of the line, the cursor will remain on that
+position after the last character on the line is output and will only assume
+the position on the next line when the next character (the first on the next
+line) is output.
+.pp
+Likewise, if scrolling is enabled, a scroll will be invoked only when the
+first character on he first line past the bottom line of the window is
+output.
+If scrolling is not enabled the chracters will to be output to the
+bottom right corner of the window which is the cursor location.
+.pp
+This policy allows consistent behavior of the cursor at the boundary
+conditions.
+Furthermore, it prevents a scroll from happening before it is
+actually needed (the old package used to scroll when the bottom right position
+was output a character).
+As a precedent, it models the
+.i xterm
+character output conventions.
+.sh 1 "Terminal State Handling"
+.pp
+The variable
+.Vn curses_termios
+contains the terminal state of the terminal.
+Certain historical routines return information:
+.Fn baudrate ,
+.Fn erasechar ,
+.Fn killchar ,
+and
+.Fn ospeed .
+These routines are obsolete and exist only for backward compatibility.
+If you wish to use the information in the
+.Vn curses_termios
+structure, you should use the
+\fItsetattr\fP(3)
+routines.
+.sh 1 "Subwindows"
+.pp
+Subwindows are windows which do not have an independent text structure,
+.i i.e. ,
+they are windows whose text is a subset of the text of a larger window: the
+.i parent
+window.
+One consequence of this is that changes to either the parent or the
+child window are destructive to the other,
+.i i.e. ,
+a change to the subwindow is also a change to the parent window and a change
+to the parent window in the region defined by the subwindow is implicitly a
+change to the subwindow as well.
+Apart from this detail, subwindows function like any other window.
diff --git a/lib/libcurses/PSD.doc/intro.6 b/lib/libcurses/PSD.doc/intro.6
new file mode 100644 (file)
index 0000000..7a16eba
--- /dev/null
@@ -0,0 +1,44 @@
+.\"    $NetBSD: intro.6,v 1.6 2003/08/07 16:44:28 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)intro.6     8.1 (Berkeley) 6/4/93
+.\"
+.sh 1 "The Functions"
+.pp
+In the following definitions,
+.q \*m
+means that if
+.Vn _CURSES_USE_MACROS
+is defined, the
+.q function
+is really a
+.q #define
+macro with arguments.
+.ta 11m 17m 25m 33m 41m 49m 57m 65m 73m
+.so fns.doc
diff --git a/lib/libcurses/PSD.doc/life.c b/lib/libcurses/PSD.doc/life.c
new file mode 100644 (file)
index 0000000..72a1594
--- /dev/null
@@ -0,0 +1,161 @@
+.\"    $NetBSD: life.c,v 1.6 2003/08/07 16:44:28 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"     The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)life.c      8.1 (Berkeley) 6/8/93
+.\"
+# include      <curses.h>
+# include      <signal.h>
+
+/*
+ *     Run a life game.  This is a demonstration program for
+ * the Screen Updating section of the -lcurses cursor package.
+ */
+
+typedef struct lst_st {                        /* linked list element */
+       int             y, x;           /* (y, x) position of piece */
+       struct lst_st   *next, *last;   /* doubly linked */
+} LIST;
+
+LIST   *Head;                  /* head of linked list */
+
+int    die();
+
+main(ac, av)
+int    ac;
+char   *av[];
+{
+       evalargs(ac, av);               /* evaluate arguments */
+
+       initscr();                      /* initialize screen package */
+       signal(SIGINT, die);            /* set to restore tty stats */
+       cbreak();                       /* set for char-by-char */
+       noecho();                       /*      input */
+       nonl();                         /* for optimization */
+
+       getstart();                     /* get starting position */
+       for (;;) {
+               prboard();              /* print out current board */
+               update();               /* update board position */
+       }
+}
+
+/*
+ * This is the routine which is called when rubout is hit.
+ * It resets the tty stats to their original values.  This
+ * is the normal way of leaving the program.
+ */
+die()
+{
+       signal(SIGINT, SIG_IGN);                /* ignore rubouts */
+       mvcur(0, COLS - 1, LINES - 1, 0);       /* go to bottom of screen */
+       endwin();                               /* set terminal to good state */
+       exit(0);
+}
+
+/*
+ * Get the starting position from the user.  They keys u, i, o, j, l,
+ * m, ,, and . are used for moving their relative directions from the
+ * k key.  Thus, u move diagonally up to the left, , moves directly down,
+ * etc.  x places a piece at the current position, " " takes it away.
+ * The input can also be from a file.  The list is built after the
+ * board setup is ready.
+ */
+getstart()
+{
+       reg char        c;
+       reg int         x, y;
+       auto char       buf[100];
+
+       box(stdscr, '|', '_');          /* box in the screen */
+       move(1, 1);                     /* move to upper left corner */
+
+       for (;;) {
+               refresh();              /* print current position */
+               if ((c = getch()) == 'q')
+                       break;
+               switch (c) {
+                 case 'u':
+                 case 'i':
+                 case 'o':
+                 case 'j':
+                 case 'l':
+                 case 'm':
+                 case ',':
+                 case '.':
+                       adjustyx(c);
+                       break;
+                 case 'f':
+                       mvaddstr(0, 0, "File name: ");
+                       getstr(buf);
+                       readfile(buf);
+                       break;
+                 case 'x':
+                       addch('X');
+                       break;
+                 case ' ':
+                       addch(' ');
+                       break;
+               }
+       }
+
+       if (Head != NULL)                       /* start new list */
+               dellist(Head);
+       Head = malloc(sizeof (LIST));
+
+       /*
+        * loop through the screen looking for 'x's, and add a list
+        * element for each one
+        */
+       for (y = 1; y < LINES - 1; y++)
+               for (x = 1; x < COLS - 1; x++) {
+                       move(y, x);
+                       if (inch() == 'x')
+                               addlist(y, x);
+               }
+}
+
+/*
+ * Print out the current board position from the linked list
+ */
+prboard() {
+
+       reg LIST        *hp;
+
+       erase();                        /* clear out last position */
+       box(stdscr, '|', '_');          /* box in the screen */
+
+       /*
+        * go through the list adding each piece to the newly
+        * blank board
+        */
+       for (hp = Head; hp; hp = hp->next)
+               mvaddch(hp->y, hp->x, 'X');
+
+       refresh();
+}
diff --git a/lib/libcurses/PSD.doc/macros b/lib/libcurses/PSD.doc/macros
new file mode 100644 (file)
index 0000000..a4773b4
--- /dev/null
@@ -0,0 +1,143 @@
+.\"    $NetBSD: macros,v 1.8 2004/04/27 02:15:04 uwe Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)macros      8.1 (Berkeley) 8/14/93
+.\"
+.\" this is the uncommented version.  The commented one is in "macros.coms"
+.ie t .ds _ \d\(mi\u
+.el .ds _ _
+.ds , ,\ \" attention: trailing space
+.ds y (y\*,x) co-ordinates
+.ds db database
+.ie n .ds f \fI
+.el .ds f \fB
+.ds tc \*ftermcap\fP(5)
+.ds Es This returns ERR if it would cause the screen to scroll illegally.
+.ds Nm This has no associated \*(lq\fBmv\fP\*(rq command.
+.ie t .ds m \fB\s-2\(dg\s+2\fP
+.el .ds m [*]
+.\" .hy WINDOW
+.\".he ''\*(Ln''
+.\".fo ''\- % \-''
+.oh '\*(Ln''PS1:19-%'
+.eh 'PS1:19-%''\*(Ln'
+.de Un
+.b
+\s-2\\$2UNIX\\$1\s+2
+.ft
+..
+.de Ds
+.sp
+.lp
+.ev 1
+.nf
+.ft I
+.in 0
+.di
+.Df
+..
+.de De
+.di
+.Df
+.ne \n(dn+2
+.ev
+.ip
+..
+.de Dg
+.di
+.Df
+.ne \n(dn+2
+.ev
+..
+.de Fd
+.br
+\&\\$4
+.fi
+.b
+\&\\$1(\\$2)
+.ft
+\&\\$3
+.br
+.nf
+..
+.de Vn
+\&\\$3\c
+.i "\\$1" \\$2
+..
+.de Bq
+.ie t \&\*(lq\fB\\$1\fP\*(rq
+.el \&\*(lq\fI\\$1\fP\*(rq
+..
+.de $0
+.(x
+.in \\n(Xs
+\\*($n \\$1
+.)x
+..
+.de $1
+.nr Xs 0
+..
+.de $2
+.nr Xs 3
+..
+.de $3
+.nr Xs 6
+..
+.de Fn
+.if \\n(.$==0 .tm error
+.nr ll 0
+.nr dg 0
+.ft R
+.if '\\$\\n(.$'.' .nr ll 1
+.if '\\$\\n(.$',' .nr ll 1
+.if '\\$\\n(.$')' .nr ll 1
+.if '\\$\\n(.$').' .nr ll 1
+.if '\\$\\n(.$';' .nr ll 1
+.if '\\$\\n(.$':' .nr ll 1
+.if '\\$\\n(.$'\'s' .nr ll 1
+.if '\\$\\n(.$'\(dg' .nr ll 1
+.\" .if '\\$\\n(.$'' .nr ll 1
+.nr al \\n(.$-\\n(ll
+.ds ot \f(CB\\$1\fP(
+.if \\n(al>1 .as ot \fI\\$2\fP
+.if \\n(al>2 .as ot ", \fI\\$3\fP
+.if \\n(al>3 .as ot ", \fI\\$4\fP
+.if \\n(al>4 .as ot ", \fI\\$5\fP
+.if \\n(al>5 .as ot ", \fI\\$6\fP
+.if \\n(al>6 .as ot ", \fI\\$7\fP
+.if \\n(al>7 .as ot ", \fI\\$8\fP
+.if \\n(al>8 .as ot ", \fI\\$9\fP
+.as ot )
+.if \\n(.$>1 \{\
+.       if \\n(ll==0 .as ot ;
+.       if '\\$\\n(.$'\(dg' .as ot ;
+.\}
+.if \\n(ll==1 .as ot \\$\\n(.$
+\\*(ot
+..
diff --git a/lib/libcurses/PSD.doc/twinkle1.c b/lib/libcurses/PSD.doc/twinkle1.c
new file mode 100644 (file)
index 0000000..c37d2a0
--- /dev/null
@@ -0,0 +1,161 @@
+/*     $NetBSD: twinkle1.c,v 1.6 2005/05/23 04:04:49 christos Exp $    */
+
+/*
+ * 
+ *  Copyright (c) 1980, 1993
+ *      The Regents of the University of California.  All rights reserved.
+ * 
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. Neither the name of the University nor the names of its contributors
+ *     may be used to endorse or promote products derived from this software
+ *     without specific prior written permission.
+ * 
+ *  THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ *  ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ *  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ *  SUCH DAMAGE.
+ * 
+ *     @(#)twinkle1.c  8.1 (Berkeley) 6/8/93
+ */ 
+#include       <curses.h>
+#include       <signal.h>
+
+/*
+ * the idea for this program was a product of the imagination of
+ * Kurt Schoens.  Not responsible for minds lost or stolen.
+ */
+
+#define        NCOLS   80
+#define        NLINES  24
+#define        MAXPATTERNS     4
+
+typedef struct {
+       int     y, x;
+} LOCS;
+
+static LOCS    Layout[NCOLS * NLINES]; /* current board layout */
+
+static int     Pattern,                /* current pattern number */
+               Numstars;               /* number of stars in pattern */
+
+static void puton(char);
+static void makeboard(void);
+static int ison(int, int);
+static void die(int);
+
+int
+main(void)
+{
+       srand(getpid());                /* initialize random sequence */
+
+       initscr();
+       signal(SIGINT, die);
+       noecho();
+       nonl();
+       leaveok(stdscr, TRUE);
+       scrollok(stdscr, FALSE);
+
+       for (;;) {
+               makeboard();            /* make the board setup */
+               puton('*');             /* put on '*'s */
+               puton(' ');             /* cover up with ' 's */
+       }
+}
+
+/*
+ * On program exit, move the cursor to the lower left corner by
+ * direct addressing, since current location is not guaranteed.
+ * We lie and say we used to be at the upper right corner to guarantee
+ * absolute addressing.
+ */
+static void
+die(int n)
+{
+       signal(SIGINT, SIG_IGN);
+       mvcur(0, COLS - 1, LINES - 1, 0);
+       endwin();
+       exit(n);
+}
+
+
+/*
+ * Make the current board setup.  It picks a random pattern and
+ * calls ison() to determine if the character is on that pattern
+ * or not.
+ */
+static void
+makeboard(void)
+{
+       int             y, x;
+       LOCS    *lp;
+
+       Pattern = rand() % MAXPATTERNS;
+       lp = Layout;
+       for (y = 0; y < NLINES; y++)
+               for (x = 0; x < NCOLS; x++)
+                       if (ison(y, x)) {
+                               lp->y = y;
+                               lp->x = x;
+                               lp++;
+                       }
+       Numstars = lp - Layout;
+}
+
+/*
+ * Return TRUE if (y, x) is on the current pattern.
+ */
+static int
+ison(int y, int x)
+{
+       switch (Pattern) {
+         case 0:       /* alternating lines */
+               return !(y & 01);
+         case 1:       /* box */
+               if (x >= LINES && y >= NCOLS)
+                       return FALSE;
+               if (y < 3 || y >= NLINES - 3)
+                       return TRUE;
+               return (x < 3 || x >= NCOLS - 3);
+         case 2:       /* holy pattern! */
+               return ((x + y) & 01);
+         case 3:       /* bar across center */
+               return (y >= 9 && y <= 15);
+       }
+       /* NOTREACHED */
+}
+
+static void
+puton(char ch)
+{
+       LOCS    *lp;
+       int     r;
+       LOCS    *end;
+       LOCS    temp;
+
+       end = &Layout[Numstars];
+       for (lp = Layout; lp < end; lp++) {
+               r = rand() % Numstars;
+               temp = *lp;
+               *lp = Layout[r];
+               Layout[r] = temp;
+       }
+
+       for (lp = Layout; lp < end; lp++) {
+               mvaddch(lp->y, lp->x, ch);
+               refresh();
+       }
+}
diff --git a/lib/libcurses/PSD.doc/twinkle2.c b/lib/libcurses/PSD.doc/twinkle2.c
new file mode 100644 (file)
index 0000000..6fdc769
--- /dev/null
@@ -0,0 +1,207 @@
+/*     $NetBSD: twinkle2.c,v 1.6 2005/05/23 04:04:49 christos Exp $    */
+
+/*
+ * 
+ *  Copyright (c) 1980, 1993
+ *      The Regents of the University of California.  All rights reserved.
+ * 
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *  1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *  3. Neither the name of the University nor the names of its contributors
+ *     may be used to endorse or promote products derived from this software
+ *     without specific prior written permission.
+ * 
+ *  THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ *  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ *  ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ *  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ *  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ *  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ *  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ *  SUCH DAMAGE.
+ * 
+ *     @(#)twinkle2.c  8.1 (Berkeley) 6/8/93
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <curses.h>
+#include <signal.h>
+
+#define        NCOLS   80
+#define        NLINES  24
+#define        MAXPATTERNS     4
+
+typedef struct {
+       int     y, x;
+} LOCS;
+
+static LOCS    Layout[NCOLS * NLINES]; /* current board layout */
+
+static int     Pattern,                /* current pattern number */
+               Numstars;               /* number of stars in pattern */
+
+static void puton(char);
+static void die(int);
+static void makeboard(void);
+static int ison(int, int);
+
+static int AM;
+static char *VS;
+static char *TI;
+static char *CL;
+
+int
+main(void)
+{
+       char    *sp;
+       char    buf[1024];
+       char    *ptr = buf;
+
+       srand(getpid());                /* initialize random sequence */
+
+       if (isatty(0)) {
+               initscr();
+               gettmode();
+               if ((sp = getenv("TERM")) != NULL)
+                       setterm(sp);
+               signal(SIGINT, die);
+       }
+       else {
+               printf("Need a terminal on fd=%d\n", 0);
+               exit(1);
+       }
+
+       tgetent(buf, sp);
+
+       AM = tgetflag("am");
+       TI = tgetstr("ti", &ptr);
+       if (TI == NULL) {
+               printf("terminal does not have the ti capability\n");
+               exit(1);
+       }
+       VS = tgetstr("vs", &ptr);
+       if (VS == NULL) {
+               printf("terminal does not have the vs capability\n");
+               exit(1);
+       }
+       CL = tgetstr("cl", &ptr);
+       if (CL == NULL) {
+               printf("terminal does not have the cl capability\n");
+               exit(1);
+       }
+       puts(TI);
+       puts(VS);
+
+       noecho();
+       nonl();
+       tputs(CL, NLINES, putchar);
+       for (;;) {
+               makeboard();            /* make the board setup */
+               puton('*');             /* put on '*'s */
+               puton(' ');             /* cover up with ' 's */
+       }
+}
+
+/*
+ * On program exit, move the cursor to the lower left corner by
+ * direct addressing, since current location is not guaranteed.
+ * We lie and say we used to be at the upper right corner to guarantee
+ * absolute addressing.
+ */
+static void
+die(int n)
+{
+       signal(SIGINT, SIG_IGN);
+       mvcur(0, COLS - 1, LINES - 1, 0);
+       endwin();
+       exit(n);
+}
+
+static void
+puton(char ch)
+{
+       LOCS    *lp;
+       int             r;
+       LOCS    *end;
+       LOCS            temp;
+       static int      lasty, lastx;
+
+       end = &Layout[Numstars];
+       for (lp = Layout; lp < end; lp++) {
+               r = rand() % Numstars;
+               temp = *lp;
+               *lp = Layout[r];
+               Layout[r] = temp;
+       }
+
+       for (lp = Layout; lp < end; lp++)
+                       /* prevent scrolling */
+               if (!AM || (lp->y < NLINES - 1 || lp->x < NCOLS - 1)) {
+                       mvcur(lasty, lastx, lp->y, lp->x);
+                       putchar(ch);
+                       lasty = lp->y;
+                       if ((lastx = lp->x + 1) >= NCOLS)
+                               if (AM) {
+                                       lastx = 0;
+                                       lasty++;
+                               }
+                               else
+                                       lastx = NCOLS - 1;
+               }
+}
+
+/*
+ * Make the current board setup.  It picks a random pattern and
+ * calls ison() to determine if the character is on that pattern
+ * or not.
+ */
+static void
+makeboard(void)
+{
+       int             y, x;
+       LOCS    *lp;
+
+       Pattern = rand() % MAXPATTERNS;
+       lp = Layout;
+       for (y = 0; y < NLINES; y++)
+               for (x = 0; x < NCOLS; x++)
+                       if (ison(y, x)) {
+                               lp->y = y;
+                               lp->x = x;
+                               lp++;
+                       }
+       Numstars = lp - Layout;
+}
+
+/*
+ * Return TRUE if (y, x) is on the current pattern.
+ */
+static int
+ison(int y, int x)
+{
+       switch (Pattern) {
+         case 0:       /* alternating lines */
+               return !(y & 01);
+         case 1:       /* box */
+               if (x >= LINES && y >= NCOLS)
+                       return FALSE;
+               if (y < 3 || y >= NLINES - 3)
+                       return TRUE;
+               return (x < 3 || x >= NCOLS - 3);
+         case 2:       /* holy pattern! */
+               return ((x + y) & 01);
+         case 3:       /* bar across center */
+               return (y >= 9 && y <= 15);
+       }
+       /* NOTREACHED */
+}
diff --git a/lib/libcurses/PSD.doc/win_st.c b/lib/libcurses/PSD.doc/win_st.c
new file mode 100644 (file)
index 0000000..2bca054
--- /dev/null
@@ -0,0 +1,56 @@
+.\"    $NetBSD: win_st.c,v 1.5 2003/08/07 16:44:29 agc Exp $
+.\"
+.\" Copyright (c) 1980, 1993
+.\"     The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"    @(#)win_st.c    8.1 (Berkeley) 6/8/93
+.\"
+# define       WINDOW  struct _win_st
+
+struct _win_st {
+       short           _cury, _curx;
+       short           _maxy, _maxx;
+       short           _begy, _begx;
+       short           _flags;
+       short           _ch_off;
+       bool            _clear;
+       bool            _leave;
+       bool            _scroll;
+       char            **_y;
+       short           *_firstch;
+       short           *_lastch;
+       struct _win_st  *_nextp, *_orig;
+};
+
+# define       _ENDLINE        001
+# define       _FULLWIN        002
+# define       _SCROLLWIN      004
+# define       _FLUSH          010
+# define       _FULLLINE       020
+# define       _IDLINE         040
+# define       _STANDOUT       0200
+# define       _NOCHANGE       -1
diff --git a/lib/libcurses/acs.c b/lib/libcurses/acs.c
new file mode 100644 (file)
index 0000000..87e02db
--- /dev/null
@@ -0,0 +1,309 @@
+/*     $NetBSD: acs.c,v 1.19 2010/02/25 10:56:24 drochner Exp $        */
+
+/*
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: acs.c,v 1.19 2010/02/25 10:56:24 drochner Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+chtype _acs_char[NUM_ACS];
+#ifdef HAVE_WCHAR
+#include <assert.h>
+#include <locale.h>
+#include <langinfo.h>
+#include <strings.h>
+
+cchar_t _wacs_char[ NUM_ACS ];
+#endif /* HAVE_WCHAR */
+
+/*
+ * __init_acs --
+ *     Fill in the ACS characters.  The 'ac' termcap entry is a list of
+ *     character pairs - ACS definition then terminal representation.
+ */
+void
+__init_acs(SCREEN *screen)
+{
+       int             count;
+       const char      *aofac; /* Address of 'ac' */
+       unsigned char   acs, term;
+
+       /* Default value '+' for all ACS characters */
+       for (count=0; count < NUM_ACS; count++)
+               _acs_char[count]= '+';
+
+       /* Add the SUSv2 defaults (those that are not '+') */
+       ACS_RARROW = '>';
+       ACS_LARROW = '<';
+       ACS_UARROW = '^';
+       ACS_DARROW = 'v';
+       ACS_BLOCK = '#';
+/*     ACS_DIAMOND = '+';      */
+       ACS_CKBOARD = ':';
+       ACS_DEGREE = 39;        /* ' */
+       ACS_PLMINUS = '#';
+       ACS_BOARD = '#';
+       ACS_LANTERN = '#';
+/*     ACS_LRCORNER = '+';     */
+/*     ACS_URCORNER = '+';     */
+/*     ACS_ULCORNER = '+';     */
+/*     ACS_LLCORNER = '+';     */
+/*     ACS_PLUS = '+';         */
+       ACS_HLINE = '-';
+       ACS_S1 = '-';
+       ACS_S9 = '_';
+/*     ACS_LTEE = '+';         */
+/*     ACS_RTEE = '+';         */
+/*     ACS_BTEE = '+';         */
+/*     ACS_TTEE = '+';         */
+       ACS_VLINE = '|';
+       ACS_BULLET = 'o';
+       /* Add the extensions defaults */
+       ACS_S3 = '-';
+       ACS_S7 = '-';
+       ACS_LEQUAL = '<';
+       ACS_GEQUAL = '>';
+       ACS_PI = '*';
+       ACS_NEQUAL = '!';
+       ACS_STERLING = 'f';
+
+       if (t_acs_chars(screen->term) == NULL)
+               goto out;
+
+       aofac = t_acs_chars(screen->term);
+
+       while (*aofac != '\0') {
+               if ((acs = *aofac) == '\0')
+                       return;
+               if ((term = *++aofac) == '\0')
+                       return;
+               /* Only add characters 1 to 127 */
+               if (acs < NUM_ACS)
+                       _acs_char[acs] = term | __ALTCHARSET;
+               aofac++;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INIT, "__init_acs: %c = %c\n", acs, term);
+#endif
+       }
+
+       if (t_ena_acs(screen->term) != NULL)
+               ti_puts(screen->term, t_ena_acs(screen->term), 0,
+                   __cputchar_args, screen->outfd);
+
+out:
+       for (count=0; count < NUM_ACS; count++)
+               screen->acs_char[count]= _acs_char[count];
+}
+
+void
+_cursesi_reset_acs(SCREEN *screen)
+{
+       int count;
+
+       for (count=0; count < NUM_ACS; count++)
+               _acs_char[count]= screen->acs_char[count];
+}
+
+#ifdef HAVE_WCHAR
+/*
+ * __init_wacs --
+ *     Fill in the ACS characters.  The 'ac' termcap entry is a list of
+ *     character pairs - ACS definition then terminal representation.
+ */
+void
+__init_wacs(SCREEN *screen)
+{
+       int             count;
+       const char      *aofac; /* Address of 'ac' */
+       unsigned char   acs, term;
+       char    *lstr;
+
+       /* Default value '+' for all ACS characters */
+       for (count=0; count < NUM_ACS; count++) {
+               _wacs_char[ count ].vals[ 0 ] = ( wchar_t )btowc( '+' );
+               _wacs_char[ count ].attributes = 0;
+               _wacs_char[ count ].elements = 1;
+       }
+
+       /* Add the SUSv2 defaults (those that are not '+') */
+       if (!strcmp(setlocale(LC_CTYPE, NULL), "C"))
+               setlocale(LC_CTYPE, "");
+       lstr = nl_langinfo(CODESET);
+       _DIAGASSERT(lstr);
+       if (strcasecmp(lstr, "UTF-8")) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INIT, "__init_wacs: setting defaults\n" );
+#endif /* DEBUG */
+               WACS_RARROW->vals[0]  = ( wchar_t )btowc( '>' );
+               WACS_LARROW->vals[0]  = ( wchar_t )btowc( '<' );
+               WACS_UARROW->vals[0]  = ( wchar_t )btowc( '^' );
+               WACS_DARROW->vals[0]  = ( wchar_t )btowc( 'v' );
+               WACS_BLOCK->vals[0]   = ( wchar_t )btowc( '#' );
+               WACS_CKBOARD->vals[0] = ( wchar_t )btowc( ':' );
+               WACS_DEGREE->vals[0]  = ( wchar_t )btowc( 39 ); /* ' */
+               WACS_PLMINUS->vals[0] = ( wchar_t )btowc( '#' );
+               WACS_BOARD->vals[0]   = ( wchar_t )btowc( '#' );
+               WACS_LANTERN->vals[0] = ( wchar_t )btowc( '#' );
+               WACS_HLINE->vals[0]   = ( wchar_t )btowc( '-' );
+               WACS_S1->vals[0]      = ( wchar_t )btowc( '-' );
+               WACS_S9->vals[0]      = ( wchar_t )btowc( '_' );
+               WACS_VLINE->vals[0]   = ( wchar_t )btowc( '|' );
+               WACS_BULLET->vals[0]  = ( wchar_t )btowc( 'o' );
+               WACS_S3->vals[0]      = ( wchar_t )btowc( 'p' );
+               WACS_S7->vals[0]      = ( wchar_t )btowc( 'r' );
+               WACS_LEQUAL->vals[0]  = ( wchar_t )btowc( 'y' );
+               WACS_GEQUAL->vals[0]  = ( wchar_t )btowc( 'z' );
+               WACS_PI->vals[0]      = ( wchar_t )btowc( '{' );
+               WACS_NEQUAL->vals[0]  = ( wchar_t )btowc( '|' );
+               WACS_STERLING->vals[0]= ( wchar_t )btowc( '}' );
+       } else {
+               /* Unicode defaults */
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INIT,
+                   "__init_wacs: setting Unicode defaults\n" );
+#endif /* DEBUG */
+               WACS_RARROW->vals[0]  = 0x2192;
+               ACS_RARROW = '+' | __ACS_IS_WACS;
+               WACS_LARROW->vals[0]  = 0x2190;
+               ACS_LARROW = ',' | __ACS_IS_WACS;
+               WACS_UARROW->vals[0]  = 0x2191;
+               ACS_UARROW = '-' | __ACS_IS_WACS;
+               WACS_DARROW->vals[0]  = 0x2193;
+               ACS_DARROW = '.' | __ACS_IS_WACS;
+               WACS_BLOCK->vals[0]   = 0x25ae;
+               ACS_BLOCK = '0' | __ACS_IS_WACS;
+               WACS_DIAMOND->vals[0] = 0x25c6;
+               ACS_DIAMOND = '`' | __ACS_IS_WACS;
+               WACS_CKBOARD->vals[0] = 0x2592;
+               ACS_CKBOARD = 'a' | __ACS_IS_WACS;
+               WACS_DEGREE->vals[0]  = 0x00b0;
+               ACS_DEGREE = 'f' | __ACS_IS_WACS;
+               WACS_PLMINUS->vals[0] = 0x00b1;
+               ACS_PLMINUS = 'g' | __ACS_IS_WACS;
+               WACS_BOARD->vals[0]   = 0x2592;
+               ACS_BOARD = 'h' | __ACS_IS_WACS;
+               WACS_LANTERN->vals[0] = 0x2603;
+               ACS_LANTERN = 'i' | __ACS_IS_WACS;
+               WACS_LRCORNER->vals[0]= 0x2518;
+               ACS_LRCORNER = 'j' | __ACS_IS_WACS;
+               WACS_URCORNER->vals[0]= 0x2510;
+               ACS_URCORNER = 'k' | __ACS_IS_WACS;
+               WACS_ULCORNER->vals[0]= 0x250c;
+               ACS_ULCORNER = 'l' | __ACS_IS_WACS;
+               WACS_LLCORNER->vals[0]= 0x2514;
+               ACS_LLCORNER = 'm' | __ACS_IS_WACS;
+               WACS_PLUS->vals[0]    = 0x253c;
+               ACS_PLUS = 'n' | __ACS_IS_WACS;
+               WACS_HLINE->vals[0]   = 0x2500;
+               ACS_HLINE = 'q' | __ACS_IS_WACS;
+               WACS_S1->vals[0]      = 0x23ba;
+               ACS_S1 = 'o' | __ACS_IS_WACS;
+               WACS_S9->vals[0]      = 0x23bd;
+               ACS_S9 = 's' | __ACS_IS_WACS;
+               WACS_LTEE->vals[0]    = 0x251c;
+               ACS_LTEE = 't' | __ACS_IS_WACS;
+               WACS_RTEE->vals[0]    = 0x2524;
+               ACS_RTEE = 'u' | __ACS_IS_WACS;
+               WACS_BTEE->vals[0]    = 0x2534;
+               ACS_BTEE = 'v' | __ACS_IS_WACS;
+               WACS_TTEE->vals[0]    = 0x252c;
+               ACS_TTEE = 'w' | __ACS_IS_WACS;
+               WACS_VLINE->vals[0]   = 0x2502;
+               ACS_VLINE = 'x' | __ACS_IS_WACS;
+               WACS_BULLET->vals[0]  = 0x00b7;
+               ACS_BULLET = '~' | __ACS_IS_WACS;
+               WACS_S3->vals[0]      = 0x23bb;
+               ACS_S3 = 'p' | __ACS_IS_WACS;
+               WACS_S7->vals[0]      = 0x23bc;
+               ACS_S7 = 'r' | __ACS_IS_WACS;
+               WACS_LEQUAL->vals[0]  = 0x2264;
+               ACS_LEQUAL = 'y' | __ACS_IS_WACS;
+               WACS_GEQUAL->vals[0]  = 0x2265;
+               ACS_GEQUAL = 'z' | __ACS_IS_WACS;
+               WACS_PI->vals[0]      = 0x03C0;
+               ACS_PI = '{' | __ACS_IS_WACS;
+               WACS_NEQUAL->vals[0]  = 0x2260;
+               ACS_NEQUAL = '|' | __ACS_IS_WACS;
+               WACS_STERLING->vals[0]= 0x00A3;
+               ACS_STERLING = '}' | __ACS_IS_WACS;
+       }
+
+       if (t_acs_chars(screen->term) == NULL) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INIT,
+                   "__init_wacs: no alternative characters\n" );
+#endif /* DEBUG */
+               goto out;
+       }
+
+       aofac = t_acs_chars(screen->term);
+
+       while (*aofac != '\0') {
+               if ((acs = *aofac) == '\0')
+                       return;
+               if ((term = *++aofac) == '\0')
+                       return;
+               /* Only add characters 1 to 127 */
+               if (acs < NUM_ACS) {
+                       _wacs_char[acs].vals[ 0 ] = term;
+                       _wacs_char[acs].attributes |= WA_ALTCHARSET;
+               }
+               aofac++;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INIT, "__init_wacs: %c = %c\n", acs, term);
+#endif
+       }
+
+       if (t_ena_acs(screen->term) != NULL)
+               ti_puts(screen->term, t_ena_acs(screen->term), 0,
+                          __cputchar_args, screen->outfd);
+
+out:
+       for (count=0; count < NUM_ACS; count++) {
+               memcpy(&screen->wacs_char[count], &_wacs_char[count],
+                       sizeof(cchar_t));
+               screen->acs_char[count]= _acs_char[count];
+       }
+}
+
+void
+_cursesi_reset_wacs(SCREEN *screen)
+{
+       int count;
+
+       for (count=0; count < NUM_ACS; count++)
+               memcpy( &_wacs_char[count], &screen->wacs_char[count],
+                       sizeof( cchar_t ));
+}
+#endif /* HAVE_WCHAR */
diff --git a/lib/libcurses/add_wch.c b/lib/libcurses/add_wch.c
new file mode 100644 (file)
index 0000000..064808b
--- /dev/null
@@ -0,0 +1,124 @@
+/*   $NetBSD: add_wch.c,v 1.3 2009/07/22 16:57:14 roy Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: add_wch.c,v 1.3 2009/07/22 16:57:14 roy Exp $");
+#endif /* not lint */
+
+#include <stdlib.h>
+#include "curses.h"
+#include "curses_private.h"
+#ifdef DEBUG
+#include <assert.h>
+#endif
+
+/*
+ * add_wch --
+ *     Add the wide character to the current position in stdscr.
+ *
+ */
+int
+add_wch(const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wadd_wch(stdscr, wch);
+#endif /* HAVE_WCHAR */
+}
+
+
+/*
+ * mvadd_wch --
+ *      Add the wide character to stdscr at the given location.
+ */
+int
+mvadd_wch(int y, int x, const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwadd_wch(stdscr, y, x, wch);
+#endif /* HAVE_WCHAR */
+}
+
+
+/*
+ * mvwadd_wch --
+ *      Add the character to the given window at the given location.
+ */
+int
+mvwadd_wch(WINDOW *win, int y, int x, const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wadd_wch(win, wch);
+#endif /* HAVE_WCHAR */
+}
+
+
+/*
+ * wadd_wch --
+ *     Add the wide character to the current position in the
+ *     given window.
+ *
+ */
+int
+wadd_wch(WINDOW *win, const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       int x = win->curx, y = win->cury;
+       __LINE *lnp = NULL;
+
+#ifdef DEBUG
+       int i;
+
+       for (i = 0; i < win->maxy; i++) {
+               assert(win->alines[i]->sentinel == SENTINEL_VALUE);
+       }
+       __CTRACE(__CTRACE_INPUT, "wadd_wch: win(%p)", win);
+#endif
+       lnp = win->alines[y];
+       return _cursesi_addwchar(win, &lnp, &y, &x, wch);
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/add_wchstr.c b/lib/libcurses/add_wchstr.c
new file mode 100644 (file)
index 0000000..d112e03
--- /dev/null
@@ -0,0 +1,338 @@
+/*   $NetBSD: add_wchstr.c,v 1.4 2010/02/23 19:48:26 drochner Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: add_wchstr.c,v 1.4 2010/02/23 19:48:26 drochner Exp $");
+#endif                         /* not lint */
+
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * add_wchstr --
+ *  Add a wide string to stdscr starting at (_cury, _curx).
+ */
+int
+add_wchstr(const cchar_t *wchstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wadd_wchnstr(stdscr, wchstr, -1);
+#endif
+}
+
+
+/*
+ * wadd_wchstr --
+ *      Add a string to the given window starting at (_cury, _curx).
+ */
+int
+wadd_wchstr(WINDOW *win, const cchar_t *wchstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wadd_wchnstr(win, wchstr, -1);
+#endif
+}
+
+
+/*
+ * add_wchnstr --
+ *      Add a string (at most n characters) to stdscr starting
+ *     at (_cury, _curx).  If n is negative, add the entire string.
+ */
+int
+add_wchnstr(const cchar_t *wchstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wadd_wchnstr(stdscr, wchstr, n);
+#endif
+}
+
+
+/*
+ * mvadd_wchstr --
+ *      Add a string to stdscr starting at (y, x)
+ */
+int
+mvadd_wchstr(int y, int x, const cchar_t *wchstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwadd_wchnstr(stdscr, y, x, wchstr, -1);
+#endif
+}
+
+
+/*
+ * mvwadd_wchstr --
+ *      Add a string to the given window starting at (y, x)
+ */
+int
+mvwadd_wchstr(WINDOW *win, int y, int x, const cchar_t *wchstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwadd_wchnstr(win, y, x, wchstr, -1);
+#endif
+}
+
+
+/*
+ * mvadd_wchnstr --
+ *      Add a string of at most n characters to stdscr
+ *      starting at (y, x).
+ */
+int
+mvadd_wchnstr(int y, int x, const cchar_t *wchstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwadd_wchnstr(stdscr, y, x, wchstr, n);
+#endif
+}
+
+
+/*
+ * mvwadd_wchnstr --
+ *      Add a string of at most n characters to the given window
+ *      starting at (y, x).
+ */
+int
+mvwadd_wchnstr(WINDOW *win, int y, int x, const cchar_t *wchstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wadd_wchnstr(win, wchstr, n);
+#endif
+}
+
+
+/*
+ * wadd_wchnstr --
+ *     Add a string (at most n wide characters) to the given window
+ *     starting at (_cury, _curx).  If n is -1, add the entire string.
+ */
+int
+wadd_wchnstr(WINDOW *win, const cchar_t *wchstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       const cchar_t *chp;
+       wchar_t wc;
+       int cw, x, y, sx, ex, newx, i, cnt;
+       __LDATA *lp, *tp;
+       nschar_t *np, *tnp;
+       __LINE *lnp;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT,
+           "wadd_wchnstr: win = %p, wchstr = %p, n = %d\n", win, wchstr, n);
+#endif
+
+       if (!wchstr)
+               return OK;
+
+       /* compute length of the cchar string */
+       if (n < -1)
+               return ERR;
+       if (n >= 0)
+               for (chp = wchstr, cnt = 0; n && chp->vals[0];
+                       n--, chp++, ++cnt);
+       else
+               for (chp = wchstr, cnt = 0; chp->vals[0]; chp++, ++cnt);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wadd_wchnstr: len=%d\n", cnt);
+#endif /* DEBUG */
+       chp = wchstr;
+       x = win->curx;
+       y = win->cury;
+       lp = &win->alines[y]->line[x];
+       lnp = win->alines[y];
+
+       cw = WCOL(*lp);
+       if (cw >= 0) {
+               sx = x;
+       } else {
+               if (wcwidth(chp->vals[0])) {
+                       /* clear the partial character before cursor */
+                       for (tp = lp + cw; tp < lp; tp++) {
+                               tp->ch = (wchar_t) btowc((int) win->bch);
+                               if (_cursesi_copy_nsp(win->bnsp, tp) == ERR)
+                                       return ERR;
+                               tp->attr = win->battr;
+                               SET_WCOL(*tp, 1);
+                               np = tp->nsp;
+                       }
+               } else {
+                       /* move to the start of current char */
+                       lp += cw;
+                       x += cw;
+               }
+               sx = x + cw;
+       }
+       lnp->flags |= __ISDIRTY;
+       newx = sx + win->ch_off;
+       if (newx < *lnp->firstchp)
+               *lnp->firstchp = newx;
+
+       /* add characters in the string */
+       ex = x;
+       while (cnt) {
+               x = ex;
+               wc = chp->vals[0];
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "wadd_wchnstr: adding %x", wc);
+#endif /* DEBUG */
+               cw = wcwidth(wc);
+               if (cw < 0)
+                       cw = 1;
+               if (cw) {
+                       /* spacing character */
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           " as a spacing char(width=%d)\n", cw);
+#endif /* DEBUG */
+                       if (cw > win->maxx - ex) {
+                               /* clear to EOL */
+                               while (ex < win->maxx) {
+                                       lp->ch = (wchar_t)
+                                               btowc((int) win->bch);
+                                       if (_cursesi_copy_nsp(win->bnsp, lp)
+                                           == ERR)
+                                               return ERR;
+                                       lp->attr = win->battr;
+                                       SET_WCOL(*lp, 1);
+                                       lp++, ex++;
+                               }
+                               ex = win->maxx - 1;
+                               break;
+                       }
+                       /* this could combine with the insertion of
+                        * non-spacing char */
+                       np = lp->nsp;
+                       if (np) {
+                               while (np) {
+                                       tnp = np->next;
+                                       free(np);
+                                       np = tnp;
+                               }
+                               lp->nsp = NULL;
+                       }
+                       lp->ch = chp->vals[0];
+                       lp->attr = chp->attributes & WA_ATTRIBUTES;
+                       SET_WCOL(*lp, cw);
+                       if (chp->elements > 1) {
+                               for (i = 1; i < chp->elements; i++) {
+                                       np = (nschar_t *)
+                                               malloc(sizeof(nschar_t));
+                                       if (!np)
+                                               return ERR;
+                                       np->ch = chp->vals[i];
+                                       np->next = lp->nsp;
+                                       lp->nsp = np;
+                               }
+                       }
+                       lp++, ex++;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                               "wadd_wchnstr: ex = %d, x = %d, cw = %d\n",
+                                ex, x, cw);
+#endif /* DEBUG */
+                       while (ex - x <= cw - 1) {
+                               np = lp->nsp;
+                               if (np) {
+                                       while (np) {
+                                               tnp = np->next;
+                                               free(np);
+                                               np = tnp;
+                                       }
+                                       lp->nsp = NULL;
+                               }
+                               lp->ch = chp->vals[0];
+                               lp->attr = chp->attributes & WA_ATTRIBUTES;
+                               SET_WCOL(*lp, x - ex);
+                               lp++, ex++;
+                       }
+               } else {
+                       /* non-spacing character */
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                               "wadd_wchnstr: as non-spacing char");
+#endif /* DEBUG */
+                       for (i = 0; i < chp->elements; i++) {
+                               np = (nschar_t *)malloc(sizeof(nschar_t));
+                               if (!np)
+                                       return ERR;
+                               np->ch = chp->vals[i];
+                               np->next = lp->nsp;
+                               lp->nsp = np;
+                       }
+               }
+               cnt--, chp++;
+       }
+#ifdef DEBUG
+       for (i = sx; i < ex; i++) {
+               __CTRACE(__CTRACE_INPUT, "wadd_wchnstr: (%d,%d)=(%x,%x,%p)\n",
+                   win->cury, i, win->alines[win->cury]->line[i].ch,
+                   win->alines[win->cury]->line[i].attr,
+                   win->alines[win->cury]->line[i].nsp);
+       }
+#endif /* DEBUG */
+       lnp->flags |= __ISDIRTY;
+       newx = ex + win->ch_off;
+       if (newx > *lnp->lastchp)
+               *lnp->lastchp = newx;
+       __touchline(win, y, sx, ex);
+
+       return OK;
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/addbytes.c b/lib/libcurses/addbytes.c
new file mode 100644 (file)
index 0000000..5945c2c
--- /dev/null
@@ -0,0 +1,586 @@
+/*     $NetBSD: addbytes.c,v 1.38 2010/12/16 17:42:28 wiz Exp $        */
+
+/*
+ * Copyright (c) 1987, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)addbytes.c 8.4 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: addbytes.c,v 1.38 2010/12/16 17:42:28 wiz Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <stdlib.h>
+#include <string.h>
+#include "curses.h"
+#include "curses_private.h"
+#ifdef DEBUG
+#include <assert.h>
+#endif
+
+#define        SYNCH_IN        {y = win->cury; x = win->curx;}
+#define        SYNCH_OUT       {win->cury = y; win->curx = x;}
+#define        PSYNCH_IN       {*y = win->cury; *x = win->curx;}
+#define        PSYNCH_OUT      {win->cury = *y; win->curx = *x;}
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * addbytes --
+ *      Add the character to the current position in stdscr.
+ */
+int
+addbytes(const char *bytes, int count)
+{
+       return __waddbytes(stdscr, bytes, count, 0);
+}
+
+/*
+ * waddbytes --
+ *      Add the character to the current position in the given window.
+ */
+int
+waddbytes(WINDOW *win, const char *bytes, int count)
+{
+       return __waddbytes(win, bytes, count, 0);
+}
+
+/*
+ * mvaddbytes --
+ *      Add the characters to stdscr at the location given.
+ */
+int
+mvaddbytes(int y, int x, const char *bytes, int count)
+{
+       return mvwaddbytes(stdscr, y, x, bytes, count);
+}
+
+/*
+ * mvwaddbytes --
+ *      Add the characters to the given window at the location given.
+ */
+int
+mvwaddbytes(WINDOW *win, int y, int x, const char *bytes, int count)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return __waddbytes(win, bytes, count, 0);
+}
+
+#endif
+
+/*
+ * waddbytes --
+ *     Add the character to the current position in the given window.
+ */
+int
+__waddbytes(WINDOW *win, const char *bytes, int count, attr_t attr)
+{
+       int              x, y, err;
+       __LINE          *lp;
+#ifdef HAVE_WCHAR
+       int             n;
+       cchar_t         cc;
+       wchar_t         wc;
+       mbstate_t       st;
+#else
+       int             c;
+#endif
+#ifdef DEBUG
+       int             i;
+
+       for (i = 0; i < win->maxy; i++) {
+               assert(win->alines[i]->sentinel == SENTINEL_VALUE);
+       }
+
+       __CTRACE(__CTRACE_INPUT, "ADDBYTES: add %d bytes\n", count);
+#endif
+
+       err = OK;
+       SYNCH_IN;
+       lp = win->alines[y];
+
+#ifdef HAVE_WCHAR
+       (void)memset(&st, 0, sizeof(st));
+#endif
+       while (count > 0) {
+#ifndef HAVE_WCHAR
+               c = *bytes++;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "ADDBYTES('%c', %x) at (%d, %d)\n",
+                   c, attr, y, x);
+#endif
+               err = _cursesi_addbyte(win, &lp, &y, &x, c, attr);
+               count--;
+#else
+               /*
+                * For wide-character support only, try and convert the
+                * given string into a wide character - we do this because
+                * this is how ncurses behaves (not that I think this is
+                * actually the correct thing to do but if we don't do it
+                * a lot of things that rely on this behaviour will break
+                * and we will be blamed).  If the conversion succeeds
+                * then we eat the n characters used to make the wide char
+                * from the string.
+                */
+               n = (int)mbrtowc(&wc, bytes, (size_t)count, &st);
+               if (n < 0) {
+                       /* not a valid conversion just eat a char */
+                       wc = *bytes;
+                       n = 1;
+                       (void)memset(&st, 0, sizeof(&st));
+               } else if (wc == 0) {
+                       break;
+               }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT,
+                "ADDBYTES WIDE(0x%x [%s], %x) at (%d, %d), ate %d bytes\n",
+                (unsigned) wc, unctrl((unsigned) wc), attr, y, x, n);
+#endif
+               cc.vals[0] = wc;
+               cc.elements = 1;
+               cc.attributes = attr;
+               err = _cursesi_addwchar(win, &lp, &y, &x, &cc);
+               bytes += n;
+               count -= n;
+#endif
+       }
+
+       SYNCH_OUT;
+
+#ifdef DEBUG
+       for (i = 0; i < win->maxy; i++) {
+               assert(win->alines[i]->sentinel == SENTINEL_VALUE);
+       }
+#endif
+
+       return (err);
+}
+
+/*
+ * _cursesi_addbyte -
+ *     Internal function to add a byte and update the row and column
+ * positions as appropriate.  This function is only used in the narrow
+ * character version of curses.
+ */
+int
+_cursesi_addbyte(WINDOW *win, __LINE **lp, int *y, int *x, int c,
+                attr_t attr)
+{
+       static char      blanks[] = "        ";
+       int              newx;
+       attr_t           attributes;
+
+       switch (c) {
+       case '\t':
+               PSYNCH_OUT;
+               if (waddbytes(win, blanks, 8 - (*x % 8)) == ERR)
+                       return (ERR);
+               PSYNCH_IN;
+               break;
+
+       default:
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "ADDBYTES(%p, %d, %d)\n",
+                        win, *y, *x);
+#endif
+
+               if ((*lp)->flags & __ISPASTEOL) {
+                 new_line:
+                       *x = 0;
+                       (*lp)->flags &= ~__ISPASTEOL;
+                       if (*y == win->scr_b) {
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                        "ADDBYTES - on bottom "
+                                        "of scrolling region\n");
+#endif
+                               if (!(win->flags & __SCROLLOK))
+                                       return ERR;
+                               PSYNCH_OUT;
+                               scroll(win);
+                               PSYNCH_IN;
+                       } else {
+                               (*y)++;
+                       }
+                       *lp = win->alines[*y];
+                       if (c == '\n')
+                               break;
+               }
+
+               attributes = (win->wattr | attr) &
+                       (__ATTRIBUTES & ~__COLOR);
+               if (attr & __COLOR)
+                       attributes |= attr & __COLOR;
+               else if (win->wattr & __COLOR)
+                       attributes |= win->wattr & __COLOR;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT,
+                        "ADDBYTES: 1: y = %d, x = %d, firstch = %d, "
+                        "lastch = %d\n",
+                        *y, *x, *win->alines[*y]->firstchp,
+                        *win->alines[*y]->lastchp);
+#endif
+               /*
+                * Always update the change pointers.  Otherwise,
+                * we could end up not displaying 'blank' characters
+                * when overlapping windows are displayed.
+                */
+               newx = *x + win->ch_off;
+               (*lp)->flags |= __ISDIRTY;
+               /*
+                * firstchp/lastchp are shared between
+                * parent window and sub-window.
+                */
+               if (newx < *(*lp)->firstchp)
+                       *(*lp)->firstchp = newx;
+               if (newx > *(*lp)->lastchp)
+                       *(*lp)->lastchp = newx;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT,
+                        "ADDBYTES: change gives f/l: %d/%d [%d/%d]\n",
+                        *(*lp)->firstchp, *(*lp)->lastchp,
+                        *(*lp)->firstchp - win->ch_off,
+                        *(*lp)->lastchp - win->ch_off);
+#endif
+               if (win->bch != ' ' && c == ' ')
+                       (*lp)->line[*x].ch = win->bch;
+               else
+                       (*lp)->line[*x].ch = c;
+
+               if (attributes & __COLOR)
+                       (*lp)->line[*x].attr =
+                               attributes | (win->battr & ~__COLOR);
+               else
+                       (*lp)->line[*x].attr = attributes | win->battr;
+
+               if (*x == win->maxx - 1)
+                       (*lp)->flags |= __ISPASTEOL;
+               else
+                       (*x)++;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT,
+                        "ADDBYTES: 2: y = %d, x = %d, firstch = %d, "
+                        "lastch = %d\n",
+                        *y, *x, *win->alines[*y]->firstchp,
+                        *win->alines[*y]->lastchp);
+#endif
+               break;
+       case '\n':
+               PSYNCH_OUT;
+               wclrtoeol(win);
+               PSYNCH_IN;
+               goto new_line;
+       case '\r':
+               *x = 0;
+               break;
+       case '\b':
+               if (--(*x) < 0)
+                       *x = 0;
+               break;
+       }
+
+       return (OK);
+}
+
+/*
+ * _cursesi_addwchar -
+ *     Internal function to add a wide character and update the row
+ * and column positions.
+ */
+int
+_cursesi_addwchar(WINDOW *win, __LINE **lnp, int *y, int *x,
+                 const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return (ERR);
+#else
+       int sx = 0, ex = 0, cw = 0, i = 0, newx = 0;
+       __LDATA *lp = &win->alines[*y]->line[*x], *tp = NULL;
+       nschar_t *np = NULL;
+       cchar_t cc;
+       attr_t attributes;
+
+       /* special characters handling */
+       switch (wch->vals[0]) {
+       case L'\b':
+               if (--*x < 0)
+                       *x = 0;
+               win->curx = *x;
+               return OK;
+       case L'\r':
+               *x = 0;
+               return OK;
+       case L'\n':
+               wclrtoeol(win);
+               PSYNCH_IN;
+               *x = 0;
+               (*lnp)->flags &= ~__ISPASTEOL;
+               if (*y == win->scr_b) {
+                       if (!(win->flags & __SCROLLOK))
+                               return ERR;
+                       PSYNCH_OUT;
+                       scroll(win);
+                       PSYNCH_IN;
+               } else {
+                       (*y)++;
+               }
+               PSYNCH_OUT;
+               return OK;
+       case L'\t':
+               cc.vals[0] = L' ';
+               cc.elements = 1;
+               cc.attributes = win->wattr;
+               for (i = 0; i < 8 - (*x % 8); i++) {
+                       if (wadd_wch(win, &cc) == ERR)
+                               return ERR;
+               }
+               return OK;
+       }
+
+       /* check for non-spacing character */
+       if (!wcwidth(wch->vals[0])) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT,
+                        "_cursesi_addwchar: char '%c' is non-spacing\n",
+                        wch->vals[0]);
+#endif /* DEBUG */
+               cw = WCOL(*lp);
+               if (cw < 0) {
+                       lp += cw;
+                       *x += cw;
+               }
+               for (i = 0; i < wch->elements; i++) {
+                       if (!(np = (nschar_t *) malloc(sizeof(nschar_t))))
+                               return ERR;;
+                       np->ch = wch->vals[i];
+                       np->next = lp->nsp;
+                       lp->nsp = np;
+               }
+               (*lnp)->flags |= __ISDIRTY;
+               newx = *x + win->ch_off;
+               if (newx < *(*lnp)->firstchp)
+                       *(*lnp)->firstchp = newx;
+               if (newx > *(*lnp)->lastchp)
+                       *(*lnp)->lastchp = newx;
+               __touchline(win, *y, *x, *x);
+               return OK;
+       }
+       /* check for new line first */
+       if ((*lnp)->flags & __ISPASTEOL) {
+               *x = 0;
+               (*lnp)->flags &= ~__ISPASTEOL;
+               if (*y == win->scr_b) {
+                       if (!(win->flags & __SCROLLOK))
+                               return ERR;
+                       PSYNCH_OUT;
+                       scroll(win);
+                       PSYNCH_IN;
+               } else {
+                       (*y)++;
+               }
+               (*lnp) = win->alines[*y];
+               lp = &win->alines[*y]->line[*x];
+       }
+       /* clear out the current character */
+       cw = WCOL(*lp);
+       if (cw >= 0) {
+               sx = *x;
+       } else {
+               for (sx = *x - 1; sx >= max(*x + cw, 0); sx--) {
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                                "_cursesi_addwchar: clear current char (%d,%d)\n",
+                                *y, sx);
+#endif /* DEBUG */
+                       tp = &win->alines[*y]->line[sx];
+                       tp->ch = (wchar_t) btowc((int) win->bch);
+                       if (_cursesi_copy_nsp(win->bnsp, tp) == ERR)
+                               return ERR;
+
+                       tp->attr = win->battr;
+                       SET_WCOL(*tp, 1);
+               }
+               sx = *x + cw;
+               (*lnp)->flags |= __ISDIRTY;
+               newx = sx + win->ch_off;
+               if (newx < *(*lnp)->firstchp)
+                       *(*lnp)->firstchp = newx;
+       }
+
+       /* check for enough space before the end of line */
+       cw = wcwidth(wch->vals[0]);
+       if (cw < 0)
+               cw = 1;
+       if (cw > win->maxx - *x) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT,
+                        "_cursesi_addwchar: clear EOL (%d,%d)\n",
+                        *y, *x);
+#endif /* DEBUG */
+               (*lnp)->flags |= __ISDIRTY;
+               newx = *x + win->ch_off;
+               if (newx < *(*lnp)->firstchp)
+                       *(*lnp)->firstchp = newx;
+               for (tp = lp; *x < win->maxx; tp++, (*x)++) {
+                       tp->ch = (wchar_t) btowc((int) win->bch);
+                       if (_cursesi_copy_nsp(win->bnsp, tp) == ERR)
+                               return ERR;
+                       tp->attr = win->battr;
+                       SET_WCOL(*tp, 1);
+               }
+               newx = win->maxx - 1 + win->ch_off;
+               if (newx > *(*lnp)->lastchp)
+                       *(*lnp)->lastchp = newx;
+               __touchline(win, *y, sx, (int) win->maxx - 1);
+               sx = *x = 0;
+               if (*y == win->scr_b) {
+                       if (!(win->flags & __SCROLLOK))
+                               return ERR;
+                       PSYNCH_OUT;
+                       scroll(win);
+                       PSYNCH_IN;
+               } else {
+                       (*y)++;
+               }
+               lp = &win->alines[*y]->line[0];
+               (*lnp) = win->alines[*y];
+       }
+       win->cury = *y;
+
+       /* add spacing character */
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT,
+                "_cursesi_addwchar: add character (%d,%d) 0x%x\n",
+                *y, *x, wch->vals[0]);
+#endif /* DEBUG */
+       (*lnp)->flags |= __ISDIRTY;
+       newx = *x + win->ch_off;
+       if (newx < *(*lnp)->firstchp)
+               *(*lnp)->firstchp = newx;
+       if (lp->nsp) {
+               __cursesi_free_nsp(lp->nsp);
+               lp->nsp = NULL;
+       }
+
+       lp->ch = wch->vals[0];
+
+       attributes = (win->wattr | wch->attributes)
+               & (WA_ATTRIBUTES & ~__COLOR);
+       if (wch->attributes & __COLOR)
+               attributes |= wch->attributes & __COLOR;
+       else if (win->wattr & __COLOR)
+               attributes |= win->wattr & __COLOR;
+       if (attributes & __COLOR)
+               lp->attr = attributes | (win->battr & ~__COLOR);
+       else
+               lp->attr = attributes | win->battr;
+
+       SET_WCOL(*lp, cw);
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT,
+                "_cursesi_addwchar: add spacing char 0x%x, attr 0x%x\n",
+                lp->ch, lp->attr);
+#endif /* DEBUG */
+
+       if (wch->elements > 1) {
+               for (i = 1; i < wch->elements; i++) {
+                       np = (nschar_t *)malloc(sizeof(nschar_t));
+                       if (!np)
+                               return ERR;;
+                       np->ch = wch->vals[i];
+                       np->next = lp->nsp;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "_cursesi_addwchar: add non-spacing char 0x%x\n", np->ch);
+#endif /* DEBUG */
+                       lp->nsp = np;
+               }
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "_cursesi_addwchar: non-spacing list header: %p\n",
+           lp->nsp);
+       __CTRACE(__CTRACE_INPUT, "_cursesi_addwchar: add rest columns (%d:%d)\n",
+               sx + 1, sx + cw - 1);
+#endif /* DEBUG */
+       for (tp = lp + 1, *x = sx + 1; *x - sx <= cw - 1; tp++, (*x)++) {
+               if (tp->nsp) {
+                       __cursesi_free_nsp(tp->nsp);
+                       tp->nsp = NULL;
+               }
+               tp->ch = wch->vals[0];
+               tp->attr = lp->attr & WA_ATTRIBUTES;
+               /* Mark as "continuation" cell */
+               tp->attr |= __WCWIDTH;
+       }
+       if (*x == win->maxx) {
+               (*lnp)->flags |= __ISPASTEOL;
+               newx = win->maxx - 1 + win->ch_off;
+               if (newx > *(*lnp)->lastchp)
+                       *(*lnp)->lastchp = newx;
+               __touchline(win, *y, sx, (int) win->maxx - 1);
+               win->curx = sx;
+       } else {
+               win->curx = *x;
+
+               /* clear the remining of the current characer */
+               if (*x && *x < win->maxx) {
+                       ex = sx + cw;
+                       tp = &win->alines[*y]->line[ex];
+                       while (ex < win->maxx && WCOL(*tp) < 0) {
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                        "_cursesi_addwchar: clear "
+                                        "remaining of current char (%d,%d)nn",
+                                        *y, ex);
+#endif /* DEBUG */
+                               tp->ch = (wchar_t) btowc((int) win->bch);
+                               if (_cursesi_copy_nsp(win->bnsp, tp) == ERR)
+                                       return ERR;
+                               tp->attr = win->battr;
+                               SET_WCOL(*tp, 1);
+                               tp++, ex++;
+                       }
+                       newx = ex - 1 + win->ch_off;
+                       if (newx > *(*lnp)->lastchp)
+                               *(*lnp)->lastchp = newx;
+                       __touchline(win, *y, sx, ex - 1);
+               }
+       }
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "add_wch: %d : 0x%x\n", lp->ch, lp->attr);
+#endif /* DEBUG */
+       return OK;
+#endif
+}
diff --git a/lib/libcurses/addch.c b/lib/libcurses/addch.c
new file mode 100644 (file)
index 0000000..ca24d5e
--- /dev/null
@@ -0,0 +1,128 @@
+/*     $NetBSD: addch.c,v 1.16 2010/02/23 19:48:26 drochner Exp $      */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)addch.c    8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: addch.c,v 1.16 2010/02/23 19:48:26 drochner Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * addch --
+ *     Add the character to the current position in stdscr.
+ *
+ */
+int
+addch(chtype ch)
+{
+       return waddch(stdscr, ch);
+}
+
+/*
+ * mvaddch --
+ *      Add the character to stdscr at the given location.
+ */
+int
+mvaddch(int y, int x, chtype ch)
+{
+       return mvwaddch(stdscr, y, x, ch);
+}
+
+/*
+ * mvwaddch --
+ *      Add the character to the given window at the given location.
+ */
+int
+mvwaddch(WINDOW *win, int y, int x, chtype ch)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return waddch(win, ch);
+}
+
+#endif
+
+/*
+ * waddch --
+ *     Add the character to the current position in the given window.
+ *
+ */
+int
+waddch(WINDOW *win, chtype ch)
+{
+#ifdef HAVE_WCHAR
+       cchar_t cc;
+#else
+       __LDATA buf;
+#endif
+
+#ifdef HAVE_WCHAR
+       __cursesi_chtype_to_cchar(ch, &cc);
+#else
+       buf.ch = (wchar_t) ch & __CHARTEXT;
+       buf.attr = (attr_t) ch & __ATTRIBUTES;
+#endif
+
+#ifdef DEBUG
+#ifdef HAVE_WCHAR
+       __CTRACE(__CTRACE_INPUT,
+                "addch: %d : 0x%x (adding char as wide char)\n",
+                cc.vals[0], cc.attributes);
+#else
+       __CTRACE(__CTRACE_INPUT, "addch: %d : 0x%x\n", buf.ch, buf.attr);
+#endif
+#endif
+
+#ifdef HAVE_WCHAR
+       return (wadd_wch(win, &cc));
+#else
+       return (__waddch(win, &buf));
+#endif
+}
+
+int
+__waddch(WINDOW *win, __LDATA *dp)
+{
+       char    buf[2];
+
+       buf[0] = dp->ch;
+       buf[1] = '\0';
+       return (__waddbytes(win, buf, 1, dp->attr));
+}
diff --git a/lib/libcurses/addchnstr.c b/lib/libcurses/addchnstr.c
new file mode 100644 (file)
index 0000000..a293cbc
--- /dev/null
@@ -0,0 +1,175 @@
+/*     $NetBSD: addchnstr.c,v 1.4 2008/04/28 20:23:01 martin Exp $     */
+
+/*
+ * Copyright (c) 2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Douwe Kiela (virtus@wanadoo.nl).
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: addchnstr.c,v 1.4 2008/04/28 20:23:01 martin Exp $");
+#endif                         /* not lint */
+
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * addchstr --
+ *      Add a string to stdscr starting at (_cury, _curx).
+ */
+int
+addchstr(const chtype *chstr)
+{
+       return waddchnstr(stdscr, chstr, -1);
+}
+
+/*
+ * waddchstr --
+ *      Add a string to the given window starting at (_cury, _curx).
+ */
+int
+waddchstr(WINDOW *win, const chtype *chstr)
+{
+       return waddchnstr(win, chstr, -1);
+}
+
+/*
+ * addchnstr --
+ *      Add a string (at most n characters) to stdscr starting
+ *     at (_cury, _curx).  If n is negative, add the entire string.
+ */
+int
+addchnstr(const chtype *chstr, int n)
+{
+       return waddchnstr(stdscr, chstr, n);
+}
+
+/*
+ * mvaddchstr --
+ *      Add a string to stdscr starting at (y, x)
+ */
+int
+mvaddchstr(int y, int x, const chtype *chstr)
+{
+       return mvwaddchnstr(stdscr, y, x, chstr, -1);
+}
+
+/*
+ * mvwaddchstr --
+ *      Add a string to the given window starting at (y, x)
+ */
+int
+mvwaddchstr(WINDOW *win, int y, int x, const chtype *chstr)
+{
+       return mvwaddchnstr(win, y, x, chstr, -1);
+}
+
+/*
+ * mvaddchnstr --
+ *      Add a string of at most n characters to stdscr
+ *      starting at (y, x).
+ */
+int
+mvaddchnstr(int y, int x, const chtype *chstr, int n)
+{
+       return mvwaddchnstr(stdscr, y, x, chstr, n);
+}
+
+/*
+ * mvwaddchnstr --
+ *      Add a string of at most n characters to the given window
+ *      starting at (y, x).
+ */
+int
+mvwaddchnstr(WINDOW *win, int y, int x, const chtype *chstr, int n)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return waddchnstr(win, chstr, n);
+}
+
+#endif
+
+/*
+ * waddchnstr --
+ *     Add a string (at most n characters) to the given window
+ *     starting at (_cury, _curx).  If n is negative, add the
+ *     entire string.
+ */
+int
+waddchnstr(WINDOW *win, const chtype *chstr, int n)
+{
+       size_t  len;
+       const chtype *chp;
+       attr_t  attr;
+       char    *ocp, *cp, *start;
+       int i, ret;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "waddchnstr: win = %p, chstr = %p, n = %d\n",
+           win, chstr, n);
+#endif
+
+       if (n >= 0)
+               for (chp = chstr, len = 0; n-- && *chp++; ++len);
+       else
+               for (chp = chstr, len = 0; *chp++; ++len);
+
+       if ((ocp = malloc(len + 1)) == NULL)
+               return ERR;
+       chp = chstr;
+       cp = ocp;
+       start = ocp;
+       i = 0;
+       attr = (*chp) & __ATTRIBUTES;
+       while (len) {
+               *cp = (*chp) & __CHARTEXT;
+               cp++;
+               chp++;
+               i++;
+               len--;
+               if (((*chp) & __ATTRIBUTES) != attr) {
+                       *cp = '\0';
+                       if (__waddbytes(win, start, i, attr) == ERR) {
+                               free(ocp);
+                               return ERR;
+                       }
+                       attr = (*chp) & __ATTRIBUTES;
+                       start = cp;
+                       i = 0;
+               }
+       }
+       *cp = '\0';
+       ret = __waddbytes(win, start, i, attr);
+       free(ocp);
+       return ret;
+}
diff --git a/lib/libcurses/addnstr.c b/lib/libcurses/addnstr.c
new file mode 100644 (file)
index 0000000..33c4c83
--- /dev/null
@@ -0,0 +1,155 @@
+/*     $NetBSD: addnstr.c,v 1.12 2007/05/28 15:01:54 blymn Exp $       */
+
+/*
+ * Copyright (c) 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)addnstr.c  8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: addnstr.c,v 1.12 2007/05/28 15:01:54 blymn Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * addstr --
+ *      Add a string to stdscr starting at (_cury, _curx).
+ */
+int
+addstr(const char *s)
+{
+       return waddnstr(stdscr, s, -1);
+}
+
+/*
+ * waddstr --
+ *      Add a string to the given window starting at (_cury, _curx).
+ */
+int
+waddstr(WINDOW *win, const char *s)
+{
+       return waddnstr(win, s, -1);
+}
+
+/*
+ * addnstr --
+ *      Add a string (at most n characters) to stdscr starting
+ *     at (_cury, _curx).  If n is negative, add the entire string.
+ */
+int
+addnstr(const char *str, int n)
+{
+       return waddnstr(stdscr, str, n);
+}
+
+/*
+ * mvaddstr --
+ *      Add a string to stdscr starting at (y, x)
+ */
+int
+mvaddstr(int y, int x, const char *str)
+{
+       return mvwaddnstr(stdscr, y, x, str, -1);
+}
+
+/*
+ * mvwaddstr --
+ *      Add a string to the given window starting at (y, x)
+ */
+int
+mvwaddstr(WINDOW *win, int y, int x, const char *str)
+{
+       return mvwaddnstr(win, y, x, str, -1);
+}
+
+/*
+ * mvaddnstr --
+ *      Add a string of at most n characters to stdscr
+ *      starting at (y, x).
+ */
+int
+mvaddnstr(int y, int x, const char *str, int count)
+{
+       return mvwaddnstr(stdscr, y, x, str, count);
+}
+
+/*
+ * mvwaddnstr --
+ *      Add a string of at most n characters to the given window
+ *      starting at (y, x).
+ */
+int
+mvwaddnstr(WINDOW *win, int y, int x, const char *str, int count)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return waddnstr(win, str, count);
+}
+
+#endif
+
+/*
+ * waddnstr --
+ *     Add a string (at most n characters) to the given window
+ *     starting at (_cury, _curx).  If n is negative, add the
+ *     entire string.
+ */
+int
+waddnstr(WINDOW *win, const char *s, int n)
+{
+       size_t  len;
+       const char *p;
+
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "ADDNSTR: win %p, length %d\n",
+                        win, n);
+#endif
+       /*
+        * behavior changed from traditional BSD curses, for better XCURSES
+        * conformance.
+        *
+        * BSD curses: if (n > 0) then "at most n", else "len = strlen(s)"
+        * ncurses: if (n >= 0) then "at most n", else "len = strlen(s)"
+        * XCURSES: if (n != -1) then "at most n", else "len = strlen(s)"
+        */
+       if (n >= 0)
+               for (p = s, len = 0; n-- && *p++; ++len);
+       else
+               len = strlen(s);
+       return (waddbytes(win, s, (int) len));
+}
diff --git a/lib/libcurses/addwstr.c b/lib/libcurses/addwstr.c
new file mode 100644 (file)
index 0000000..0a433a1
--- /dev/null
@@ -0,0 +1,201 @@
+/*   $NetBSD: addwstr.c,v 1.2 2007/05/28 15:01:54 blymn Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: addwstr.c,v 1.2 2007/05/28 15:01:54 blymn Exp $");
+#endif                                           /* not lint */
+
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * addwstr --
+ *       Add a string to stdscr starting at (_cury, _curx).
+ */
+int
+addwstr(const wchar_t *s)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return waddnwstr(stdscr, s, -1);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * waddwstr --
+ *       Add a string to the given window starting at (_cury, _curx).
+ */
+int
+waddwstr(WINDOW *win, const wchar_t *s)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return waddnwstr(win, s, -1);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * addnwstr --
+ *       Add a string (at most n characters) to stdscr starting
+ *     at (_cury, _curx).  If n is negative, add the entire string.
+ */
+int
+addnwstr(const wchar_t *str, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return waddnwstr(stdscr, str, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvaddwstr --
+ *       Add a string to stdscr starting at (y, x)
+ */
+int
+mvaddwstr(int y, int x, const wchar_t *str)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwaddnwstr(stdscr, y, x, str, -1);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvwaddwstr --
+ *       Add a string to the given window starting at (y, x)
+ */
+int
+mvwaddwstr(WINDOW *win, int y, int x, const wchar_t *str)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwaddnwstr(win, y, x, str, -1);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvaddnwstr --
+ *       Add a string of at most n characters to stdscr
+ *       starting at (y, x).
+ */
+int
+mvaddnwstr(int y, int x, const wchar_t *str, int count)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwaddnwstr(stdscr, y, x, str, count);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvwaddnwstr --
+ *       Add a string of at most n characters to the given window
+ *       starting at (y, x).
+ */
+int
+mvwaddnwstr(WINDOW *win, int y, int x, const wchar_t *str, int count)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return waddnwstr(win, str, count);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * waddnwstr --
+ *     Add a string (at most n characters) to the given window
+ *     starting at (_cury, _curx).  If n is negative, add the
+ *     entire string.
+ */
+int
+waddnwstr(WINDOW *win, const wchar_t *s, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       size_t  len;
+       const wchar_t *p;
+       cchar_t cc;
+       wchar_t wc[ 2 ];
+
+       /*
+        * BSD curses: if (n > 0) then "at most n", else "len = strlen(s)"
+        * ncurses: if (n >= 0) then "at most n", else "len = strlen(s)"
+        * XCURSES: if (n != -1) then "at most n", else "len = strlen(s)"
+        */
+       /* compute the length and column width of string */
+       if ( n < -1 ) 
+               return ERR;
+       if (n >= 0)
+               for (p = s, len = 0; n-- && *p++; ++len );
+       else
+               len = wcslen(s);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "waddnwstr: string len=%ld\n", (long) len);
+#endif /* DEBUG */
+
+       p = s;
+       while ( len ) {
+               wc[ 0 ] = *p;
+               wc[ 1 ] = L'\0';
+               if ( setcchar( &cc, wc, win->wattr, 0, NULL ) == ERR )
+                       return ERR;
+               if ( wadd_wch( win, &cc ) == ERR )
+                       return ERR;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "waddnwstr: (%x,%x,%d) added\n", 
+                               cc.vals[ 0 ], cc.attributes, cc.elements );
+#endif /* DEBUG */
+               p++, len--;
+       }
+
+       return OK;
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/attributes.c b/lib/libcurses/attributes.c
new file mode 100644 (file)
index 0000000..b0bfe29
--- /dev/null
@@ -0,0 +1,449 @@
+/*     $NetBSD: attributes.c,v 1.21 2010/12/25 10:08:20 blymn Exp $    */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: attributes.c,v 1.21 2010/12/25 10:08:20 blymn Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+void __wcolor_set(WINDOW *, attr_t);
+
+#ifndef _CURSES_USE_MACROS
+/*
+ * attr_get --
+ *     Get wide attributes and color pair from stdscr
+ */
+/* ARGSUSED */
+int
+attr_get(attr_t *attr, short *pair, void *opt)
+{
+       return wattr_get(stdscr, attr, pair, opt);
+}
+
+/*
+ * attr_on --
+ *     Test and set wide attributes on stdscr
+ */
+/* ARGSUSED */
+int
+attr_on(attr_t attr, void *opt)
+{
+       return wattr_on(stdscr, attr, opt);
+}
+
+/*
+ * attr_off --
+ *     Test and unset wide attributes on stdscr
+ */
+/* ARGSUSED */
+int
+attr_off(attr_t attr, void *opt)
+{
+       return wattr_off(stdscr, attr, opt);
+}
+
+/*
+ * attr_set --
+ *     Set wide attributes and color pair on stdscr
+ */
+/* ARGSUSED */
+int
+attr_set(attr_t attr, short pair, void *opt)
+{
+       return wattr_set(stdscr, attr, pair, opt);
+}
+
+/*
+ * color_set --
+ *     Set color pair on stdscr
+ */
+/* ARGSUSED */
+int
+color_set(short pair, void *opt)
+{
+       return wcolor_set(stdscr, pair, opt);
+}
+
+/*
+ * attron --
+ *     Test and set attributes on stdscr
+ */
+int
+attron(int attr)
+{
+       return wattr_on(stdscr, (attr_t) attr, NULL);
+}
+
+/*
+ * attroff --
+ *     Test and unset attributes on stdscr.
+ */
+int
+attroff(int attr)
+{
+       return wattr_off(stdscr, (attr_t) attr, NULL);
+}
+
+/*
+ * attrset --
+ *     Set specific attribute modes.
+ *     Unset others.  On stdscr.
+ */
+int
+attrset(int attr)
+{
+       return wattrset(stdscr, attr);
+}
+#endif /* _CURSES_USE_MACROS */
+
+/*
+ * wattr_get --
+ *     Get wide attributes and colour pair from window
+ *     Note that attributes also includes colour.
+ */
+/* ARGSUSED */
+int
+wattr_get(WINDOW *win, attr_t *attr, short *pair, void *opt)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wattr_get: win %p\n", win);
+#endif
+       if (attr != NULL) {
+               *attr = win->wattr;
+#ifdef HAVE_WCHAR
+               *attr &= WA_ATTRIBUTES;
+#endif
+       }
+
+       if (pair != NULL)
+               *pair = PAIR_NUMBER(win->wattr);
+       return OK;
+}
+
+/*
+ * wattr_on --
+ *     Test and set wide attributes on window
+ */
+/* ARGSUSED */
+int
+wattr_on(WINDOW *win, attr_t attr, void *opt)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wattr_on: win %p, attr %08x\n", win, attr);
+#endif
+       /* If can enter modes, set the relevent attribute bits. */
+       if (exit_attribute_mode != NULL) {
+               if (attr & __BLINK && enter_blink_mode != NULL)
+                       win->wattr |= __BLINK;
+               if (attr & __BOLD && enter_bold_mode != NULL)
+                       win->wattr |= __BOLD;
+               if (attr & __DIM && enter_dim_mode != NULL)
+                       win->wattr |= __DIM;
+               if (attr & __BLANK && enter_secure_mode != NULL)
+                       win->wattr |= __BLANK;
+               if (attr & __PROTECT && enter_protected_mode != NULL)
+                       win->wattr |= __PROTECT;
+               if (attr & __REVERSE && enter_reverse_mode != NULL)
+                       win->wattr |= __REVERSE;
+#ifdef HAVE_WCHAR
+               if (attr & WA_LOW && enter_low_hl_mode != NULL)
+                       win->wattr |= WA_LOW;
+               if (attr & WA_TOP && enter_top_hl_mode != NULL)
+                       win->wattr |= WA_TOP;
+               if (attr & WA_LEFT && enter_left_hl_mode != NULL)
+                       win->wattr |= WA_LEFT;
+               if (attr & WA_RIGHT && enter_right_hl_mode != NULL)
+                       win->wattr |= WA_RIGHT;
+               if (attr & WA_HORIZONTAL && enter_horizontal_hl_mode != NULL)
+                       win->wattr |= WA_HORIZONTAL;
+               if (attr & WA_VERTICAL && enter_vertical_hl_mode != NULL)
+                       win->wattr |= WA_VERTICAL;
+#endif /* HAVE_WCHAR */
+       }
+       if (attr & __STANDOUT && enter_standout_mode != NULL && exit_standout_mode != NULL)
+               wstandout(win);
+       if (attr & __UNDERSCORE && enter_underline_mode != NULL && exit_underline_mode != NULL)
+               wunderscore(win);
+       if ((attr_t) attr & __COLOR)
+               __wcolor_set(win, (attr_t) attr);
+       return OK;
+}
+
+/*
+ * wattr_off --
+ *     Test and unset wide attributes on window
+ *
+ *     Note that the 'me' sequence unsets all attributes.  We handle
+ *     which attributes should really be set in refresh.c:makech().
+ */
+/* ARGSUSED */
+int
+wattr_off(WINDOW *win, attr_t attr, void *opt)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wattr_off: win %p, attr %08x\n", win, attr);
+#endif
+       /* If can do exit modes, unset the relevent attribute bits. */
+       if (exit_attribute_mode != NULL) {
+               if (attr & __BLINK)
+                       win->wattr &= ~__BLINK;
+               if (attr & __BOLD)
+                       win->wattr &= ~__BOLD;
+               if (attr & __DIM)
+                       win->wattr &= ~__DIM;
+               if (attr & __BLANK)
+                       win->wattr &= ~__BLANK;
+               if (attr & __PROTECT)
+                       win->wattr &= ~__PROTECT;
+               if (attr & __REVERSE)
+                       win->wattr &= ~__REVERSE;
+#ifdef HAVE_WCHAR
+               if (attr & WA_LOW)
+                       win->wattr &= ~WA_LOW;
+               if (attr & WA_TOP)
+                       win->wattr &= ~WA_TOP;
+               if (attr & WA_LEFT)
+                       win->wattr &= ~WA_LEFT;
+               if (attr & WA_RIGHT)
+                       win->wattr &= ~WA_RIGHT;
+               if (attr & WA_HORIZONTAL)
+                       win->wattr &= ~WA_HORIZONTAL;
+       if (attr & WA_VERTICAL)
+                       win->wattr &= ~WA_VERTICAL;
+#endif /* HAVE_WCHAR */
+       }
+       if (attr & __STANDOUT)
+               wstandend(win);
+       if (attr & __UNDERSCORE)
+               wunderend(win);
+       if ((attr_t) attr & __COLOR) {
+               if (max_colors != 0)
+                       win->wattr &= ~__COLOR;
+       }
+       return OK;
+}
+
+/*
+ * wattr_set --
+ *     Set wide attributes and color pair on window
+ */
+int
+wattr_set(WINDOW *win, attr_t attr, short pair, void *opt)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wattr_set: win %p, attr %08x, pair %d\n",
+           win, attr, pair);
+#endif
+       wattr_off(win, __ATTRIBUTES, opt);
+       /*
+        * This overwrites any colour setting from the attributes
+        * and is compatible with ncurses.
+        */
+       attr = (attr & ~__COLOR) | COLOR_PAIR(pair);
+       wattr_on(win, attr, opt);
+       return OK;
+}
+
+/*
+ * wattron --
+ *     Test and set attributes.
+ */
+int
+wattron(WINDOW *win, int attr)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wattron: win %p, attr %08x\n", win, attr);
+#endif
+       return wattr_on(win, (attr_t) attr, NULL);
+}
+
+/*
+ * wattroff --
+ *     Test and unset attributes.
+ */
+int
+wattroff(WINDOW *win, int attr)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wattroff: win %p, attr %08x\n", win, attr);
+#endif
+       return wattr_off(win, (attr_t) attr, NULL);
+}
+
+/*
+ * wattrset --
+ *     Set specific attribute modes.
+ *     Unset others.
+ */
+int
+wattrset(WINDOW *win, int attr)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wattrset: win %p, attr %08x\n", win, attr);
+#endif
+       wattr_off(win, __ATTRIBUTES, NULL);
+       wattr_on(win, (attr_t) attr, NULL);
+       return OK;
+}
+
+/*
+ * wcolor_set --
+ *     Set color pair on window
+ */
+/* ARGSUSED */
+int
+wcolor_set(WINDOW *win, short pair, void *opt)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_COLOR, "wolor_set: win %p, pair %d\n", win, pair);
+#endif
+       __wcolor_set(win, (attr_t) COLOR_PAIR(pair));
+       return OK;
+}
+
+/*
+ * getattrs --
+ *     Get window attributes.
+ */
+chtype
+getattrs(WINDOW *win)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "getattrs: win %p\n", win);
+#endif
+       return((chtype) win->wattr);
+}
+
+/*
+ * termattrs --
+ *     Get terminal attributes
+ */
+chtype
+termattrs(void)
+{
+       chtype ch = 0;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "termattrs\n");
+#endif
+       if (exit_attribute_mode != NULL) {
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "termattrs: have exit attribute mode\n");
+#endif
+               if (enter_blink_mode != NULL)
+                       ch |= __BLINK;
+               if (enter_bold_mode != NULL)
+                       ch |= __BOLD;
+               if (enter_dim_mode != NULL)
+                       ch |= __DIM;
+               if (enter_secure_mode != NULL)
+                       ch |= __BLANK;
+               if (enter_protected_mode != NULL)
+                       ch |= __PROTECT;
+               if (enter_reverse_mode != NULL)
+                       ch |= __REVERSE;
+       }
+       if (enter_standout_mode != NULL && exit_standout_mode != NULL)
+               ch |= __STANDOUT;
+       if (enter_underline_mode != NULL && exit_underline_mode != NULL)
+               ch |= __UNDERSCORE;
+       if (enter_alt_charset_mode != NULL && exit_alt_charset_mode != NULL)
+               ch |= __ALTCHARSET;
+
+       return ch;
+}
+
+/*
+ * term_attrs --
+ *     Get terminal wide attributes
+ */
+attr_t
+term_attrs(void)
+{
+       attr_t attr = 0;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "term_attrs\n");
+#endif
+       if (exit_attribute_mode != NULL) {
+               if (enter_blink_mode != NULL)
+                       attr |= __BLINK;
+               if (enter_bold_mode != NULL)
+                       attr |= __BOLD;
+               if (enter_dim_mode != NULL)
+                       attr |= __DIM;
+               if (enter_secure_mode != NULL)
+                       attr |= __BLANK;
+               if (enter_protected_mode != NULL)
+                       attr |= __PROTECT;
+               if (enter_reverse_mode != NULL)
+                       attr |= __REVERSE;
+#ifdef HAVE_WCHAR
+               if (enter_low_hl_mode != NULL)
+                       attr |= WA_LOW;
+               if (enter_top_hl_mode != NULL)
+                       attr |= WA_TOP;
+               if (enter_left_hl_mode != NULL)
+                       attr |= WA_LEFT;
+               if (enter_right_hl_mode != NULL)
+                       attr |= WA_RIGHT;
+               if (enter_horizontal_hl_mode != NULL)
+                       attr |= WA_HORIZONTAL;
+               if (enter_vertical_hl_mode != NULL)
+                       attr |= WA_VERTICAL;
+#endif /* HAVE_WCHAR */
+       }
+       if (enter_standout_mode != NULL && exit_standout_mode != NULL)
+               attr |= __STANDOUT;
+       if (enter_underline_mode != NULL && exit_underline_mode != NULL)
+               attr |= __UNDERSCORE;
+       if (enter_alt_charset_mode != NULL && exit_alt_charset_mode != NULL)
+               attr |= __ALTCHARSET;
+
+       return attr;
+}
+
+/*
+ * __wcolor_set --
+ * Set color attribute on window
+ */
+void
+__wcolor_set(WINDOW *win, attr_t attr)
+{
+       /* If another color pair is set, turn that off first. */
+       win->wattr &= ~__COLOR;
+       /* If can do color video, set the color pair bits. */
+       if (max_colors != 0 && attr & __COLOR)
+               win->wattr |= attr & __COLOR;
+}
diff --git a/lib/libcurses/background.c b/lib/libcurses/background.c
new file mode 100644 (file)
index 0000000..3e3469d
--- /dev/null
@@ -0,0 +1,285 @@
+/*     $NetBSD: background.c,v 1.15 2009/07/22 16:57:14 roy Exp $      */
+
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: background.c,v 1.15 2009/07/22 16:57:14 roy Exp $");
+#endif                         /* not lint */
+
+#include <stdlib.h>
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * bkgdset
+ *     Set new background attributes on stdscr.
+ */
+void
+bkgdset(chtype ch)
+{
+       wbkgdset(stdscr, ch);
+}
+
+/*
+ * bkgd --
+ *     Set new background and new background attributes on stdscr.
+ */
+int
+bkgd(chtype ch)
+{
+       return(wbkgd(stdscr, ch));
+}
+
+/*
+ * wbkgdset
+ *     Set new background attributes.
+ */
+void
+wbkgdset(WINDOW *win, chtype ch)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wbkgdset: (%p), '%s', %08x\n",
+           win, unctrl(ch & +__CHARTEXT), ch & __ATTRIBUTES);
+#endif
+
+       /* Background character. */
+       if (ch & __CHARTEXT)
+               win->bch = (wchar_t) ch & __CHARTEXT;
+
+       /* Background attributes (check colour). */
+       if (__using_color && !(ch & __COLOR))
+               ch |= __default_color;
+       win->battr = (attr_t) ch & __ATTRIBUTES;
+}
+
+/*
+ * wbkgd --
+ *     Set new background and new background attributes.
+ */
+int
+wbkgd(WINDOW *win, chtype ch)
+{
+       int     y, x;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wbkgd: (%p), '%s', %08x\n",
+           win, unctrl(ch & +__CHARTEXT), ch & __ATTRIBUTES);
+#endif
+
+       /* Background attributes (check colour). */
+       if (__using_color && !(ch & __COLOR))
+               ch |= __default_color;
+
+       win->battr = (attr_t) ch & __ATTRIBUTES;
+       wbkgdset(win, ch);
+       for (y = 0; y < win->maxy; y++)
+               for (x = 0; x < win->maxx; x++) {
+                       /* Copy character if space */
+                       if (ch & A_CHARTEXT && win->alines[y]->line[x].ch == ' ')
+                               win->alines[y]->line[x].ch = ch & __CHARTEXT;
+                       /* Merge attributes */
+                       if (win->alines[y]->line[x].attr & __ALTCHARSET)
+                               win->alines[y]->line[x].attr =
+                                   (ch & __ATTRIBUTES) | __ALTCHARSET;
+                       else
+                               win->alines[y]->line[x].attr =
+                                   ch & __ATTRIBUTES;
+#ifdef HAVE_WCHAR
+                       SET_WCOL(win->alines[y]->line[x], 1);
+#endif
+               }
+       __touchwin(win);
+       return(OK);
+}
+
+/*
+ * getbkgd --
+ *     Get current background attributes.
+ */
+chtype
+getbkgd(WINDOW *win)
+{
+       attr_t  battr;
+
+       /* Background attributes (check colour). */
+       battr = win->battr & A_ATTRIBUTES;
+       if (__using_color && ((battr & __COLOR) == __default_color))
+               battr &= ~__default_color;
+
+       return ((chtype) ((win->bch & A_CHARTEXT) | battr));
+}
+
+int bkgrnd(const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wbkgrnd( stdscr, wch );
+#endif /* HAVE_WCHAR */
+}
+
+void bkgrndset(const cchar_t *wch)
+{
+#ifdef HAVE_WCHAR
+       wbkgrndset( stdscr, wch );
+#endif /* HAVE_WCHAR */
+}
+
+int getbkgrnd(cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wgetbkgrnd( stdscr, wch );
+#endif /* HAVE_WCHAR */
+}
+
+int wbkgrnd(WINDOW *win, const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+/*     int     y, x, i; */
+       attr_t battr;
+/*     nschar_t *np, *tnp, *pnp; */
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wbkgrnd: (%p), '%s', %x\n",
+               win, (const char *) wunctrl(wch), wch->attributes);
+#endif
+
+       /* ignore multi-column characters */
+       if ( !wch->elements || wcwidth( wch->vals[ 0 ]) > 1 )
+               return ERR;
+
+       /* Background attributes (check colour). */
+       battr = wch->attributes & WA_ATTRIBUTES;
+       if (__using_color && !( battr & __COLOR))
+               battr |= __default_color;
+
+       win->battr = battr;
+       wbkgrndset(win, wch);
+       __touchwin(win);
+       return OK;
+#endif /* HAVE_WCHAR */
+}
+
+void wbkgrndset(WINDOW *win, const cchar_t *wch)
+{
+#ifdef HAVE_WCHAR
+       attr_t battr;
+       nschar_t *np, *tnp;
+       int i;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ATTR, "wbkgrndset: (%p), '%s', %x\n",
+               win, (const char *) wunctrl(wch), wch->attributes);
+#endif
+
+       /* ignore multi-column characters */
+       if ( !wch->elements || wcwidth( wch->vals[ 0 ]) > 1 )
+               return;
+
+       /* Background character. */
+       tnp = np = win->bnsp;
+       if ( wcwidth( wch->vals[ 0 ]))
+               win->bch = wch->vals[ 0 ];
+       else {
+               if ( !np ) {
+                       np = (nschar_t *)malloc(sizeof(nschar_t));
+                       if (!np)
+                               return;
+                       np->next = NULL;
+                       win->bnsp = np;
+               }
+               np->ch = wch->vals[ 0 ];
+               tnp = np;
+               np = np->next;
+       }
+       /* add non-spacing characters */
+       if ( wch->elements > 1 ) {
+               for ( i = 1; i < wch->elements; i++ ) {
+                       if ( !np ) {
+                               np = (nschar_t *)malloc(sizeof(nschar_t));
+                               if (!np)
+                                       return;
+                               np->next = NULL;
+                               if ( tnp )
+                                       tnp->next = np;
+                               else
+                                       win->bnsp = np;
+                       }
+                       np->ch = wch->vals[ i ];
+                       tnp = np;
+                       np = np->next;
+               }
+       }
+       /* clear the old non-spacing characters */
+       while ( np ) {
+               tnp = np->next;
+               free( np );
+               np = tnp;
+       }
+
+       /* Background attributes (check colour). */
+       battr = wch->attributes & WA_ATTRIBUTES;
+       if (__using_color && !( battr & __COLOR))
+               battr |= __default_color;
+       win->battr = battr;
+       SET_BGWCOL((*win), 1);
+#endif /* HAVE_WCHAR */
+}
+
+int wgetbkgrnd(WINDOW *win, cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       nschar_t *np;
+
+       /* Background attributes (check colour). */
+       wch->attributes = win->battr & WA_ATTRIBUTES;
+       if (__using_color && (( wch->attributes & __COLOR )
+                       == __default_color))
+               wch->attributes &= ~__default_color;
+       wch->vals[ 0 ] = win->bch;
+       wch->elements = 1;
+       np = win->bnsp;
+       if (np) {
+               while ( np && wch->elements < CURSES_CCHAR_MAX ) {
+                       wch->vals[ wch->elements++ ] = np->ch;
+                       np = np->next;
+               }
+       }
+
+       return OK;
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/beep.c b/lib/libcurses/beep.c
deleted file mode 100644 (file)
index aa6fced..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <curses.h>
-#include <termcap.h>
-
-extern char *bl, *vb;
-
-/* Beep() sounds the terminal bell. */
-void beep()
-{
-  if (bl)
-       tputs(bl, 1, outc);
-  else if (vb)
-       tputs(vb, 1, outc);
-}
diff --git a/lib/libcurses/bell.c b/lib/libcurses/bell.c
new file mode 100644 (file)
index 0000000..4257167
--- /dev/null
@@ -0,0 +1,80 @@
+/*     $NetBSD: bell.c,v 1.8 2010/02/03 15:34:40 roy Exp $     */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: bell.c,v 1.8 2010/02/03 15:34:40 roy Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * beep
+ *     Ring the terminal bell
+ */
+int
+beep(void)
+{
+       if (bell != NULL) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_MISC, "beep: bl\n");
+#endif
+               tputs(bell, 0, __cputchar);
+       } else if (flash_screen != NULL) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_MISC, "beep: vb\n");
+#endif
+               tputs(flash_screen, 0, __cputchar);
+       }
+       return (1);
+}
+
+/*
+ * flash
+ *     Flash the terminal screen
+ */
+int
+flash(void)
+{
+       if (flash_screen != NULL) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_MISC, "flash: vb\n");
+#endif
+               tputs(flash_screen, 0, __cputchar);
+       } else if (bell != NULL) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_MISC, "flash: bl\n");
+#endif
+               tputs(bell, 0, __cputchar);
+       }
+       return (1);
+}
diff --git a/lib/libcurses/border.c b/lib/libcurses/border.c
new file mode 100644 (file)
index 0000000..041e9dc
--- /dev/null
@@ -0,0 +1,606 @@
+/*     $NetBSD: border.c,v 1.14 2010/12/25 09:59:52 blymn Exp $        */
+
+/*
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: border.c,v 1.14 2010/12/25 09:59:52 blymn Exp $");
+#endif                         /* not lint */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * border --
+ *     Draw a border around stdscr using the specified
+ *     delimiting characters.
+ */
+int
+border(chtype left, chtype right, chtype top, chtype bottom, chtype topleft,
+       chtype topright, chtype botleft, chtype botright)
+{
+       return wborder(stdscr, left, right, top, bottom, topleft, topright,
+           botleft, botright);
+}
+
+#endif
+
+/*
+ * wborder --
+ *     Draw a border around the given window using the specified delimiting
+ *     characters.
+ */
+int
+wborder(WINDOW *win, chtype left, chtype right, chtype top, chtype bottom,
+       chtype topleft, chtype topright, chtype botleft, chtype botright)
+{
+#ifndef HAVE_WCHAR
+       int      endy, endx, i;
+       __LDATA *fp, *lp;
+
+       if (!(left & __CHARTEXT))
+               left |= ACS_VLINE;
+       if (!(right & __CHARTEXT))
+               right |= ACS_VLINE;
+       if (!(top & __CHARTEXT))
+               top |= ACS_HLINE;
+       if (!(bottom & __CHARTEXT))
+               bottom |= ACS_HLINE;
+       if (!(topleft & __CHARTEXT))
+               topleft |= ACS_ULCORNER;
+       if (!(topright & __CHARTEXT))
+               topright |= ACS_URCORNER;
+       if (!(botleft & __CHARTEXT))
+               botleft |= ACS_LLCORNER;
+       if (!(botright & __CHARTEXT))
+               botright |= ACS_LRCORNER;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wborder: left = %c, 0x%x\n",
+           left & __CHARTEXT, left & __ATTRIBUTES);
+       __CTRACE(__CTRACE_INPUT, "wborder: right = %c, 0x%x\n",
+           right & __CHARTEXT, right & __ATTRIBUTES);
+       __CTRACE(__CTRACE_INPUT, "wborder: top = %c, 0x%x\n",
+           top & __CHARTEXT, top & __ATTRIBUTES);
+       __CTRACE(__CTRACE_INPUT, "wborder: bottom = %c, 0x%x\n",
+           bottom & __CHARTEXT, bottom & __ATTRIBUTES);
+       __CTRACE(__CTRACE_INPUT, "wborder: topleft = %c, 0x%x\n",
+           topleft & __CHARTEXT, topleft & __ATTRIBUTES);
+       __CTRACE(__CTRACE_INPUT, "wborder: topright = %c, 0x%x\n",
+           topright & __CHARTEXT, topright & __ATTRIBUTES);
+       __CTRACE(__CTRACE_INPUT, "wborder: botleft = %c, 0x%x\n",
+           botleft & __CHARTEXT, botleft & __ATTRIBUTES);
+       __CTRACE(__CTRACE_INPUT, "wborder: botright = %c, 0x%x\n",
+           botright & __CHARTEXT, botright & __ATTRIBUTES);
+#endif
+
+       /* Merge window and background attributes */
+       left |= (left & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
+       left |= (left & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
+       right |= (right & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
+       right |= (right & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
+       top |= (top & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
+       top |= (top & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
+       bottom |= (bottom & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
+       bottom |= (bottom & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
+       topleft |= (topleft & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
+       topleft |= (topleft & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
+       topright |= (topright & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
+       topright |= (topright & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
+       botleft |= (botleft & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
+       botleft |= (botleft & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
+       botright |= (botright & __COLOR) ? (win->wattr & ~__COLOR) : win->wattr;
+       botright |= (botright & __COLOR) ? (win->battr & ~__COLOR) : win->battr;
+
+       endx = win->maxx - 1;
+       endy = win->maxy - 1;
+       fp = win->alines[0]->line;
+       lp = win->alines[endy]->line;
+
+       /* Sides */
+       for (i = 1; i < endy; i++) {
+               win->alines[i]->line[0].ch = (wchar_t) left & __CHARTEXT;
+               win->alines[i]->line[0].attr = (attr_t) left & __ATTRIBUTES;
+               win->alines[i]->line[endx].ch = (wchar_t) right & __CHARTEXT;
+               win->alines[i]->line[endx].attr = (attr_t) right & __ATTRIBUTES;
+       }
+       for (i = 1; i < endx; i++) {
+               fp[i].ch = (wchar_t) top & __CHARTEXT;
+               fp[i].attr = (attr_t) top & __ATTRIBUTES;
+               lp[i].ch = (wchar_t) bottom & __CHARTEXT;
+               lp[i].attr = (attr_t) bottom & __ATTRIBUTES;
+       }
+
+       /* Corners */
+       if (!(win->maxx == LINES && win->maxy == COLS &&
+           (win->flags & __SCROLLOK) && (win->flags & __SCROLLWIN))) {
+               fp[0].ch = (wchar_t) topleft & __CHARTEXT;
+               fp[0].attr = (attr_t) topleft & __ATTRIBUTES;
+               fp[endx].ch = (wchar_t) topright & __CHARTEXT;
+               fp[endx].attr = (attr_t) topright & __ATTRIBUTES;
+               lp[0].ch = (wchar_t) botleft & __CHARTEXT;
+               lp[0].attr = (attr_t) botleft & __ATTRIBUTES;
+               lp[endx].ch = (wchar_t) botright & __CHARTEXT;
+               lp[endx].attr = (attr_t) botright & __ATTRIBUTES;
+       }
+       __touchwin(win);
+       return (OK);
+#else /* HAVE_WCHAR */
+       cchar_t ls, rs, ts, bs, tl, tr, bl, br;
+       cchar_t *lsp, *rsp, *tsp, *bsp, *tlp, *trp, *blp, *brp;
+
+#define S(in, out, def) \
+       if (in & __CHARTEXT) { \
+               __cursesi_chtype_to_cchar(in, &out); \
+       } else { \
+               memcpy(&out, def, sizeof(cchar_t)); \
+               out.attributes |= in & __ATTRIBUTES; \
+       } \
+       out##p = &out;
+
+       S(left, ls, WACS_VLINE);
+       S(right, rs, WACS_VLINE);
+       S(top, ts, WACS_HLINE);
+       S(bottom, bs, WACS_HLINE);
+       S(topleft, tl, WACS_ULCORNER);
+       S(topright, tr, WACS_URCORNER);
+       S(botleft, bl, WACS_LLCORNER);
+       S(botright, br, WACS_LRCORNER);
+#undef S
+       return wborder_set(win, lsp, rsp, tsp, bsp, tlp, trp, blp, brp);
+#endif /* HAVE_WCHAR */
+}
+
+int border_set(const cchar_t *ls, const cchar_t *rs, const cchar_t *ts,
+          const cchar_t *bs, const cchar_t *tl, const cchar_t *tr,
+          const cchar_t *bl, const cchar_t *br)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wborder_set(stdscr, ls, rs, ts, bs, tl, tr, bl, br);
+#endif /* HAVE_WCHAR */
+}
+
+int wborder_set(WINDOW *win, const cchar_t *ls, const cchar_t *rs,
+               const cchar_t *ts, const cchar_t *bs,
+               const cchar_t *tl, const cchar_t *tr,
+               const cchar_t *bl, const cchar_t *br)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       int      endy, endx, i, j, k, cw, pcw, tlcw, blcw, trcw, brcw;
+       cchar_t left, right, bottom, top, topleft, topright, botleft, botright;
+       nschar_t *np, *tnp;
+
+       if ( ls && wcwidth( ls->vals[ 0 ]))
+               memcpy( &left, ls, sizeof( cchar_t ));
+       else
+               memcpy( &left, WACS_VLINE, sizeof( cchar_t ));
+       if ( rs && wcwidth( rs->vals[ 0 ]))
+               memcpy( &right, rs, sizeof( cchar_t ));
+       else
+               memcpy( &right, WACS_VLINE, sizeof( cchar_t ));
+       if ( ts && wcwidth( ts->vals[ 0 ]))
+               memcpy( &top, ts, sizeof( cchar_t ));
+       else
+               memcpy( &top, WACS_HLINE, sizeof( cchar_t ));
+       if ( bs && wcwidth( bs->vals[ 0 ]))
+               memcpy( &bottom, bs, sizeof( cchar_t ));
+       else
+               memcpy( &bottom, WACS_HLINE, sizeof( cchar_t ));
+       if ( tl && wcwidth( tl->vals[ 0 ]))
+               memcpy( &topleft, tl, sizeof( cchar_t ));
+       else
+               memcpy( &topleft, WACS_ULCORNER, sizeof( cchar_t ));
+       if ( tr && wcwidth( tr->vals[ 0 ]))
+               memcpy( &topright, tr, sizeof( cchar_t ));
+       else
+               memcpy( &topright, WACS_URCORNER, sizeof( cchar_t ));
+       if ( bl && wcwidth( bl->vals[ 0 ]))
+               memcpy( &botleft, bl, sizeof( cchar_t ));
+       else
+               memcpy( &botleft, WACS_LLCORNER, sizeof( cchar_t ));
+       if ( br && wcwidth( br->vals[ 0 ]))
+               memcpy( &botright, br, sizeof( cchar_t ));
+       else
+               memcpy( &botright, WACS_LRCORNER, sizeof( cchar_t ));
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wborder_set: left = %c, 0x%x\n",
+           left.vals[0], left.attributes );
+       __CTRACE(__CTRACE_INPUT, "wborder_set: right = %c, 0x%x\n",
+           right.vals[0], right.attributes );
+       __CTRACE(__CTRACE_INPUT, "wborder_set: top = %c, 0x%x\n",
+           top.vals[0], top.attributes );
+       __CTRACE(__CTRACE_INPUT, "wborder_set: bottom = %c, 0x%x\n",
+           bottom.vals[0], bottom.attributes );
+       __CTRACE(__CTRACE_INPUT, "wborder_set: topleft = %c, 0x%x\n",
+           topleft.vals[0], topleft.attributes );
+       __CTRACE(__CTRACE_INPUT, "wborder_set: topright = %c, 0x%x\n",
+           topright.vals[0], topright.attributes );
+       __CTRACE(__CTRACE_INPUT, "wborder_set: botleft = %c, 0x%x\n",
+           botleft.vals[0], botleft.attributes );
+       __CTRACE(__CTRACE_INPUT, "wborder_set: botright = %c, 0x%x\n",
+           botright.vals[0], botright.attributes );
+#endif
+
+       /* Merge window attributes */
+       left.attributes |= (left.attributes & __COLOR) ?
+               (win->wattr & ~__COLOR) : win->wattr;
+       right.attributes |= (right.attributes & __COLOR) ?
+               (win->wattr & ~__COLOR) : win->wattr;
+       top.attributes |= (top.attributes & __COLOR) ?
+               (win->wattr & ~__COLOR) : win->wattr;
+       bottom.attributes |= (bottom.attributes & __COLOR) ?
+               (win->wattr & ~__COLOR) : win->wattr;
+       topleft.attributes |= (topleft.attributes & __COLOR) ?
+               (win->wattr & ~__COLOR) : win->wattr;
+       topright.attributes |= (topright.attributes & __COLOR) ?
+               (win->wattr & ~__COLOR) : win->wattr;
+       botleft.attributes |= (botleft.attributes & __COLOR) ?
+               (win->wattr & ~__COLOR) : win->wattr;
+       botright.attributes |= (botright.attributes & __COLOR) ?
+               (win->wattr & ~__COLOR) : win->wattr;
+
+       endx = win->maxx - 1;
+       endy = win->maxy - 1;
+
+       /* Sides */
+       for (i = 1; i < endy; i++) {
+               /* left border */
+               cw = wcwidth( left.vals[ 0 ]);
+               if (cw < 0)
+                       cw = 1;
+               for ( j = 0; j < cw; j++ ) {
+                       win->alines[i]->line[j].ch = left.vals[ 0 ];
+                       win->alines[i]->line[j].attr = left.attributes;
+                       np = win->alines[i]->line[j].nsp;
+                       if (np) {
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               win->alines[i]->line[j].nsp = NULL;
+                       }
+                       if ( j )
+                               SET_WCOL( win->alines[i]->line[j], -j );
+                       else {
+                               SET_WCOL( win->alines[i]->line[j], cw );
+                               if ( left.elements > 1 ) {
+                                       for (k = 1; k < left.elements; k++) {
+                                               np = (nschar_t *)malloc(sizeof(nschar_t));
+                                               if (!np)
+                                                       return ERR;
+                                               np->ch = left.vals[ k ];
+                                               np->next = win->alines[i]->line[j].nsp;
+                                               win->alines[i]->line[j].nsp
+                                                       = np;
+                                       }
+                               }
+                       }
+               }
+               for ( j = cw; WCOL( win->alines[i]->line[j]) < 0; j++ ) {
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "wborder_set: clean out partial char[%d]", j);
+#endif /* DEBUG */
+                       win->alines[i]->line[j].ch = ( wchar_t )btowc(win->bch);
+                       if (_cursesi_copy_nsp(win->bnsp,
+                                             &win->alines[i]->line[j]) == ERR)
+                               return ERR;
+                       SET_WCOL( win->alines[i]->line[j], 1 );
+               }
+               /* right border */
+               cw = wcwidth( right.vals[ 0 ]);
+               if (cw < 0)
+                       cw = 1;
+               pcw = WCOL( win->alines[i]->line[endx - cw]);
+               for ( j = endx - cw + 1; j <= endx; j++ ) {
+                       win->alines[i]->line[j].ch = right.vals[ 0 ];
+                       win->alines[i]->line[j].attr = right.attributes;
+                       np = win->alines[i]->line[j].nsp;
+                       if (np) {
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               win->alines[i]->line[j].nsp = NULL;
+                       }
+                       if ( j == endx - cw + 1 ) {
+                               SET_WCOL( win->alines[i]->line[j], cw );
+                               if ( right.elements > 1 ) {
+                                       for (k = 1; k < right.elements; k++) {
+                                               np = (nschar_t *)malloc(sizeof(nschar_t));
+                                               if (!np)
+                                                       return ERR;
+                                               np->ch = right.vals[ k ];
+                                               np->next = win->alines[i]->line[j].nsp;
+                                               win->alines[i]->line[j].nsp
+                                                       = np;
+                                       }
+                               }
+                       } else
+                               SET_WCOL( win->alines[i]->line[j],
+                                       endx - cw + 1 - j );
+               }
+               if ( pcw != 1 ) {
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "wborder_set: clean out partial chars[%d:%d]",
+                           endx - cw + pcw, endx - cw );
+#endif /* DEBUG */
+                       k = pcw < 0 ? endx -cw + pcw : endx - cw;
+                       for ( j = endx - cw; j >= k; j-- ) {
+                               win->alines[i]->line[j].ch
+                                       = (wchar_t)btowc(win->bch);
+                               if (_cursesi_copy_nsp(win->bnsp,
+                                              &win->alines[i]->line[j]) == ERR)
+                                       return ERR;
+                               win->alines[i]->line[j].attr = win->battr;
+                               SET_WCOL( win->alines[i]->line[j], 1 );
+                       }
+               }
+       }
+       tlcw = wcwidth( topleft.vals[ 0 ]);
+       if (tlcw < 0)
+               tlcw = 1;
+       blcw = wcwidth( botleft.vals[ 0 ]);
+       if (blcw < 0)
+               blcw = 1;
+       trcw = wcwidth( topright.vals[ 0 ]);
+       if (trcw < 0)
+               trcw = 1;
+       brcw = wcwidth( botright.vals[ 0 ]);
+       if (brcw < 0)
+               brcw = 1;
+       /* upper border */
+       cw = wcwidth( top.vals[ 0 ]);
+       if (cw < 0)
+               cw = 1;
+       for (i = tlcw; i <= min( endx - cw, endx - trcw ); i += cw ) {
+               for ( j = 0; j < cw; j++ ) {
+                       win->alines[ 0 ]->line[i + j].ch = top.vals[ 0 ];
+                       win->alines[ 0 ]->line[i + j].attr = top.attributes;
+                       np = win->alines[ 0 ]->line[i + j].nsp;
+                       if (np) {
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               win->alines[ 0 ]->line[i + j].nsp = NULL;
+                       }
+                       if ( j )
+                               SET_WCOL( win->alines[ 0 ]->line[ i + j ], -j );
+                       else {
+                               SET_WCOL( win->alines[ 0 ]->line[ i + j ], cw );
+                               if ( top.elements > 1 ) {
+                                       for ( k = 1; k < top.elements; k++ ) {
+                                               np = (nschar_t *)malloc(sizeof(nschar_t));
+                                               if (!np)
+                                                       return ERR;
+                                               np->ch = top.vals[ k ];
+                                               np->next = win->alines[0]->line[i + j].nsp;
+                                               win->alines[0]->line[i + j].nsp
+                                                       = np;
+                                       }
+                               }
+                       }
+               }
+       }
+       while ( i <= endx - trcw ) {
+               win->alines[0]->line[i].ch =
+                       ( wchar_t )btowc(( int ) win->bch );
+               if (_cursesi_copy_nsp(win->bnsp,
+                                     &win->alines[0]->line[i]) == ERR)
+                       return ERR;
+               win->alines[ 0 ]->line[ i ].attr = win->battr;
+               SET_WCOL( win->alines[ 0 ]->line[ i ], 1 );
+               i++;
+       }
+       /* lower border */
+       for (i = blcw; i <= min( endx - cw, endx - brcw ); i += cw ) {
+               for ( j = 0; j < cw; j++ ) {
+                       win->alines[ endy ]->line[i + j].ch = bottom.vals[ 0 ];
+                       win->alines[endy]->line[i + j].attr = bottom.attributes;
+                       np = win->alines[ endy ]->line[i + j].nsp;
+                       if (np) {
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               win->alines[ endy ]->line[i + j].nsp = NULL;
+                       }
+                       if ( j )
+                               SET_WCOL( win->alines[endy]->line[i + j], -j);
+                       else {
+                               SET_WCOL( win->alines[endy]->line[i + j], cw );
+                               if ( bottom.elements > 1 ) {
+                                       for ( k = 1; k < bottom.elements;
+                                                       k++ ) {
+                                               if ( !( np = ( nschar_t *)malloc( sizeof( nschar_t ))))
+                                                       return ERR;
+                                               np->ch = bottom.vals[ k ];
+                                               np->next = win->alines[endy]->line[i + j].nsp;
+                                               win->alines[endy]->line[i + j].nsp = np;
+                                       }
+                               }
+                       }
+               }
+       }
+       while ( i <= endx - brcw ) {
+               win->alines[endy]->line[i].ch =
+                       (wchar_t)btowc((int) win->bch );
+               if (_cursesi_copy_nsp(win->bnsp,
+                                     &win->alines[endy]->line[i]) == ERR)
+                       return ERR;
+               win->alines[ endy ]->line[ i ].attr = win->battr;
+               SET_WCOL( win->alines[ endy ]->line[ i ], 1 );
+               i++;
+       }
+
+       /* Corners */
+       if (!(win->maxx == LINES && win->maxy == COLS &&
+               (win->flags & __SCROLLOK) && (win->flags & __SCROLLWIN))) {
+               for ( i = 0; i < tlcw; i++ ) {
+                       win->alines[ 0 ]->line[i].ch = topleft.vals[ 0 ];
+                       win->alines[ 0 ]->line[i].attr = topleft.attributes;
+                       np = win->alines[ 0 ]->line[i].nsp;
+                       if (np) {
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               win->alines[ 0 ]->line[i].nsp = NULL;
+                       }
+                       if ( i )
+                               SET_WCOL( win->alines[ 0 ]->line[ i ], -i );
+                       else {
+                               SET_WCOL( win->alines[ 0 ]->line[ i ], tlcw );
+                               if ( topleft.elements > 1 ) {
+                                       for ( k = 1; k < topleft.elements;
+                                                       k++ ) {
+                                               np = (nschar_t *)malloc(sizeof(nschar_t));
+                                               if (!np)
+                                                       return ERR;
+                                               np->ch = topleft.vals[ k ];
+                                               np->next = win->alines[ 0 ]->line[i].nsp;
+                                               win->alines[ 0 ]->line[i].nsp
+                                                       = np;
+                                       }
+                               }
+                       }
+               }
+               for ( i = endx - trcw + 1; i <= endx; i++ ) {
+                       win->alines[ 0 ]->line[i].ch = topright.vals[ 0 ];
+                       win->alines[ 0 ]->line[i].attr = topright.attributes;
+                       np = win->alines[ 0 ]->line[i].nsp;
+                       if (np) {
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               win->alines[ 0 ]->line[i].nsp = NULL;
+                       }
+                       if ( i == endx - trcw + 1 ) {
+                               SET_WCOL( win->alines[ 0 ]->line[ i ], trcw );
+                               if ( topright.elements > 1 ) {
+                                       for ( k = 1; k < topright.elements;
+                                                       k++ ) {
+                                               np = (nschar_t *)malloc(sizeof(nschar_t));
+                                               if (!np)
+                                                       return ERR;
+                                               np->ch = topright.vals[ k ];
+                                               np->next = win->alines[0]->line[i].nsp;
+                                               win->alines[ 0 ]->line[i].nsp
+                                                       = np;
+                                       }
+                               }
+                       } else
+                               SET_WCOL( win->alines[ 0 ]->line[ i ],
+                                         endx - trcw + 1 - i );
+               }
+               for ( i = 0; i < blcw; i++ ) {
+                       win->alines[ endy ]->line[i].ch = botleft.vals[ 0 ];
+                       win->alines[ endy ]->line[i].attr = botleft.attributes;
+                       np = win->alines[ endy ]->line[i].nsp;
+                       if (np) {
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               win->alines[ endy ]->line[i].nsp = NULL;
+                       }
+                       if ( i )
+                               SET_WCOL( win->alines[endy]->line[i], -i );
+                       else {
+                               SET_WCOL( win->alines[endy]->line[i], blcw );
+                               if ( botleft.elements > 1 ) {
+                                       for ( k = 1; k < botleft.elements;
+                                                       k++ ) {
+                                               np = (nschar_t *)malloc(sizeof(nschar_t));
+                                               if (!np)
+                                                       return ERR;
+                                               np->ch = botleft.vals[ k ];
+                                               np->next = win->alines[endy]->line[i].nsp;
+                                               win->alines[endy]->line[i].nsp
+                                                       = np;
+                                       }
+                               }
+                       }
+               }
+               for ( i = endx - brcw + 1; i <= endx; i++ ) {
+                       win->alines[ endy ]->line[i].ch = botright.vals[ 0 ];
+                       win->alines[ endy ]->line[i].attr = botright.attributes;
+                       np = win->alines[ endy ]->line[i].nsp;
+                       if (np) {
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               win->alines[ endy ]->line[i].nsp = NULL;
+                       }
+                       if ( i == endx - brcw + 1 ) {
+                               SET_WCOL( win->alines[ endy ]->line[ i ],
+                                         brcw );
+                               if ( botright.elements > 1 ) {
+                                       for ( k = 1; k < botright.elements; k++ ) {
+                                               np = (nschar_t *)malloc(sizeof(nschar_t));
+                                               if (!np)
+                                                       return ERR;
+                                               np->ch = botright.vals[ k ];
+                                               np->next = win->alines[endy]->line[i].nsp;
+                                               win->alines[endy]->line[i].nsp
+                                                       = np;
+                                       }
+                               }
+                       } else
+                               SET_WCOL( win->alines[ endy ]->line[ i ],
+                                       endx - brcw + 1 - i );
+               }
+       }
+       __touchwin(win);
+       return (OK);
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/box.c b/lib/libcurses/box.c
new file mode 100644 (file)
index 0000000..9ffe710
--- /dev/null
@@ -0,0 +1,62 @@
+/*     $NetBSD: box.c,v 1.14 2007/05/28 15:01:54 blymn Exp $   */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)box.c      8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: box.c,v 1.14 2007/05/28 15:01:54 blymn Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+
+/*
+ * box --
+ *     Draw a box around the given window with "vert" as the vertical
+ *     delimiting char, and "hor", as the horizontal one.  Uses wborder().
+ */
+int
+box(WINDOW *win, chtype vert, chtype hor)
+{
+       return (wborder(win, vert, vert, hor, hor, 0, 0, 0, 0));
+}
+
+int 
+box_set(WINDOW *win, const cchar_t *verch, const cchar_t *horch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wborder_set(win, verch, verch, horch, horch, NULL, NULL, NULL, NULL);
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/cchar.c b/lib/libcurses/cchar.c
new file mode 100644 (file)
index 0000000..3f72306
--- /dev/null
@@ -0,0 +1,138 @@
+/*   $NetBSD: cchar.c,v 1.5 2010/12/16 17:42:28 wiz Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: cchar.c,v 1.5 2010/12/16 17:42:28 wiz Exp $");
+#endif                                           /* not lint */
+
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * getcchar --
+ *     get a wide-character string and rendition from a cchar_t
+ */
+int
+getcchar(const cchar_t *wcval, wchar_t *wch, attr_t *attrs,
+                                        short *color_pair, void *opts)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       wchar_t *wp;
+       size_t len;
+
+       if ( opts )
+               return ERR;
+
+       len = (wp = wmemchr(wcval->vals, L'\0', CCHARW_MAX))
+               ? wp - wcval->vals : CCHARW_MAX;
+
+       if (wch == NULL)
+               return (int) len;
+       if (attrs == 0 || color_pair == 0)
+               return ERR;
+       if (len > 0) {
+               *attrs = wcval->attributes;
+               *color_pair = COLOR_PAIR( wcval -> attributes );
+               wmemcpy(wch, wcval->vals, (unsigned) len);
+               wch[len] = L'\0';
+       }
+       return OK;
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * setcchar --
+ *     set cchar_t from a wide-character string and rendition
+ */
+int
+setcchar(cchar_t *wcval, const wchar_t *wch, const attr_t attrs,
+                                        short color_pair, const void *opts)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       int i;
+       size_t len;
+
+       if (opts || (len = wcslen(wch)) > CCHARW_MAX
+               || (len > 1 && wcwidth(wch[0]) < 0)) {
+               return ERR;
+       }
+
+       /*
+        * If we have a following spacing-character, stop at that point.  We
+        * are only interested in adding non-spacing characters.
+        */
+       for (i = 1; i < len; ++i) {
+               if (wcwidth(wch[i]) != 0) {
+                       len = i;
+                       break;
+               }
+       }
+
+       memset(wcval, 0, sizeof(*wcval));
+       if (len != 0) {
+               wcval -> attributes = attrs | color_pair;
+               wcval -> elements = 1;
+               memcpy(&wcval->vals, wch, len * sizeof(wchar_t));
+       }
+
+       return OK;
+#endif /* HAVE_WCHAR */
+}
+
+void
+__cursesi_chtype_to_cchar(chtype in, cchar_t *out)
+{
+       unsigned int idx;
+
+       if (in & __ACS_IS_WACS) {
+               idx = in & __CHARTEXT;
+               if (idx < NUM_ACS) {
+                       memcpy(out, &_wacs_char[idx], sizeof(cchar_t));
+                       out->attributes |= in & __ATTRIBUTES;
+                       return;
+               }
+       }
+       out->vals[0] = in & __CHARTEXT;
+       out->attributes = in & __ATTRIBUTES;
+       out->elements = 1;
+}
diff --git a/lib/libcurses/charpick.c b/lib/libcurses/charpick.c
deleted file mode 100644 (file)
index 4b464a3..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#include <curses.h>
-
-/****************************************************************/
-/* Winch(win) returns the character at the current position in */
-/* Window 'win'.                                               */
-/****************************************************************/
-
-int winch(win)
-WINDOW *win;
-{
-  return((win->_line[win->_cury][win->_curx]) & 0xff);
-}                              /* winch */
-
-/****************************************************************/
-/* Mvinch() moves the stdscr cursor to a new position, then    */
-/* Returns the character at that position.                     */
-/****************************************************************/
-
-int mvinch(y, x)
-int y;
-int x;
-{
-  if (wmove(stdscr, y, x) == ERR) return(ERR);
-  return((stdscr->_line[stdscr->_cury][stdscr->_curx]) & 0xff);
-}
-
-/****************************************************************/
-/* Mvwinch() moves the cursor of window 'win' to a new posi-   */
-/* Tion, then returns the character at that position.          */
-/****************************************************************/
-
-int mvwinch(win, y, x)
-WINDOW *win;
-int y;
-int x;
-{
-  if (wmove(win, y, x) == ERR) return(ERR);
-  return((win->_line[win->_cury][win->_curx]) & 0xff);
-}
diff --git a/lib/libcurses/chgat.c b/lib/libcurses/chgat.c
new file mode 100644 (file)
index 0000000..5a2c42b
--- /dev/null
@@ -0,0 +1,93 @@
+/*     $NetBSD: chgat.c,v 1.4 2009/07/22 16:57:14 roy Exp $    */
+
+/*
+ * Copyright (c) 2009 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: chgat.c,v 1.4 2009/07/22 16:57:14 roy Exp $");
+
+#include "curses.h"
+#include "curses_private.h"
+
+int
+chgat(int n, attr_t attr, short color, const void *opts)
+{
+       return wchgat(stdscr, n, attr, color, opts);
+}
+
+int
+mvchgat(int y, int x, int n, attr_t attr, short color,
+    const void *opts)
+{
+       return mvwchgat(stdscr, y, x, n, attr, color, opts);
+}
+
+int
+wchgat(WINDOW *win, int n, attr_t attr, short color, const void *opts)
+{
+       return mvwchgat(win, win->cury, win->curx, n, attr, color, opts);
+}
+
+int
+mvwchgat(WINDOW *win , int y, int x, int count, attr_t attr, short color,
+    const void *opts)
+{
+       __LINE *lp;
+       __LDATA *lc;
+
+       if (x < 0 || y < 0)
+               return (ERR);
+       if (x >= win->maxx || y >= win->maxy)
+               return (ERR);
+
+       attr = (attr & ~__COLOR) | COLOR_PAIR(color);
+
+       if (count < 0 || count > win->maxx - x)
+               count = win->maxx - x;
+
+       lp = win->alines[y];
+       lc = &lp->line[x];
+
+       if (x + win->ch_off < *lp->firstchp)
+               *lp->firstchp = x + win->ch_off;
+       if (x + win->ch_off + count > *lp->lastchp)
+               *lp->lastchp = x + win->ch_off + count;
+
+       while (count-- > 0) {
+               lp->flags |= __ISDIRTY;
+#ifdef HAVE_WCHAR
+               lc->attr = (lc->attr & ~WA_ATTRIBUTES) | attr;
+#else
+               lc->attr = attr;
+#endif
+               ++lc;
+       }
+
+       return OK;
+}
diff --git a/lib/libcurses/clear.c b/lib/libcurses/clear.c
new file mode 100644 (file)
index 0000000..59238b1
--- /dev/null
@@ -0,0 +1,70 @@
+/*     $NetBSD: clear.c,v 1.13 2003/08/07 16:44:19 agc Exp $   */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)clear.c    8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: clear.c,v 1.13 2003/08/07 16:44:19 agc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * clear --
+ *     Clear stdscr
+ */
+int
+clear(void)
+{
+       return wclear(_cursesi_screen->stdscr);
+}
+
+#endif
+
+/*
+ * wclear --
+ *     Clear the window.
+ */
+int
+wclear(WINDOW *win)
+{
+       if (werase(win) == OK) {
+               win->flags |= __CLEAROK;
+               return (OK);
+       }
+       return (ERR);
+}
diff --git a/lib/libcurses/clearok.c b/lib/libcurses/clearok.c
new file mode 100644 (file)
index 0000000..3bf49b1
--- /dev/null
@@ -0,0 +1,52 @@
+/*     $NetBSD: clearok.c,v 1.5 2008/04/28 20:23:01 martin Exp $       */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: clearok.c,v 1.5 2008/04/28 20:23:01 martin Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * clearok --
+ *     Turn on and off clear before refresh for the given window.
+ */
+int
+clearok(WINDOW *win, bool bf)
+{
+       if (bf)
+               win->flags |= __CLEAROK;
+       else
+               win->flags &= ~__CLEAROK;
+       return (OK);
+}
diff --git a/lib/libcurses/clrtobot.c b/lib/libcurses/clrtobot.c
new file mode 100644 (file)
index 0000000..4a2d659
--- /dev/null
@@ -0,0 +1,115 @@
+/*     $NetBSD: clrtobot.c,v 1.21 2009/07/22 16:57:14 roy Exp $        */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)clrtobot.c 8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: clrtobot.c,v 1.21 2009/07/22 16:57:14 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <stdlib.h>
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * clrtobot --
+ *     Erase everything on stdscr.
+ */
+int
+clrtobot(void)
+{
+       return wclrtobot(stdscr);
+}
+
+#endif
+
+/*
+ * wclrtobot --
+ *     Erase everything on the window.
+ */
+int
+wclrtobot(WINDOW *win)
+{
+       int      minx, startx, starty, y;
+       __LDATA *sp, *end, *maxx;
+       attr_t  attr;
+
+#ifdef __GNUC__
+       maxx = NULL;            /* XXX gcc -Wuninitialized */
+#endif
+       if (win->alines[win->cury]->flags & __ISPASTEOL) {
+               starty = win->cury + 1;
+               startx = 0;
+       } else {
+               starty = win->cury;
+               startx = win->curx;
+       }
+       if (__using_color && win != curscr)
+               attr = win->battr & __COLOR;
+       else
+               attr = 0;
+       for (y = starty; y < win->maxy; y++) {
+               minx = -1;
+               end = &win->alines[y]->line[win->maxx];
+               for (sp = &win->alines[y]->line[startx]; sp < end; sp++) {
+#ifndef HAVE_WCHAR
+                       if (sp->ch != win->bch || sp->attr != attr) {
+#else
+                       if (sp->ch != (wchar_t)btowc((int) win->bch) ||
+                           (sp->attr & WA_ATTRIBUTES) != 0 || sp->nsp) {
+#endif /* HAVE_WCHAR */
+                               maxx = sp;
+                               if (minx == -1)
+                                       minx = (int)(sp - win->alines[y]->line);
+                               sp->attr = attr;
+#ifdef HAVE_WCHAR
+                               sp->ch = ( wchar_t )btowc(( int ) win->bch);
+                               if (_cursesi_copy_nsp(win->bnsp, sp) == ERR)
+                                       return ERR;
+                               SET_WCOL( *sp, 1 );
+#else
+                               sp->ch = win->bch;
+#endif /* HAVE_WCHAR */
+                       }
+               }
+
+               if (minx != -1)
+                       __touchline(win, y, minx,
+                                   (int) (maxx - win->alines[y]->line));
+               startx = 0;
+       }
+       return (OK);
+}
diff --git a/lib/libcurses/clrtoeol.c b/lib/libcurses/clrtoeol.c
new file mode 100644 (file)
index 0000000..d7d2a57
--- /dev/null
@@ -0,0 +1,118 @@
+/*     $NetBSD: clrtoeol.c,v 1.25 2009/07/22 16:57:14 roy Exp $        */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)clrtoeol.c 8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: clrtoeol.c,v 1.25 2009/07/22 16:57:14 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <stdlib.h>
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * clrtoeol --
+ *     Clear up to the end of line.
+ */
+int
+clrtoeol(void)
+{
+       return wclrtoeol(stdscr);
+}
+
+#endif
+
+/*
+ * wclrtoeol --
+ *     Clear up to the end of line.
+ */
+int
+wclrtoeol(WINDOW *win)
+{
+       int     minx, x, y;
+       __LDATA *end, *maxx, *sp;
+       attr_t  attr;
+
+       y = win->cury;
+       x = win->curx;
+       if (win->alines[y]->flags & __ISPASTEOL) {
+               if (y < win->maxy - 1) {
+                       win->alines[y]->flags &= ~__ISPASTEOL;
+                       y++;
+                       x = 0;
+                       win->cury = y;
+                       win->curx = x;
+               } else
+                       return (OK);
+       }
+       end = &win->alines[y]->line[win->maxx];
+       minx = -1;
+       maxx = &win->alines[y]->line[x];
+       if (__using_color && win != curscr)
+               attr = win->battr & __COLOR;
+       else
+               attr = 0;
+       for (sp = maxx; sp < end; sp++)
+#ifndef HAVE_WCHAR
+               if (sp->ch != win->bch || sp->attr != attr) {
+#else
+               if (sp->ch != ( wchar_t )btowc(( int ) win->bch ) ||
+                   (sp->attr & WA_ATTRIBUTES) != attr || sp->nsp
+                   || (WCOL(*sp) < 0)) {
+#endif /* HAVE_WCHAR */
+                       maxx = sp;
+                       if (minx == -1)
+                               minx = (int) (sp - win->alines[y]->line);
+                       sp->attr = attr;
+#ifdef HAVE_WCHAR
+                       sp->ch = ( wchar_t )btowc(( int ) win->bch);
+                       if (_cursesi_copy_nsp(win->bnsp, sp) == ERR)
+                               return ERR;
+                       SET_WCOL( *sp, 1 );
+#else
+                       sp->ch = win->bch;
+#endif /* HAVE_WCHAR */
+               }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ERASE, "CLRTOEOL: y = %d, minx = %d, maxx = %d, "
+           "firstch = %d, lastch = %d\n",
+           y, minx, (int) (maxx - win->alines[y]->line),
+           *win->alines[y]->firstchp, *win->alines[y]->lastchp);
+#endif
+       /* Update firstch and lastch for the line. */
+       return (__touchline(win, y, x, (int) win->maxx - 1));
+}
diff --git a/lib/libcurses/color.c b/lib/libcurses/color.c
new file mode 100644 (file)
index 0000000..36bb6ae
--- /dev/null
@@ -0,0 +1,687 @@
+/*     $NetBSD: color.c,v 1.37 2011/01/06 11:29:40 blymn Exp $ */
+
+/*
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: color.c,v 1.37 2011/01/06 11:29:40 blymn Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/* Have we initialised colours? */
+int    __using_color = 0;
+
+/* Default colour number */
+attr_t __default_color = 0;
+
+/* Default colour pair values - white on black. */
+struct __pair  __default_pair = {COLOR_WHITE, COLOR_BLACK, 0};
+
+/* Default colour values */
+/* Flags for colours and pairs */
+#define        __USED          0x01
+
+static void
+__change_pair(short);
+
+/*
+ * has_colors --
+ *     Check if terminal has colours.
+ */
+bool
+has_colors(void)
+{
+       if (max_colors > 0 && max_pairs > 0 &&
+           ((set_a_foreground != NULL && set_a_background != NULL) ||
+               initialize_pair != NULL || initialize_color != NULL ||
+               (set_background != NULL && set_foreground != NULL)))
+               return(TRUE);
+       else
+               return(FALSE);
+}
+
+/*
+ * can_change_color --
+ *     Check if terminal can change colours.
+ */
+bool
+can_change_color(void)
+{
+       if (can_change)
+               return(TRUE);
+       else
+               return(FALSE);
+}
+
+/*
+ * start_color --
+ *     Initialise colour support.
+ */
+int
+start_color(void)
+{
+       int                      i;
+       attr_t                   temp_nc;
+       struct __winlist        *wlp;
+       WINDOW                  *win;
+       int                      y, x;
+
+       if (has_colors() == FALSE)
+               return(ERR);
+
+       /* Max colours and colour pairs */
+       if (max_colors == -1)
+               COLORS = 0;
+       else {
+               COLORS = max_colors > MAX_COLORS ? MAX_COLORS : max_colors;
+               if (max_pairs == -1) {
+                       COLOR_PAIRS = 0;
+                       COLORS = 0;
+               } else {
+                       COLOR_PAIRS = (max_pairs > MAX_PAIRS - 1 ?
+                           MAX_PAIRS - 1 : max_pairs);
+                        /* Use the last colour pair for curses default. */
+                       __default_color = COLOR_PAIR(MAX_PAIRS - 1);
+               }
+       }
+       if (!COLORS)
+               return (ERR);
+
+       _cursesi_screen->COLORS = COLORS;
+       _cursesi_screen->COLOR_PAIRS = COLOR_PAIRS;
+
+       /* Reset terminal colour and colour pairs. */
+       if (orig_colors != NULL)
+               tputs(orig_colors, 0, __cputchar);
+       if (orig_pair != NULL) {
+               tputs(orig_pair, 0, __cputchar);
+               curscr->wattr &= _cursesi_screen->mask_op;
+       }
+
+       /* Type of colour manipulation - ANSI/TEK/HP/other */
+       if (set_a_foreground != NULL && set_a_background != NULL)
+               _cursesi_screen->color_type = COLOR_ANSI;
+       else if (initialize_pair != NULL)
+               _cursesi_screen->color_type = COLOR_HP;
+       else if (initialize_color != NULL)
+               _cursesi_screen->color_type = COLOR_TEK;
+       else if (set_foreground != NULL && set_background != NULL)
+               _cursesi_screen->color_type = COLOR_OTHER;
+       else
+               return(ERR);            /* Unsupported colour method */
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_COLOR, "start_color: COLORS = %d, COLOR_PAIRS = %d",
+           COLORS, COLOR_PAIRS);
+       switch (_cursesi_screen->color_type) {
+       case COLOR_ANSI:
+               __CTRACE(__CTRACE_COLOR, " (ANSI style)\n");
+               break;
+       case COLOR_HP:
+               __CTRACE(__CTRACE_COLOR, " (HP style)\n");
+               break;
+       case COLOR_TEK:
+               __CTRACE(__CTRACE_COLOR, " (Tektronics style)\n");
+               break;
+       case COLOR_OTHER:
+               __CTRACE(__CTRACE_COLOR, " (Other style)\n");
+               break;
+       }
+#endif
+
+       /*
+        * Attributes that cannot be used with color.
+        * Store these in an attr_t for wattrset()/wattron().
+        */
+       _cursesi_screen->nca = __NORMAL;
+       if (no_color_video != -1) {
+               temp_nc = (attr_t) t_no_color_video(_cursesi_screen->term);
+               if (temp_nc & 0x0001)
+                       _cursesi_screen->nca |= __STANDOUT;
+               if (temp_nc & 0x0002)
+                       _cursesi_screen->nca |= __UNDERSCORE;
+               if (temp_nc & 0x0004)
+                       _cursesi_screen->nca |= __REVERSE;
+               if (temp_nc & 0x0008)
+                       _cursesi_screen->nca |= __BLINK;
+               if (temp_nc & 0x0010)
+                       _cursesi_screen->nca |= __DIM;
+               if (temp_nc & 0x0020)
+                       _cursesi_screen->nca |= __BOLD;
+               if (temp_nc & 0x0040)
+                       _cursesi_screen->nca |= __BLANK;
+               if (temp_nc & 0x0080)
+                       _cursesi_screen->nca |= __PROTECT;
+               if (temp_nc & 0x0100)
+                       _cursesi_screen->nca |= __ALTCHARSET;
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_COLOR, "start_color: _cursesi_screen->nca = %08x\n",
+           _cursesi_screen->nca);
+#endif
+
+       /* Set up initial 8 colours */
+       if (COLORS >= COLOR_BLACK)
+               (void) init_color(COLOR_BLACK, 0, 0, 0);
+       if (COLORS >= COLOR_RED)
+               (void) init_color(COLOR_RED, 1000, 0, 0);
+       if (COLORS >= COLOR_GREEN)
+               (void) init_color(COLOR_GREEN, 0, 1000, 0);
+       if (COLORS >= COLOR_YELLOW)
+               (void) init_color(COLOR_YELLOW, 1000, 1000, 0);
+       if (COLORS >= COLOR_BLUE)
+               (void) init_color(COLOR_BLUE, 0, 0, 1000);
+       if (COLORS >= COLOR_MAGENTA)
+               (void) init_color(COLOR_MAGENTA, 1000, 0, 1000);
+       if (COLORS >= COLOR_CYAN)
+               (void) init_color(COLOR_CYAN, 0, 1000, 1000);
+       if (COLORS >= COLOR_WHITE)
+               (void) init_color(COLOR_WHITE, 1000, 1000, 1000);
+
+       /* Initialise other colours */
+       for (i = 8; i < COLORS; i++) {
+               _cursesi_screen->colours[i].red = 0;
+               _cursesi_screen->colours[i].green = 0;
+               _cursesi_screen->colours[i].blue = 0;
+               _cursesi_screen->colours[i].flags = 0;
+       }
+
+       /* Initialise pair 0 to default colours. */
+       _cursesi_screen->colour_pairs[0].fore = -1;
+       _cursesi_screen->colour_pairs[0].back = -1;
+       _cursesi_screen->colour_pairs[0].flags = 0;
+
+       /* Initialise user colour pairs to default (white on black) */
+       for (i = 0; i < COLOR_PAIRS; i++) {
+               _cursesi_screen->colour_pairs[i].fore = COLOR_WHITE;
+               _cursesi_screen->colour_pairs[i].back = COLOR_BLACK;
+               _cursesi_screen->colour_pairs[i].flags = 0;
+       }
+
+       /* Initialise default colour pair. */
+       _cursesi_screen->colour_pairs[PAIR_NUMBER(__default_color)].fore =
+           __default_pair.fore;
+       _cursesi_screen->colour_pairs[PAIR_NUMBER(__default_color)].back =
+           __default_pair.back;
+       _cursesi_screen->colour_pairs[PAIR_NUMBER(__default_color)].flags =
+           __default_pair.flags;
+
+       __using_color = 1;
+
+       /* Set all positions on all windows to curses default colours. */
+       for (wlp = _cursesi_screen->winlistp; wlp != NULL; wlp = wlp->nextp) {
+               win = wlp->winp;
+               if (wlp->winp != __virtscr && wlp->winp != curscr) {
+                       /* Set color attribute on other windows */
+                       win->battr |= __default_color;
+                       for (y = 0; y < win->maxy; y++) {
+                               for (x = 0; x < win->maxx; x++) {
+                                       win->alines[y]->line[x].attr &= ~__COLOR;
+                                       win->alines[y]->line[x].attr |= __default_color;
+                               }
+                       }
+                       __touchwin(win);
+               }
+       }
+
+       return(OK);
+}
+
+/*
+ * init_pair --
+ *     Set pair foreground and background colors.
+ *     Our default colour ordering is ANSI - 1 = red, 4 = blue, 3 = yellow,
+ *     6 = cyan.  The older style (Sb/Sf) uses 1 = blue, 4 = red, 3 = cyan,
+ *     6 = yellow, so we swap them here and in pair_content().
+ */
+int
+init_pair(short pair, short fore, short back)
+{
+       int     changed;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_COLOR, "init_pair: %d, %d, %d\n", pair, fore, back);
+#endif
+
+       if (pair < 0 || pair >= COLOR_PAIRS)
+               return (ERR);
+
+       if (pair == 0) /* Ignore request for pair 0, it is default. */
+               return OK;
+
+       if (fore >= COLORS)
+               return (ERR);
+       if (back >= COLORS)
+               return (ERR);
+
+       /* Swap red/blue and yellow/cyan */
+       if (_cursesi_screen->color_type == COLOR_OTHER) {
+               switch (fore) {
+               case COLOR_RED:
+                       fore = COLOR_BLUE;
+                       break;
+               case COLOR_BLUE:
+                       fore = COLOR_RED;
+                       break;
+               case COLOR_YELLOW:
+                       fore = COLOR_CYAN;
+                       break;
+               case COLOR_CYAN:
+                       fore = COLOR_YELLOW;
+                       break;
+               }
+               switch (back) {
+               case COLOR_RED:
+                       back = COLOR_BLUE;
+                       break;
+               case COLOR_BLUE:
+                       back = COLOR_RED;
+                       break;
+               case COLOR_YELLOW:
+                       back = COLOR_CYAN;
+                       break;
+               case COLOR_CYAN:
+                       back = COLOR_YELLOW;
+                       break;
+               }
+       }
+
+       if ((_cursesi_screen->colour_pairs[pair].flags & __USED) &&
+           (fore != _cursesi_screen->colour_pairs[pair].fore ||
+            back != _cursesi_screen->colour_pairs[pair].back))
+               changed = 1;
+       else
+               changed = 0;
+
+       _cursesi_screen->colour_pairs[pair].flags |= __USED;
+       _cursesi_screen->colour_pairs[pair].fore = fore;
+       _cursesi_screen->colour_pairs[pair].back = back;
+
+       /* XXX: need to initialise HP style (Ip) */
+
+       if (changed)
+               __change_pair(pair);
+       return (OK);
+}
+
+/*
+ * pair_content --
+ *     Get pair foreground and background colours.
+ */
+int
+pair_content(short pair, short *forep, short *backp)
+{
+       if (pair < 0 || pair > _cursesi_screen->COLOR_PAIRS)
+               return(ERR);
+
+       *forep = _cursesi_screen->colour_pairs[pair].fore;
+       *backp = _cursesi_screen->colour_pairs[pair].back;
+
+       /* Swap red/blue and yellow/cyan */
+       if (_cursesi_screen->color_type == COLOR_OTHER) {
+               switch (*forep) {
+               case COLOR_RED:
+                       *forep = COLOR_BLUE;
+                       break;
+               case COLOR_BLUE:
+                       *forep = COLOR_RED;
+                       break;
+               case COLOR_YELLOW:
+                       *forep = COLOR_CYAN;
+                       break;
+               case COLOR_CYAN:
+                       *forep = COLOR_YELLOW;
+                       break;
+               }
+               switch (*backp) {
+               case COLOR_RED:
+                       *backp = COLOR_BLUE;
+                       break;
+               case COLOR_BLUE:
+                       *backp = COLOR_RED;
+                       break;
+               case COLOR_YELLOW:
+                       *backp = COLOR_CYAN;
+                       break;
+               case COLOR_CYAN:
+                       *backp = COLOR_YELLOW;
+                       break;
+               }
+       }
+       return(OK);
+}
+
+/*
+ * init_color --
+ *     Set colour red, green and blue values.
+ */
+int
+init_color(short color, short red, short green, short blue)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_COLOR, "init_color: %d, %d, %d, %d\n",
+           color, red, green, blue);
+#endif
+       if (color < 0 || color >= _cursesi_screen->COLORS)
+               return(ERR);
+
+       _cursesi_screen->colours[color].red = red;
+       _cursesi_screen->colours[color].green = green;
+       _cursesi_screen->colours[color].blue = blue;
+       /* XXX Not yet implemented */
+       return(ERR);
+       /* XXX: need to initialise Tek style (Ic) and support HLS */
+}
+
+/*
+ * color_content --
+ *     Get colour red, green and blue values.
+ */
+int
+color_content(short color, short *redp, short *greenp, short *bluep)
+{
+       if (color < 0 || color >= _cursesi_screen->COLORS)
+               return(ERR);
+
+       *redp = _cursesi_screen->colours[color].red;
+       *greenp = _cursesi_screen->colours[color].green;
+       *bluep = _cursesi_screen->colours[color].blue;
+       return(OK);
+}
+
+/*
+ * use_default_colors --
+ *     Use terminal default colours instead of curses default colour.
+  */
+int
+use_default_colors()
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_COLOR, "use_default_colors\n");
+#endif
+
+       return(assume_default_colors(-1, -1));
+}
+
+/*
+ * assume_default_colors --
+ *     Set the default foreground and background colours.
+ */
+int
+assume_default_colors(short fore, short back)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_COLOR, "assume_default_colors: %d, %d\n",
+           fore, back);
+       __CTRACE(__CTRACE_COLOR, "assume_default_colors: default_colour = %d, pair_number = %d\n", __default_color, PAIR_NUMBER(__default_color));
+#endif
+
+       /* Swap red/blue and yellow/cyan */
+       if (_cursesi_screen->color_type == COLOR_OTHER) {
+               switch (fore) {
+               case COLOR_RED:
+                       fore = COLOR_BLUE;
+                       break;
+               case COLOR_BLUE:
+                       fore = COLOR_RED;
+                       break;
+               case COLOR_YELLOW:
+                       fore = COLOR_CYAN;
+                       break;
+               case COLOR_CYAN:
+                       fore = COLOR_YELLOW;
+                       break;
+               }
+               switch (back) {
+               case COLOR_RED:
+                       back = COLOR_BLUE;
+                       break;
+               case COLOR_BLUE:
+                       back = COLOR_RED;
+                       break;
+               case COLOR_YELLOW:
+                       back = COLOR_CYAN;
+                       break;
+               case COLOR_CYAN:
+                       back = COLOR_YELLOW;
+                       break;
+               }
+       }
+       __default_pair.fore = fore;
+       __default_pair.back = back;
+       __default_pair.flags = __USED;
+
+       if (COLOR_PAIRS) {
+               _cursesi_screen->colour_pairs[PAIR_NUMBER(__default_color)].fore = fore;
+               _cursesi_screen->colour_pairs[PAIR_NUMBER(__default_color)].back = back;
+               _cursesi_screen->colour_pairs[PAIR_NUMBER(__default_color)].flags = __USED;
+       }
+
+       /*
+        * If we've already called start_color(), make sure all instances
+        * of the curses default colour pair are dirty.
+        */
+       if (__using_color)
+               __change_pair(PAIR_NUMBER(__default_color));
+
+       return(OK);
+}
+
+/* no_color_video is a terminfo macro, but we need to retain binary compat */
+#ifdef __strong_alias
+#undef no_color_video
+__strong_alias(no_color_video, no_color_attributes)
+#endif
+/*
+ * no_color_attributes --
+ *     Return attributes that cannot be combined with color.
+ */
+attr_t
+no_color_attributes(void)
+{
+       return(_cursesi_screen->nca);
+}
+
+/*
+ * __set_color --
+ *     Set terminal foreground and background colours.
+ */
+void
+__set_color( /*ARGSUSED*/ WINDOW *win, attr_t attr)
+{
+       short   pair;
+
+       if ((curscr->wattr & __COLOR) == (attr & __COLOR))
+               return;
+
+       pair = PAIR_NUMBER((u_int32_t)attr);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_COLOR, "__set_color: %d, %d, %d\n", pair,
+                _cursesi_screen->colour_pairs[pair].fore,
+                _cursesi_screen->colour_pairs[pair].back);
+#endif
+       switch (_cursesi_screen->color_type) {
+       /* Set ANSI forground and background colours */
+       case COLOR_ANSI:
+               if (_cursesi_screen->colour_pairs[pair].fore < 0 ||
+                   _cursesi_screen->colour_pairs[pair].back < 0)
+                       __unset_color(curscr);
+               if (_cursesi_screen->colour_pairs[pair].fore >= 0)
+                       tputs(vtparm(t_set_a_foreground(_cursesi_screen->term),
+                           _cursesi_screen->colour_pairs[pair].fore),
+                           0, __cputchar);
+               if (_cursesi_screen->colour_pairs[pair].back >= 0)
+                       tputs(vtparm(t_set_a_background(_cursesi_screen->term),
+                           _cursesi_screen->colour_pairs[pair].back),
+                           0, __cputchar);
+               break;
+       case COLOR_HP:
+               /* XXX: need to support HP style */
+               break;
+       case COLOR_TEK:
+               /* XXX: need to support Tek style */
+               break;
+       case COLOR_OTHER:
+               if (_cursesi_screen->colour_pairs[pair].fore < 0 ||
+                   _cursesi_screen->colour_pairs[pair].back < 0)
+                       __unset_color(curscr);
+               if (_cursesi_screen->colour_pairs[pair].fore >= 0)
+                       tputs(vtparm(t_set_foreground(_cursesi_screen->term),
+                           _cursesi_screen->colour_pairs[pair].fore),
+                           0, __cputchar);
+               if (_cursesi_screen->colour_pairs[pair].back >= 0)
+                       tputs(vtparm(t_set_background(_cursesi_screen->term),
+                           _cursesi_screen->colour_pairs[pair].back),
+                           0, __cputchar);
+               break;
+       }
+       curscr->wattr &= ~__COLOR;
+       curscr->wattr |= attr & __COLOR;
+}
+
+/*
+ * __unset_color --
+ *     Clear terminal foreground and background colours.
+ */
+void
+__unset_color(WINDOW *win)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_COLOR, "__unset_color\n");
+#endif
+       switch (_cursesi_screen->color_type) {
+       /* Clear ANSI forground and background colours */
+       case COLOR_ANSI:
+               if (orig_pair != NULL) {
+                       tputs(orig_pair, 0, __cputchar);
+                       win->wattr &= __mask_op;
+               }
+               break;
+       case COLOR_HP:
+               /* XXX: need to support HP style */
+               break;
+       case COLOR_TEK:
+               /* XXX: need to support Tek style */
+               break;
+       case COLOR_OTHER:
+               if (orig_pair != NULL) {
+                       tputs(orig_pair, 0, __cputchar);
+                       win->wattr &= __mask_op;
+               }
+               break;
+       }
+}
+
+/*
+ * __restore_colors --
+ *     Redo color definitions after restarting 'curses' mode.
+ */
+void
+__restore_colors(void)
+{
+       if (can_change != 0)
+               switch (_cursesi_screen->color_type) {
+               case COLOR_HP:
+                       /* XXX: need to re-initialise HP style (Ip) */
+                       break;
+               case COLOR_TEK:
+                       /* XXX: need to re-initialise Tek style (Ic) */
+                       break;
+               }
+}
+
+/*
+ * __change_pair --
+ *     Mark dirty all positions using pair.
+ */
+void
+__change_pair(short pair)
+{
+       struct __winlist        *wlp;
+       WINDOW                  *win;
+       int                      y, x;
+       __LINE                  *lp;
+       uint32_t                cl = COLOR_PAIR(pair);
+
+
+       for (wlp = _cursesi_screen->winlistp; wlp != NULL; wlp = wlp->nextp) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_COLOR, "__change_pair: win = %p\n",
+                   wlp->winp);
+#endif
+               win = wlp->winp;
+               if (win == __virtscr)
+                       continue;
+               else if (win == curscr) {
+                       /* Reset colour attribute on curscr */
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_COLOR,
+                           "__change_pair: win == curscr\n");
+#endif
+                       for (y = 0; y < curscr->maxy; y++) {
+                               lp = curscr->alines[y];
+                               for (x = 0; x < curscr->maxx; x++) {
+                                       if ((lp->line[x].attr & __COLOR) == cl)
+                                               lp->line[x].attr &= ~__COLOR;
+                               }
+                       }
+               } else {
+                       /* Mark dirty those positions with colour pair "pair" */
+                       for (y = 0; y < win->maxy; y++) {
+                               lp = win->alines[y];
+                               for (x = 0; x < win->maxx; x++)
+                                       if ((lp->line[x].attr &
+                                           __COLOR) == cl) {
+                                               if (!(lp->flags & __ISDIRTY))
+                                                       lp->flags |= __ISDIRTY;
+                                               /*
+                                               * firstchp/lastchp are shared
+                                               * between parent window and
+                                               * sub-window.
+                                               */
+                                               if (*lp->firstchp > x)
+                                               *lp->firstchp = x;
+                                               if (*lp->lastchp < x)
+                                                       *lp->lastchp = x;
+                                       }
+#ifdef DEBUG
+                               if ((win->alines[y]->flags & __ISDIRTY))
+                                       __CTRACE(__CTRACE_COLOR,
+                                           "__change_pair: first = %d, "
+                                           "last = %d\n",
+                                           *win->alines[y]->firstchp,
+                                           *win->alines[y]->lastchp);
+#endif
+                       }
+               }
+       }
+}
diff --git a/lib/libcurses/copywin.c b/lib/libcurses/copywin.c
new file mode 100644 (file)
index 0000000..0bec722
--- /dev/null
@@ -0,0 +1,135 @@
+/*     $NetBSD: copywin.c,v 1.15 2009/07/22 16:57:14 roy Exp $ */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn
+ *                         (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * This code has been donated to The NetBSD Foundation by the Author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: copywin.c,v 1.15 2009/07/22 16:57:14 roy Exp $");
+#endif                         /* not lint */
+
+#include <ctype.h>
+#include <string.h>
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * copywin --
+ *     Copy the box starting at (sminrow, smincol) with a size that
+ *     matches the destination box (dminrow, dmincol) by (dmaxrow, dmaxcol)
+ *     from the source window srcwin to the destination window dstwin.
+ *     All these coordindinates are relative to the relevant window.
+ *     If dooverlay is true then the copy is nondestructive otherwise the
+ *     copy is destructive.
+ */
+int copywin(const WINDOW *srcwin, WINDOW *dstwin,
+           int sminrow, int smincol,
+           int dminrow, int dmincol, int dmaxrow, int dmaxcol, int dooverlay)
+{
+       int dcol;
+       __LDATA *sp, *end;
+#ifdef HAVE_WCHAR
+       cchar_t cc;
+       nschar_t *np;
+#endif /* HAVE_WCHAR */
+
+       /* overwrite() and overlay() can come here with -ve srcwin coords */
+       if (sminrow < 0) {
+               dminrow -= sminrow;
+               sminrow = 0;
+       }
+       if (smincol < 0) {
+               dmincol -= smincol;
+               smincol = 0;
+       }
+
+       /* for symmetry allow dstwin coords to be -ve as well */
+       if (dminrow < 0) {
+               sminrow -= dminrow;
+               dminrow = 0;
+       }
+       if (dmincol < 0) {
+               smincol -= dmincol;
+               dmincol = 0;
+       }
+
+       /* Bound dmaxcol for both windows (should be ok for dstwin) */
+       if (dmaxcol >= dstwin->maxx)
+               dmaxcol = dstwin->maxx - 1;
+       if (smincol + (dmaxcol - dmincol) >= srcwin->maxx)
+               dmaxcol = srcwin->maxx + dmincol - smincol - 1;
+       if (dmaxcol < dmincol)
+               /* nothing in the intersection */
+               return OK;
+
+       /* Bound dmaxrow for both windows (should be ok for dstwin) */
+       if (dmaxrow >= dstwin->maxy)
+               dmaxrow = dstwin->maxy - 1;
+       if (sminrow + (dmaxrow - dminrow) >= srcwin->maxy)
+               dmaxrow = srcwin->maxy + dminrow - sminrow - 1;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW,
+           "copywin %s mode: from (%d,%d) to (%d,%d-%d,%d)\n",
+           dooverlay ? "overlay" : "overwrite",
+           sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol);
+#endif
+
+       for (; dminrow <= dmaxrow; sminrow++, dminrow++) {
+               sp = &srcwin->alines[sminrow]->line[smincol];
+               end = sp + dmaxcol - dmincol;
+               for (dcol = dmincol; sp <= end; dcol++, sp++) {
+                       /* XXX: Perhaps this should check for the
+                        * background character
+                        */
+                       if ((dooverlay && !isspace(sp->ch)) || !dooverlay) {
+                               wmove(dstwin, dminrow, dcol);
+#ifndef HAVE_WCHAR
+                               __waddch(dstwin, sp);
+#else
+                               cc.vals[0] = sp->ch;
+                               cc.attributes = sp->attr;
+                               cc.elements = 1;
+                               np = sp->nsp;
+                               if (np) {
+                                       while (np && cc.elements <=
+                                           CURSES_CCHAR_MAX) {
+                                               cc.vals[cc.elements++] = np->ch;
+                                               np = np->next;
+                                       }
+                               }
+                               wadd_wch(dstwin, &cc);
+#endif /* HAVE_WCHAR */
+                       }
+               }
+       }
+       __touchwin(dstwin);
+       return OK;
+}
+
diff --git a/lib/libcurses/cr_put.c b/lib/libcurses/cr_put.c
new file mode 100644 (file)
index 0000000..10de438
--- /dev/null
@@ -0,0 +1,480 @@
+/*     $NetBSD: cr_put.c,v 1.30 2010/02/12 10:06:15 roy Exp $  */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cr_put.c   8.3 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: cr_put.c,v 1.30 2010/02/12 10:06:15 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#define        HARDTABS        8
+
+/*
+ * Terminal driving and line formatting routines.  Basic motion optimizations
+ * are done here as well as formatting lines (printing of control characters,
+ * line numbering and the like).
+ */
+
+/* Stub function for the users. */
+int
+mvcur(int ly, int lx, int y, int x)
+{
+       return (__mvcur(ly, lx, y, x, 0));
+}
+
+static void fgoto __P((int));
+static int plod __P((int, int));
+static int plodput __P((int));
+static int tabcol __P((int, int));
+
+static int outcol, outline, destcol, destline;
+
+/*
+ * Sync the position of the output cursor.  Most work here is rounding for
+ * terminal boundaries getting the column position implied by wraparound or
+ * the lack thereof and rolling up the screen to get destline on the screen.
+ */
+int
+__mvcur(int ly, int lx, int y, int x, int in_refresh)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_OUTPUT,
+           "mvcur: moving cursor from (%d, %d) to (%d, %d)\n", ly, lx, y, x);
+#endif
+       destcol = x;
+       destline = y;
+       outcol = lx;
+       outline = ly;
+       fgoto(in_refresh);
+       return (OK);
+}
+
+static void
+fgoto(in_refresh)
+       int      in_refresh;
+{
+       int      c, l;
+       char    *cgp;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_OUTPUT, "fgoto: in_refresh=%d\n", in_refresh);
+#endif /* DEBUG */
+       if (destcol >= COLS) {
+               destline += destcol / COLS;
+               destcol %= COLS;
+       }
+       if (outcol >= COLS) {
+               l = (outcol + 1) / COLS;
+               outline += l;
+               outcol %= COLS;
+               if (auto_left_margin == 0) {
+                       while (l > 0) {
+                               if (__pfast) {
+                                       if (carriage_return)
+                                               tputs(carriage_return,
+                                                       0, __cputchar);
+                                       else
+                                               __cputchar('\r');
+                               }
+                               if (cursor_down)
+                                       tputs(cursor_down, 0, __cputchar);
+                               else
+                                       __cputchar('\n');
+                               l--;
+                       }
+                       outcol = 0;
+               }
+               if (outline > LINES - 1) {
+                       destline -= outline - (LINES - 1);
+                       outline = LINES - 1;
+               }
+       }
+       if (destline >= LINES) {
+               l = destline;
+               destline = LINES - 1;
+               if (outline < LINES - 1) {
+                       c = destcol;
+                       if (__pfast == 0 && !cursor_address)
+                               destcol = 0;
+                       fgoto(in_refresh);
+                       destcol = c;
+               }
+               while (l >= LINES) {
+                       /* The following linefeed (or simulation thereof) is
+                        * supposed to scroll up the screen, since we are on
+                        * the bottom line.  We make the assumption that
+                        * linefeed will scroll.  If ns is in the capability
+                        * list this won't work.  We should probably have an
+                        * sc capability but sf will generally take the place
+                        * if it works.
+                        *
+                        * Superbee glitch: in the middle of the screen have to
+                        * use esc B (down) because linefeed screws up in
+                        * "Efficient Paging" (what a joke) mode (which is
+                        * essential in some SB's because CRLF mode puts
+                        * garbage in at end of memory), but you must use
+                        * linefeed to scroll since down arrow won't go past
+                        * memory end. I turned this off after recieving Paul
+                        * Eggert's Superbee description which wins better. */
+                       if (cursor_down /* && !__tc_xb */ && __pfast)
+                               tputs(cursor_down, 0, __cputchar);
+                       else
+                               __cputchar('\n');
+                       l--;
+                       if (__pfast == 0)
+                               outcol = 0;
+               }
+       }
+       if (destline < outline && !(cursor_address || cursor_up))
+               destline = outline;
+       
+       if (cursor_address &&
+           (cgp = t_vparm(NULL, cursor_address, destline, destcol)))
+       {
+               /*
+                * Need this condition due to inconsistent behavior
+                * of backspace on the last column.
+                */
+#ifdef DEBUG
+               __CTRACE(__CTRACE_OUTPUT, "fgoto: cgp=%s\n", cgp);
+#endif /* DEBUG */
+               if (outcol != COLS - 1 &&
+                   plod((int) strlen(cgp), in_refresh) > 0)
+                       plod(0, in_refresh);
+               else
+                       tputs(cgp, 0, __cputchar);
+       } else
+               plod(0, in_refresh);
+       outline = destline;
+       outcol = destcol;
+}
+/*
+ * Move (slowly) to destination.
+ * Hard thing here is using home cursor on really deficient terminals.
+ * Otherwise just use cursor motions, hacking use of tabs and overtabbing
+ * and backspace.
+ *
+ * XXX this needs to be revisited for wide characters since we may output
+ * XXX more than one byte for a character.
+ */
+
+static int plodcnt, plodflg;
+
+static int
+plodput(c)
+       int      c;
+{
+       if (plodflg)
+               --plodcnt;
+       else
+               __cputchar(c);
+       return (0);
+}
+
+static int
+plod(cnt, in_refresh)
+       int      cnt, in_refresh;
+{
+       int      i, j, k, soutcol, soutline;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_OUTPUT, "plod: cnt=%d, in_refresh=%d\n",
+           cnt, in_refresh);
+#endif /* DEBUG */
+       plodcnt = plodflg = cnt;
+       soutcol = outcol;
+       soutline = outline;
+
+       /*
+        * Consider homing and moving down/right from there, vs. moving
+        * directly with local motions to the right spot.
+        */
+       if (cursor_home) {
+               /*
+                * i is the cost to home and tab/space to the right to get to
+                * the proper column.  This assumes nd space costs 1 char.  So
+                * i + destcol is cost of motion with home.
+                */
+               if (__GT)
+                       i = (destcol / HARDTABS) + (destcol % HARDTABS);
+               else
+                       i = destcol;
+
+               /* j is cost to move locally without homing. */
+               if (destcol >= outcol) {        /* if motion is to the right */
+                       j = destcol / HARDTABS - outcol / HARDTABS;
+                       if (__GT && j)
+                               j += destcol % HARDTABS;
+                       else
+                               j = destcol - outcol;
+               } else
+                       /* leftward motion only works if we can backspace. */
+                       if (outcol - destcol <= i)
+                               /* Cheaper to backspace. */
+                               i = j = outcol - destcol;
+                       else
+                               /* Impossibly expensive. */
+                               j = i + 1;
+
+               /* k is the absolute value of vertical distance. */
+               k = outline - destline;
+               if (k < 0)
+                       k = -k;
+               j += k;
+
+               /* Decision.  We may not have a choice if no up. */
+               if (i + destline < j || (!cursor_up && destline < outline)) {
+                       /*
+                        * Cheaper to home.  Do it now and pretend it's a
+                        * regular local motion.
+                        */
+                       tputs(cursor_home, 0, plodput);
+                       outcol = outline = 0;
+               } else
+                       if (cursor_to_ll) {
+                               /*
+                                * Quickly consider homing down and moving from
+                                * there.  Assume cost of ll is 2.
+                                */
+                               k = (LINES - 1) - destline;
+                               if (i + k + 2 < j && (k <= 0 || cursor_up)) {
+                                       tputs(cursor_to_ll, 0, plodput);
+                                       outcol = 0;
+                                       outline = LINES - 1;
+                               }
+                       }
+       } else
+               /* No home and no up means it's impossible. */
+               if (!cursor_up && destline < outline)
+                       return (-1);
+       if (__GT)
+               i = destcol % HARDTABS + destcol / HARDTABS;
+       else
+               i = destcol;
+#ifdef notdef
+       if (back_tab && outcol > destcol &&
+           (j = (((outcol + 7) & ~7) - destcol - 1) >> 3)) {
+               j *= (k = strlen(back_tab));
+               if ((k += (destcol & 7)) > 4)
+                       j += 8 - (destcol & 7);
+               else
+                       j += k;
+       } else
+#endif
+               j = outcol - destcol;
+
+       /*
+        * If we will later need a \n which will turn into a \r\n by the
+        * system or the terminal, then don't bother to try to \r.
+        */
+       if ((__NONL || !__pfast) && outline < destline)
+               goto dontcr;
+
+       /*
+        * If the terminal will do a \r\n and there isn't room for it, then
+        * we can't afford a \r.
+        */
+       if (!carriage_return && outline >= destline)
+               goto dontcr;
+
+       /*
+        * If it will be cheaper, or if we can't back up, then send a return
+        * preliminarily.
+        */
+       if (j > i + 1 || outcol > destcol) {
+               /*
+                * BUG: this doesn't take the (possibly long) length of cr
+                * into account.
+                */
+               if (carriage_return)
+                       tputs(carriage_return, 0, plodput);
+               else
+                       plodput('\r');
+               if (!carriage_return) {
+                       if (cursor_down)
+                               tputs(cursor_down, 0, plodput);
+                       else
+                               plodput('\n');
+                       outline++;
+               }
+               outcol = 0;
+       }
+dontcr:while (outline < destline) {
+               outline++;
+               if (cursor_down)
+                       tputs(cursor_down, 0, plodput);
+               else
+                       plodput('\n');
+               if (plodcnt < 0)
+                       goto out;
+               if (__NONL || __pfast == 0)
+                       outcol = 0;
+       }
+       if (back_tab)
+               k = (int) strlen(back_tab);
+       while (outcol > destcol) {
+               if (plodcnt < 0)
+                       goto out;
+#ifdef notdef
+               if (back_tab && outcol - destcol > k + 4) {
+                       tputs(back_tab, 0, plodput);
+                       outcol--;
+                       outcol &= ~7;
+                       continue;
+               }
+#endif
+               outcol--;
+               if (cursor_left)
+                       tputs(cursor_left, 0, plodput);
+               else
+                       plodput('\b');
+       }
+       while (outline > destline) {
+               outline--;
+               tputs(cursor_up, 0, plodput);
+               if (plodcnt < 0)
+                       goto out;
+       }
+       if (__GT && destcol - outcol > 1) {
+               for (;;) {
+                       i = tabcol(outcol, HARDTABS);
+                       if (i > destcol)
+                               break;
+                       if (tab)
+                               tputs(tab, 0, plodput);
+                       else
+                               plodput('\t');
+                       outcol = i;
+               }
+               if (destcol - outcol > 4 && i < COLS) {
+                       if (tab)
+                               tputs(tab, 0, plodput);
+                       else
+                               plodput('\t');
+                       outcol = i;
+                       while (outcol > destcol) {
+                               outcol--;
+                               if (cursor_left)
+                                       tputs(cursor_left, 0, plodput);
+                               else
+                                       plodput('\b');
+                       }
+               }
+       }
+       while (outcol < destcol) {
+               /*
+                * Move one char to the right.  We don't use nd space because
+                * it's better to just print the char we are moving over.
+                */
+               if (in_refresh)
+                       if (plodflg)    /* Avoid a complex calculation. */
+                               plodcnt--;
+                       else {
+#ifndef HAVE_WCHAR
+                               i = curscr->alines[outline]->line[outcol].ch
+                                   & __CHARTEXT;
+                               if (curscr->alines[outline]->line[outcol].attr
+                                   == curscr->wattr)
+                                       __cputchar(i);
+#else
+                               if ((curscr->alines[outline]->line[outcol].attr
+                                   & WA_ATTRIBUTES)
+                                   == curscr->wattr) {
+                                       switch (WCOL(curscr->alines[outline]->line[outcol])) {
+                                       case 1:
+                                               __cputwchar(curscr->alines[outline]->line[outcol].ch);
+                                               __cursesi_putnsp(curscr->alines[outline]->line[outcol].nsp,
+                                                               outline,
+                                                               outcol);
+#ifdef DEBUG
+                                               __CTRACE(__CTRACE_OUTPUT,
+                                                   "plod: (%d,%d)WCOL(%d), "
+                                                   "putwchar(%x)\n",
+                                                   outline, outcol,
+                                                   WCOL(curscr->alines[outline]->line[outcol]),
+                                                   curscr->alines[outline]->line[outcol].ch);
+#endif /* DEBUG */
+                                       /*FALLTHROUGH*/
+                                       case 0:
+                                               break;
+                                       default:
+                                               goto nondes;
+                                       }
+                               }
+#endif /* HAVE_WCHAR */
+                               else
+                                       goto nondes;
+                       }
+               else
+       nondes: if (cursor_right)
+                       tputs(cursor_right, 0, plodput);
+               else
+                       plodput(' ');
+               outcol++;
+               if (plodcnt < 0)
+                       goto out;
+       }
+
+out:   if (plodflg) {
+               outcol = soutcol;
+               outline = soutline;
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_OUTPUT, "plod: returns %d\n", plodcnt);
+#endif /* DEBUG */
+       return (plodcnt);
+}
+/*
+ * Return the column number that results from being in column col and
+ * hitting a tab, where tabs are set every ts columns.  Work right for
+ * the case where col > COLS, even if ts does not divide COLS.
+ */
+static int
+tabcol(col, ts)
+       int      col, ts;
+{
+       int      offset;
+
+       if (col >= COLS) {
+               offset = COLS * (col / COLS);
+               col -= offset;
+       } else
+               offset = 0;
+       return (col + ts - (col % ts) + offset);
+}
diff --git a/lib/libcurses/ctrace.c b/lib/libcurses/ctrace.c
new file mode 100644 (file)
index 0000000..04cccad
--- /dev/null
@@ -0,0 +1,120 @@
+/*     $NetBSD: ctrace.c,v 1.20 2009/01/17 15:25:36 christos Exp $     */
+
+/*-
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)ctrace.c   8.2 (Berkeley) 10/5/93";
+#else
+__RCSID("$NetBSD: ctrace.c,v 1.20 2009/01/17 15:25:36 christos Exp $");
+#endif
+#endif                         /* not lint */
+
+#ifdef DEBUG
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <sys/time.h>
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+static FILE *tracefp = NULL;           /* Curses debugging file descriptor. */
+
+static int tracemask;  /* Areas of trace output we want. */
+
+static int init_done = 0;
+
+void
+__CTRACE_init()
+{
+       char *tf, *tm;
+
+       tm = getenv("CURSES_TRACE_MASK");
+       if (tm == NULL)
+               tracemask = __CTRACE_ALL;
+       else {
+               tracemask = (int) strtol(tm, NULL, 0);
+       }
+       if (tracemask < 0)
+               tracemask = (0 - tracemask) ^ __CTRACE_ALL;
+       if (tracemask == 0)
+               return;
+
+       tf = getenv("CURSES_TRACE_FILE");
+
+       if ((tf != NULL) && !strcmp( tf, "<none>"))
+               tf = NULL;
+
+       if (tf != NULL)
+               tracefp = fopen(tf, "w");
+
+       init_done = 1;
+       __CTRACE(__CTRACE_ALL, "Trace mask: 0x%08x\n", tracemask);
+}
+
+void
+__CTRACE(int area, const char *fmt,...)
+{
+       struct timeval tv;
+        static int seencr = 1;
+       va_list ap;
+
+       if (!init_done)
+               __CTRACE_init();
+       if (tracefp == NULL || !(tracemask & area)) {
+               return;
+       }
+       gettimeofday(&tv, NULL);
+        if (seencr && (tracemask & __CTRACE_TSTAMP)) {
+                gettimeofday(&tv, NULL);
+                (void) fprintf(tracefp, "%llu.%06lu: ", 
+                   (long long)tv.tv_sec, (long)tv.tv_usec);
+        }
+       va_start(ap, fmt);
+        (void) vfprintf(tracefp, fmt, ap);
+        seencr = (strchr(fmt, '\n') != NULL);
+       va_end(ap);
+       (void) fflush(tracefp);
+}
+#else
+/* this kills the empty translation unit message from lint... */
+void
+__cursesi_make_lint_shut_up_if_debug_not_defined(void);
+
+void
+__cursesi_make_lint_shut_up_if_debug_not_defined(void)
+{
+       return;
+}
+#endif
diff --git a/lib/libcurses/cur_hash.c b/lib/libcurses/cur_hash.c
new file mode 100644 (file)
index 0000000..caf0515
--- /dev/null
@@ -0,0 +1,65 @@
+/*     $NetBSD: cur_hash.c,v 1.12 2005/02/18 22:16:27 dsl Exp $        */
+
+/*
+ * Copyright (c) 1992, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)cur_hash.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: cur_hash.c,v 1.12 2005/02/18 22:16:27 dsl Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <sys/types.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * __hash_more() is "hashpjw" from the Dragon Book, Aho, Sethi & Ullman, p.436.
+ */
+u_int
+__hash_more(const void  *v_s, size_t len, u_int h)
+{
+       u_int g;
+       size_t i = 0;
+       const char *s = v_s;
+
+       while (i < len) {
+               h = (h << 4) + s[i];
+               if ((g = h & 0xf0000000) != 0) {
+                       h = h ^ (g >> 24);
+                       h = h ^ g;
+               }
+               i++;
+       }
+       return h;
+}
index e481d59b296adee0703de8cf47d71791e51e6421..b59359f48a14ddde1134e9776ff4f99c6cf955b3 100644 (file)
-#include <curses.h>
-#include <termcap.h>
+/*     $NetBSD: curs_set.c,v 1.9 2010/02/03 15:34:40 roy Exp $ */
 
-extern char *vi, *ve, *vs;
+/*-
+ * Copyright (c) 1998-2000 Brett Lymn
+ *                         (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * This code has been donated to The NetBSD Foundation by the Author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
 
-/* Sets cursor visibility to unvisible=0; normal visible=1 or very good
- * visible=2. 
-*/
-void curs_set(visibility)
-int visibility;
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: curs_set.c,v 1.9 2010/02/03 15:34:40 roy Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * curs_set --
+ *    Set the visibility of the cursor, 0 means invisible, 1 means normal
+ *    visibility and 2 means high visibility.  Return the previous
+ *    visibility iff the terminal supports the new visibility otherwise
+ *    return ERR.
+ */
+int
+curs_set(int visibility)
 {
-  switch (visibility) {
-      case 0:
-       if (vi) tputs(vi, 1, outc);
-       break;
-      case 1:
-       if (ve) tputs(ve, 1, outc);
-       break;
-      case 2:
-       if (vs)
-               tputs(vs, 1, outc);
-       else if (ve)
-               tputs(ve, 1, outc);
-  }
+       int old_one;
+
+       old_one = _cursesi_screen->old_mode;
+       switch (visibility) {
+               case 0: /* invisible */
+                       if (cursor_invisible != NULL) {
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "curs_set: invisible\n");
+#endif
+                               _cursesi_screen->old_mode = 0;
+                               tputs(cursor_invisible, 0, __cputchar);
+                               return old_one;
+                       }
+                       break;
+
+               case 1: /* normal */
+                       if (cursor_normal != NULL) {
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC, "curs_set: normal\n");
+#endif
+                               _cursesi_screen->old_mode = 1;
+                               tputs(cursor_normal, 0, __cputchar);
+                               return old_one;
+                       }
+                       break;
+
+               case 2: /* high visibility */
+                       if (cursor_visible != NULL) {
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "curs_set: high vis\n");
+#endif
+                               _cursesi_screen->old_mode = 2;
+                               tputs(cursor_visible, 0, __cputchar);
+                               return old_one;
+                       }
+                       break;
+
+               default:
+                       break;
+       }
+
+       return ERR;
 }
+
+/*
+ * __restore_cursor_vis --
+ *     Restore the old cursor visibility.
+ */
+void
+__restore_cursor_vis(void)
+{
+       curs_set(_cursesi_screen->old_mode);
+}
+
diff --git a/lib/libcurses/curses.3 b/lib/libcurses/curses.3
new file mode 100644 (file)
index 0000000..eaad716
--- /dev/null
@@ -0,0 +1,338 @@
+.\"    $NetBSD: curses.3,v 1.61 2010/12/09 13:26:27 njoly Exp $
+.\"
+.\" Copyright (c) 1985, 1991, 1993
+.\"    The Regents of the University of California.  All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. Neither the name of the University nor the names of its contributors
+.\"    may be used to endorse or promote products derived from this software
+.\"    without specific prior written permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"     @(#)curses.3   8.1 (Berkeley) 6/4/93
+.\"
+.Dd July 6, 2009
+.Dt CURSES 3
+.Os
+.Sh NAME
+.Nm curses
+.Nd screen functions with
+.Dq optimal
+cursor motion
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.Nm cc
+.Op Ar flags
+.Ar files
+.Fl lcurses
+.Op Ar libraries
+.Sh DESCRIPTION
+These routines give the user a method of updating screens with reasonable
+optimization.
+They keep an image of the current screen,
+and the user sets up an image of a new one.
+Then the
+.Fn refresh
+tells the routines to make the current screen look like the new one.
+In order to initialize the routines, the routine
+.Fn initscr
+must be called before any of the other routines that deal with windows and
+screens are used.
+The routine
+.Fn endwin
+should be called before exiting.
+The routine
+.Fn start_color
+must be called before any of the other routines that deal with color are used.
+.Sh FUNCTIONS
+.Bl -column "subwin(win,lines,cols,begin_y,begin_x)"
+.It Sy "Function Name" Ta Sy "Manual Page Name"
+.It addch Ta Xr curses_addch 3
+.It addchnstr Ta Xr curses_addchstr 3
+.It addchstr Ta Xr curses_addchstr 3
+.It addnstr Ta Xr curses_addstr 3
+.It addstr Ta Xr curses_addstr 3
+.It assume_default_colors Ta Xr curses_default_colors 3
+.It attr_get Ta Xr curses_attributes 3
+.It attr_off Ta Xr curses_attributes 3
+.It attr_on Ta Xr curses_attributes 3
+.It attr_set Ta Xr curses_attributes 3
+.It attroff Ta Xr curses_attributes 3
+.It attron Ta Xr curses_attributes 3
+.It attrset Ta Xr curses_attributes 3
+.It beep Ta Xr curses_tty 3
+.It bkgd Ta Xr curses_background 3
+.It bkgdset Ta Xr curses_background 3
+.It border Ta Xr curses_border 3
+.It box Ta Xr curses_border 3
+.It can_change_color Ta Xr curses_color 3
+.It cbreak Ta Xr curses_tty 3
+.It chgat Ta Xr curses_chgat 3
+.It clear Ta Xr curses_clear 3
+.It clearok Ta Xr curses_clear 3
+.It clrtobot Ta Xr curses_clear 3
+.It clrtoeol Ta Xr curses_clear 3
+.It color_content Ta Xr curses_color 3
+.It color_set Ta Xr curses_attributes 3
+.It copywin Ta Xr curses_window 3
+.It curs_set Ta Xr curses_tty 3
+.It def_prog_mode Ta Xr curses_tty 3
+.It def_shell_mode Ta Xr curses_tty 3
+.It define_key Ta Xr curses_input 3
+.It delay_output Ta Xr curses_tty 3
+.It delch Ta Xr curses_delch 3
+.It deleteln Ta Xr curses_deleteln 3
+.It delscreen Ta Xr curses_screen 3
+.It delwin Ta Xr curses_window 3
+.It derwin Ta Xr curses_window 3
+.It doupdate Ta Xr curses_refresh 3
+.It dupwin Ta Xr curses_window 3
+.It echo Ta Xr curses_tty 3
+.It endwin Ta Xr curses_screen 3
+.It erase Ta Xr curses_clear 3
+.It erasechar Ta Xr curses_tty 3
+.It flash Ta Xr curses_tty 3
+.It flushinp Ta Xr curses_tty 3
+.It flushok Ta Xr curses_refresh 3
+.It fullname Ta Xr curses_termcap 3
+.It getattrs Ta Xr curses_attributes 3
+.It getbegx Ta Xr curses_cursor 3
+.It getbegy Ta Xr curses_cursor 3
+.It getbkgd Ta Xr curses_background 3
+.It getcap Ta Xr curses_termcap 3
+.It getch Ta Xr curses_input 3
+.It getcurx Ta Xr curses_cursor 3
+.It getcury Ta Xr curses_cursor 3
+.It getmaxx Ta Xr curses_cursor 3
+.It getmaxy Ta Xr curses_cursor 3
+.It getnstr Ta Xr curses_input 3
+.It getparx Ta Xr curses_cursor 3
+.It getpary Ta Xr curses_cursor 3
+.It getparyx Ta Xr curses_cursor 3
+.It getstr Ta Xr curses_input 3
+.It gettmode Ta Xr curses_tty 3
+.It getwin Ta Xr curses_fileio 3
+.It getyx Ta Xr curses_cursor 3
+.It has_colors Ta Xr curses_color 3
+.It has_ic Ta Xr curses_tty 3
+.It has_il Ta Xr curses_tty 3
+.It hline Ta Xr curses_line 3
+.It idcok Ta Xr curses_tty 3
+.It idlok Ta Xr curses_tty 3
+.It inch Ta Xr curses_inch 3
+.It inchnstr Ta Xr curses_inch 3
+.It inchstr Ta Xr curses_inch 3
+.It init_color Ta Xr curses_color 3
+.It init_pair Ta Xr curses_color 3
+.It initscr Ta Xr curses_screen 3
+.It innstr Ta Xr curses_inch 3
+.It insch Ta Xr curses_insertch 3
+.It insdelln Ta Xr curses_insdelln 3
+.It insertln Ta Xr curses_insertln 3
+.It instr Ta Xr curses_inch 3
+.It intrflush Ta Xr curses_tty 3
+.It is_linetouched Ta Xr curses_touch 3
+.It is_wintouched Ta Xr curses_touch 3
+.It isendwin Ta Xr curses_screen 3
+.It keyname Ta Xr curses_keyname 3
+.It keyok Ta Xr curses_input 3
+.It keypad Ta Xr curses_input 3
+.It killchar Ta Xr curses_tty 3
+.It leaveok Ta Xr curses_tty 3
+.It longname Ta Xr curses_termcap 3
+.It meta Ta Xr curses_tty 3
+.It move Ta Xr curses_cursor 3
+.It mvaddch Ta Xr curses_addch 3
+.It mvaddchnstr Ta Xr curses_addchstr 3
+.It mvaddchstr Ta Xr curses_addchstr 3
+.It mvaddnstr Ta Xr curses_addstr 3
+.It mvaddstr Ta Xr curses_addstr 3
+.It mvchgat Ta Xr curses_chgat 3
+.It mvcur Ta Xr curses_cursor 3
+.It mvderwin Ta Xr curses_window 3
+.It mvgetnstr Ta Xr curses_input 3
+.It mvgetstr Ta Xr curses_input 3
+.It mvhline Ta Xr curses_line 3
+.It mvinchstr Ta Xr curses_inch 3
+.It mvinchnstr Ta Xr curses_inch 3
+.It mvprintw Ta Xr curses_print 3
+.It mvscanw Ta Xr curses_scanw 3
+.It mvvline Ta Xr curses_line 3
+.It mvwaddch Ta Xr curses_addch 3
+.It mvwaddchnstr Ta Xr curses_addchstr 3
+.It mvwaddchstr Ta Xr curses_addchstr 3
+.It mvwaddnstr Ta Xr curses_addstr 3
+.It mvwaddstr Ta Xr curses_addstr 3
+.It mvwchgat Ta Xr curses_chgat 3
+.It mvwgetnstr Ta Xr curses_input 3
+.It mvwgetstr Ta Xr curses_input 3
+.It mvwhline Ta Xr curses_line 3
+.It mvwinchstr Ta Xr curses_inch 3
+.It mvwinchnstr Ta Xr curses_inch 3
+.It mvwprintw Ta Xr curses_print 3
+.It mvwscanw Ta Xr curses_scanw 3
+.It mvwvline Ta Xr curses_line 3
+.It napms Ta Xr curses_tty 3
+.It newpad Ta Xr curses_pad 3
+.It newterm Ta Xr curses_screen 3
+.It newwin Ta Xr curses_window 3
+.It \&nl Ta Xr curses_tty 3
+.It nocbreak Ta Xr curses_tty 3
+.It nodelay Ta Xr curses_input 3
+.It noecho Ta Xr curses_tty 3
+.It nonl Ta Xr curses_tty 3
+.It noqiflush Ta Xr curses_tty 3
+.It noraw Ta Xr curses_tty 3
+.It notimeout Ta Xr curses_input 3
+.It overlay Ta Xr curses_window 3
+.It overwrite Ta Xr curses_window 3
+.It pair_content Ta Xr curses_color 3
+.It pnoutrefresh Ta Xr curses_pad 3
+.It prefresh Ta Xr curses_pad 3
+.It printw Ta Xr curses_print 3
+.It putwin Ta Xr curses_fileio 3
+.It qiflush Ta Xr curses_tty 3
+.It raw Ta Xr curses_tty 3
+.It redrawwin Ta Xr curses_touch 3
+.It refresh Ta Xr curses_refresh 3
+.It reset_prog_mode Ta Xr curses_tty 3
+.It reset_shell_mode Ta Xr curses_tty 3
+.It resetty Ta Xr curses_tty 3
+.It resizeterm Ta Xr curses_screen 3
+.It savetty Ta Xr curses_tty 3
+.It scanw Ta Xr curses_scanw 3
+.It scrl Ta Xr curses_scroll 3
+.It scroll Ta Xr curses_scroll 3
+.It scrollok Ta Xr curses_scroll 3
+.It set_term Ta Xr curses_screen 3
+.It setscrreg Ta Xr curses_scroll 3
+.It setterm Ta Xr curses_screen 3
+.It standend Ta Xr curses_standout 3
+.It standout Ta Xr curses_standout 3
+.It start_color Ta Xr curses_color 3
+.It subpad Ta Xr curses_pad 3
+.It subwin Ta Xr curses_window 3
+.It termattrs Ta Xr curses_attributes 3
+.It timeout Ta Xr curses_input 3
+.It touchline Ta Xr curses_touch 3
+.It touchoverlap Ta Xr curses_touch 3
+.It touchwin Ta Xr curses_touch 3
+.It unctrl Ta Xr curses_print 3
+.It underend Ta Xr curses_underscore 3
+.It underscore Ta Xr curses_underscore 3
+.It ungetch Ta Xr curses_input 3
+.It untouchwin Ta Xr curses_touch 3
+.It use_default_colors Ta Xr curses_default_colors 3
+.It vline Ta Xr curses_line 3
+.It waddch Ta Xr curses_addch 3
+.It waddchnstr Ta Xr curses_addchstr 3
+.It waddchstr Ta Xr curses_addchstr 3
+.It waddnstr Ta Xr curses_addstr 3
+.It waddstr Ta Xr curses_addstr 3
+.It wattr_get Ta Xr curses_attributes 3
+.It wattr_off Ta Xr curses_attributes 3
+.It wattr_on Ta Xr curses_attributes 3
+.It wattr_set Ta Xr curses_attributes 3
+.It wattroff Ta Xr curses_attributes 3
+.It wattron Ta Xr curses_attributes 3
+.It wattrset Ta Xr curses_attributes 3
+.It wbkgd Ta Xr curses_background 3
+.It wbkgdset Ta Xr curses_background 3
+.It wborder Ta Xr curses_border 3
+.It wchgat Ta Xr curses_chgat 3
+.It wclear Ta Xr curses_clear 3
+.It wclrtobot Ta Xr curses_clear 3
+.It wclrtoeol Ta Xr curses_clear 3
+.It wcolor_set Ta Xr curses_attributes 3
+.It wdelch Ta Xr curses_delch 3
+.It wdeleteln Ta Xr curses_deleteln 3
+.It werase Ta Xr curses_clear 3
+.It wgetch Ta Xr curses_input 3
+.It wgetnstr Ta Xr curses_input 3
+.It wgetstr Ta Xr curses_input 3
+.It whline Ta Xr curses_line 3
+.It winch Ta Xr curses_inch 3
+.It winchnstr Ta Xr curses_inch 3
+.It winchstr Ta Xr curses_inch 3
+.It winnstr Ta Xr curses_inch 3
+.It winsch Ta Xr curses_insertch 3
+.It winsdelln Ta Xr curses_insdelln 3
+.It winsertln Ta Xr curses_insertln 3
+.It winstr Ta Xr curses_inch 3
+.It wmove Ta Xr curses_cursor 3
+.It wnoutrefresh Ta Xr curses_refresh 3
+.It wprintw Ta Xr curses_print 3
+.It wredrawln Ta Xr curses_touch 3
+.It wrefresh Ta Xr curses_refresh 3
+.It wresize Ta Xr curses_window 3
+.It wscanw Ta Xr curses_scanw 3
+.It wscrl Ta Xr curses_scroll 3
+.It wsetscrreg Ta Xr curses_scroll 3
+.It wstandend Ta Xr curses_standout 3
+.It wstandout Ta Xr curses_standout 3
+.It wtimeout Ta Xr curses_input 3
+.It wtouchln Ta Xr curses_touch 3
+.It wunderend Ta Xr curses_underscore 3
+.It wunderscore Ta Xr curses_underscore 3
+.It wvline Ta Xr curses_line 3
+.El
+.Sh ENVIRONMENT
+.Bl -tag -width CURSES_TRACE_MASK
+.It COLUMNS
+The number of columns in the terminal if set.
+This is usually automatically configured by querying the kernel.
+.It CURSES_TRACE_MASK
+An integer mask that enables specific debugging traces.
+Enabled only in the debug build of curses.
+.It CURSES_TRACE_FILE
+A file where to output debugging information.
+Enabled only in the debug build of curses.
+.It ESCDELAY
+The maximum delay in milliseconds between characters in multi-character
+keystrokes (such are arrow keys) where the adjacent characters are considered
+part of the same multi-character sequence.
+The default is 300 milliseconds.
+.It LINES
+The number of lines in the terminal if set.
+is usually automatically configured by querying the kernel.
+.It TERM
+The terminal type of the current terminal.
+.El
+.Sh SEE ALSO
+.Xr ioctl 2 ,
+.Xr getenv 3 ,
+.Xr tty 4 ,
+.Xr termcap 5
+.Rs
+.%T Screen Updating and Cursor Movement Optimization: A Library Package
+.%A Ken Arnold
+.Re
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
+.Sh AUTHORS
+.An Ken Arnold
diff --git a/lib/libcurses/curses.c b/lib/libcurses/curses.c
new file mode 100644 (file)
index 0000000..7e1e8a8
--- /dev/null
@@ -0,0 +1,160 @@
+/*     $NetBSD: curses.c,v 1.24 2010/02/03 15:34:40 roy Exp $  */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#include <stdlib.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)curses.c   8.3 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: curses.c,v 1.24 2010/02/03 15:34:40 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/* Private. */
+int    __echoit = 1;                    /* If stty indicates ECHO. */
+int    __pfast;
+int    __rawmode = 0;                   /* If stty indicates RAW mode. */
+int    __noqch = 0;
+                                        /* If terminal doesn't have
+                                        * insert/delete line capabilities
+                                        * for quick change on refresh.
+                                        */
+char   __CA;
+
+/*
+ * Public.
+ *
+ * XXX
+ * UPPERCASE isn't used by libcurses, and is left for backward
+ * compatibility only.
+ */
+WINDOW *curscr;                        /* Current screen. */
+WINDOW *stdscr;                        /* Standard screen. */
+WINDOW *__virtscr;                     /* Virtual screen (for doupdate()). */
+SCREEN  *_cursesi_screen;               /* the current screen we are using */
+int     COLS;                          /* Columns on the screen. */
+int     LINES;                         /* Lines on the screen. */
+int     COLORS;                        /* Maximum colors on the screen */
+int     COLOR_PAIRS = 0;               /* Maximum color pairs on the screen */
+int     My_term = 0;                   /* Use Def_term regardless. */
+const char     *Def_term = "unknown";  /* Default terminal type. */
+char    __GT;                          /* Gtty indicates tabs. */
+char    __NONL;                        /* Term can't hack LF doing a CR. */
+char    __UPPERCASE;                   /* Terminal is uppercase only. */
+
+#ifdef HAVE_WCHAR
+/*
+ * Copy the non-spacing character list (src_nsp) to the given character,
+ * allocate or free storage as required.
+ */
+int
+_cursesi_copy_nsp(nschar_t *src_nsp, struct __ldata *ch)
+{
+       nschar_t *np, *tnp, *pnp;
+
+       pnp = NULL;
+       np = src_nsp;
+       if (np) {
+               tnp = ch->nsp;
+               while (np) {
+                       if (tnp) {
+                               tnp->ch = np->ch;
+                               pnp = tnp;
+                               tnp = tnp->next;
+                       } else {
+                               tnp = (nschar_t *)malloc(sizeof(nschar_t));
+                               if (!tnp)
+                                       return ERR;
+                               tnp->ch = np->ch;
+                               pnp->next = tnp;
+                               tnp->next = NULL;
+                               pnp = tnp;
+                               tnp = NULL;
+                       }
+                       np = np->next;
+               }
+                np = tnp;
+               if (np) {
+                       pnp->next = NULL;
+                       __cursesi_free_nsp(np);
+               }
+       } else {
+               if (ch->nsp) {
+                       __cursesi_free_nsp(ch->nsp);
+                       ch->nsp = NULL;
+               }
+       }
+
+       return OK;
+}
+
+/*
+ * Free the storage associated with a non-spacing character - traverse the
+ * linked list until all storage is done.
+ */
+void
+__cursesi_free_nsp(nschar_t *inp)
+{
+       nschar_t *tnp, *np;
+
+       np = inp;
+       if (np) {
+               while (np) {
+                       tnp = np->next;
+                       free(np);
+                       np = tnp;
+               }
+       }
+}
+
+/*
+ * Traverse all the cells in the given window free'ing the non-spacing
+ * character storage.
+ */
+void
+__cursesi_win_free_nsp(WINDOW *win)
+{
+       int     i, j;
+       __LDATA *sp;
+
+       for (i = 0; i < win->maxy; i++) {
+               for (sp = win->alines[i]->line, j = 0; j < win->maxx;
+                    j++, sp++) {
+                       __cursesi_free_nsp(sp->nsp);
+               }
+       }
+}
+
+#endif
diff --git a/lib/libcurses/curses.h b/lib/libcurses/curses.h
new file mode 100644 (file)
index 0000000..b7b607c
--- /dev/null
@@ -0,0 +1,933 @@
+/*     $NetBSD: curses.h,v 1.101 2010/12/16 17:42:28 wiz Exp $ */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)curses.h    8.5 (Berkeley) 4/29/95
+ *
+ *     Modified by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com> 2005
+ *     to add wide-character support
+ *  - Add complex character structure (cchar_t)
+ *     - Add definitions of wide-character routines
+ *     - Add KEY_CODE_YES
+ */
+
+#ifndef _CURSES_H_
+#define        _CURSES_H_
+
+#include <sys/types.h>
+#include <sys/cdefs.h>
+#include <wchar.h>
+
+#include <stdio.h>
+#include <stdbool.h>
+
+/*
+ * attr_t must be the same size as wchar_t (see <wchar.h>) to avoid padding
+ * in __LDATA.
+ */
+typedef wchar_t        chtype;
+typedef wchar_t        attr_t;
+
+#if !defined(HAVE_WCHAR) && !defined(DISABLE_WCHAR)
+#define HAVE_WCHAR 1
+#endif
+
+#ifdef HAVE_WCHAR
+/* 
+ * The complex character structure required by the X/Open reference and used
+ * in * functions such as in_wchstr(). It includes a string of up to 8 wide
+ * characters and its length, an attribute, and a color-pair.
+ */
+#define CURSES_CCHAR_MAX 8
+#define CCHARW_MAX       5
+typedef struct {
+       attr_t          attributes;             /* character attributes */
+       unsigned        elements;               /* number of wide char in
+                                                  vals[] */
+       wchar_t         vals[CURSES_CCHAR_MAX]; /* wide chars including
+                                                  non-spacing */
+} cchar_t;
+#else 
+typedef chtype cchar_t;
+#endif /* HAVE_WCHAR */
+
+#ifndef TRUE
+#define        TRUE    (/*CONSTCOND*/1)
+#endif
+#ifndef FALSE
+#define        FALSE   (/*CONSTCOND*/0)
+#endif
+
+#ifndef _CURSES_PRIVATE
+
+#define _puts(s)        tputs(s, 0, __cputchar)
+#define _putchar(c)     __cputchar(c)
+
+/* Old-style terminal modes access. */
+#define crmode()        cbreak()
+#define nocrmode()      nocbreak()
+#endif /* _CURSES_PRIVATE */
+
+
+/* symbols for values returned by getch in keypad mode */
+#define    KEY_MIN        0x101    /* minimum extended key value */
+#define    KEY_BREAK      0x101    /* break key */
+#define    KEY_DOWN       0x102    /* down arrow */
+#define    KEY_UP         0x103    /* up arrow */
+#define    KEY_LEFT       0x104    /* left arrow */
+#define    KEY_RIGHT      0x105    /* right arrow*/
+#define    KEY_HOME       0x106    /* home key */
+#define    KEY_BACKSPACE  0x107    /* Backspace */
+
+/* First function key (block of 64 follow) */
+#define    KEY_F0         0x108
+/* Function defining other function key values*/
+#define    KEY_F(n)       (KEY_F0+(n))
+
+#define    KEY_DL         0x148    /* Delete Line */
+#define    KEY_IL         0x149    /* Insert Line*/
+#define    KEY_DC         0x14A    /* Delete Character */
+#define    KEY_IC         0x14B    /* Insert Character */
+#define    KEY_EIC        0x14C    /* Exit Insert Char mode */
+#define    KEY_CLEAR      0x14D    /* Clear screen */
+#define    KEY_EOS        0x14E    /* Clear to end of screen */
+#define    KEY_EOL        0x14F    /* Clear to end of line */
+#define    KEY_SF         0x150    /* Scroll one line forward */
+#define    KEY_SR         0x151    /* Scroll one line back */
+#define    KEY_NPAGE      0x152    /* Next Page */
+#define    KEY_PPAGE      0x153    /* Prev Page */
+#define    KEY_STAB       0x154    /* Set Tab */
+#define    KEY_CTAB       0x155    /* Clear Tab */
+#define    KEY_CATAB      0x156    /* Clear All Tabs */
+#define    KEY_ENTER      0x157    /* Enter or Send */
+#define    KEY_SRESET     0x158    /* Soft Reset */
+#define    KEY_RESET      0x159    /* Hard Reset */
+#define    KEY_PRINT      0x15A    /* Print */
+#define    KEY_LL         0x15B    /* Home Down */
+
+/*
+ * "Keypad" keys arranged like this:
+ *
+ *  A1   up  A3
+ * left  B2 right
+ *  C1  down C3
+ *
+ */
+#define    KEY_A1         0x15C    /* Keypad upper left */
+#define    KEY_A3         0x15D    /* Keypad upper right */
+#define    KEY_B2         0x15E    /* Keypad centre key */
+#define    KEY_C1         0x15F    /* Keypad lower left */
+#define    KEY_C3         0x160    /* Keypad lower right */
+
+#define    KEY_BTAB       0x161    /* Back Tab */
+#define    KEY_BEG        0x162    /* Begin key */
+#define    KEY_CANCEL     0x163    /* Cancel key */
+#define    KEY_CLOSE      0x164    /* Close Key */
+#define    KEY_COMMAND    0x165    /* Command Key */
+#define    KEY_COPY       0x166    /* Copy key */
+#define    KEY_CREATE     0x167    /* Create key */
+#define    KEY_END        0x168    /* End key */
+#define    KEY_EXIT       0x169    /* Exit key */
+#define    KEY_FIND       0x16A    /* Find key */
+#define    KEY_HELP       0x16B    /* Help key */
+#define    KEY_MARK       0x16C    /* Mark key */
+#define    KEY_MESSAGE    0x16D    /* Message key */
+#define    KEY_MOVE       0x16E    /* Move key */
+#define    KEY_NEXT       0x16F    /* Next Object key */
+#define    KEY_OPEN       0x170    /* Open key */
+#define    KEY_OPTIONS    0x171    /* Options key */
+#define    KEY_PREVIOUS   0x172    /* Previous Object key */
+#define    KEY_REDO       0x173    /* Redo key */
+#define    KEY_REFERENCE  0x174    /* Ref Key */
+#define    KEY_REFRESH    0x175    /* Refresh key */
+#define    KEY_REPLACE    0x176    /* Replace key */
+#define    KEY_RESTART    0x177    /* Restart key */
+#define    KEY_RESUME     0x178    /* Resume key */
+#define    KEY_SAVE       0x179    /* Save key */
+#define    KEY_SBEG       0x17A    /* Shift begin key */
+#define    KEY_SCANCEL    0x17B    /* Shift Cancel key */
+#define    KEY_SCOMMAND   0x17C    /* Shift Command key */
+#define    KEY_SCOPY      0x17D    /* Shift Copy key */
+#define    KEY_SCREATE    0x17E    /* Shift Create key */
+#define    KEY_SDC        0x17F    /* Shift Delete Character */
+#define    KEY_SDL        0x180    /* Shift Delete Line */
+#define    KEY_SELECT     0x181    /* Select key */
+#define    KEY_SEND       0x182    /* Send key */
+#define    KEY_SEOL       0x183    /* Shift Clear Line key */
+#define    KEY_SEXIT      0x184    /* Shift Exit key */
+#define    KEY_SFIND      0x185    /* Shift Find key */
+#define    KEY_SHELP      0x186    /* Shift Help key */
+#define    KEY_SHOME      0x187    /* Shift Home key */
+#define    KEY_SIC        0x188    /* Shift Input key */
+#define    KEY_SLEFT      0x189    /* Shift Left Arrow key */
+#define    KEY_SMESSAGE   0x18A    /* Shift Message key */
+#define    KEY_SMOVE      0x18B    /* Shift Move key */
+#define    KEY_SNEXT      0x18C    /* Shift Next key */
+#define    KEY_SOPTIONS   0x18D    /* Shift Options key */
+#define    KEY_SPREVIOUS  0x18E    /* Shift Previous key */
+#define    KEY_SPRINT     0x18F    /* Shift Print key */
+#define    KEY_SREDO      0x190    /* Shift Redo key */
+#define    KEY_SREPLACE   0x191    /* Shift Replace key */
+#define    KEY_SRIGHT     0x192    /* Shift Right Arrow key */
+#define    KEY_SRSUME     0x193    /* Shift Resume key */
+#define    KEY_SSAVE      0x194    /* Shift Save key */
+#define    KEY_SSUSPEND   0x195    /* Shift Suspend key */
+#define    KEY_SUNDO      0x196    /* Shift Undo key */
+#define    KEY_SUSPEND    0x197    /* Suspend key */
+#define    KEY_UNDO       0x198    /* Undo key */
+#define    KEY_MOUSE      0x199    /* Mouse event has occurred */
+#define    KEY_RESIZE     0x200    /* Resize event has occurred */
+#define    KEY_MAX        0x240    /* maximum extended key value */
+#define    KEY_CODE_YES   0x241    /* A function key pressed */
+
+#include <unctrl.h>
+
+/*
+ * A window an array of __LINE structures pointed to by the 'lines' pointer.
+ * A line is an array of __LDATA structures pointed to by the 'line' pointer.
+ */
+
+/*
+ * Definitions for characters and attributes in __LDATA
+ */
+#define __CHARTEXT     0x000000ff      /* bits for 8-bit characters */
+#define __NORMAL       0x00000000      /* Added characters are normal. */
+#define __STANDOUT     0x00000100      /* Added characters are standout. */
+#define __UNDERSCORE   0x00000200      /* Added characters are underscored. */
+#define __REVERSE      0x00000400      /* Added characters are reverse
+                                          video. */
+#define __BLINK                0x00000800      /* Added characters are blinking. */
+#define __DIM          0x00001000      /* Added characters are dim. */
+#define __BOLD         0x00002000      /* Added characters are bold. */
+#define __BLANK                0x00004000      /* Added characters are blanked. */
+#define __PROTECT      0x00008000      /* Added characters are protected. */
+#define __ALTCHARSET   0x00010000      /* Added characters are ACS */
+#define __COLOR                0x03fe0000      /* Color bits */
+#define __ATTRIBUTES   0x03ffff00      /* All 8-bit attribute bits */
+#ifdef HAVE_WCHAR
+#define __ACS_IS_WACS  0x04000000 /* internal: use wacs table for ACS char */
+#endif
+
+typedef struct __ldata __LDATA;
+typedef struct __line  __LINE;
+typedef struct __window  WINDOW;
+typedef struct __screen SCREEN;
+
+/*
+ * Attribute definitions
+ */
+#define        A_NORMAL        __NORMAL
+#define        A_STANDOUT      __STANDOUT
+#define        A_UNDERLINE     __UNDERSCORE
+#define        A_REVERSE       __REVERSE
+#define        A_BLINK         __BLINK
+#define        A_DIM           __DIM
+#define        A_BOLD          __BOLD
+#define        A_BLANK         __BLANK
+#define        A_INVIS         __BLANK
+#define        A_PROTECT       __PROTECT
+#define        A_ALTCHARSET    __ALTCHARSET
+#define        A_ATTRIBUTES    __ATTRIBUTES
+#define        A_CHARTEXT      __CHARTEXT
+#define        A_COLOR         __COLOR
+
+#ifdef HAVE_WCHAR
+#define WA_ATTRIBUTES  0x03ffffff      /* Wide character attributes mask */
+#define WA_STANDOUT    __STANDOUT      /* Best highlighting mode */
+#define WA_UNDERLINE   __UNDERSCORE    /* Underlining */
+#define WA_REVERSE     __REVERSE       /* Reverse video */
+#define WA_BLINK       __BLINK         /* Blinking */
+#define WA_DIM         __DIM           /* Half bright */
+#define WA_BOLD                __BOLD          /* Extra bright or bold */
+#define WA_INVIS       __BLANK         /* Invisible */
+#define WA_PROTECT     __PROTECT       /* Protected */
+#define WA_ALTCHARSET  __ALTCHARSET    /* Alternate character set */
+#define WA_LOW         0x00000002      /* Low highlight */
+#define WA_TOP         0x00000004      /* Top highlight */
+#define WA_HORIZONTAL  0x00000008      /* Horizontal highlight */
+#define WA_VERTICAL    0x00000010      /* Vertical highlight */
+#define WA_LEFT                0x00000020      /* Left highlight */
+#define WA_RIGHT       0x00000040      /* Right highlight */
+#endif /* HAVE_WCHAR */
+
+/*
+ * Alternate character set definitions
+ */
+
+#define        NUM_ACS 128
+
+extern chtype _acs_char[NUM_ACS];
+#ifdef __cplusplus
+#define __UC_CAST(a)   static_cast<unsigned char>(a)
+#else
+#define __UC_CAST(a)   (unsigned char)(a)
+#endif
+
+/* Standard definitions */
+#define        ACS_RARROW      _acs_char[__UC_CAST('+')]
+#define        ACS_LARROW      _acs_char[__UC_CAST(',')]
+#define        ACS_UARROW      _acs_char[__UC_CAST('-')]
+#define        ACS_DARROW      _acs_char[__UC_CAST('.')]
+#define        ACS_BLOCK       _acs_char[__UC_CAST('0')]
+#define        ACS_DIAMOND     _acs_char[__UC_CAST('`')]
+#define        ACS_CKBOARD     _acs_char[__UC_CAST('a')]
+#define        ACS_DEGREE      _acs_char[__UC_CAST('f')]
+#define        ACS_PLMINUS     _acs_char[__UC_CAST('g')]
+#define        ACS_BOARD       _acs_char[__UC_CAST('h')]
+#define        ACS_LANTERN     _acs_char[__UC_CAST('i')]
+#define        ACS_LRCORNER    _acs_char[__UC_CAST('j')]
+#define        ACS_URCORNER    _acs_char[__UC_CAST('k')]
+#define        ACS_ULCORNER    _acs_char[__UC_CAST('l')]
+#define        ACS_LLCORNER    _acs_char[__UC_CAST('m')]
+#define        ACS_PLUS        _acs_char[__UC_CAST('n')]
+#define        ACS_HLINE       _acs_char[__UC_CAST('q')]
+#define        ACS_S1          _acs_char[__UC_CAST('o')]
+#define        ACS_S9          _acs_char[__UC_CAST('s')]
+#define        ACS_LTEE        _acs_char[__UC_CAST('t')]
+#define        ACS_RTEE        _acs_char[__UC_CAST('u')]
+#define        ACS_BTEE        _acs_char[__UC_CAST('v')]
+#define        ACS_TTEE        _acs_char[__UC_CAST('w')]
+#define        ACS_VLINE       _acs_char[__UC_CAST('x')]
+#define        ACS_BULLET      _acs_char[__UC_CAST('~')]
+
+/* Extensions */
+#define        ACS_S3          _acs_char[__UC_CAST('p')]
+#define        ACS_S7          _acs_char[__UC_CAST('r')]
+#define        ACS_LEQUAL      _acs_char[__UC_CAST('y')]
+#define        ACS_GEQUAL      _acs_char[__UC_CAST('z')]
+#define        ACS_PI          _acs_char[__UC_CAST('{')]
+#define        ACS_NEQUAL      _acs_char[__UC_CAST('|')]
+#define        ACS_STERLING    _acs_char[__UC_CAST('}')]
+
+#ifdef HAVE_WCHAR
+extern cchar_t _wacs_char[NUM_ACS];
+
+#define        WACS_RARROW     (&_wacs_char[(unsigned char)'+'])
+#define        WACS_LARROW     (&_wacs_char[(unsigned char)','])
+#define        WACS_UARROW     (&_wacs_char[(unsigned char)'-'])
+#define        WACS_DARROW     (&_wacs_char[(unsigned char)'.'])
+#define        WACS_BLOCK      (&_wacs_char[(unsigned char)'0'])
+#define        WACS_DIAMOND    (&_wacs_char[(unsigned char)'`'])
+#define        WACS_CKBOARD    (&_wacs_char[(unsigned char)'a'])
+#define        WACS_DEGREE     (&_wacs_char[(unsigned char)'f'])
+#define        WACS_PLMINUS    (&_wacs_char[(unsigned char)'g'])
+#define        WACS_BOARD      (&_wacs_char[(unsigned char)'h'])
+#define        WACS_LANTERN    (&_wacs_char[(unsigned char)'i'])
+#define        WACS_LRCORNER   (&_wacs_char[(unsigned char)'j'])
+#define        WACS_URCORNER   (&_wacs_char[(unsigned char)'k'])
+#define        WACS_ULCORNER   (&_wacs_char[(unsigned char)'l'])
+#define        WACS_LLCORNER   (&_wacs_char[(unsigned char)'m'])
+#define        WACS_PLUS       (&_wacs_char[(unsigned char)'n'])
+#define        WACS_HLINE      (&_wacs_char[(unsigned char)'q'])
+#define        WACS_S1         (&_wacs_char[(unsigned char)'o'])
+#define        WACS_S9         (&_wacs_char[(unsigned char)'s'])
+#define        WACS_LTEE       (&_wacs_char[(unsigned char)'t'])
+#define        WACS_RTEE       (&_wacs_char[(unsigned char)'u'])
+#define        WACS_BTEE       (&_wacs_char[(unsigned char)'v'])
+#define        WACS_TTEE       (&_wacs_char[(unsigned char)'w'])
+#define        WACS_VLINE      (&_wacs_char[(unsigned char)'x'])
+#define        WACS_BULLET     (&_wacs_char[(unsigned char)'~'])
+#define        WACS_S3         (&_wacs_char[(unsigned char)'p'])
+#define        WACS_S7         (&_wacs_char[(unsigned char)'r'])
+#define        WACS_LEQUAL     (&_wacs_char[(unsigned char)'y'])
+#define        WACS_GEQUAL     (&_wacs_char[(unsigned char)'z'])
+#define        WACS_PI         (&_wacs_char[(unsigned char)'{'])
+#define        WACS_NEQUAL     (&_wacs_char[(unsigned char)'|'])
+#define        WACS_STERLING   (&_wacs_char[(unsigned char)'}'])
+#endif /* HAVE_WCHAR */
+
+/* System V compatibility */
+#define        ACS_SBBS        ACS_LRCORNER
+#define        ACS_BBSS        ACS_URCORNER
+#define        ACS_BSSB        ACS_ULCORNER
+#define        ACS_SSBB        ACS_LLCORNER
+#define        ACS_SSSS        ACS_PLUS
+#define        ACS_BSBS        ACS_HLINE
+#define        ACS_SSSB        ACS_LTEE
+#define        ACS_SBSS        ACS_RTEE
+#define        ACS_SSBS        ACS_BTEE
+#define        ACS_BSSS        ACS_TTEE
+#define        ACS_SBSB        ACS_VLINE
+#define        _acs_map        _acs_char
+
+/*
+ * Color definitions (ANSI color numbers)
+ */
+
+#define        COLOR_BLACK     0x00
+#define        COLOR_RED       0x01
+#define        COLOR_GREEN     0x02
+#define        COLOR_YELLOW    0x03
+#define        COLOR_BLUE      0x04
+#define        COLOR_MAGENTA   0x05
+#define        COLOR_CYAN      0x06
+#define        COLOR_WHITE     0x07
+
+#ifdef __cplusplus
+#define __UINT32_CAST(a)       static_cast<u_int32_t>(a)
+#else
+#define __UINT32_CAST(a)       (u_int32_t)(a)
+#endif
+#define        COLOR_PAIR(n)   (((__UINT32_CAST(n)) << 17) & A_COLOR)
+#define        PAIR_NUMBER(n)  (((__UINT32_CAST(n)) & A_COLOR) >> 17)
+
+/* Curses external declarations. */
+extern WINDOW  *curscr;                /* Current screen. */
+extern WINDOW  *stdscr;                /* Standard screen. */
+
+extern int     __tcaction;             /* If terminal hardware set. */
+
+extern int      COLS;                  /* Columns on the screen. */
+extern int      LINES;                 /* Lines on the screen. */
+extern int      COLORS;                /* Max colors on the screen. */
+extern int      COLOR_PAIRS;           /* Max color pairs on the screen. */
+
+extern int      ESCDELAY;              /* Delay between keys in esc seq's. */
+
+#ifndef OK
+#define        ERR     (-1)                    /* Error return. */
+#define        OK      (0)                     /* Success return. */
+#endif
+
+/*
+ * The following have, traditionally, been macros but X/Open say they
+ * need to be functions.  Keep the old macros for debugging.
+ */
+#ifdef _CURSES_USE_MACROS
+/* Standard screen pseudo functions. */
+#define        addbytes(s, n)                  __waddbytes(stdscr, s, n, 0)
+#define        addch(ch)                       waddch(stdscr, ch)
+#define        addchnstr(s)                    waddchnstr(stdscr, s, n)
+#define        addchstr(s)                     waddchnstr(stdscr, s, -1)
+#define        addnstr(s, n)                   waddnstr(stdscr, s, n)
+#define        addstr(s)                       waddnstr(stdscr, s, -1)
+#define attr_get(a, p, o)              wattr_get(stdscr, a, p, o)
+#define attr_off(a, o)                 wattr_off(stdscr, a, o)
+#define attr_on(a, o)                  wattr_on(stdscr, a, o)
+#define attr_set(a, p, o)              wattr_set(stdscr, a, p, o)
+#define        attroff(attr)                   wattroff(stdscr, attr)
+#define        attron(attr)                    wattron(stdscr, attr)
+#define        attrset(attr)                   wattrset(stdscr, attr)
+#define bkgd(ch)                       wbkgd(stdscr, ch)
+#define bkgdset(ch)                    wbkgdset(stdscr, ch)
+#define        border(l, r, t, b, tl, tr, bl, br) \
+       wborder(stdscr, l, r, t, b, tl, tr, bl, br)
+#define        clear()                         wclear(stdscr)
+#define        clrtobot()                      wclrtobot(stdscr)
+#define        clrtoeol()                      wclrtoeol(stdscr)
+#define color_set(c, o)                        wcolor_set(stdscr, c, o)
+#define        delch()                         wdelch(stdscr)
+#define        deleteln()                      wdeleteln(stdscr)
+#define        echochar(c)                     wechochar(stdscr, c)
+#define        erase()                         werase(stdscr)
+#define        getch()                         wgetch(stdscr)
+#define        getnstr(s, n)                   wgetnstr(stdscr, s, n)
+#define        getstr(s)                       wgetstr(stdscr, s)
+#define        inch()                          winch(stdscr)
+#define        inchnstr(c)                     winchnstr(stdscr, c)
+#define        inchstr(c)                      winchstr(stdscr, c)
+#define        innstr(s, n)                    winnstr(stdscr, s, n)
+#define        insch(ch)                       winsch(stdscr, ch)
+#define        insdelln(n)                     winsdelln(stdscr, n)
+#define        insertln()                      winsertln(stdscr)
+#define        instr(s)                        winstr(stdscr, s)
+#define        move(y, x)                      wmove(stdscr, y, x)
+#define        refresh()                       wrefresh(stdscr)
+#define        scrl(n)                         wscrl(stdscr, n)
+#define        setscrreg(t, b)                 wsetscrreg(stdscr, t, b)
+#define        standend()                      wstandend(stdscr)
+#define        standout()                      wstandout(stdscr)
+#define        timeout(delay)                  wtimeout(stdscr, delay)
+#define        underscore()                    wunderscore(stdscr)
+#define        underend()                      wunderend(stdscr)
+#define        waddbytes(w, s, n)              __waddbytes(w, s, n, 0)
+#define        waddstr(w, s)                   waddnstr(w, s, -1)
+
+/* Standard screen plus movement pseudo functions. */
+#define        mvaddbytes(y, x, s, n)          mvwaddbytes(stdscr, y, x, s, n)
+#define        mvaddch(y, x, ch)               mvwaddch(stdscr, y, x, ch)
+#define        mvaddchnstr(y, x, s, n)         mvwaddchnstr(stdscr, y, x, s, n)
+#define        mvaddchstr(y, x, s)             mvwaddchstr(stdscr, y, x, s)
+#define        mvaddnstr(y, x, s, n)           mvwaddnstr(stdscr, y, x, s, n)
+#define        mvaddstr(y, x, s)               mvwaddstr(stdscr, y, x, s)
+#define        mvdelch(y, x)                   mvwdelch(stdscr, y, x)
+#define        mvgetch(y, x)                   mvwgetch(stdscr, y, x)
+#define        mvgetnstr(y, x, s)              mvwgetnstr(stdscr, y, x, s, n)
+#define        mvgetstr(y, x, s)               mvwgetstr(stdscr, y, x, s)
+#define        mvinch(y, x)                    mvwinch(stdscr, y, x)
+#define        mvinchnstr(y, x, c, n)          mvwinchnstr(stdscr, y, x, c, n)
+#define        mvinchstr(y, x, c)              mvwinchstr(stdscr, y, x, c)
+#define        mvinnstr(y, x, s, n)            mvwinnstr(stdscr, y, x, s, n)
+#define        mvinsch(y, x, c)                mvwinsch(stdscr, y, x, c)
+#define        mvinstr(y, x, s)                mvwinstr(stdscr, y, x, s)
+#define        mvwaddbytes(w, y, x, s, n) \
+       (wmove(w, y, x) == ERR ? ERR : __waddbytes(w, s, n, 0))
+#define        mvwaddch(w, y, x, ch) \
+       (wmove(w, y, x) == ERR ? ERR : waddch(w, ch))
+#define        mvwaddchnstr(w, y, x, s, n) \
+       (wmove(w, y, x) == ERR ? ERR : waddchnstr(w, s, n))
+#define        mvwaddchstr(w, y, x, s) \
+       (wmove(w, y, x) == ERR ? ERR : waddchnstr(w, s, -1))
+#define        mvwaddnstr(w, y, x, s, n) \
+       (wmove(w, y, x) == ERR ? ERR : waddnstr(w, s, n))
+#define        mvwaddstr(w, y, x, s) \
+       (wmove(w, y, x) == ERR ? ERR : waddnstr(w, s, -1))
+#define        mvwdelch(w, y, x) \
+       (wmove(w, y, x) == ERR ? ERR : wdelch(w))
+#define        mvwgetch(w, y, x) \
+       (wmove(w, y, x) == ERR ? ERR : wgetch(w))
+#define        mvwgetnstr(w, y, x, s, n) \
+       (wmove(w, y, x) == ERR ? ERR : wgetnstr(w, s, n))
+#define        mvwgetstr(w, y, x, s) \
+       (wmove(w, y, x) == ERR ? ERR : wgetstr(w, s))
+#define        mvwinch(w, y, x) \
+       (wmove(w, y, x) == ERR ? ERR : winch(w))
+#define        mvwinchnstr(w, y, x, c, n) \
+       (wmove(w, y, x) == ERR ? ERR : winchnstr(w, c, n))
+#define        mvwinchstr(w, y, x, s) \
+       (wmove(w, y, x) == ERR ? ERR : winchstr(w, c))
+#define        mvwinnstr(w, y, x, s, n) \
+       (wmove(w, y, x) == ERR ? ERR : winnstr(w, s, n))
+#define        mvwinsch(w, y, x, c) \
+       (wmove(w, y, x) == ERR ? ERR : winsch(w, c))
+#define        mvwinstr(w, y, x, s) \
+       (wmove(w, y, x) == ERR ? ERR : winstr(w, s))
+
+/* Miscellaneous. */
+#define        noqiflush()             intrflush(stdscr, FALSE)
+#define        qiflush()               intrflush(stdscr, TRUE)
+
+#else
+/* Use functions not macros... */
+__BEGIN_DECLS
+int     addbytes(const char *, int);
+int     addch(chtype);
+int     addchnstr(const chtype *, int);
+int     addchstr(const chtype *);
+int     addnstr(const char *, int);
+int     addstr(const char *);
+int     attr_get(attr_t *, short *, void *);
+int     attr_off(attr_t, void *);
+int     attr_on(attr_t, void *);
+int     attr_set(attr_t, short, void *);
+int     attroff(int);
+int     attron(int);
+int     attrset(int);
+int     bkgd(chtype);
+void    bkgdset(chtype);
+int     border(chtype, chtype, chtype, chtype,
+          chtype, chtype, chtype, chtype);
+int     clear(void);
+int     clrtobot(void);
+int     clrtoeol(void);
+int     color_set(short, void *);
+int     delch(void);
+int     deleteln(void);
+int     echochar(const chtype);
+int     erase(void);
+int     getch(void);
+int     getnstr(char *, int);
+int     getstr(char *);
+chtype  inch(void);
+int     inchnstr(chtype *, int);
+int     inchstr(chtype *);
+int     innstr(char *, int);
+int     insch(chtype);
+int     insdelln(int);
+int     insertln(void);
+int     instr(char *);
+int     move(int, int);
+int     refresh(void);
+int     scrl(int);
+int     setscrreg(int, int);
+int     standend(void);
+int     standout(void);
+void    timeout(int);
+int     underscore(void);
+int     underend(void);
+int     waddbytes(WINDOW *, const char *, int);
+int     waddstr(WINDOW *, const char *);
+
+/* Standard screen plus movement functions. */
+int     mvaddbytes(int, int, const char *, int);
+int     mvaddch(int, int, chtype);
+int     mvaddchnstr(int, int, const chtype *, int);
+int     mvaddchstr(int, int, const chtype *);
+int     mvaddnstr(int, int, const char *, int);
+int     mvaddstr(int, int, const char *);
+int     mvdelch(int, int);
+int     mvgetch(int, int);
+int     mvgetnstr(int, int, char *, int);
+int     mvgetstr(int, int, char *);
+chtype  mvinch(int, int);
+int     mvinchnstr(int, int, chtype *, int);
+int     mvinchstr(int, int, chtype *);
+int     mvinnstr(int, int, char *, int);
+int     mvinsch(int, int, chtype);
+int     mvinstr(int, int, char *);
+
+int     mvwaddbytes(WINDOW *, int, int, const char *, int);
+int     mvwaddch(WINDOW *, int, int, chtype);
+int     mvwaddchnstr(WINDOW *, int, int, const chtype *, int);
+int     mvwaddchstr(WINDOW *, int, int, const chtype *);
+int     mvwaddnstr(WINDOW *, int, int, const char *, int);
+int     mvwaddstr(WINDOW *, int, int, const char *);
+int     mvwdelch(WINDOW *, int, int);
+int     mvwgetch(WINDOW *, int, int);
+int     mvwgetnstr(WINDOW *, int, int, char *, int);
+int     mvwgetstr(WINDOW *, int, int, char *);
+chtype  mvwinch(WINDOW *, int, int);
+int     mvwinsch(WINDOW *, int, int, chtype);
+__END_DECLS
+#endif /* _CURSES_USE_MACROS */
+
+#define        getyx(w, y, x)          (y) = getcury(w), (x) = getcurx(w)
+#define        getbegyx(w, y, x)       (y) = getbegy(w), (x) = getbegx(w)
+#define        getmaxyx(w, y, x)       (y) = getmaxy(w), (x) = getmaxx(w)
+#define        getparyx(w, y, x)       (y) = getpary(w), (x) = getparx(w)
+
+/* Public function prototypes. */
+__BEGIN_DECLS
+int     assume_default_colors(short, short);
+int     baudrate(void);
+int     beep(void);
+int     box(WINDOW *, chtype, chtype);
+bool    can_change_color(void);
+int     cbreak(void);
+int     clearok(WINDOW *, bool);
+int     color_content(short, short *, short *, short *);
+int     copywin(const WINDOW *, WINDOW *, int, int, int, int, int, int, int);
+int     curs_set(int);
+int     def_prog_mode(void);
+int     def_shell_mode(void);
+int      define_key(char *, int);
+int     delay_output(int);
+void     delscreen(SCREEN *);
+int     delwin(WINDOW *);
+WINDOW *derwin(WINDOW *, int, int, int, int);
+WINDOW *dupwin(WINDOW *);
+int     doupdate(void);
+int     echo(void);
+int     endwin(void);
+char     erasechar(void);
+int     flash(void);
+int     flushinp(void);
+int     flushok(WINDOW *, bool);
+char   *fullname(const char *, char *);
+chtype  getattrs(WINDOW *);
+chtype  getbkgd(WINDOW *);
+char   *getcap(char *);
+int     getcury(WINDOW *);
+int     getcurx(WINDOW *);
+int     getbegy(WINDOW *);
+int     getbegx(WINDOW *);
+int     getmaxy(WINDOW *);
+int     getmaxx(WINDOW *);
+int     getpary(WINDOW *);
+int     getparx(WINDOW *);
+int     gettmode(void);
+WINDOW *getwin(FILE *);
+int     halfdelay(int);
+bool    has_colors(void);
+bool    has_ic(void);
+bool    has_il(void);
+int     hline(chtype, int);
+int     idcok(WINDOW *, bool);
+int     idlok(WINDOW *, bool);
+int     init_color(short, short, short, short);
+int     init_pair(short, short, short);
+WINDOW *initscr(void);
+int     intrflush(WINDOW *, bool);
+bool    isendwin(void);
+bool    is_linetouched(WINDOW *, int);
+bool    is_wintouched(WINDOW *);
+int      keyok(int, bool);
+int     keypad(WINDOW *, bool);
+char   *keyname(int);
+char     killchar(void);
+int     leaveok(WINDOW *, bool);
+char   *longname(void);
+int     meta(WINDOW *, bool);
+int     mvcur(int, int, int, int);
+int      mvderwin(WINDOW *, int, int);
+int     mvhline(int, int, chtype, int);
+int     mvprintw(int, int, const char *, ...) __printflike(3, 4);
+int     mvscanw(int, int, const char *, ...) __scanflike(3, 4);
+int     mvvline(int, int, chtype, int);
+int     mvwhline(WINDOW *, int, int, chtype, int);
+int     mvwvline(WINDOW *, int, int, chtype, int);
+int     mvwin(WINDOW *, int, int);
+int     mvwinchnstr(WINDOW *, int, int, chtype *, int);
+int     mvwinchstr(WINDOW *, int, int, chtype *);
+int     mvwinnstr(WINDOW *, int, int, char *, int);
+int     mvwinstr(WINDOW *, int, int, char *);
+int     mvwprintw(WINDOW *, int, int, const char *, ...) __printflike(4, 5);
+int     mvwscanw(WINDOW *, int, int, const char *, ...) __scanflike(4, 5);
+int     napms(int);
+WINDOW *newpad(int, int);
+SCREEN  *newterm(char *, FILE *, FILE *);
+WINDOW *newwin(int, int, int, int);
+int     nl(void);
+attr_t  no_color_attributes(void);
+int     nocbreak(void);
+int     nodelay(WINDOW *, bool);
+int     noecho(void);
+int     nonl(void);
+void    noqiflush(void);
+int     noraw(void);
+int     notimeout(WINDOW *, bool);
+int     overlay(const WINDOW *, WINDOW *);
+int     overwrite(const WINDOW *, WINDOW *);
+int     pair_content(short, short *, short *);
+int     pechochar(WINDOW *, const chtype);
+int     pnoutrefresh(WINDOW *, int, int, int, int, int, int);
+int     prefresh(WINDOW *, int, int, int, int, int, int);
+int     printw(const char *, ...) __printflike(1, 2);
+int     putwin(WINDOW *, FILE *);
+void    qiflush(void);
+int     raw(void);
+int     redrawwin(WINDOW *);
+int     reset_prog_mode(void);
+int     reset_shell_mode(void);
+int     resetty(void);
+int      resizeterm(int, int);
+int     savetty(void);
+int     scanw(const char *, ...) __scanflike(1, 2);
+int     scroll(WINDOW *);
+int     scrollok(WINDOW *, bool);
+int     setterm(char *);
+SCREEN  *set_term(SCREEN *);
+int     start_color(void);
+WINDOW *subpad(WINDOW *, int, int, int, int);
+WINDOW *subwin(WINDOW *, int, int, int, int);
+chtype  termattrs(void);
+attr_t  term_attrs(void);
+int     touchline(WINDOW *, int, int);
+int     touchoverlap(WINDOW *, WINDOW *);
+int     touchwin(WINDOW *);
+int     ungetch(int);
+int     untouchwin(WINDOW *);
+int     use_default_colors(void);
+int     vline(chtype, int);
+int     vw_printw(WINDOW *, const char *, _BSD_VA_LIST_) __printflike(2, 0);
+int     vw_scanw(WINDOW *, const char *, _BSD_VA_LIST_) __scanflike(2, 0);
+int     vwprintw(WINDOW *, const char *, _BSD_VA_LIST_) __printflike(2, 0);
+int     vwscanw(WINDOW *, const char *, _BSD_VA_LIST_) __scanflike(2, 0);
+int     waddch(WINDOW *, chtype);
+int     waddchnstr(WINDOW *, const chtype *, int);
+int     waddchstr(WINDOW *, const chtype *);
+int     waddnstr(WINDOW *, const char *, int);
+int     wattr_get(WINDOW *, attr_t *, short *, void *);
+int     wattr_off(WINDOW *, attr_t, void *);
+int     wattr_on(WINDOW *, attr_t, void *);
+int     wattr_set(WINDOW *, attr_t, short, void *);
+int     wattroff(WINDOW *, int);
+int     wattron(WINDOW *, int);
+int     wattrset(WINDOW *, int);
+int     wbkgd(WINDOW *, chtype);
+void    wbkgdset(WINDOW *, chtype);
+int     wborder(WINDOW *, chtype, chtype, chtype, chtype, chtype, chtype,
+               chtype, chtype);
+int     wclear(WINDOW *);
+int     wclrtobot(WINDOW *);
+int     wclrtoeol(WINDOW *);
+int     wcolor_set(WINDOW *, short, void *);
+void    wcursyncup(WINDOW *);
+int     wdelch(WINDOW *);
+int     wdeleteln(WINDOW *);
+int     wechochar(WINDOW *, const chtype);
+int     werase(WINDOW *);
+int     wgetch(WINDOW *);
+int     wgetnstr(WINDOW *, char *, int);
+int     wgetstr(WINDOW *, char *);
+int     whline(WINDOW *, chtype, int);
+chtype  winch(WINDOW *);
+int     winchnstr(WINDOW *, chtype *, int);
+int     winchstr(WINDOW *, chtype *);
+int     winnstr(WINDOW *, char *, int);
+int     winsch(WINDOW *, chtype);
+int     winsdelln(WINDOW *, int);
+int     winsertln(WINDOW *);
+int     winstr(WINDOW *, char *);
+int     wmove(WINDOW *, int, int);
+int     wnoutrefresh(WINDOW *);
+int     wprintw(WINDOW *, const char *, ...)  __printflike(2, 3);
+int     wredrawln(WINDOW *, int, int);
+int     wrefresh(WINDOW *);
+int      wresize(WINDOW *, int, int);
+int     wscanw(WINDOW *, const char *, ...) __scanflike(2, 3);
+int     wscrl(WINDOW *, int);
+int     wsetscrreg(WINDOW *, int, int);
+int     wstandend(WINDOW *);
+int     wstandout(WINDOW *);
+void    wsyncdown(WINDOW *);
+void    wsyncup(WINDOW *);
+void    wtimeout(WINDOW *, int);
+int     wtouchln(WINDOW *, int, int, int);
+int     wunderend(WINDOW *);
+int     wunderscore(WINDOW *);
+int     wvline(WINDOW *, chtype, int);
+
+int insnstr(const char *, int);
+int insstr(const char *);
+int mvinsnstr(int, int, const char *, int);
+int mvinsstr(int, int, const char *);
+int mvwinsnstr(WINDOW *, int, int, const char *, int);
+int mvwinsstr(WINDOW *, int, int, const char *);
+int winsnstr(WINDOW *, const char *, int);
+int winsstr(WINDOW *, const char *);
+
+int chgat(int, attr_t, short, const void *);
+int wchgat(WINDOW *, int, attr_t, short, const void *);
+int mvchgat(int, int, int, attr_t, short, const void *);
+int mvwchgat(WINDOW *, int, int, int, attr_t, short, const void *);
+
+/* wide-character support routines */
+/* return ERR when HAVE_WCHAR is not defined */
+/* add */
+int add_wch(const cchar_t *);
+int wadd_wch(WINDOW *, const cchar_t *);
+int mvadd_wch(int, int, const cchar_t *);
+int mvwadd_wch(WINDOW *, int, int, const cchar_t *);
+
+int add_wchnstr(const cchar_t *, int);
+int add_wchstr(const cchar_t *);
+int wadd_wchnstr(WINDOW *, const cchar_t *, int);
+int wadd_wchstr(WINDOW *, const cchar_t *);
+int mvadd_wchnstr(int, int, const cchar_t *, int);
+int mvadd_wchstr(int, int, const cchar_t *);
+int mvwadd_wchnstr(WINDOW *, int, int, const cchar_t *, int);
+int mvwadd_wchstr(WINDOW *, int, int, const cchar_t *);
+
+int addnwstr(const wchar_t *, int);
+int addwstr(const wchar_t *);
+int mvaddnwstr(int, int x, const wchar_t *, int);
+int mvaddwstr(int, int x, const wchar_t *);
+int mvwaddnwstr(WINDOW *, int, int, const wchar_t *, int);
+int mvwaddwstr(WINDOW *, int, int, const wchar_t *);
+int waddnwstr(WINDOW *, const wchar_t *, int);
+int waddwstr(WINDOW *, const wchar_t *);
+
+int echo_wchar(const cchar_t *);
+int wecho_wchar(WINDOW *, const cchar_t *);
+int pecho_wchar(WINDOW *, const cchar_t *);
+
+/* insert */
+int ins_wch(const cchar_t *);
+int wins_wch(WINDOW *, const cchar_t *);
+int mvins_wch(int, int, const cchar_t *);
+int mvwins_wch(WINDOW *, int, int, const cchar_t *);
+
+int ins_nwstr(const wchar_t *, int);
+int ins_wstr(const wchar_t *);
+int mvins_nwstr(int, int, const wchar_t *, int);
+int mvins_wstr(int, int, const wchar_t *);
+int mvwins_nwstr(WINDOW *, int, int, const wchar_t *, int);
+int mvwins_wstr(WINDOW *, int, int, const wchar_t *);
+int wins_nwstr(WINDOW *, const wchar_t *, int);
+int wins_wstr(WINDOW *, const wchar_t *);
+
+/* input */
+int get_wch(wint_t *);
+int unget_wch(const wchar_t);
+int mvget_wch(int, int, wint_t *);
+int mvwget_wch(WINDOW *, int, int, wint_t *);
+int wget_wch(WINDOW *, wint_t *);
+
+int getn_wstr(wchar_t *, int);
+int get_wstr(wchar_t *);
+int mvgetn_wstr(int, int, wchar_t *, int);
+int mvget_wstr(int, int, wchar_t *);
+int mvwgetn_wstr(WINDOW *, int, int, wchar_t *, int);
+int mvwget_wstr(WINDOW *, int, int, wchar_t *);
+int wgetn_wstr(WINDOW *, wchar_t *, int);
+int wget_wstr(WINDOW *, wchar_t *);
+
+int in_wch(cchar_t *);
+int mvin_wch(int, int, cchar_t *);
+int mvwin_wch(WINDOW *, int, int, cchar_t *);
+int win_wch(WINDOW *, cchar_t *);
+
+int in_wchnstr(cchar_t *, int);
+int in_wchstr(cchar_t *);
+int mvin_wchnstr(int, int, cchar_t *, int);
+int mvin_wchstr(int, int, cchar_t *);
+int mvwin_wchnstr(WINDOW *, int, int, cchar_t *, int);
+int mvwin_wchstr(WINDOW *, int, int, cchar_t *);
+int win_wchnstr(WINDOW *, cchar_t *, int);
+int win_wchstr(WINDOW *, cchar_t *);
+
+int innwstr(wchar_t *, int);
+int inwstr(wchar_t *);
+int mvinnwstr(int, int, wchar_t *, int);
+int mvinwstr(int, int, wchar_t *);
+int mvwinnwstr(WINDOW *, int, int, wchar_t *, int);
+int mvwinwstr(WINDOW *, int, int, wchar_t *);
+int winnwstr(WINDOW *, wchar_t *, int);
+int winwstr(WINDOW *, wchar_t *);
+
+/* cchar handlgin */
+int setcchar(cchar_t *, const wchar_t *, const attr_t, short, const void *);
+int getcchar(const cchar_t *, wchar_t *, attr_t *, short *, void *);
+
+/* misc */
+char *key_name( wchar_t );
+int border_set(const cchar_t *, const cchar_t *, const cchar_t *,
+               const cchar_t *, const cchar_t *, const cchar_t *,
+               const cchar_t *, const cchar_t *);
+int wborder_set(WINDOW *, const cchar_t *, const cchar_t *,
+                const cchar_t *, const cchar_t *, const cchar_t *, 
+                const cchar_t *, const cchar_t *, const cchar_t *);
+int box_set(WINDOW *, const cchar_t *, const cchar_t *);
+int erasewchar(wchar_t *);
+int killwchar(wchar_t *);
+int hline_set(const cchar_t *, int);
+int mvhline_set(int, int, const cchar_t *, int);
+int mvvline_set(int, int, const cchar_t *, int);
+int mvwhline_set(WINDOW *, int, int, const cchar_t *, int);
+int mvwvline_set(WINDOW *, int, int, const cchar_t *, int);
+int vline_set(const cchar_t *, int);
+int whline_set(WINDOW *, const cchar_t *, int);
+int wvline_set(WINDOW *, const cchar_t *, int);
+int bkgrnd(const cchar_t *);
+void bkgrndset(const cchar_t *);
+int getbkgrnd(cchar_t *);
+int wbkgrnd(WINDOW *, const cchar_t *);
+void wbkgrndset(WINDOW *, const cchar_t *);
+int wgetbkgrnd(WINDOW *, cchar_t *);
+
+/* Private functions that are needed for user programs prototypes. */
+int     __cputchar(int);
+int     __waddbytes(WINDOW *, const char *, int, attr_t);
+#ifdef HAVE_WCHAR
+int __cputwchar( wchar_t );
+#endif /* HAVE_WCHAR */
+__END_DECLS
+
+#endif /* !_CURSES_H_ */
diff --git a/lib/libcurses/curses_addch.3 b/lib/libcurses/curses_addch.3
new file mode 100644 (file)
index 0000000..597506a
--- /dev/null
@@ -0,0 +1,187 @@
+.\"    $NetBSD: curses_addch.3,v 1.8 2007/07/15 21:37:55 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd July 11, 2007
+.Dt CURSES_ADDCH 3
+.Os
+.Sh NAME
+.Nm curses_addch ,
+.Nm addch ,
+.Nm waddch ,
+.Nm mvaddch ,
+.Nm mvwaddch
+.Nd curses add characters to windows routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn addch "chtype ch"
+.Ft int
+.Fn waddch "WINDOW *win" "chtype ch"
+.Ft int
+.Fn mvaddch "int y" "int x" "chtype ch"
+.Ft int
+.Fn mvwaddch "WINDOW *win" "int y" "int x" "chtype ch"
+.Sh DESCRIPTION
+These functions add characters to
+.Dv stdscr
+or to the specified window.
+.Pp
+The
+.Fn addch
+function adds the character given in
+.Fa ch
+to
+.Dv stdscr
+at the current cursor position and advances the current cursor position by one.
+Any character attributes set in
+.Fa ch
+will be merged with the background attributes currently set on
+.Dv stdscr .
+.Pp
+The
+.Fn waddch
+function is the same as the
+.Fn addch
+function, excepting that the character is added to the window specified by
+.Fa win .
+.Pp
+The
+.Fn mvaddch
+and
+.Fn mvwaddch
+functions are the same as the
+.Fn addch
+and
+.Fn waddch
+functions, respectively, excepting that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the character is added to the window.
+.Ss LINE DRAWING CHARACTERS
+Some terminals support the display of line drawing and graphics characters.
+These characters can be added using their defined names, as shown in the
+table below.
+Where the terminal does not support a specific character, the default
+(non-graphics) character is displayed instead.
+.Bl -column -offset indent ".Sy System V Name" ".Sy Default"
+.It Sy "Name" Ta Sy "Default" Ta Sy "Description"
+.It ACS_RARROW Ta \*[Gt] Ta "Arrow pointing right"
+.It ACS_LARROW Ta \*[Lt] Ta "Arrow pointing left"
+.It ACS_UARROW Ta ^ Ta "Arrow pointing up"
+.It ACS_DARROW Ta v Ta "Arrow pointing down"
+.It ACS_BLOCK Ta # Ta "Solid square block"
+.It ACS_DIAMOND Ta + Ta "Diamond"
+.It ACS_CKBOARD Ta : Ta "Checker board (stipple)"
+.It ACS_DEGREE Ta ' Ta "Degree symbol"
+.It ACS_PLMINUS Ta # Ta "Plus/minus"
+.It ACS_BOARD Ta # Ta "Board of squares"
+.It ACS_LANTERN Ta # Ta "Lantern symbol"
+.It ACS_LRCORNER Ta + Ta "Lower right-hand corner"
+.It ACS_URCORNER Ta + Ta "Upper right-hand corner"
+.It ACS_ULCORNER Ta + Ta "Upper left-hand corner"
+.It ACS_LLCORNER Ta + Ta "Lower left-hand corner"
+.It ACS_PLUS Ta + Ta "Plus"
+.It ACS_HLINE Ta - Ta "Horizontal line"
+.It ACS_S1 Ta - Ta "Scan line 1"
+.It ACS_S9 Ta - Ta "Scan line 9"
+.It ACS_LTEE Ta + Ta "Left tee"
+.It ACS_RTEE Ta + Ta "Right tee"
+.It ACS_BTEE Ta + Ta "Bottom tee"
+.It ACS_TTEE Ta + Ta "Top tee"
+.It ACS_VLINE Ta | Ta "Vertical line"
+.It ACS_BULLET Ta o Ta "Bullet"
+.El
+.Pp
+The following additional,
+.Em ncurses
+compatible, characters are also supported.
+.Bl -column -offset indent ".Sy System V Name" ".Sy Default"
+.It Sy "Name" Ta Sy "Default" Ta Sy "Description"
+.It ACS_S3 Ta - Ta "Scan line 3"
+.It ACS_S7 Ta - Ta "Scan line 7"
+.It ACS_LEQUAL Ta \*[Lt] Ta "Less than or equal to"
+.It ACS_GEQUAL Ta \*[Gt] Ta "Greater than or equal to"
+.It ACS_PI Ta * Ta "Pi symbol"
+.It ACS_NEQUAL Ta ! Ta "Not equal to"
+.It ACS_STERLING Ta f Ta "Sterling symbol"
+.El
+.Pp
+For compatibility with some
+.Em System V
+implementations, the following definitions are also supported.
+.Bl -column -offset indent ".Sy System V Name" ".Sy Default"
+.It Sy "System V Name" Ta Sy "NetBSD Curses Name"
+.It ACS_SBBS Ta ACS_LRCORNER
+.It ACS_BBSS Ta ACS_URCORNER
+.It ACS_BSSB Ta ACS_ULCORNER
+.It ACS_SSBB Ta ACS_LLCORNER
+.It ACS_SSSS Ta ACS_PLUS
+.It ACS_BSBS Ta ACS_HLINE
+.It ACS_SSSB Ta ACS_LTEE
+.It ACS_SBSS Ta ACS_RTEE
+.It ACS_SSBS Ta ACS_BTEE
+.It ACS_BSSS Ta ACS_TTEE
+.It ACS_SBSB Ta ACS_VLINE
+.El
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_addchstr 3 ,
+.Xr curses_addstr 3 ,
+.Xr curses_attributes 3 ,
+.Xr curses_cursor 3 ,
+.Xr curses_delch 3 ,
+.Xr curses_inch 3 ,
+.Xr curses_insertch 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_addchstr.3 b/lib/libcurses/curses_addchstr.3
new file mode 100644 (file)
index 0000000..82df0f2
--- /dev/null
@@ -0,0 +1,155 @@
+.\"    $NetBSD: curses_addchstr.3,v 1.3 2008/04/30 13:10:51 martin Exp $
+.\"
+.\" Copyright (c) 2003
+.\"    Douwe Kiela (virtus@wanadoo.nl)
+.\" Copyright (c) 2003 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Douwe Kiela (virtus@wanadoo.nl).
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.\"
+.Dd May 21, 2003
+.Dt CURSES_ADDCHSTR 3
+.Os
+.Sh NAME
+.Nm curses_addchstr ,
+.Nm addchstr ,
+.Nm waddchstr ,
+.Nm addchnstr ,
+.Nm waddchnstr ,
+.Nm mvaddchstr ,
+.Nm mvwaddchstr ,
+.Nm mvaddchnstr ,
+.Nm mvwaddchnstr
+.Nd curses add character strings to windows routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn addchstr "const chtype *chstr"
+.Ft int
+.Fn waddchstr "WINDOW *win" "const chtype *chstr"
+.Ft int
+.Fn mvaddchstr "int y" "int x" "const chtype *chstr"
+.Ft int
+.Fn mvwaddchstr "WINDOW *win" "int y" "int x" "const chtype *chstr"
+.Ft int
+.Fn addchnstr "const chtype *chstr" "int n"
+.Ft int
+.Fn waddchnstr "WINDOW *win" "const chtype *chstr" "int n"
+.Ft int
+.Fn mvaddchnstr "int y" "int x" "const chtype *chstr" "int n"
+.Ft int
+.Fn mvwaddchnstr "WINDOW *win" "int y" "int x" "const chtype *chstr" "int n"
+.Sh DESCRIPTION
+These functions add character strings and attributes to
+.Dv stdscr
+or to the specified window.
+.Pp
+The
+.Fn addchstr
+function will add the characters and their attributes passed in
+.Fa chstr
+to
+.Dv stdscr
+starting at the current cursor position.
+Any character attributes set in
+.Fa chstr
+will be merged with the background attributes currently set on
+.Dv stdscr .
+The
+.Fn waddstr
+function does the same as
+.Fn addchstr
+but adds the string to the window specified by
+.Fn win .
+.Pp
+The
+.Fn addchnstr
+function will add the contents of
+.Fa string
+to
+.Dv stdscr
+but will limit the number of characters added to be, at most,
+.Fa n .
+If
+.Fa n
+is \-1 then
+.Fa addchnstr
+will add the number of characters contained in the null terminated string
+.Fa chstr .
+Any character attributes set in
+.Fa chstr
+will be merged with the background attributes currently set on
+.Dv stdscr .
+.Pp
+The
+.Fn waddchnstr
+function does the same as
+.Fa addchnstr
+but adds the string to the window specified by
+.Fa win .
+.Pp
+The functions
+.Fn mvaddchstr ,
+.Fn mwaddchnstr ,
+.Fn mvwaddchstr
+and
+.Fn mvwaddchnstr
+are the same as the functions
+.Fn addchstr ,
+.Fn waddchstr ,
+.Fn waddchstr
+and
+.Fn waddchnstr ,
+respectively, except that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the string is added to the window.
+.Sh RETURN VALUES
+The functions will return one of the following values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_addch 3 ,
+.Xr curses_addstr 3 ,
+.Xr curses_attributes 3 ,
+.Xr curses_cursor 3 ,
+.Xr curses_inch 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+These functions first appeared in
+.Nx 2.0 .
diff --git a/lib/libcurses/curses_addstr.3 b/lib/libcurses/curses_addstr.3
new file mode 100644 (file)
index 0000000..8ed7199
--- /dev/null
@@ -0,0 +1,159 @@
+.\"    $NetBSD: curses_addstr.3,v 1.4 2003/05/21 21:22:15 jdc Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd May 21, 2003
+.Dt CURSES_ADDSTR 3
+.Os
+.Sh NAME
+.Nm curses_addstr ,
+.Nm addstr ,
+.Nm waddstr ,
+.Nm addnstr ,
+.Nm waddnstr ,
+.Nm mvaddstr ,
+.Nm mvwaddstr ,
+.Nm mvaddnstr ,
+.Nm mvwaddnstr
+.Nd curses add character strings to windows routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn addstr "const char *string"
+.Ft int
+.Fn waddstr "WINDOW *win" "const char *string"
+.Ft int
+.Fn mvaddstr "int y" "int x" "const char *string"
+.Ft int
+.Fn mvwaddstr "WINDOW *win" "int y" "int x" "const char *string"
+.Ft int
+.Fn addnstr "const char *string" "int len"
+.Ft int
+.Fn waddnstr "WINDOW *win" "const char *string" "int len"
+.Ft int
+.Fn mvaddnstr "int y" "int x" "const char *string" "int len"
+.Ft int
+.Fn mvwaddnstr "WINDOW *win" "int y" "int x" "const char *string" "int len"
+.Sh DESCRIPTION
+These functions add character strings to
+.Dv stdscr
+or to the specified window.
+.Pp
+The
+.Fn addstr
+function
+will add the characters passed in
+.Fa string
+to
+.Dv stdscr
+starting at the current cursor position.
+Any background attributes currently set on
+.Dv stdscr
+will be applied to the added character.
+The
+.Fn waddstr
+function does the same as
+.Fn addstr
+but adds the string to the window specified by
+.Fn win .
+.Pp
+The
+.Fn addnstr
+function will add the contents of
+.Fa string
+to
+.Dv stdscr
+but will limit the number of characters added to be, at most,
+.Fa len .
+If
+.Fa len
+is \-1 then
+.Fa addnstr
+will add the number of characters contained in the null terminated string
+.Fa string .
+Any background attributes currently set on
+.Dv stdscr
+will be applied to the added character.
+The
+.Fn waddnstr
+function
+does the same as
+.Fa addnstr
+but adds the string to the window specified by
+.Fa win .
+.Pp
+The functions
+.Fn mvaddstr ,
+.Fn mwaddnstr ,
+.Fn mvwaddstr
+and
+.Fn mvwaddnstr
+are the same as the functions
+.Fn addstr ,
+.Fn waddstr ,
+.Fn waddstr
+and
+.Fn waddnstr ,
+respectively, excepting that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the string is added to the window.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_addch 3 ,
+.Xr curses_addchstr 3 ,
+.Xr curses_attributes 3 ,
+.Xr curses_cursor 3 ,
+.Xr curses_inch 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_attributes.3 b/lib/libcurses/curses_attributes.3
new file mode 100644 (file)
index 0000000..307ea85
--- /dev/null
@@ -0,0 +1,342 @@
+.\"    $NetBSD: curses_attributes.3,v 1.8 2008/04/30 13:10:51 martin Exp $
+.\" Copyright (c) 2002 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd March 14, 2008
+.Dt CURSES_ATTRIBUTES 3
+.Os
+.Sh NAME
+.Nm curses_attributes ,
+.Nm attron ,
+.Nm attroff ,
+.Nm attrset ,
+.Nm color_set ,
+.Nm getattrs ,
+.Nm termattrs ,
+.Nm wattron ,
+.Nm wattroff ,
+.Nm wattrset ,
+.Nm wcolor_set ,
+.Nm attr_on ,
+.Nm attr_off ,
+.Nm attr_set ,
+.Nm attr_get ,
+.Nm term_attrs ,
+.Nm wattr_on ,
+.Nm wattr_off ,
+.Nm wattr_set ,
+.Nm wattr_get
+.Nd curses general attribute manipulation routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn attron "int attr"
+.Ft int
+.Fn attroff "int attr"
+.Ft int
+.Fn attrset "int attr"
+.Ft int
+.Fn color_set "short pair" "void *opt"
+.Ft chtype
+.Fn getattrs "WINDOW *win"
+.Ft chtype
+.Fn termattrs "void"
+.Ft int
+.Fn wcolor_set "WINDOW *win" "short pair" "void *opt"
+.Ft int
+.Fn wattron "WINDOW * win" "int attr"
+.Ft int
+.Fn wattroff "WINDOW * win" "int attr"
+.Ft int
+.Fn wattrset "WINDOW * win" "int attr"
+.Ft int
+.Fn attr_on "attr_t attr" "void *opt"
+.Ft int
+.Fn attr_off "attr_t attr" "void *opt"
+.Ft int
+.Fn attr_set "attr_t attr" "short pair" "void *opt"
+.Ft int
+.Fn attr_get "attr_t *attr" "short *pair" "void *opt"
+.Ft attr_t
+.Fn term_attrs "void"
+.Ft int
+.Fn wattr_on "WINDOW *win" "attr_t attr" "void *opt"
+.Ft int
+.Fn wattr_off "WINDOW *win" "attr_t attr" "void *opt"
+.Ft int
+.Fn wattr_set "WINDOW *win" "attr_t attr" "short pair" "void *opt"
+.Ft int
+.Fn wattr_get "WINDOW *win" "attr_t *attr" "short *pair" "void *opt"
+.Sh DESCRIPTION
+These functions manipulate attributes on
+.Dv stdscr
+or on the specified window.
+The attributes that can be manipulated are:
+.Pp
+.Bl -tag -width "COLOR_PAIR(n)" -compact -offset indent
+.It A_NORMAL
+no special attributes are applied
+.It A_STANDOUT
+characters are displayed in standout mode
+.It A_UNDERLINE
+characters are displayed underlined
+.It A_REVERSE
+characters are displayed in inverse video
+.It A_BLINK
+characters blink
+.It A_DIM
+characters are displayed at a lower intensity
+.It A_BOLD
+characters are displayed at a higher intensity
+.It A_INVIS
+characters are added invisibly
+.It A_PROTECT
+characters are protected from modification
+.It A_ALTCHARSET
+characters are displayed using the alternate character set (ACS)
+.It COLOR_PAIR(n)
+characters are displayed using color pair n.
+.El
+.Pp
+The
+.Fn attron
+function turns on the attributes specified in
+.Fa attr
+on
+.Dv stdscr ,
+while the
+.Fn attroff
+function turns off the attributes specified in
+.Fa attr
+on
+.Dv stdscr .
+.Pp
+The function
+.Fn attrset
+sets the attributes of
+.Dv stdscr
+to those specified in
+.Fa attr ,
+turning off any others.
+To turn off all the attributes (including color and alternate character set),
+use
+.Fn attrset A_NORMAL .
+.Pp
+Multiple attributes can be manipulated by combining the attributes
+using a logical
+.Em OR .
+For example,
+.Fn attron "A_REVERSE | A_BOLD"
+will turn on both inverse video and higher intensity.
+.Pp
+The function
+.Fn color_set
+sets the color pair attribute to the pair specified in
+.Fa pair .
+.Pp
+The function
+.Fn getattrs
+returns the attributes that are currently applied to window specified by
+.Fa win .
+.Pp
+The function
+.Fn termattrs
+returns the logical
+.Em OR
+of attributes that can be applied to the screen.
+.Pp
+The functions
+.Fn wattron ,
+.Fn wattroff ,
+.Fn wattrset ,
+and
+.Fn wcolor_set
+are equivalent to
+.Fn attron ,
+.Fn attroff
+.Fn attrset ,
+and
+.Fn color_set
+respectively, excepting that the attributes are applied to the window
+specified by
+.Fa win .
+.Pp
+The following functions additionally manipulate wide attributes on
+.Dv stdscr
+or on the specified window.
+The additional wide attributes that can be manipulated are:
+.Pp
+.Bl -tag -width "COLOR_PAIR(n)" -compact -offset indent
+.It WA_STANDOUT
+characters are displayed in standout mode
+.It WA_UNDERLINE
+characters are displayed underlined
+.It WA_REVERSE
+characters are displayed in inverse video
+.It WA_BLINK
+characters blink
+.It WA_DIM
+characters are displayed at a lower intensity
+.It WA_BOLD
+characters are displayed at a higher intensity
+.It WA_INVIS
+characters are added invisibly
+.It WA_PROTECT
+characters are protected from modification
+.It WA_ALTCHARSET
+characters are displayed using the alternate character set (ACS)
+.It WA_LOW
+characters are displayed with low highlight
+.It WA_TOP
+characters are displayed with top highlight
+.It WA_HORIZONTAL
+characters are displayed with horizontal highlight
+.It WA_VERTICAL
+characters are displayed with vertical highlight
+.It WA_LEFT
+characters are displayed with left highlight
+.It WA_RIGHT
+characters are displayed with right highlight
+.El
+.Pp
+The
+.Fn attr_on
+function turns on the wide attributes specified in
+.Fa attr
+on
+.Dv stdscr ,
+while the
+.Fn attr_off
+function turns off the wide attributes specified in
+.Fa attr
+on
+.Dv stdscr .
+.Pp
+The function
+.Fn attr_set
+sets the wide attributes of
+.Dv stdscr
+to those specified in
+.Fa attr
+and
+.Fa pair ,
+turning off any others.
+Note that a color pair specified in
+.Fa pair
+will override any color pair specified in
+.Fa attr .
+.Pp
+The function
+.Fn attr_get
+sets
+.Fa attr
+to the wide attributes and
+.Fa pair
+to the color pair currently applied to
+.Dv stdscr .
+Either of
+.Fa attr
+and
+.Fa pair
+can be
+.Dv NULL ,
+if the relevant value is of no interest.
+.Pp
+The function
+.Fn term_attrs
+returns the logical
+.Em OR
+of wide attributes that can be applied to the screen.
+.Pp
+The functions
+.Fn wattr_on ,
+.Fn wattr_off
+and
+.Fn wattr_set
+are equivalent to
+.Fn attr_on ,
+.Fn attr_off
+and
+.Fn attr_set
+respectively, excepting that the character is added to the window specified by
+.Fa win .
+.Pp
+The function
+.Fn wattr_get
+is equivalent to
+.Fn attr_get ,
+excepting that the wide attributes and color pair currently applied to
+.Fa win
+are set.
+.Pp
+The following constants can be used to extract the components of a
+.Dv chtype :
+.Pp
+.Bl -tag -width "COLOR_PAIR(n)" -compact -offset indent
+.It A_ATTRIBUTES
+bit-mask containing attributes part
+.It A_CHARTEXT
+bit-mask containing character part
+.It A_COLOR
+bit-mask containing color-pair part
+.El
+.Sh RETURN VALUES
+These functions return OK on success and ERR on failure.
+.Sh SEE ALSO
+.Xr curses_addch 3 ,
+.Xr curses_addchstr 3 ,
+.Xr curses_addstr 3 ,
+.Xr curses_background 3 ,
+.Xr curses_color 3 ,
+.Xr curses_insertch 3 ,
+.Xr curses_standout 3 ,
+.Xr curses_underscore 3
+.Sh NOTES
+The
+.Fa opt
+argument is not currently used but is reserved for a future version of the
+specification.
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Pp
+The
+.Fn getattrs
+function
+is a
+.Nx
+extension.
+.Sh HISTORY
+These functions first appeared in
+.Nx 1.5 .
+.Sh BUGS
+Some terminals do not support characters with both color and other attributes
+set.
+In this case, the other attribute is displayed instead of the color attribute.
diff --git a/lib/libcurses/curses_background.3 b/lib/libcurses/curses_background.3
new file mode 100644 (file)
index 0000000..f07f6db
--- /dev/null
@@ -0,0 +1,124 @@
+.\"    $NetBSD: curses_background.3,v 1.6 2008/04/30 13:10:51 martin Exp $
+.\" Copyright (c) 2002 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd January 15, 2006
+.Dt CURSES_BACKGROUND 3
+.Os
+.Sh NAME
+.Nm curses_background ,
+.Nm bkgd ,
+.Nm bkgdset ,
+.Nm getbkgd ,
+.Nm wbkgd ,
+.Nm wbkgdset
+.Nd curses attribute manipulation routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn bkgd chtype
+.Ft int
+.Fn bkgdset chtype
+.Ft chtype
+.Fn getbkgd "WINDOW *"
+.Ft int
+.Fn wbkgd chtype
+.Ft int
+.Fn wbkgdset chtype
+.Sh DESCRIPTION
+These functions manipulate the background attributes on
+.Dv stdscr
+or on the specified window.
+.Pp
+The function
+.Fn wbkgdset win ch
+sets the background attributes of the specified window
+.Fa win
+to
+.Fa ch .
+.Pp
+When the background attributes are set on a window, characters are added to
+the window with the logical
+.Em OR
+of the background attributes and the character's attributes.
+If both the background attribute and the character attribute contain color,
+the color of the character attribute is rendered.
+If the background attribute contains a non-space character, then this
+character is added where the foreground character is a space character.
+.Pp
+Note that subwindows created from
+.Fa win
+inherit the background attributes of
+.Fa win .
+.Pp
+The function
+.Fn wbkgd win ch
+sets the background attributes of the specified window
+.Fa win
+to
+.Fa ch
+and also sets the rendition of every character position on that window,
+as if the characters had been newly added to
+.Fa win .
+The rendition of characters on subwindows of
+.Fa win
+is also set to
+.Fa ch .
+.Pp
+The functions
+.Fn bkgdset ch
+and
+.Fn bkgd ch
+are equivalent to
+.Fn wbkgdset stdscr ch
+and
+.Fn wbkgd stdscr ch ,
+respectively.
+.Pp
+The function
+.Fn getbkgd win
+returns the background attributes for the window
+.Fa win .
+.Sh RETURN VALUES
+The functions
+.Fn wbkgdset
+and
+.Fn wbkgd
+return OK on success and ERR on failure.
+.Sh SEE ALSO
+.Xr curses_attributes 3 ,
+.Xr curses_color 3 ,
+.Xr curses_window 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+These functions first appeared in
+.Nx 1.6 .
diff --git a/lib/libcurses/curses_border.3 b/lib/libcurses/curses_border.3
new file mode 100644 (file)
index 0000000..25098e2
--- /dev/null
@@ -0,0 +1,159 @@
+.\"    $NetBSD: curses_border.3,v 1.4 2004/03/16 19:20:20 snj Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd August 12, 2002
+.Dt CURSES_BORDER 3
+.Os
+.Sh NAME
+.Nm curses_border ,
+.Nm border ,
+.Nm box ,
+.Nm wborder
+.Nd curses border drawing routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fo border
+.Fa "chtype ls"
+.Fa "chtype rs"
+.Fa "chtype ts"
+.Fa "chtype bs"
+.Fa "chtype tl"
+.Fa "chtype tr"
+.Fa "chtype bl"
+.Fa "chtype br"
+.Fc
+.Ft int
+.Fn box "WINDOW *win" "chtype vertical" "chtype horizontal"
+.Ft int
+.Fo wborder
+.Fa "WINDOW *win"
+.Fa "chtype ls"
+.Fa "chtype rs"
+.Fa "chtype ts"
+.Fa "chtype bs"
+.Fa "chtype tl"
+.Fa "chtype tr"
+.Fa "chtype bl"
+.Fa "chtype br"
+.Fc
+.Sh DESCRIPTION
+These functions draw borders around
+.Dv stdscr
+or around the specified window.
+.Pp
+The
+.Fn border
+function draws a border around
+.Dv stdscr
+using the characters given as arguments to the function.
+The
+.Fa ls ,
+.Fa rs ,
+.Fa ts
+and
+.Fa bs
+are the characters used to draw the left, right, top and bottom sides,
+respectively.
+The
+.Fa tl ,
+.Fa tr ,
+.Fa bl
+and
+.Fa br
+are the characters used to draw the top-left, top-right, bottom-left
+and bottom-right corners, respectively.
+If any of the characters have a text portion that is 0 then a default
+alternate character set character is used for that character.
+Note that even though the text portion of the argument is 0, the argument
+can still be used to specify the attributes for that portion of the border.
+The following table shows the default characters for each argument:
+.Pp
+.Bl -column "ls" -offset indent
+.It ls ACS_VLINE
+.It rs ACS_VLINE
+.It ts ACS_HLINE
+.It bs ACS_HLINE
+.It tl ACS_ULCORNER
+.It tr ACS_URCORNER
+.It bl ACS_LLCORNER
+.It br ACS_LRCORNER
+.El
+.Pp
+.Fn wborder
+is the same as
+.Fn border
+excepting that the border is drawn around the specified window.
+.Pp
+The
+.Fn box
+command draws a box around the window given in
+.Fa win
+using the
+.Fa vertical
+character for the vertical lines and the
+.Fa horizontal
+character for the horizontal lines.
+The corner characters of this box will be the defaults as described for
+.Fn border
+above.
+Passing characters with text portion that is 0 to
+.Fn box
+will result in the same defaults as those for
+.Fn border
+as described above.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_attributes 3 ,
+.Xr curses_line 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_chgat.3 b/lib/libcurses/curses_chgat.3
new file mode 100644 (file)
index 0000000..2143286
--- /dev/null
@@ -0,0 +1,119 @@
+.\" $NetBSD: curses_chgat.3,v 1.4 2009/07/12 23:14:06 wiz Exp $
+.\"
+.\" Copyright (c) 2009 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Joerg Sonnenberger.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd July 6, 2009
+.Dt CURSES_CHGAT 3
+.Os
+.Sh NAME
+.Nm chgat ,
+.Nm wchgat ,
+.Nm mvchgat ,
+.Nm mvwchgat
+.Nd curses on-screen attribute manipulation routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn chgat "int n" "attr_t attr" "short color" "const void *opts"
+.Ft int
+.Fn wchgat "WINDOW *win" "int n" "attr_t attr" "short color" \
+"const void *opts"
+.Ft int
+.Fn mvchgat "int y" "int x" "int n" "attr_t attr" "short color" \
+"const void *opts"
+.Ft int
+.Fn mvwchgat "WINDOW *win" "int y" "int x" "int n" "attr_t attr" \
+"short color" "const void *opts"
+.Sh DESCRIPTION
+These functions modify the attributes of the drawn content on stdscr or
+on the specified window.
+.Pp
+The
+.Fn chgat
+function sets the attributes of the next
+.Fa n
+characters to
+.Fa attr
+and the color pair to
+.Fa color .
+If
+.Fa n
+is negative or larger than the reminder of the line, it gets truncated.
+.Pp
+The
+.Fn wchgat
+is the same as the
+.Fn chgat
+function, excepting that the attributes are changed in the window specified by
+.Fa win .
+.Pp
+The
+.Fn mvchgat
+and
+.Fn mvwchgat
+functions are the same as the
+.Fn chgat
+and
+.Fn wchgat
+functions, respectively, excepting that they operate from the position
+specified by
+.Fa y ,
+.Fa x .
+.Pp
+These functions do not perform wrapping.
+They do not update the cursor position.
+.Sh RETURN VALUES
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_attributes 3
+.Sh STANDARDS
+The
+.Fn chgat ,
+.Fn wchgat ,
+.Fn mvchgat ,
+and
+.Fn mvwchgat
+functions conform to
+.St -xcurses4.2 .
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
+Support for the
+.Fn chgat
+family was added in
+.Nx 6.0 .
diff --git a/lib/libcurses/curses_clear.3 b/lib/libcurses/curses_clear.3
new file mode 100644 (file)
index 0000000..1a318b7
--- /dev/null
@@ -0,0 +1,141 @@
+.\"    $NetBSD: curses_clear.3,v 1.3 2003/04/16 13:35:00 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd August 12, 2002
+.Dt CURSES_CLEAR 3
+.Os
+.Sh NAME
+.Nm curses_clear ,
+.Nm clear ,
+.Nm wclear ,
+.Nm clearok ,
+.Nm clrtobot ,
+.Nm clrtoeol ,
+.Nm erase ,
+.Nm werase ,
+.Nm wclrtobot ,
+.Nm wclrtoeol
+.Nd curses clear window routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn clear "void"
+.Ft int
+.Fn clearok "WINDOW *win" "bool flag"
+.Ft int
+.Fn clrtobot "void"
+.Ft int
+.Fn clrtoeol "void"
+.Ft int
+.Fn erase "void"
+.Ft int
+.Fn wclear "WINDOW *win"
+.Ft int
+.Fn werase "WINDOW *win"
+.Ft int
+.Fn wclrtobot "WINDOW *win"
+.Ft int
+.Fn wclrtoeol "WINDOW *win"
+.Sh DESCRIPTION
+These functions clear all or part of
+.Dv stdscr
+or of the specified window.
+.Pp
+The
+.Fn clear
+and
+.Fn erase
+functions erase all characters on
+.Dv stdscr .
+.Fn wclear
+and
+.Fn werase
+perform the same function as
+.Fn clear
+and
+.Fn erase ,
+respectively, excepting that the specified window is cleared.
+.Pp
+By setting
+.Fa flag
+to
+.Dv TRUE ,
+the
+.Fn clearok
+function is used to force the next call to
+.Fn wrefresh
+to clear and completely redraw the window given in
+.Fa win .
+.Pp
+The function
+.Fn clrtobot
+will clear
+.Dv stdscr
+from the current row to the bottom of the screen.
+.Fn clrtoeol
+will clear
+.Dv stdscr
+from the current column position to the end of the line.
+.Fn wclrtobot
+and
+.Fn wclrtoeol
+are the same as
+.Fn clrtobot
+and
+.Fn clrtoeol ,
+respectively, excepting the window specified is operated on instead of
+.Dv stdscr .
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_refresh 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_color.3 b/lib/libcurses/curses_color.3
new file mode 100644 (file)
index 0000000..19b567a
--- /dev/null
@@ -0,0 +1,232 @@
+.\"    $NetBSD: curses_color.3,v 1.12 2009/07/22 16:57:14 roy Exp $
+.\" Copyright (c) 2002 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd July 20, 2009
+.Dt CURSES_COLOR 3
+.Os
+.Sh NAME
+.Nm curses_color ,
+.Nm has_colors ,
+.Nm can_change_color ,
+.Nm start_color ,
+.Nm init_pair ,
+.Nm pair_content ,
+.Nm COLOR_PAIR ,
+.Nm PAIR_NUMBER ,
+.Nm init_color ,
+.Nm color_content ,
+.Nm no_color_attributes
+.Nd curses color manipulation routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft bool
+.Fn has_colors void
+.Ft bool
+.Fn can_change_color void
+.Ft int
+.Fn start_color void
+.Ft int
+.Fn init_pair "short pair" "short fore" "short back"
+.Ft int
+.Fn pair_content "short pair" "short *fore" "short *back"
+.Ft int
+.Fn COLOR_PAIR "int n"
+.Ft int
+.Fn PAIR_NUMBER "int val"
+.Ft int
+.Fn init_color "short color" "short red" "short green" "short blue"
+.Ft int
+.Fn color_content "short color" "short *red" "short *green" "short *blue"
+.Ft attr_t
+.Fn no_color_attributes void
+.Pp
+.Va extern int COLOR_PAIRS ;
+.Pp
+.Va extern int COLORS ;
+.Sh DESCRIPTION
+These functions manipulate color on terminals that support color attributes.
+.Pp
+The function
+.Fn has_colors
+indicates whether a terminal is capable of displaying color attributes.
+It returns
+.Dv TRUE
+if the terminal is capable of displaying color attributes and
+.Dv FALSE
+otherwise.
+.Pp
+The function
+.Fn can_change_color
+indicates whether a terminal is capable of redefining colors.
+It returns
+.Dv TRUE
+if colors can be redefined and
+.Dv FALSE
+if they can not.
+.Pp
+The function
+.Fn start_color
+initializes the curses color support on a terminal.
+It must be called before any color manipulation functions are called on that
+terminal.
+The function initializes the eight basic colors (black, red, green, yellow,
+blue, magenta, cyan and white) that are specified using the color macros
+(such as
+.Dv COLOR_BLACK )
+defined in
+.Em \*[Lt]curses.h\*[Gt] .
+.Fn start_color
+also initializes the global external variables
+.Va COLORS
+and
+.Va COLOR_PAIRS .
+.Va COLORS
+defines the number of colors that the terminal supports and
+.Va COLOR_PAIRS
+defines the number of color-pairs that the terminal supports.
+These color-pairs are initialized to white foreground on black background.
+.Fn start_color
+sets the colors on the terminal to the curses defaults of white
+foreground on black background unless the functions
+.Fn assume_default_colors
+or
+.Fn use_default_colors
+have been called previously.
+.Pp
+The function
+.Fn init_pair pair fore back
+sets foreground color
+.Fa fore
+and background color
+.Fa back
+for color-pair number
+.Fa pair .
+The valid range for the color-pair
+.Fa pair
+is from 1 to
+.Va COLOR_PAIRS
+\&- 1
+and the valid range for the colors is any number less than
+.Va COLORS .
+Specifying a negative number will set that color to the default foreground
+or background color.
+The 8 initial colors are defined as:
+.Bl -tag -width "COLOR_MAGENTA" -compact -offset indent
+.It COLOR_BLACK
+.It COLOR_RED
+.It COLOR_GREEN
+.It COLOR_YELLOW
+.It COLOR_BLUE
+.It COLOR_MAGENTA
+.It COLOR_CYAN
+.It COLOR_WHITE
+.El
+Color-pair 0 is used as the default color pair, so changing this will
+have no effect.
+Use the function
+.Fn assume_default_colors
+to change the default colors.
+.Pp
+The function
+.Fn pair_content pair *fore *back
+stores the foreground and background color numbers of color-pair
+.Fa pair
+in the variables
+.Fa fore
+and
+.Fa back ,
+respectively.
+.Pp
+The macro
+.Fn COLOR_PAIR n
+gives the attribute value of color-pair number
+.Fa n .
+This is the value that is used to set the attribute of a character to this
+color-pair.
+For example,
+.Dl attrset(COLOR_PAIR(2))
+will display characters using color-pair 2.
+.Pp
+The macro
+.Fn PAIR_NUMBER val
+gives the color-pair number associated with the attribute value
+.Fa val .
+.Pp
+The function
+.Fn init_color color red green blue
+sets the red, green and blue intensity components of color
+.Fa color
+to the values
+.Fa red ,
+.Fa green
+and
+.Fa blue ,
+respectively.
+The minimum intensity value is 0 and the maximum intensity value is 1000.
+.Pp
+The function
+.Fn color_content color *red *green *blue
+stores the red, green and blue intensity components of color
+.Fa color
+in the variables
+.Fa red ,
+.Fa green ,
+and
+.Fa blue ,
+respectively.
+.Pp
+The function
+.Fn no_color_attributes
+returns those attributes that a terminal is unable to combine with color.
+.Sh RETURN VALUES
+The functions
+.Fn start_color ,
+.Fn init_pair ,
+.Fn pair_content ,
+.Fn init_color
+and
+.Fn color_content
+return OK on success and ERR on failure.
+.Sh SEE ALSO
+.Xr curses_attributes 3 ,
+.Xr curses_background 3 ,
+.Xr curses_default_colors 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Pp
+The function
+.Fn no_color_attributes
+and the use of negative color numbers
+are extensions to the X/Open Curses specification.
+.Sh HISTORY
+These functions first appeared in
+.Nx 1.5 .
diff --git a/lib/libcurses/curses_cursor.3 b/lib/libcurses/curses_cursor.3
new file mode 100644 (file)
index 0000000..dd15d8c
--- /dev/null
@@ -0,0 +1,223 @@
+.\"    $NetBSD: curses_cursor.3,v 1.7 2010/02/24 13:02:13 drochner Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd February 23, 2010
+.Dt CURSES 3
+.Os
+.Sh NAME
+.Nm curses_cursor ,
+.Nm getcury ,
+.Nm getcurx ,
+.Nm getyx ,
+.Nm getbegy ,
+.Nm getbegx ,
+.Nm getbegyx ,
+.Nm getmaxy ,
+.Nm getmaxx ,
+.Nm getmaxyx ,
+.Nm getpary ,
+.Nm getparx ,
+.Nm getparyx ,
+.Nm move ,
+.Nm wmove ,
+.Nm mvcur ,
+.Nm wcursyncup
+.Nd curses cursor and window location and positioning routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn getcury "WINDOW *win"
+.Ft int
+.Fn getcurx "WINDOW *win"
+.Ft void
+.Fn getyx "WINDOW *win" "int y" "int x"
+.Ft int
+.Fn getbegy "WINDOW *win"
+.Ft int
+.Fn getbegx "WINDOW *win"
+.Ft void
+.Fn getbegyx "WINDOW *win" "int y" "int x"
+.Ft int
+.Fn getmaxy "WINDOW *win"
+.Ft int
+.Fn getmaxx "WINDOW *win"
+.Ft void
+.Fn getmaxyx "WINDOW *win" "int y" "int x"
+.Ft int
+.Fn getpary "WINDOW *win"
+.Ft int
+.Fn getparx "WINDOW *win"
+.Ft void
+.Fn getparyx "WINDOW *win" "int y" "int x"
+.Ft int
+.Fn move "int y" "int x"
+.Ft int
+.Fn wmove "WINDOW *win" "int y" "int x"
+.Ft int
+.Fn mvcur "int oldy" "int oldx" "int y" "int x"
+.Ft void
+.Fn wcursyncup "WINDOW *win"
+.Sh DESCRIPTION
+These functions and macros locate and position cursors and windows.
+.Pp
+The
+.Fn getcury
+and
+.Fn getcurx
+functions get the current row and column positions, respectively, of the cursor in
+the window
+.Fa win .
+The
+.Fn getyx
+macro sets the values of
+.Fa y
+and
+.Fa x
+to the current row and column positions of the cursor in the window
+.Fa win .
+.Pp
+The origin row and columns of a window
+.Fa win
+can be
+determined by calling the
+.Fn getbegy
+and
+.Fn getbegx
+functions, respectively, and the maximum row and column for the window can be
+found by calling the functions
+.Fn getmaxy
+and
+.Fn getmaxx ,
+respectively.
+The
+.Fn getbegyx
+and
+.Fn getmaxyx
+macros set the values of
+.Fa y
+and
+.Fa x
+to the origin and maximum row and column positions, respectively, for the window
+.Fa win .
+.Pp
+The
+.Fn getpary
+and
+.Fn getparx
+functions return the row and column position of the given subwindow relative to
+the window's parent.
+The macro
+.Fn getparyx
+sets the values of
+.Fa y
+and
+.Fa x
+to the origin of the subwindow relative to the window's parent.
+.Pp
+The
+.Fn move
+function positions the cursor on the current window at the position given by
+.Fa y ,
+.Fa x .
+The cursor position is not changed on the screen until the next
+.Fn refresh .
+.Pp
+The
+.Fn wmove
+function is the same as the
+.Fn move
+function, excepting that the cursor is moved in the window specified by
+.Fa win .
+.Pp
+The function
+.Fn mvcur
+moves the cursor to
+.Fa y ,
+.Fa x
+on the screen.
+The arguments
+.Fa oldy ,
+.Fa oldx
+define the previous cursor position for terminals that do not support
+absolute cursor motions.
+The curses library may optimise the cursor motion based on these values.
+If the
+.Fn mvcur
+succeeds then the curses internal structures are updated with the new
+position of the cursor.
+If the destination arguments for
+.Fn mvcur
+exceed the terminal bounds an error will be returned and the cursor
+position will be unchanged.
+.Pp
+The
+.Fn wcursyncup
+function sets the cursor positions of all ancestors of
+.Fa win
+to that of
+.Fa win .
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_refresh 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of
+the Single Unix Specification.
+The
+.Fn getbegx ,
+.Fn getbegy ,
+.Fn getcurx ,
+.Fn getcury ,
+.Fn getmaxx ,
+.Fn getmaxy ,
+.Fn getparx ,
+and
+.Fn getpary
+functions are extensions.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_default_colors.3 b/lib/libcurses/curses_default_colors.3
new file mode 100644 (file)
index 0000000..2efd8c3
--- /dev/null
@@ -0,0 +1,73 @@
+.\"    $NetBSD: curses_default_colors.3,v 1.6 2008/04/30 13:10:51 martin Exp $
+.\" Copyright (c) 2002 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 13, 2002
+.Dt CURSES_DEFAULT_COLORS 3
+.Os
+.Sh NAME
+.Nm curses_default_colors ,
+.Nm assume_default_colors ,
+.Nm use_default_colors
+.Nd curses default colors setting routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn assume_default_colors "short fore" "short back"
+.Ft int
+.Fn use_default_colors ""
+.Sh DESCRIPTION
+These functions tell the curses library to set the default colors or to use
+the terminal's default colors instead of using the default colors for curses
+applications (which are white foreground on black background).
+.Pp
+The function
+.Fn assume_default_colors fore back
+sets the default colors to foreground color
+.Fa fore
+and background color
+.Fa back .
+If a value of \-1 is used for a color, then the terminal default color is used
+for that color.
+.Pp
+The function
+.Fn use_default_colors
+sets both the foreground and background colors to the terminal default colors.
+This is equivalent to
+.Fn assume_default_colors \-1 \-1 .
+.Sh RETURN VALUES
+These functions return OK on success and ERR on failure.
+.Sh SEE ALSO
+.Xr curses_color 3
+.Sh STANDARDS
+These functions are based on
+.Em ncurses
+extensions to the curses standards.
+.Sh HISTORY
+These functions first appeared in
+.Nx 2.0 .
diff --git a/lib/libcurses/curses_delch.3 b/lib/libcurses/curses_delch.3
new file mode 100644 (file)
index 0000000..5768a4f
--- /dev/null
@@ -0,0 +1,90 @@
+.\"    $NetBSD: curses_delch.3,v 1.3 2003/04/16 13:35:01 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd August 12, 2002
+.Dt CURSES_DELCH 3
+.Os
+.Sh NAME
+.Nm curses_delch ,
+.Nm delch ,
+.Nm wdelch
+.Nd curses delete characters routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn delch "void"
+.Ft int
+.Fn wdelch "WINDOW *win"
+.Sh DESCRIPTION
+These functions delete characters from
+.Dv stdscr
+or from the specified window.
+.Pp
+The
+.Fn delch
+function deletes the character at the current cursor position on
+.Dv stdscr .
+Characters to the right of the deleted character are moved one position
+to the left.
+The cursor position is unchanged.
+.Pp
+The
+.Fn wdelch
+function is the same as the
+.Fn delch
+function, excepting that the character is deleted from the specified window.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_addch 3 ,
+.Xr curses_insertch 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_deleteln.3 b/lib/libcurses/curses_deleteln.3
new file mode 100644 (file)
index 0000000..c0324be
--- /dev/null
@@ -0,0 +1,110 @@
+.\"    $NetBSD: curses_deleteln.3,v 1.4 2003/04/16 13:35:01 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd August 12, 2002
+.Dt CURSES_DELETELN 3
+.Os
+.Sh NAME
+.Nm curses_deleteln ,
+.Nm deleteln ,
+.Nm wdeleteln
+.Nd curses delete single line routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn deleteln "void"
+.Ft int
+.Fn wdeleteln "WINDOW *win"
+.Sh DESCRIPTION
+These functions delete a single line from
+.Dv stdscr
+or from the specified window.
+.Pp
+The
+.Fn deleteln
+function deletes the screen line containing the cursor in the
+.Dv stdscr .
+The
+.Fn wdeleteln
+function is the same as the
+.Fn deleteln
+function, excepting that the line is deleted from the window specified by
+.Fa win .
+.Pp
+All lines following the deleted line are moved up one line toward the cursor.
+The last line of the window is cleared.
+The cursor position is unchanged.
+.Pp
+If a scrolling region has been set with the
+.Fn setscrreg
+or
+.Fn wsetscrreg
+functions and the current cursor position is inside the scrolling region,
+then only the lines from the current line to the bottom of the scrolling
+region are moved up and the bottom line of the scrolling region cleared.
+.Pp
+The functions
+.Fn deleteln
+and
+.Fn wdeleteln win
+are equivalent to
+.Fn winsdelln stdscr \-1
+and
+.Fn winsdelln win \-1
+respectively.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_insdelln 3 ,
+.Xr curses_insertln 3 ,
+.Xr curses_scroll 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_echochar.3 b/lib/libcurses/curses_echochar.3
new file mode 100644 (file)
index 0000000..d2f8d4f
--- /dev/null
@@ -0,0 +1,123 @@
+.\"    $NetBSD: curses_echochar.3,v 1.3 2008/04/30 13:10:51 martin Exp $
+.\" Copyright (c) 2004 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd March 27, 2004
+.Dt CURSES_ECHOCHAR 3
+.Os
+.Sh NAME
+.Nm curses_echochar ,
+.Nm echochar ,
+.Nm wechochar ,
+.Nm pechochar
+.Nd curses add characters and then refresh routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn echochar "const chtype ch"
+.Ft int
+.Fn wechochar "WINDOW *win" "const chtype ch"
+.Ft int
+.Fn pechochar "WINDOW *pad" "const chtype ch"
+.Sh DESCRIPTION
+These functions add characters to
+.Dv stdscr
+or to the specified window or pad and then cause an immediate
+.Fn refresh
+of that window or pad.
+.Pp
+The
+.Fn echochar
+function adds the character given in
+.Fa ch
+to
+.Dv stdscr
+at the current cursor position and advances the current cursor position by one.
+Any character attributes set in
+.Fa ch
+will be merged with the background attributes currently set on
+.Dv stdscr .
+.Dv stdscr
+is then refreshed.
+Calling
+.Fn echochar
+is equivalent to calling
+.Fn addch
+followed by
+.Fn refresh .
+.Pp
+The
+.Fn wechochar
+function is the same as the
+.Fn echochar
+function, excepting that the character is added to the window specified by
+.Fa win
+and
+.Fa win
+is refreshed.
+.Pp
+The
+.Fn pechochar
+function is the similar to the
+.Fn echochar
+function, excepting that the character is added to the pad specified by
+.Fa pad
+and
+.Fa pad
+is refreshed at its previous location on the screen.
+Calling
+.Fn pechochar
+is equivalent to calling
+.Fn addch
+followed by
+.Fn prefresh .
+.Sh RETURN VALUES
+These functions will return one of the following values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_addch 3 ,
+.Xr curses_attributes 3 ,
+.Xr curses_pad 3 ,
+.Xr curses_refresh 3
+.Sh STANDARDS
+The
+.Fn echochar ,
+.Fn wechochar ,
+and
+.Fn pechochar
+functions comply with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_fileio.3 b/lib/libcurses/curses_fileio.3
new file mode 100644 (file)
index 0000000..f85c248
--- /dev/null
@@ -0,0 +1,93 @@
+.\"    $NetBSD: curses_fileio.3,v 1.4 2010/12/09 11:21:49 njoly Exp $
+.\" Copyright (c) 2008 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd March 31, 2008
+.Dt CURSES_FILEIO 3
+.Os
+.Sh NAME
+.Nm curses_fileio ,
+.Nm getwin ,
+.Nm putwin
+.Nd curses file input/output routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft WINDOW *
+.Fn getwin "FILE *fp"
+.Ft int
+.Fn putwin "WINDOW *win" "FILE *fp"
+.Sh DESCRIPTION
+These functions read and write data to and from files.
+.Pp
+The
+.Fn getwin
+function reads window data that has been stored in the file to which
+.Fa fp
+points, and then creates a new window using that data.
+.Pp
+The
+.Fn putwin
+function writes window data from the window
+.Fa win
+to the file pointed to by
+.Fa fp .
+.Sh RETURN VALUES
+The
+.Fn getwin
+function returns one of the following values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Pp
+The
+.Fn putwin
+function returns
+.Dv NULL
+if an error is detected.
+.Sh SEE ALSO
+.Xr curses_window 3 ,
+.Xr fread 3 ,
+.Xr fwrite 3
+.Sh NOTES
+Subwindows can not be created by the
+.Fn getwin
+function, nor written by the
+.Fn putwin
+function.
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+These functions first appeared in
+.Nx 5.0 .
diff --git a/lib/libcurses/curses_inch.3 b/lib/libcurses/curses_inch.3
new file mode 100644 (file)
index 0000000..c6d16f3
--- /dev/null
@@ -0,0 +1,257 @@
+.\"    $NetBSD: curses_inch.3,v 1.10 2004/04/21 06:24:32 jdc Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd April 18, 2004
+.Dt CURSES_INCH 3
+.Os
+.Sh NAME
+.Nm curses_inch ,
+.Nm inch ,
+.Nm winch ,
+.Nm inchnstr ,
+.Nm mvinchnstr ,
+.Nm winchnstr ,
+.Nm mvwinchnstr ,
+.Nm inchstr ,
+.Nm mvinchstr ,
+.Nm winchstr ,
+.Nm mvwinchstr ,
+.Nm innstr ,
+.Nm winnstr ,
+.Nm mvinnstr ,
+.Nm mvwinnstr ,
+.Nm instr ,
+.Nm winstr
+.Nm mvinstr ,
+.Nm mvwinstr
+.Nd curses read screen contents routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft chtype
+.Fn inch "void"
+.Ft chtype
+.Fn winch "WINDOW *win"
+.Ft int
+.Fn inchnstr "chtype *chars" "int n"
+.Ft int
+.Fn mvinchnstr "int y" "int x" "chtype *chstr" "int n"
+.Ft int
+.Fn winchnstr "WINDOW *win" "chtype *chars" "int n"
+.Ft int
+.Fn mvwinchnstr "WINDOW *win" "int y" "int x" "chtype *chstr" "int n"
+.Ft int
+.Fn inchstr "chtype *chars"
+.Ft int
+.Fn mvinchstr "int y" "int x" "chtype *chstr"
+.Ft int
+.Fn winchstr "WINDOW *win" "chtype *chars"
+.Ft int
+.Ft mvwinchstr "WINDOW *win" "int y" "int x" "chtype *chstr"
+.Ft int
+.Fn innstr "char *str" "int n"
+.Ft int
+.Fn winnstr "WINDOW *win" "char *str" "int n"
+.Ft int
+.Fn mvinnstr "int y" "int x" "char *str" "int n"
+.Ft int
+.Fn mvwinnstr "WINDOW *win" "int y" "int x" "char *str" "int n"
+.Ft int
+.Fn instr "char *str"
+.Ft int
+.Fn winstr "WINDOW *win" "char *str"
+.Ft int
+.Fn mvinstr "int y" "int x" "char *str"
+.Ft int
+.Fn mvwinstr "WINDOW *win" "int y" "int x" "char *str"
+.Sh DESCRIPTION
+These functions read the contents of
+.Dv stdscr
+or of the specified window.
+.Pp
+The
+.Fn inch
+function returns the character that is displayed on
+.Dv stdscr
+at the current cursor position.
+.Pp
+The
+.Fn winch
+function is the same as the
+.Fn inch
+function, excepting that the character is read from window specified by
+.Fa win .
+.Pp
+The
+.Fn inchnstr
+function fills an array of
+.Ft chtype
+with characters read from
+.Dv stdscr ,
+the characters are read starting from the current cursor position and
+continuing until either n \- 1 characters are read or the right hand
+side of the screen is reached.
+The resulting character array will be
+.Dv NULL
+terminated.
+.Pp
+The
+.Fn winchnstr
+function is the same as
+.Fn inchnstr
+excepting that the characters are read from the window specified by
+.Fa win .
+.Pp
+The
+.Fn inchstr
+and
+.Fn winchstr
+functions are the same as the
+.Fn inchnstr
+and
+.Fn winchnstr
+functions, respectively, excepting that they do not limit the number
+of characters read.
+The characters returned are those from the current starting position to
+the right hand side of the screen.
+The use of
+.Fn inchstr
+and
+.Fn winchstr
+is not recommended as the character buffer can be overflowed.
+.Pp
+The
+.Fn innstr
+function
+is similar to the
+.Fn inchstr
+function, excepting that the array of characters returned is stripped of all
+the curses attributes making it a plain character string.
+.Pp
+The
+.Fn mvinchstr ,
+.Fn mvinchnstr ,
+.Fn mvwinchstr ,
+and
+.Fn mvwinchnstr
+functions are the same as the
+.Fn inchstr ,
+.Fn inchnstr ,
+.Fn winchstr ,
+and
+.Fn winchstr
+functions, respectively, except that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the output is printed on the window.
+Likewise, the
+.Fn mvinstr ,
+.Fn mvinnstr ,
+.Fn mvwinstr ,
+and
+.Fn mvwinnstr
+functions are the same as the
+.Fn instr ,
+.Fn innstr ,
+.Fn winstr ,
+and
+.Fn winstr
+functions, respectively, except that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the output is printed on the window.
+.Pp
+The
+.Fn winnstr
+function is the same as the
+.Fn innstr
+function, excepting that characters are read from the window specified by
+.Fa win .
+.Pp
+The
+.Fn instr
+and
+.Fn winstr
+functions
+are the same as the
+.Fn innstr
+and
+.Fn winnstr
+functions, respectively, excepting that there are no limits placed on the
+size of the returned string, which may cause buffer overflows.
+For this reason, the use of
+.Fn instr
+and
+.Fn winstr
+is not recommended.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_addch 3 ,
+.Xr curses_addstr 3 ,
+.Xr curses_attributes 3 ,
+.Xr curses_insertch 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part
+of the Single Unix Specification.
+.Sh NOTES
+The
+.Fn inchnstr
+and
+.Fn innstr
+function read at most n \- 1 characters from the screen so as to leave
+room for
+.Dv NULL
+termination.
+The X/Open specification is unclear as to whether or not this is the correct
+behaviour.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_input.3 b/lib/libcurses/curses_input.3
new file mode 100644 (file)
index 0000000..8eb76a1
--- /dev/null
@@ -0,0 +1,584 @@
+.\"    $NetBSD: curses_input.3,v 1.21 2010/08/06 04:03:26 dholland Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd July 25, 2006
+.Dt CURSES_INPUT 3
+.Os
+.Sh NAME
+.Nm curses_input ,
+.Nm getch ,
+.Nm wgetch ,
+.Nm mvgetch ,
+.Nm mvwgetch ,
+.Nm define_key ,
+.Nm keyok ,
+.Nm getnstr ,
+.Nm wgetnstr ,
+.Nm mvgetnstr ,
+.Nm mvwgetnstr ,
+.Nm getstr ,
+.Nm wgetstr ,
+.Nm mvgetstr ,
+.Nm mvwgetstr ,
+.Nm keypad ,
+.Nm notimeout ,
+.Nm timeout ,
+.Nm wtimeout ,
+.Nm nodelay ,
+.Nm ungetch
+.Nd curses input stream routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn getch "void"
+.Ft int
+.Fn wgetch "WINDOW *win"
+.Ft int
+.Fn mvgetch "int y" "int x"
+.Ft int
+.Fn mvwgetch "WINDOW *win" "int y" "int x"
+.Ft int
+.Fn keyok "int key_symbol" "bool flag"
+.Ft int
+.Fn define_key "char *sequence" "int key_symbol"
+.Ft int
+.Fn getnstr "char *str" "int limit"
+.Ft int
+.Fn wgetnstr "WINDOW *win" "char *str" "int limit"
+.Ft int
+.Fn mvgetnstr "int y" "int x" "char *str" "int limit"
+.Ft int
+.Fn mvwgetnstr "WINDOW *win" "int y" "int x" "char *str" "int limit"
+.Ft int
+.Fn getstr "char *str"
+.Ft int
+.Fn wgetstr "WINDOW *win" "char *str"
+.Ft int
+.Fn mvgetstr "int y" "int x" "char *str"
+.Ft int
+.Fn mvwgetstr "WINDOW *win" "int y" "int x" "char *str"
+.Ft int
+.Fn keypad "WINDOW *win" "boolf flag"
+.Ft int
+.Fn notimeout "WINDOW *win" "boolf flag"
+.Ft int
+.Fn timeout "int delay"
+.Ft int
+.Fn wtimeout "WINDOW *win" "int delay"
+.Ft int
+.Fn nodelay "WINDOW *win" "boolf flag"
+.Ft int
+.Fn ungetch "int c"
+.Pp
+.Va extern int ESCDELAY ;
+.Sh DESCRIPTION
+These functions read characters and strings from the window input file
+descriptor.
+.Pp
+The
+.Fn getch
+function reads a character from the
+.Dv stdscr
+input file descriptor and returns it.
+If the
+.Fn keypad
+flag has been set to
+.Dv TRUE ,
+then
+.Fn getch
+will assemble multi-character key sequences into key symbols,
+If the terminal is resized,
+.Fn getch
+will return
+.Dv KEY_RESIZE ,
+regardless of the setting of
+.Fn keypad .
+Calling
+.Fn getch
+will cause an implicit
+.Fn refresh
+on
+.Dv stdscr .
+.Pp
+The
+.Fn wgetch
+function is the same as the
+.Fn getch
+function, excepting that it reads from the input file descriptor associated
+with the window specified by
+.Fa win .
+.Pp
+If the
+.Fn keypad
+flag is
+.Dv TRUE
+then the assembly of specific key symbols can be disabled by using the
+.Fn keyok
+function.
+If the
+.Fa flag
+is set to
+.Dv FALSE
+on a key symbol then
+.Fn getch
+will behave as if the character sequence associated with that key symbol
+was not recognised and will return the component characters one at a time to
+the caller.
+.Pp
+Custom associations between sequences of characters and a key symbol can
+be made by using the
+.Fn define_key
+function.
+Normally, these associations are made by the information in the
+.Xr termcap 5
+database but the
+.Fn define_key
+function gives the capability to remove or add more associations.
+If
+.Fn define_key
+is passed a non-NULL string in
+.Fa sequence
+it will associate that sequence with the key symbol passed in
+.Fa key_symbol .
+The key symbol may be one of the ones listed below or a custom value that
+is application defined.
+It is valid to have multiple character sequences map to the same key
+symbol and there are no constraints on the length of the sequence allowed.
+The assembly of custom sequences follow the same rules for inter-character
+timing and so forth as the
+.Xr termcap 5
+derived ones.
+If
+.Fn define_key
+is passed a NULL in
+.Fa sequence
+then all associations for the key symbol in
+.Fa key_symbol
+will be deleted, this includes any associations that were derived from
+.Xr termcap 5 .
+.Pp
+The
+.Fn mvgetch
+and
+.Fn mvwgetch
+functions are the same as the
+.Fn getch
+and
+.Fn wgetch
+functions, respectively, excepting that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the character is read.
+.Pp
+Calling
+.Fn getnstr ,
+.Fn wgetnstr ,
+.Fn mvgetnstr
+or
+.Fn mvwgetnstr
+is effectively the same as calling
+.Fn getch
+repeatedly until a newline is received or the character limit
+.Fa limit
+is reached.
+Once this happens the string is
+.Dv NULL
+terminated and returned in
+.Fa str .
+During input, the normal curses input key processing is performed and
+affects the input buffer.
+The
+.Fn mvgetnstr
+function calls
+.Fn wmove
+to move the cursor to the position given by
+.Fa y ,
+.Fa x
+before getting the string,
+.Fn wgetnstr
+reads the input from the designated window,
+.Fn mvwgetnstr
+moves the cursor to the position given by
+.Fa y ,
+.Fa x
+before getting the input from the designated window.
+.Pp
+The functions
+.Fn getstr ,
+.Fn wgetstr ,
+.Fn mvgetstr ,
+and
+.Fn mvwgetstr
+are similar to
+.Fn getnstr ,
+.Fn wgetnstr ,
+.Fn mvgetnstr ,
+and
+.Fn mvwgetnstr ,
+respectively, excepting that there is no limit on the number of characters
+that may be inserted into
+.Fa str .
+This may cause the buffer to be overflowed, so their use is not recommended.
+.Pp
+The
+.Fn keypad
+function is used to affect how
+.Fn getch
+processes input characters.
+If
+.Fa flag
+is set to
+.Dv TRUE ,
+then
+.Fn getch
+will scan the input stream looking for multi-character key sequences
+that are emitted by some terminal function keys.
+If a recognised sequence of characters is found, then
+.Fn getch
+will collapse that sequence into an integer key symbol, as shown below.
+The default setting for the flag is
+.Dv FALSE .
+.Pp
+The
+.Fn notimeout
+function controls whether or not
+.Fn getch
+will wait indefinitely between characters in a multi-character key
+sequence or not.
+If
+.Fa flag
+is
+.Dv TRUE ,
+then there is no timeout applied between characters comprising a
+multi-character key sequence.
+If
+.Fa flag
+is
+.Dv FALSE ,
+then the component characters of a multi-character sequence must not
+have an inter-character gap of more than
+.Va ESCDELAY .
+If this timing is exceeded, then the multi-character key assembly is
+deemed to have failed and the characters read thus far are returned
+one at a time when
+.Fn getch
+is called.
+The default setting for the flag is
+.Dv FALSE .
+The default value of
+.Va ESCDELAY
+is 300ms.
+If
+.Va ESCDELAY
+is negative, no timeout is applied between characters comprising a
+multi-character key sequence.
+.Pp
+The
+.Fn timeout
+function affects the behaviour of
+.Fn getch
+when reading a character from
+.Dv stdscr .
+If
+.Fa delay
+is negative, then
+.Fn getch
+will block indefinitely on a read.
+If
+.Fa delay
+is 0, then
+.Fn getch
+will return immediately with
+.Dv ERR
+if there are no characters immediately available.
+If
+.Fa delay
+is a positive number, then
+.Fn getch
+will wait for that many milliseconds before returning and, if no character
+was available, then
+.Dv ERR
+will be returned.
+Note that for a positive number, the timeout is only accurate to the nearest
+tenth of a second.
+Also, the maximum value of
+.Fa delay
+is 25500 milliseconds.
+The
+.Fn wtimeout
+function does the same as
+.Fn timeout
+but applies to the specified window
+.Fa win .
+.Pp
+The
+.Fn nodelay
+function turns on and off blocking reads for
+.Fn getch .
+If
+.Fa flag
+is
+.Dv TRUE ,
+then
+.Fn getch
+will not block on reads, if
+.Fa flag
+is
+.Dv FALSE ,
+then reads will block.
+The default setting for the flag is
+.Dv FALSE .
+.Fn nodelay win TRUE
+is equivalent to
+.Fn wtimeout win 0
+and
+.Fn nodelay win FALSE
+is equivalent to
+.Fn wtimeout win \-1 .
+.Pp
+.Fn ungetch
+will convert
+.Fa c
+into an unsigned char and push that character back onto the input stream.
+Only one character of push-back is guaranteed to work, more may be possible
+depending on system resources.
+.Sh RETURN VALUES
+The functions
+.Fn getch ,
+.Fn wgetch ,
+.Fn mvgetch ,
+and
+.Fn mvwgetch
+will return the value of the key pressed or
+.Dv ERR
+in the case of an error or a timeout.
+Additionally, if
+.Fn keypad TRUE
+has been called on a window, then it may return one of the following values:
+.Pp
+.Bl -column "Termcap entry" "getch Return Value" "Key Function" -offset indent
+.It Sy "Termcap entry" Ta Sy "getch Return Value" Ta Sy "Key Function"
+.It \&!1 Ta KEY_SSAVE Ta Shift Save
+.It \&!2 Ta KEY_SSUSPEND Ta Shift Suspend
+.It \&!3 Ta KEY_SUNDO Ta Shift Undo
+.It \&#1 Ta KEY_SHELP Ta Shift Help
+.It \&#2 Ta KEY_SHOME Ta Shift Home
+.It \&#3 Ta KEY_SIC Ta Shift Insert Character
+.It \&#4 Ta KEY_SLEFT Ta Shift Left Arrow
+.It \&%0 Ta KEY_REDO Ta Redo
+.It \&%1 Ta KEY_HELP Ta Help
+.It \&%2 Ta KEY_MARK Ta Mark
+.It \&%3 Ta KEY_MESSAGE Ta Message
+.It \&%4 Ta KEY_MOVE Ta Move
+.It \&%5 Ta KEY_NEXT Ta Next Object
+.It \&%6 Ta KEY_OPEN Ta Open
+.It \&%7 Ta KEY_OPTIONS Ta Options
+.It \&%8 Ta KEY_PREVIOUS Ta Previous Object
+.It \&%9 Ta KEY_PRINT Ta Print
+.It \&%a Ta KEY_SMESSAGE Ta Shift Message
+.It \&%b Ta KEY_SMOVE Ta Shift Move
+.It \&%c Ta KEY_SNEXT Ta Shift Next Object
+.It \&%d Ta KEY_SOPTIONS Ta Shift Options
+.It \&%e Ta KEY_SPREVIOUS Ta Shift Previous Object
+.It \&%f Ta KEY_SPRINT Ta Shift Print
+.It \&%g Ta KEY_SREDO Ta Shift Redo
+.It \&%h Ta KEY_SREPLACE Ta Shift Replace
+.It \&%i Ta KEY_SRIGHT Ta Shift Right Arrow
+.It \&%j Ta KEY_SRSUME Ta Shift Resume
+.It \&\*[Am]0 Ta KEY_SCANCEL Ta Shift Cancel
+.It \&\*[Am]1 Ta KEY_REFERENCE Ta Reference
+.It \&\*[Am]2 Ta KEY_REFRESH Ta Refresh
+.It \&\*[Am]3 Ta KEY_REPLACE Ta Replace
+.It \&\*[Am]4 Ta KEY_RESTART Ta Restart
+.It \&\*[Am]5 Ta KEY_RESUME Ta Resume
+.It \&\*[Am]6 Ta KEY_SAVE Ta Save
+.It \&\*[Am]7 Ta KEY_SUSPEND Ta Suspend
+.It \&\*[Am]8 Ta KEY_UNDO Ta Undo
+.It \&\*[Am]9 Ta KEY_SBEG Ta Shift Begin
+.It \&*0 Ta KEY_SFIND Ta Shift Find
+.It \&*1 Ta KEY_SCOMMAND Ta Shift Command
+.It \&*2 Ta KEY_SCOPY Ta Shift Copy
+.It \&*3 Ta KEY_SCREATE Ta Shift Create
+.It \&*4 Ta KEY_SDC Ta Shift Delete Character
+.It \&*5 Ta KEY_SDL Ta Shift Delete Line
+.It \&*6 Ta KEY_SELECT Ta Select
+.It \&*7 Ta KEY_SEND Ta Shift End
+.It \&*8 Ta KEY_SEOL Ta Shift Clear to EOL
+.It \&*9 Ta KEY_SEXIT Ta Shift Exit
+.It \&@0 Ta KEY_FIND Ta Find
+.It \&@1 Ta KEY_BEG Ta Begin
+.It \&@2 Ta KEY_CANCEL Ta Cancel
+.It \&@3 Ta KEY_CLOSE Ta Close
+.It \&@4 Ta KEY_COMMAND Ta Command
+.It \&@5 Ta KEY_COPY Ta Copy
+.It \&@6 Ta KEY_CREATE Ta Create
+.It \&@7 Ta KEY_END Ta End
+.It \&@8 Ta KEY_ENTER Ta Enter
+.It \&@9 Ta KEY_EXIT Ta Exit
+.It \&F1 Ta KEY_F(11) Ta Function Key 11
+.It \&F2 Ta KEY_F(12) Ta Function Key 12
+.It \&F3 Ta KEY_F(13) Ta Function Key 13
+.It \&F4 Ta KEY_F(14) Ta Function Key 14
+.It \&F5 Ta KEY_F(15) Ta Function Key 15
+.It \&F6 Ta KEY_F(16) Ta Function Key 16
+.It \&F7 Ta KEY_F(17) Ta Function Key 17
+.It \&F8 Ta KEY_F(18) Ta Function Key 18
+.It \&F9 Ta KEY_F(19) Ta Function Key 19
+.It \&FA Ta KEY_F(20) Ta Function Key 20
+.It \&FB Ta KEY_F(21) Ta Function Key 21
+.It \&FC Ta KEY_F(22) Ta Function Key 22
+.It \&FD Ta KEY_F(23) Ta Function Key 23
+.It \&FE Ta KEY_F(24) Ta Function Key 24
+.It \&FF Ta KEY_F(25) Ta Function Key 25
+.It \&FG Ta KEY_F(26) Ta Function Key 26
+.It \&FH Ta KEY_F(27) Ta Function Key 27
+.It \&FI Ta KEY_F(28) Ta Function Key 28
+.It \&FJ Ta KEY_F(29) Ta Function Key 29
+.It \&FK Ta KEY_F(30) Ta Function Key 30
+.It \&FL Ta KEY_F(31) Ta Function Key 31
+.It \&FM Ta KEY_F(32) Ta Function Key 32
+.It \&FN Ta KEY_F(33) Ta Function Key 33
+.It \&FO Ta KEY_F(34) Ta Function Key 34
+.It \&FP Ta KEY_F(35) Ta Function Key 35
+.It \&FQ Ta KEY_F(36) Ta Function Key 36
+.It \&FR Ta KEY_F(37) Ta Function Key 37
+.It \&FS Ta KEY_F(38) Ta Function Key 38
+.It \&FT Ta KEY_F(39) Ta Function Key 39
+.It \&FU Ta KEY_F(40) Ta Function Key 40
+.It \&FV Ta KEY_F(41) Ta Function Key 41
+.It \&FW Ta KEY_F(42) Ta Function Key 42
+.It \&FX Ta KEY_F(43) Ta Function Key 43
+.It \&FY Ta KEY_F(44) Ta Function Key 44
+.It \&FZ Ta KEY_F(45) Ta Function Key 45
+.It \&Fa Ta KEY_F(46) Ta Function Key 46
+.It \&Fb Ta KEY_F(47) Ta Function Key 47
+.It \&Fc Ta KEY_F(48) Ta Function Key 48
+.It \&Fd Ta KEY_F(49) Ta Function Key 49
+.It \&Fe Ta KEY_F(50) Ta Function Key 50
+.It \&Ff Ta KEY_F(51) Ta Function Key 51
+.It \&Fg Ta KEY_F(52) Ta Function Key 52
+.It \&Fh Ta KEY_F(53) Ta Function Key 53
+.It \&Fi Ta KEY_F(54) Ta Function Key 54
+.It \&Fj Ta KEY_F(55) Ta Function Key 55
+.It \&Fk Ta KEY_F(56) Ta Function Key 56
+.It \&Fl Ta KEY_F(57) Ta Function Key 57
+.It \&Fm Ta KEY_F(58) Ta Function Key 58
+.It \&Fn Ta KEY_F(59) Ta Function Key 59
+.It \&Fo Ta KEY_F(60) Ta Function Key 60
+.It \&Fp Ta KEY_F(61) Ta Function Key 61
+.It \&Fq Ta KEY_F(62) Ta Function Key 62
+.It \&Fr Ta KEY_F(63) Ta Function Key 63
+.It \&K1 Ta KEY_A1 Ta Upper left key in keypad
+.It \&K2 Ta KEY_B2 Ta Centre key in keypad
+.It \&K3 Ta KEY_A3 Ta Upper right key in keypad
+.It \&K4 Ta KEY_C1 Ta Lower left key in keypad
+.It \&K5 Ta KEY_C3 Ta Lower right key in keypad
+.It \&Km Ta KEY_MOUSE Ta Mouse Event
+.It \&k0 Ta KEY_F0 Ta Function Key 0
+.It \&k1 Ta KEY_F(1) Ta Function Key 1
+.It \&k2 Ta KEY_F(2) Ta Function Key 2
+.It \&k3 Ta KEY_F(3) Ta Function Key 3
+.It \&k4 Ta KEY_F(4) Ta Function Key 4
+.It \&k5 Ta KEY_F(5) Ta Function Key 5
+.It \&k6 Ta KEY_F(6) Ta Function Key 6
+.It \&k7 Ta KEY_F(7) Ta Function Key 7
+.It \&k8 Ta KEY_F(8) Ta Function Key 8
+.It \&k9 Ta KEY_F(9) Ta Function Key 9
+.It \&k; Ta KEY_F(10) Ta Function Key 10
+.It \&kA Ta KEY_IL Ta Insert Line
+.It \&ka Ta KEY_CATAB Ta Clear All Tabs
+.It \&kB Ta KEY_BTAB Ta Back Tab
+.It \&kb Ta KEY_BACKSPACE Ta Backspace
+.It \&kC Ta KEY_CLEAR Ta Clear
+.It \&kD Ta KEY_DC Ta Delete Character
+.It \&kd Ta KEY_DOWN Ta Down Arrow
+.It \&kE Ta KEY_EOL Ta Clear to End Of Line
+.It \&kF Ta KEY_SF Ta Scroll Forward one line
+.It \&kH Ta KEY_LL Ta Home Down
+.It \&kh Ta KEY_HOME Ta Home
+.It \&kI Ta KEY_IC Ta Insert Character
+.It \&kL Ta KEY_DL Ta Delete Line
+.It \&kl Ta KEY_LEFT Ta Left Arrow
+.It \&kM Ta KEY_EIC Ta Exit Insert Character Mode
+.It \&kN Ta KEY_NPAGE Ta Next Page
+.It \&kP Ta KEY_PPAGE Ta Previous Page
+.It \&kR Ta KEY_SR Ta Scroll One Line Back
+.It \&kr Ta KEY_RIGHT Ta Right Arrow
+.It \&kS Ta KEY_EOS Ta Clear to End Of Screen
+.It \&kT Ta KEY_STAB Ta Set Tab
+.It \&kt Ta KEY_CTAB Ta Clear Tab
+.It \&ku Ta KEY_UP Ta Up Arrow
+.El
+.Pp
+Note that not all terminals are capable of generating all the keycodes
+listed above nor are termcap entries normally configured with all the
+above capabilities defined.
+.Pp
+Other functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Pp
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+.Sh SEE ALSO
+.Xr curses_cursor 3 ,
+.Xr curses_keyname 3 ,
+.Xr curses_refresh 3 ,
+.Xr curses_tty 3 ,
+.Xr termcap 5
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh NOTES
+The
+.Fn keyok
+and
+.Fn define_key
+functions are implementations of extensions made by the NCurses library
+to the Curses standard.
+Portable implementations should avoid the use of these functions.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_insdelln.3 b/lib/libcurses/curses_insdelln.3
new file mode 100644 (file)
index 0000000..b590d12
--- /dev/null
@@ -0,0 +1,115 @@
+.\"    $NetBSD: curses_insdelln.3,v 1.3 2003/04/16 13:35:01 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd August 12, 2002
+.Dt CURSES_INSDEL 3
+.Os
+.Sh NAME
+.Nm curses_insdelln ,
+.Nm insdelln ,
+.Nm winsdelln
+.Nd curses insert or delete lines routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn insdelln "int n"
+.Ft int
+.Fn winsdelln "WINDOW *win" "int n"
+.Sh DESCRIPTION
+These functions insert or delete lines on
+.Dv stdscr
+or on the specified window.
+.Pp
+If
+.Fn insdelln
+is called with a positive number in
+.Fa n ,
+then the specified number of lines are inserted before the current line on
+.Dv stdscr .
+The last
+.Fa n
+lines of the screen are no longer displayed.
+If
+.Fa n
+is negative, then
+.Fa n
+lines are deleted from
+.Dv stdscr ,
+starting at the current line.
+The last
+.Fa n
+lines of
+.Dv stdscr
+are cleared.
+.Pp
+The
+.Fn winsdelln
+function is the same as the
+.Fn insdelln
+function, excepting that lines are inserted or deleted from the window
+specified by
+.Fa win .
+.Pp
+If a scrolling region has been set with the
+.Fn setscrreg
+or
+.Fn wsetscrreg
+functions and the current cursor position is inside the scrolling region,
+then only the lines from the current line to the bottom of the scrolling
+region are affected.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_deleteln 3 ,
+.Xr curses_insertln 3 ,
+.Xr curses_scroll 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of
+the Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_insertch.3 b/lib/libcurses/curses_insertch.3
new file mode 100644 (file)
index 0000000..c5c13e7
--- /dev/null
@@ -0,0 +1,113 @@
+.\"    $NetBSD: curses_insertch.3,v 1.4 2006/02/05 17:07:13 jdc Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd February 5, 2006
+.Dt CURSES_INSERTCH 3
+.Os
+.Sh NAME
+.Nm curses_insert ,
+.Nm insch ,
+.Nm winsch ,
+.Nm mvinsch ,
+.Nm mvwinsch
+.Nd curses insert characters routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn insch "chtype ch"
+.Ft int
+.Fn winsch "WINDOW *win" "chtype ch"
+.Ft int
+.Fn mvinsch "int y" "int x" "chtype ch"
+.Ft int
+.Fn mvwinsch "WINDOW *win" "int y" "int x" "chtype ch"
+.Sh DESCRIPTION
+These functions insert characters on
+.Dv stdscr
+or on the specified window.
+.Pp
+The
+.Fn insch
+function inserts the character given in
+.Fa ch
+at the current cursor position on
+.Dv stdscr .
+The cursor is not advanced and wrapping is not performed.
+.Pp
+The
+.Fn winsch
+function is the same as the
+.Fn insch
+function, excepting that the character is inserted on the window specified by
+.Fa win .
+.Pp
+The
+.Fn mvinsch
+and
+.Fn mvwinsch
+functions are the same as the
+.Fn insch
+and
+.Fn insch
+functions, respectively, excepting that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the character is inserted on the window.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_addch 3 ,
+.Xr curses_cursor 3 ,
+.Xr curses_delch 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of
+the Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_insertln.3 b/lib/libcurses/curses_insertln.3
new file mode 100644 (file)
index 0000000..6cd325e
--- /dev/null
@@ -0,0 +1,109 @@
+.\"    $NetBSD: curses_insertln.3,v 1.4 2006/02/05 17:07:13 jdc Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd February 5, 2006
+.Dt CURSES_INSERTLN 3
+.Os
+.Sh NAME
+.Nm curses_insertln ,
+.Nm insertln ,
+.Nm winsertln
+.Nd curses insert single line routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn insertln "void"
+.Ft int
+.Fn winsertln "WINDOW *win"
+.Sh DESCRIPTION
+These functions insert a single line on
+.Dv stdscr
+or on the specified window.
+.Pp
+The
+.Fn insertln
+function inserts a blank line before the current line on
+.Dv stdscr .
+The current line and all lines below are moved down one line away from
+the cursor and the bottom line of the window is lost.
+.Pp
+The
+.Fn winsertln
+function is the same as the
+.Fn insertln
+function, excepting that the line is inserted on the window
+.Fa win .
+.Pp
+If a scrolling region has been set with the
+.Fn setscrreg
+or
+.Fn wsetscrreg
+functions and the current cursor position is inside the scrolling region,
+then only the lines from the current line to the bottom of the scrolling
+region are moved down and the bottom line of the scrolling region lost.
+.Pp
+The functions
+.Fn insertln
+and
+.Fn winsertln win
+are equivalent to
+.Fn insdelln 1
+and
+.Fn winsdelln win 1 ,
+respectively.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_deleteln 3 ,
+.Xr curses_insdelln 3 ,
+.Xr curses_scroll 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of
+the Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_keyname.3 b/lib/libcurses/curses_keyname.3
new file mode 100644 (file)
index 0000000..bb0bda0
--- /dev/null
@@ -0,0 +1,72 @@
+.\"    $NetBSD: curses_keyname.3,v 1.5 2008/04/30 13:10:51 martin Exp $
+.\" Copyright (c) 2002 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 17, 2007
+.Dt CURSES_KEYNAME 3
+.Os
+.Sh NAME
+.Nm curses_keyname ,
+.Nm keyname
+.Nd curses report key name routine
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft "char *"
+.Fn keyname "int key"
+.Sh DESCRIPTION
+The function
+.Fn keyname
+generates a character string containing a description of the key specified in
+.Fa key .
+.Pp
+The string is formatted according to the following table:
+.Bl -column "Meta + control character" "KEY_MIN - KEY_MAX" "String format"
+.It "Description" Ta "Key range" Ta "String format"
+.It Li "Control character" Ta "0 - 31" Ta "^X"
+.It Li "Visible character" Ta "32 - 126" Ta "X"
+.It Li "Delete character" Ta "127" Ta "^?"
+.It Li "Meta + control character" Ta "128 - 158" Ta "M-^X"
+.It Li "Meta + visible character" Ta "159 - 254" Ta "M-X"
+.It Li "Meta + delete character" Ta "255" Ta "M-^?"
+.It Li "Named key" Ta "KEY_MIN - KEY_MAX" Ta "KEY_EXIT"
+.It Li "Unknown key" Ta "" Ta "-1"
+.El
+.Sh SEE ALSO
+.Xr curses_input 3
+.Sh NOTE
+The return value of
+.Fn keyname
+is a static buffer, which will be overwritten on a subsequent call.
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+These functions first appeared in
+.Nx 2.0 .
diff --git a/lib/libcurses/curses_line.3 b/lib/libcurses/curses_line.3
new file mode 100644 (file)
index 0000000..7da7b53
--- /dev/null
@@ -0,0 +1,171 @@
+.\"    $NetBSD: curses_line.3,v 1.6 2010/02/20 10:23:04 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd February 19, 2010
+.Dt CURSES_LINE 3
+.Os
+.Sh NAME
+.Nm curses_line ,
+.Nm hline ,
+.Nm whline ,
+.Nm vline ,
+.Nm wvline ,
+.Nm mvhline ,
+.Nm mvwhline ,
+.Nm mvvline ,
+.Nm mvwvline
+.Nd curses draw lines on windows routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn hline "chtype ch" "int n"
+.Ft int
+.Fn whline "WINDOW *win" "chtype ch" "int n"
+.Ft int
+.Fn mvhline "int y" "int x" "chtype ch" "int n"
+.Ft int
+.Fn mvwvline "WINDOW *win" "int y" "int x" "chtype c" "int n"
+.Ft int
+.Fn vline "chtype c" "int n"
+.Ft int
+.Fn wvline "WINDOW *win" "chtype c" "int n"
+.Ft int
+.Fn mvvline "int y" "int x" "chtype ch" "int n"
+.Ft int
+.Fn mvwhline "WINDOW *win" "int y" "int x" "chtype c" "int n"
+.Sh DESCRIPTION
+These functions draw lines on
+.Dv stdscr
+or on the specified window.
+.Pp
+The
+.Fn hline
+function draws a horizontal line of the character
+.Fa ch
+on
+.Dv stdscr
+starting at the current cursor position and extending for
+.Fa n
+characters, or until the right hand side of
+.Dv stdscr
+is reached.
+If the text portion of
+.Fa ch
+is 0 then the line will be drawn with the
+.Dv ACS_HLINE
+character.
+.Pp
+The
+.Fn whline
+function is the same as the
+.Fn hline
+function, excepting that the line is drawn in the window specified by
+.Fa win .
+.Pp
+The
+.Fn vline
+function draws a vertical line of character
+.Fa ch
+on
+.Dv stdscr
+starting at the current cursor position and moving down until either
+.Fa n
+characters have been drawn or the bottom of
+.Dv stdscr
+is reached.
+If the text portion of
+.Fa ch
+is 0 then the line will be drawn with the
+.Dv ACS_VLINE
+character.
+.Pp
+The
+.Fn wvline
+function is the same as the
+.Fn vline
+function, excepting that the line is drawn on the given window.
+.Pp
+The
+.Fn mvhline ,
+.Fn mvwhline ,
+.Fn mvvline
+and
+.Fn mvwvline
+functions are the same as the
+.Fn hline ,
+.Fn whline ,
+.Fn vline
+and
+.Fn wvline
+functions, respectively, excepting that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the line is drawn on the window.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_border 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of
+the Single Unix Specification.
+.Pp
+The use of
+.Dv ACS_HLINE
+and
+.Dv ACS_VLINE
+as default drawing character in
+.Fn hline
+and
+.Fn vline
+is a
+.Nx
+extension which should not be relied on in portable code.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_pad.3 b/lib/libcurses/curses_pad.3
new file mode 100644 (file)
index 0000000..00488b0
--- /dev/null
@@ -0,0 +1,142 @@
+.\"    $NetBSD: curses_pad.3,v 1.4 2008/04/30 13:10:51 martin Exp $
+.\" Copyright (c) 2002 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd December 4, 2002
+.Dt CURSES_PAD 3
+.Os
+.Sh NAME
+.Nm curses_pad ,
+.Nm newpad ,
+.Nm subpad ,
+.Nm prefresh ,
+.Nm pnoutrefresh
+.Nd curses pad routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft WINDOW *
+.Fn newpad "int lines" "int cols"
+.Ft WINDOW *
+.Fn subpad "WINDOW *pad" "int lines" "int cols" "int begin_y" "int begin_x"
+.Ft int
+.Fn prefresh "WINDOW *pad" "int pbeg_y" "int pbeg_x" "int sbeg_y" "int sbeg_x" "int smax_y" "int smax_x"
+.Ft int
+.Fn pnoutrefresh "WINDOW *pad" "int pbeg_y" "int pbeg_x" "int sbeg_y" "int sbeg_x" "int smax_y" "int smax_x"
+.Sh DESCRIPTION
+These functions create and display pads on the current screen.
+.Pp
+The
+.Fn newpad
+function creates a new pad of size
+.Fa lines ,
+.Fa cols .
+.Pp
+.Fn subpad
+is similar to
+.Fn newpad
+excepting that the size of the subpad is bounded by the parent
+pad
+.Fa pad .
+The subpad shares internal data structures with the parent pad
+and will be refreshed when the parent pad is refreshed.
+The starting column and row
+.Fa begin_y ,
+.Fa begin_x
+are relative to the parent pad origin.
+.Pp
+The
+.Fn pnoutrefresh
+function performs the internal processing required by curses to determine
+what changes need to be made to synchronise the internal screen buffer
+and the terminal but does not modify the terminal display.
+A rectangular area of the pad starting at column and row
+.Fa pbeg_y ,
+.Fa pbeg_x
+is copied to the corresponding rectangular area of the screen buffer starting
+at column and row
+.Fa sbeg_y ,
+.Fa sbeg_x
+and extending to
+.Fa smax_y ,
+.Fa smax_x .
+.Pp
+The
+.Fn prefresh
+function causes curses to propagate changes made to the pad specified by
+.Fa pad
+to the terminal display.
+A rectangular area of the pad starting at column and row
+.Fa pbeg_y ,
+.Fa pbeg_x
+is copied to the corresponding rectangular area of the terminal starting
+at column and row
+.Fa sbeg_y ,
+.Fa sbeg_x
+and extending to
+.Fa smax_y ,
+.Fa smax_x .
+.Pp
+The
+.Fn pnoutrefresh
+and
+.Fn doupdate
+functions can be used together to speed up terminal redraws by
+deferring the actual terminal updates until after a batch of updates
+to multiple pads has been done.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_refresh 3 ,
+.Xr curses_window 3
+.Sh NOTES
+The
+.Fn subpad
+function is similar to the
+.Xr derwin 3
+function, and not the
+.Xr subwin 3
+function.
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_print.3 b/lib/libcurses/curses_print.3
new file mode 100644 (file)
index 0000000..cc5172d
--- /dev/null
@@ -0,0 +1,124 @@
+.\"    $NetBSD: curses_print.3,v 1.6 2003/04/16 13:35:01 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd August 12, 2002
+.Dt CURSES_PRINT 3
+.Os
+.Sh NAME
+.Nm curses_print ,
+.Nm printw ,
+.Nm wprintw ,
+.Nm mvprintw ,
+.Nm mvwprintw ,
+.Nm unctrl
+.Nd curses print formatted strings on windows routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn printw "const char *fmt" "..."
+.Ft int
+.Fn wprintw "WINDOW *win" "const char *fmt" "..."
+.Ft int
+.Fn mvprintw "int y" "int x" "const char *fmt" "..."
+.Ft int
+.Fn mvwprintw "WINDOW *win" "int y" "int x" "const char *fmt" "..."
+.Ft char *
+.Fn unctrl "chtype ch"
+.Sh DESCRIPTION
+These functions print formatted strings on
+.Dv stdscr
+or on the specified window.
+.Pp
+The
+.Fn printw
+function formats and prints its arguments on
+.Dv stdscr .
+The behaviour is the same as that of
+.Fn printf .
+.Pp
+The
+.Fn wprintw
+function is the same as the
+.Fn printw
+function, excepting that the resulting output is printed on the window
+specified by
+.Fa win .
+.Pp
+The
+.Fn mvprintw
+and
+.Fn mvwprintw
+functions are the same as the
+.Fn printw
+and
+.Fn wprintw
+functions, respectively, excepting that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the output is printed on the window.
+.Pp
+The
+.Fn unctrl
+function returns a printable string representation of the character
+.Fa ch .
+If
+.Fa ch
+is a control character then it will be converted to the form ^Y.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_cursor 3 ,
+.Xr curses_scanw 3 ,
+.Xr printf 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_private.h b/lib/libcurses/curses_private.h
new file mode 100644 (file)
index 0000000..fcd19d4
--- /dev/null
@@ -0,0 +1,360 @@
+/*     $NetBSD: curses_private.h,v 1.46 2010/12/16 17:42:28 wiz Exp $  */
+
+/*-
+ * Copyright (c) 1998-2000 Brett Lymn
+ *                         (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * This code has been donated to The NetBSD Foundation by the Author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+/* Modified by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>
+ * to add support for wide characters
+ * Changes:
+ * - Add a compiler variable HAVE_WCHAR for wide character only code
+ * - Add a pointer to liked list of non-spacing characters in __ldata
+ *   and the macro to access the width field in the attribute field
+ * - Add a circular input character buffer in __screen to handle
+ *   wide-character input (used in get_wch())
+ */
+
+#include <term.h>
+#include <termios.h>
+
+/* Private structure definitions for curses. */
+
+/* Termcap capabilities. */
+#ifdef HAVE_WCHAR
+/*
+ * Add a list of non-spacing characters to each spacing
+ * character in a singly linked list
+ */
+typedef struct nschar_t {
+       wchar_t                 ch;             /* Non-spacing character */
+       struct nschar_t *next;  /* Next non-spacing character */
+} nschar_t;
+#endif /* HAVE_WCHAR */
+
+/*
+ * A window is an array of __LINE structures pointed to by the 'lines' pointer.
+ * A line is an array of __LDATA structures pointed to by the 'line' pointer.
+ *
+ * IMPORTANT: the __LDATA structure must NOT induce any padding, so if new
+ * fields are added -- padding fields with *constant values* should ensure
+ * that the compiler will not generate any padding when storing an array of
+ *  __LDATA structures.  This is to enable consistent use of memcmp, and memcpy
+ * for comparing and copying arrays.
+ */
+
+struct __ldata {
+       wchar_t ch;                     /* Character */
+       attr_t  attr;                   /* Attributes */
+#ifdef HAVE_WCHAR
+       nschar_t        *nsp;   /* Foreground non-spacing character pointer */
+#endif /* HAVE_WCHAR */
+};
+
+#ifdef HAVE_WCHAR
+/* macros to extract the width of a wide character */
+#define __WCWIDTH 0xfc000000
+#define WCW_SHIFT 26
+#define WCOL(wc) ((((unsigned) (wc).attr) >> WCW_SHIFT ) > MB_LEN_MAX ? ((int)(((unsigned) (wc).attr ) >> WCW_SHIFT )) - 64 : ((int)(((unsigned) (wc).attr ) >> WCW_SHIFT)))
+#define SET_WCOL(c, w) do {                                            \
+       ((c).attr) = ((((c).attr) & WA_ATTRIBUTES ) | ((w) << WCW_SHIFT )); \
+} while(/*CONSTCOND*/0)
+#define BGWCOL(wc) ((((wc).battr) >> WCW_SHIFT ) > MB_LEN_MAX ? (((wc).battr ) >> WCW_SHIFT ) - 64 : (((wc).battr ) >> WCW_SHIFT ))
+#define SET_BGWCOL(c, w) do {                                          \
+       ((c).battr) = ((((c).battr) & WA_ATTRIBUTES ) | ((w) << WCW_SHIFT )); \
+} while(/*CONSTCOND*/0)
+#endif /* HAVE_WCHAR */
+
+#define __LDATASIZE    (sizeof(__LDATA))
+
+struct __line {
+#ifdef DEBUG
+#define SENTINEL_VALUE 0xaac0ffee
+
+       unsigned int sentinel;          /* try to catch line overflows */
+#endif
+#define        __ISDIRTY       0x01            /* Line is dirty. */
+#define __ISPASTEOL    0x02            /* Cursor is past end of line */
+       unsigned int flags;
+       unsigned int hash;              /* Hash value for the line. */
+       int *firstchp, *lastchp;        /* First and last chngd columns ptrs */
+       int firstch, lastch;            /* First and last changed columns. */
+       __LDATA *line;                  /* Pointer to the line text. */
+};
+
+struct __window {              /* Window structure. */
+       struct __window *nextp, *orig;  /* Subwindows list and parent. */
+       int begy, begx;                 /* Window home. */
+       int cury, curx;                 /* Current x, y coordinates. */
+       int maxy, maxx;                 /* Maximum values for curx, cury. */
+       int reqy, reqx;                 /* Size requested when created */
+       int ch_off;                     /* x offset for firstch/lastch. */
+       __LINE **alines;                /* Array of pointers to the lines */
+       __LINE  *lspace;                /* line space (for cleanup) */
+       __LDATA *wspace;                /* window space (for cleanup) */
+
+#define        __ENDLINE       0x00000001      /* End of screen. */
+#define        __FLUSH         0x00000002      /* Fflush(stdout) after refresh. */
+#define        __FULLWIN       0x00000004      /* Window is a screen. */
+#define        __IDLINE        0x00000008      /* Insert/delete sequences. */
+#define        __SCROLLWIN     0x00000010      /* Last char will scroll window. */
+#define        __SCROLLOK      0x00000020      /* Scrolling ok. */
+#define        __CLEAROK       0x00000040      /* Clear on next refresh. */
+#define        __LEAVEOK       0x00000100      /* If cursor left */
+#define        __KEYPAD        0x00010000      /* If interpreting keypad codes */
+#define        __NOTIMEOUT     0x00020000      /* Wait indefinitely for func keys */
+#define __IDCHAR       0x00040000      /* insert/delete char sequences */
+#define __ISPAD                0x00080000      /* "window" is a pad */
+       unsigned int flags;
+       int     delay;                  /* delay for getch() */
+       attr_t  wattr;                  /* Character attributes */
+       wchar_t bch;                    /* Background character */
+       attr_t  battr;                  /* Background attributes */
+       int     scr_t, scr_b;           /* Scrolling region top, bottom */
+       SCREEN  *screen;                /* Screen for this window */
+       int     pbegy, pbegx,
+               sbegy, sbegx,
+               smaxy, smaxx;           /* Saved prefresh() values */
+#ifdef HAVE_WCHAR
+       nschar_t *bnsp;                 /* Background non-spacing char list */
+#endif /* HAVE_WCHAR */
+};
+
+/* Set of attributes unset by 'me' - 'mb', 'md', 'mh', 'mk', 'mp' and 'mr'. */
+#ifndef HAVE_WCHAR
+#define        __TERMATTR \
+       (__REVERSE | __BLINK | __DIM | __BOLD | __BLANK | __PROTECT)
+#else
+#define        __TERMATTR \
+       (__REVERSE | __BLINK | __DIM | __BOLD | __BLANK | __PROTECT \
+       | WA_TOP | WA_LOW | WA_LEFT | WA_RIGHT | WA_HORIZONTAL | WA_VERTICAL)
+#endif /* HAVE_WCHAR */
+
+struct __winlist {
+       struct __window         *winp;  /* The window. */
+       struct __winlist        *nextp; /* Next window. */
+};
+
+struct __color {
+       short   num;
+       short   red;
+       short   green;
+       short   blue;
+       int     flags;
+};
+
+/* List of colour pairs */
+struct __pair {
+       short   fore;
+       short   back;
+       int     flags;
+};
+
+/* Maximum colours */
+#define        MAX_COLORS      64
+/* Maximum colour pairs - determined by number of colour bits in attr_t */
+#define        MAX_PAIRS       PAIR_NUMBER(__COLOR)
+
+typedef struct keymap keymap_t;
+
+/* this is the encapsulation of the terminal definition, one for
+ * each terminal that curses talks to.
+ */
+struct __screen {
+       FILE    *infd, *outfd;  /* input and output file descriptors */
+       WINDOW  *curscr;        /* Current screen. */
+       WINDOW  *stdscr;        /* Standard screen. */
+       WINDOW  *__virtscr;     /* Virtual screen (for doupdate()). */
+       int      curwin;        /* current window for refresh */
+       int      lx, ly;        /* loop parameters for refresh */
+       int      COLS;          /* Columns on the screen. */
+       int      LINES;         /* Lines on the screen. */
+       int      COLORS;        /* Maximum colors on the screen */
+       int      COLOR_PAIRS;   /* Maximum color pairs on the screen */
+       int      My_term;       /* Use Def_term regardless. */
+       char     GT;            /* Gtty indicates tabs. */
+       char     NONL;          /* Term can't hack LF doing a CR. */
+       char     UPPERCASE;     /* Terminal is uppercase only. */
+
+       chtype acs_char[NUM_ACS];
+#ifdef HAVE_WCHAR
+       cchar_t wacs_char[ NUM_ACS ];
+#endif /* HAVE_WCHAR */
+       struct __color colours[MAX_COLORS];
+       struct __pair  colour_pairs[MAX_PAIRS];
+       attr_t  nca;
+
+/* Style of colour manipulation */
+#define COLOR_NONE     0
+#define COLOR_ANSI     1       /* ANSI/DEC-style colour manipulation */
+#define COLOR_HP       2       /* HP-style colour manipulation */
+#define COLOR_TEK      3       /* Tektronix-style colour manipulation */
+#define COLOR_OTHER    4       /* None of the others but can set fore/back */
+       int color_type;
+
+       attr_t mask_op;
+       attr_t mask_me;
+       attr_t mask_ue;
+       attr_t mask_se;
+       TERMINAL *term;
+       int old_mode; /* old cursor visibility state for terminal */
+       keymap_t *base_keymap;
+       int echoit;
+       int pfast;
+       int rawmode;
+       int nl;
+       int noqch;
+       int clearok;
+       int useraw;
+       struct __winlist *winlistp;
+       struct   termios cbreakt, rawt, *curt, save_termios;
+       struct termios orig_termios, baset, savedtty;
+       int ovmin;
+       int ovtime;
+       char *stdbuf;
+       unsigned int len;
+       int meta_state;
+       char padchar;
+       char ttytype[128];
+       int endwin;
+       int notty;
+       int half_delay;
+       int resized;
+       wchar_t *unget_list;
+       int unget_len, unget_pos;
+#ifdef HAVE_WCHAR
+#define MB_LEN_MAX 8
+#define MAX_CBUF_SIZE MB_LEN_MAX
+       int             cbuf_head;              /* header to cbuf */
+       int             cbuf_tail;              /* tail to cbuf */
+       int             cbuf_cur;               /* the current char in cbuf */
+       mbstate_t       sp;                     /* wide char processing state */
+       char            cbuf[ MAX_CBUF_SIZE ];  /* input character buffer */
+#endif /* HAVE_WCHAR */
+};
+
+
+extern char     __GT;                  /* Gtty indicates tabs. */
+extern char     __NONL;                /* Term can't hack LF doing a CR. */
+extern char     __UPPERCASE;           /* Terminal is uppercase only. */
+extern int      My_term;               /* Use Def_term regardless. */
+extern const char      *Def_term;      /* Default terminal type. */
+extern SCREEN   *_cursesi_screen;       /* The current screen in use */
+
+/* Debugging options/functions. */
+#ifdef DEBUG
+#define __CTRACE_TSTAMP                0x00000001
+#define __CTRACE_MISC          0x00000002
+#define __CTRACE_INIT          0x00000004
+#define __CTRACE_SCREEN                0x00000008
+#define __CTRACE_WINDOW                0x00000010
+#define __CTRACE_REFRESH       0x00000020
+#define __CTRACE_COLOR         0x00000040
+#define __CTRACE_INPUT         0x00000080
+#define __CTRACE_OUTPUT                0x00000100
+#define __CTRACE_LINE          0x00000200
+#define __CTRACE_ATTR          0x00000400
+#define __CTRACE_ERASE         0x00000800
+#define __CTRACE_FILEIO                0x00001000
+#define __CTRACE_ALL           0x7fffffff
+void    __CTRACE_init(void);
+void    __CTRACE(int, const char *, ...) __attribute__((__format__(__printf__, 2, 3)));
+#endif
+
+/* Private functions. */
+int     __cputchar_args(int, void *);
+void     _cursesi_free_keymap(keymap_t *);
+int      _cursesi_gettmode(SCREEN *);
+void     _cursesi_reset_acs(SCREEN *);
+int    _cursesi_addbyte(WINDOW *, __LINE **, int *, int *, int , attr_t);
+int    _cursesi_addwchar(WINDOW *, __LINE **, int *, int *, const cchar_t *);
+#ifdef HAVE_WCHAR
+void     _cursesi_reset_wacs(SCREEN *);
+#endif /* HAVE_WCHAR */
+void     _cursesi_resetterm(SCREEN *);
+int      _cursesi_setterm(char *, SCREEN *);
+int     __delay(void);
+u_int   __hash_more(const void *, size_t, u_int);
+#define        __hash(s, len)  __hash_more((s), (len), 0u)
+void    __id_subwins(WINDOW *);
+void    __init_getch(SCREEN *);
+void    __init_acs(SCREEN *);
+#ifdef HAVE_WCHAR
+void    __init_get_wch(SCREEN *);
+void    __init_wacs(SCREEN *);
+int    __cputwchar_args( wchar_t, void * );
+int     _cursesi_copy_nsp(nschar_t *, struct __ldata *);
+void   __cursesi_free_nsp(nschar_t *);
+void   __cursesi_win_free_nsp(WINDOW *);
+void   __cursesi_putnsp(nschar_t *, const int, const int);
+void   __cursesi_chtype_to_cchar(chtype, cchar_t *);
+#endif /* HAVE_WCHAR */
+int     __unget(wint_t);
+char   *__longname(char *, char *);    /* Original BSD version */
+int     __mvcur(int, int, int, int, int);
+WINDOW  *__newwin(SCREEN *, int, int, int, int, int);
+int     __nodelay(void);
+int     __notimeout(void);
+void    __restartwin(void);
+void    __restore_colors(void);
+void     __restore_cursor_vis(void);
+void     __restore_meta_state(void);
+void    __restore_termios(void);
+void    __restore_stophandler(void);
+void    __restore_winchhandler(void);
+void    __save_termios(void);
+void    __set_color(WINDOW *win, attr_t attr);
+void    __set_stophandler(void);
+void    __set_winchhandler(void);
+void    __set_subwin(WINDOW *, WINDOW *);
+void    __startwin(SCREEN *);
+void    __stop_signal_handler(int);
+int     __stopwin(void);
+void    __swflags(WINDOW *);
+int     __timeout(int);
+int     __touchline(WINDOW *, int, int, int);
+int     __touchwin(WINDOW *);
+void    __unsetattr(int);
+void    __unset_color(WINDOW *win);
+int     __waddch(WINDOW *, __LDATA *);
+int     __wgetnstr(WINDOW *, char *, int);
+void    __winch_signal_handler(int);
+
+/* Private #defines. */
+#define        min(a,b)        ((a) < (b) ? (a) : (b))
+#define        max(a,b)        ((a) > (b) ? (a ): (b))
+
+/* Private externs. */
+extern int              __echoit;
+extern int              __endwin;
+extern int              __pfast;
+extern int              __rawmode;
+extern int              __noqch;
+extern attr_t           __mask_op, __mask_me, __mask_ue, __mask_se;
+extern WINDOW          *__virtscr;
+extern int              __using_color;
+extern attr_t           __default_color;
diff --git a/lib/libcurses/curses_refresh.3 b/lib/libcurses/curses_refresh.3
new file mode 100644 (file)
index 0000000..9800b1a
--- /dev/null
@@ -0,0 +1,157 @@
+.\"    $NetBSD: curses_refresh.3,v 1.10 2003/04/16 13:35:01 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd March 26, 2003
+.Dt CURSES_REFRESH 3
+.Os
+.Sh NAME
+.Nm curses_refresh ,
+.Nm refresh ,
+.Nm wrefresh ,
+.Nm wnoutrefresh ,
+.Nm doupdate ,
+.Nm leaveok ,
+.Nm flushok
+.Nd curses terminal update routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn refresh "void"
+.Ft int
+.Fn wrefresh "WINDOW *win"
+.Ft int
+.Fn wnoutrefresh "WINDOW *win"
+.Ft int
+.Fn doupdate "void"
+.Ft int
+.Fn leaveok "WINDOW *win" "boolf flag"
+.Ft int
+.Fn flushok "WINDOW *win" "boolf flag"
+.Sh DESCRIPTION
+These functions update the terminal with the contents of
+.Dv stdscr
+or of the specified window(s).
+.Pp
+The
+.Fn refresh
+function causes curses to propagate changes made to
+.Dv stdscr
+to the terminal display.
+Any changes made to subwindows of
+.Dv stdscr
+are also propagated.
+.Pp
+The
+.Fn wrefresh
+function is the same as the
+.Fn refresh
+function, excepting that changes are propagated to the terminal from the
+window specified by
+.Fa win .
+.Pp
+The
+.Fn wnoutrefresh
+function performs the internal processing required by curses to determine
+what changes need to be made to synchronise the internal screen buffer
+and the terminal but does not modify the terminal display.
+.Pp
+The
+.Fn doupdate
+function updates the terminal display to match the internal curses
+representation of the display.
+.Pp
+The
+.Fn wnoutrefresh
+and
+.Fn doupdate
+functions can be used together to speed up terminal redraws by
+deferring the actual terminal updates until after a batch of updates
+to multiple windows has been done.
+.Pp
+The
+.Fn refresh
+function is equivalent to
+.Fn wnoutrefresh stdscr
+followed by
+.Fn doupdate .
+.Pp
+The
+.Fn leaveok
+function determines whether refresh operations may leave the screen cursor
+in an arbitrary position on the screen.
+Setting
+.Fa flag
+to
+.Dv FALSE
+ensures that the screen cursor is positioned at the current cursor
+position after a refresh operation has taken place.
+.Pp
+The
+.Fn flushok
+function is used to determine whether or not the screen's output file
+descriptor will be flushed on refresh.
+Setting
+.Fa flag
+to
+.Dv TRUE
+will cause the output to be flushed.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_pad 3 ,
+.Xr curses_touch 3 ,
+.Xr getch 3
+.Sh NOTES
+Calling
+.Fn wrefresh
+on a new, unchanged window has no effect.
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_scanw.3 b/lib/libcurses/curses_scanw.3
new file mode 100644 (file)
index 0000000..b6c1ab7
--- /dev/null
@@ -0,0 +1,114 @@
+.\"    $NetBSD: curses_scanw.3,v 1.5 2003/04/16 13:35:01 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd August 12, 2002
+.Dt CURSES_SCANW 3
+.Os
+.Sh NAME
+.Nm curses_scanw ,
+.Nm scanw ,
+.Nm wscanw ,
+.Nm mvscanw ,
+.Nm mvwscanw
+.Nd curses read formatted data from screen routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn scanw "const char *fmt" "..."
+.Ft int
+.Fn wscanw "WINDOW *win" "const char *fmt" "..."
+.Ft int
+.Fn mvscanw "int y" "int x" "const char *fmt" "..."
+.Ft int
+.Fn mvwscanw "WINDOW *win" "int y" "int x" "const char *fmt" "..."
+.Sh DESCRIPTION
+These functions read formatted data from
+.Dv stdscr
+or from the specified window.
+.Pp
+The
+.Fn scanw
+function is the same as the
+.Fn scanf
+function, excepting that the input data stream is read from the current
+cursor position on
+.Dv stdscr ,
+.Pp
+The
+.Fn wscanw
+function is the same
+as the
+.Fn scanw
+function, excepting that the data stream is read from the window specified by
+.Fa win .
+.Pp
+The
+.Fn mvscanw
+and
+.Fn mvwscanw
+functions are the same as the
+.Fn scanw
+and
+.Fn mvscanw
+functions, respectively, excepting that
+.Fn wmove
+is called to move the cursor to the position specified by
+.Fa y ,
+.Fa x
+before the data is read from the window.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_cursor 3 ,
+.Xr curses_print 3 ,
+.Xr scanf 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_screen.3 b/lib/libcurses/curses_screen.3
new file mode 100644 (file)
index 0000000..50bb806
--- /dev/null
@@ -0,0 +1,204 @@
+.\"    $NetBSD: curses_screen.3,v 1.14 2007/10/25 20:42:07 jdc Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd October 24, 2007
+.Dt CURSES_SCREEN 3
+.Os
+.Sh NAME
+.Nm curses_screen ,
+.Nm newterm ,
+.Nm set_term ,
+.Nm delscreen ,
+.Nm endwin ,
+.Nm initscr ,
+.Nm isendwin ,
+.Nm resizeterm ,
+.Nm setterm
+.Nd curses terminal and screen routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft SCREEN *
+.Fn newterm "char *type" "FILE *outfd" "FILE *infd"
+.Ft SCREEN *
+.Fn set_term "SCREEN *screen"
+.Ft void
+.Fn delscreen "SCREEN *screen"
+.Ft int
+.Fn endwin "void"
+.Ft WINDOW *
+.Fn initscr "void"
+.Ft bool
+.Fn isendwin "void"
+.Ft int
+.Fn resizeterm "int lines" "int cols"
+.Ft int
+.Fn setterm "char *name"
+.Pp
+.Va extern int LINES ;
+.Pp
+.Va extern int COLS ;
+.Sh DESCRIPTION
+These functions initialize terminals and screens.
+.Pp
+The
+.Fn newterm
+function initialises the curses data structures and pointers ready for
+use by curses.
+The
+.Fa type
+argument points to a
+.Xr termcap 5
+capability name, or it may be
+.Dv NULL
+in which case the TERM environment variable is used.
+The
+.Fa outfd
+and
+.Fa infd
+are the output and input file descriptors for the terminal.
+The
+.Fn newterm
+function must only be called once  per terminal.
+.Pp
+The
+.Fn set_term
+function can be used to switch between the screens defined by calling
+.Fn newterm ,
+a pointer to the previous screen structure that was in use will be
+returned on success.
+.Pp
+Calling
+.Fn delscreen
+will destroy the given screen and free all allocated resources.
+.Pp
+Calling
+.Fn endwin
+will end the curses session and restore the saved terminal settings.
+.Pp
+The curses session must be initialised by calling
+.Fn initscr
+which saves the current terminal state and sets up the terminal and
+internal data structures to support the curses application.
+This
+function call must be, with few exceptions, the first Curses library
+call made.
+The exception to this rule is the
+.Fn newterm
+call which may be called prior to
+.Fn initscr .
+The size of the curses screen is determined by checking the
+.Xr tty 4
+size and then the
+.Xr termcap 5
+entries for the terminal type.
+If the environment variables
+.Va LINES
+or
+.Va COLS
+are set, then these will be used instead.
+.Pp
+When either
+.Fn newterm
+or
+.Fn initscr
+are called, the Curses library sets up signal handlers for
+.Dv SIGTSTP
+and
+.Dv SIGWINCH .
+If a signal handler is already installed for
+.Dv SIGWINCH ,
+this will also be called when the Curses library handler is called.
+.Pp
+The
+.Fn isendwin
+function can be used to determine whether or not a refresh of the
+screen has occurred since the last call to
+.Fn endwin .
+.Pp
+The size of the screen may be changed  by calling
+.Fn resizeterm
+with the updated number of lines and columns.
+This will resize the curses internal data structures to accommodate the
+changed terminal geometry.
+The
+.Dv curscr
+and
+.Dv stdscr
+windows and any of their subwindows will be resized to fit the new
+screen size.
+The application must redraw the screen after a call to
+.Fn resizeterm .
+.Pp
+The
+.Fn setterm
+function sets the terminal type for the current screen to the one
+passed, initialising all the curses internal data structures with
+information related to the named terminal.
+The
+.Fa name
+argument must be a valid name or alias in the
+.Xr termcap 5
+database for this function to succeed.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_window 3 ,
+.Xr tty 4 ,
+.Xr termcap 5 ,
+.Xr signal 7
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
+The
+.Fn resizeterm
+function is a
+.Em ncurses
+extension to the Curses library and was added in
+.Nx 1.6 .
diff --git a/lib/libcurses/curses_scroll.3 b/lib/libcurses/curses_scroll.3
new file mode 100644 (file)
index 0000000..459de9a
--- /dev/null
@@ -0,0 +1,169 @@
+.\"    $NetBSD: curses_scroll.3,v 1.4 2003/04/16 13:35:01 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd August 12, 2002
+.Dt CURSES_SCROLL 3
+.Os
+.Sh NAME
+.Nm curses_scroll ,
+.Nm scrl ,
+.Nm wscrl
+.Nm scroll ,
+.Nm scrollok ,
+.Nm setscrreg ,
+.Nm wsetscrreg
+.Nd curses window scrolling routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn scrl "int n"
+.Ft int
+.Fn wscrl "WINDOW *win" "int n"
+.Ft int
+.Fn scroll "WINDOW *win"
+.Ft int
+.Fn scrollok "WINDOW *win" "boolf flag"
+.Ft int
+.Fn setscrreg "int top" "int bottom"
+.Ft int
+.Fn wsetscrreg "WINDOW *win" "int top" "int bottom"
+.Sh DESCRIPTION
+These functions scroll areas on
+.Dv stdscr
+or on the specified window.
+.Pp
+The
+.Fn scrl
+function scrolls
+.Dv stdscr
+by
+.Fa n
+lines.
+If
+.Fa n
+is positive then then
+.Dv stdscr
+is scrolled up.
+.Fa n
+lines are lost from the top of
+.Dv stdscr
+and
+.Fa n
+blank lines are inserted at the bottom.
+If
+.Fa n
+is negative then
+.Dv stdscr
+is scrolled down.
+.Fa n
+blank lines are inserted at the top of
+.Dv stdscr
+and
+.Fa n
+lines are lost from the bottom.
+.Pp
+The
+.Fn wscrl
+function is the same as the
+.Fn scrl
+function, excepting that it scrolls the window specified by
+.Fa win .
+.Pp
+The
+.Fn scroll
+function scrolls the window
+.Fa win
+up by one line.
+.Pp
+The scrolling behaviour of a window can be controlled by using the
+.Fn scrollok
+function.
+If the
+.Fa flag
+argument is
+.Dv TRUE
+then a line wrap at the bottom of the window will cause the window to
+be scrolled up one line, if
+.Fa flag
+is
+.Dv FALSE
+then lines that would force a scroll will be truncated.
+.Pp
+The
+.Fn setscrreg
+function sets up a software scrolling region on
+.Dv stdscr
+which will define a region of the screen that will be scrolled.
+The scrolling of this region is also controlled by the
+.Fn scrollok
+function.
+.Pp
+The
+.Fn wsetscrreg
+function does the same as the
+.Fn setscrreg
+function, except that the scrolling region is set on the window specified by
+.Fa win .
+.Pp
+If a scrolling region has been set with the
+.Fn setscrreg
+or
+.Fn wsetscrreg
+functions and the current cursor position is inside the scrolling region,
+then only the area inside the scrolling region is scrolled.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_deleteln 3 ,
+.Xr curses_insdelln 3 ,
+.Xr curses_insertln 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_standout.3 b/lib/libcurses/curses_standout.3
new file mode 100644 (file)
index 0000000..269b9d4
--- /dev/null
@@ -0,0 +1,104 @@
+.\"    $NetBSD: curses_standout.3,v 1.4 2008/04/30 13:10:51 martin Exp $
+.\" Copyright (c) 2002 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 13, 2002
+.Dt CURSES_STANDOUT 3
+.Os
+.Sh NAME
+.Nm curses_standout ,
+.Nm standout ,
+.Nm standend ,
+.Nm wstandout ,
+.Nm wstandend
+.Nd curses standout attribute manipulation routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn standout void
+.Ft int
+.Fn standend void
+.Ft int
+.Fn wstandout void
+.Ft int
+.Fn wstandend void
+.Sh DESCRIPTION
+These functions manipulate the standout attribute on
+.Dv stdscr
+or on the specified window.
+.Pp
+The
+.Fn standout
+function turns on the standout attribute
+on
+.Dv stdscr .
+The
+.Fn standend
+function turns off the standout attribute
+on
+.Dv stdscr .
+.Pp
+The
+.Fn wstandout
+and
+.Fn wstandend
+functions are equivalent to
+.Fn standout
+and
+.Fn standend ,
+respectively, excepting that the attribute is manipulated on the
+window specified by
+.Fa win .
+.Pp
+The
+.Fn standout
+and
+.Fn standend
+functions are equivalent to
+.Fn attron A_STANDOUT
+and
+.Fn attroff A_STANDOUT ,
+respectively.
+.Sh RETURN VALUES
+These functions always return 1.
+.Sh SEE ALSO
+.Xr curses_attributes 3 ,
+.Xr curses_underscore 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
+.Sh BUGS
+On modern terminals that support other attributes, there is no difference
+between characters displayed with the standout attribute set and those
+displayed with one of the other attributes set (usually bold).
+It is best to avoid using standout if the terminal supports other attributes.
diff --git a/lib/libcurses/curses_termcap.3 b/lib/libcurses/curses_termcap.3
new file mode 100644 (file)
index 0000000..a32f7e8
--- /dev/null
@@ -0,0 +1,103 @@
+.\"    $NetBSD: curses_termcap.3,v 1.4 2003/04/16 13:35:01 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd August 12, 2002
+.Dt CURSES_TERMCAP 3
+.Os
+.Sh NAME
+.Nm curses_termcap ,
+.Nm fullname ,
+.Nm getcap ,
+.Nm longname
+.Nd curses termcap querying routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft char *
+.Fn fullname "char *termbuf" "char *name"
+.Ft char *
+.Fn getcap "char *name"
+.Ft char *
+.Fn longname "void"
+.Sh DESCRIPTION
+The
+.Fn fullname
+function takes the termcap entry in
+.Fa termbuf
+and copies the full name of the terminal from the entry into the
+target variable
+.Fa name .
+The full name of the terminal is assumed to be the last alias in the
+termcap entry name.
+It is assumed that the
+.Fa name
+variable has sufficient storage to hold the full name of the terminal.
+.Pp
+A termcap entry can be retrieved by calling the
+.Fn getcap
+function with the name of the capability in
+.Fa name .
+The matching capability string for the terminal is returned.
+.Pp
+The
+.Fn longname
+function returns a verbose description of the terminal which is taken
+from the last name alias in the termcap description for the terminal.
+This string will be at most 128 characters long and will only be
+defined after a call to
+.Fn initscr
+or
+.Fn newterm .
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr termcap 5
+.Sh STANDARDS
+The
+.Lb libcurses
+library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_touch.3 b/lib/libcurses/curses_touch.3
new file mode 100644 (file)
index 0000000..c5d32a0
--- /dev/null
@@ -0,0 +1,199 @@
+.\"    $NetBSD: curses_touch.3,v 1.8 2010/02/24 13:02:13 drochner Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd February 23, 2010
+.Dt CURSES_TOUCH 3
+.Os
+.Sh NAME
+.Nm curses_touch ,
+.Nm touchline ,
+.Nm touchoverlap ,
+.Nm touchwin ,
+.Nm untouchwin ,
+.Nm wtouchln ,
+.Nm is_linetouched ,
+.Nm is_wintouched ,
+.Nm redrawwin ,
+.Nm wredrawln ,
+.Nm wsyncup ,
+.Nm wsyncdown
+.Nd curses window modification routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn touchline "WINDOW *win" "int start" "int count"
+.Ft int
+.Fn touchoverlap "WINDOW *win1" "WINDOW *win2"
+.Ft int
+.Fn touchwin "WINDOW *win"
+.Ft int
+.Fn untouchwin "WINDOW *win"
+.Ft int
+.Fn wtouchln "WINDOW *win" "int line" "int n" "boolf changed"
+.Ft bool
+.Fn is_linetouched "WINDOW *win" "int line"
+.Ft bool
+.Fn is_wintouched "WINDOW *win"
+.Ft int
+.Fn redrawwin "WINDOW *win"
+.Ft int
+.Fn wredrawln "WINDOW *win" "int line" "int n"
+.Ft void
+.Fn wsyncup "WINDOW *win"
+.Ft void
+.Fn wsyncdown "WINDOW *win"
+.Sh DESCRIPTION
+These functions mark lines and windows as modified and check the modification
+status of lines and windows.
+.Pp
+The
+.Fn touchline
+function marks
+.Fa count
+lines starting from
+.Fa start
+in window
+.Fa win
+as having been modified.
+These characters will be synced to the terminal on the next call to
+.Fn wrefresh .
+.Pp
+The
+.Fn touchoverlap
+function marks the portion of
+.Fa win2
+that overlaps
+.Fa win1
+as being modified.
+.Pp
+The
+.Fn touchwin
+function marks the entire window
+.Fa win
+as having been modified.
+Conversely,
+the
+.Fn untouchwin
+function marks the window
+.Fa win
+as being unmodified, so that any changes made to that window will
+not be synced to the terminal during a
+.Fn wrefresh .
+.Pp
+The
+.Fn wtouchln
+function performs one of two operations on
+.Fa n
+lines starting at
+.Fa line
+in the given window.
+If
+.Fa changed
+is 1 then the given line range is marked as being modified, if
+.Fa changed
+is 0 then the given line range is set to being unmodified.
+.Pp
+The
+.Fn is_linetouched
+function returns
+.Dv TRUE
+if
+.Fa line
+in window
+.Fa win
+has been modified since the last refresh was done, otherwise
+.Dv FALSE
+is returned.
+.Pp
+.Fn is_wintouched
+returns
+.Dv TRUE
+if the window
+.Fa win
+has been modified since the last refresh, otherwise
+.Dv FALSE
+is returned.
+.Pp
+The
+.Fn redrawwin
+function marks the entire window
+.Fa win
+as having been corrupted.
+Is is equivalent to the
+.Fn touchwin
+function.
+.Pp
+The
+.Fn wredrawln
+function marks
+.Fa n
+lines starting at
+.Fa line
+in the given window as corrupted.
+It is equivalent to
+.Fn wtouchln win line n 1 .
+.Pp
+The
+.Fn wsyncup
+function touches all ancestors of
+.Fa win .
+.Pp
+The
+.Fn wsyncdown
+function touches
+.Fa win
+if any of its ancestors is touched.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_refresh 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_tty.3 b/lib/libcurses/curses_tty.3
new file mode 100644 (file)
index 0000000..5c2969d
--- /dev/null
@@ -0,0 +1,360 @@
+.\"    $NetBSD: curses_tty.3,v 1.8 2004/03/16 19:27:35 snj Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd June 13, 2003
+.Dt CURSES_TTY 3
+.Os
+.Sh NAME
+.Nm curses_tty ,
+.Nm beep ,
+.Nm flash ,
+.Nm curs_set ,
+.Nm def_prog_mode ,
+.Nm reset_prog_mode ,
+.Nm def_shell_mode ,
+.Nm reset_shell_mode ,
+.Nm echo ,
+.Nm noecho ,
+.Nm delay_output ,
+.Nm erasechar ,
+.Nm flushinp ,
+.Nm gettmode ,
+.Nm halfdelay ,
+.Nm has_ic ,
+.Nm has_il ,
+.Nm idcok ,
+.Nm idlok ,
+.Nm intrflush ,
+.Nm noqiflush ,
+.Nm qiflush ,
+.Nm killchar ,
+.Nm meta ,
+.Nm napms ,
+.Nm nl ,
+.Nm nonl ,
+.Nm cbreak ,
+.Nm nocbreak ,
+.Nm raw ,
+.Nm noraw ,
+.Nm savetty ,
+.Nm resetty
+.Nd curses terminal manipulation routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn beep "void"
+.Ft int
+.Fn flash "void"
+.Ft int
+.Fn curs_set "int visibility"
+.Ft int
+.Fn def_prog_mode "void"
+.Ft int
+.Fn reset_prog_mode "void"
+.Ft int
+.Fn def_shell_mode "void"
+.Ft int
+.Fn reset_shell_mode "void"
+.Ft int
+.Fn echo "void"
+.Ft int
+.Fn noecho "void"
+.Ft int
+.Fn delay_output "int ms"
+.Ft char
+.Fn erasechar "void"
+.Ft int
+.Fn flushinp "void"
+.Ft int
+.Fn gettmode "void"
+.Ft int
+.Fn has_ic "void"
+.Ft int
+.Fn has_il "void"
+.Ft int
+.Fn idcok "WINDOW *win" "boolf flag"
+.Ft int
+.Fn idlok "WINDOW *win" "boolf flag"
+.Ft int
+.Fn intrflush "WINDOW *win" "boolf flag"
+.Ft void
+.Fn noqiflush "void"
+.Ft void
+.Fn qiflush "void"
+.Ft char
+.Fn killchar "void"
+.Ft int
+.Fn meta "WINDOW *win" "boolf flag"
+.Ft int
+.Fn napms "int ms"
+.Ft int
+.Fn nl "void"
+.Ft int
+.Fn nonl "void"
+.Ft int
+.Fn cbreak "void"
+.Ft int
+.Fn nocbreak "void"
+.Ft int
+.Fn halfdelay "int"
+.Ft int
+.Fn raw "void"
+.Ft int
+.Fn noraw "void"
+.Ft int
+.Fn savetty "void"
+.Ft int
+.Fn resetty "void"
+.Sh DESCRIPTION
+These functions manipulate curses terminal settings.
+.Pp
+The
+.Fn beep
+function rings the terminal bell, if this is possible.
+Failing that, the terminal screen will be flashed.
+If neither of these are possible, then no action will be taken.
+.Fn flash
+will flash the terminal screen if possible.
+Failing that, the terminal bell will be rung.
+If neither of these are possible then no action will be taken.
+.Pp
+The cursor
+visibility can be set by calling
+.Fn curs_set .
+The following visibility settings are valid for
+.Fn curs_set :
+.Pp
+.Bl -tag -width visibility -compact -offset indent
+.It Visibility
+Effect
+.It 0
+cursor is invisible.
+.It 1
+cursor is normal visibility
+.It 2
+cursor is high visibility
+.El
+.Pp
+A successful call to
+.Fn curs_set
+will return the previous visibility setting for the cursor.
+.Pp
+The
+.Fn delay_output
+function pauses the output to the terminal by sending the appropriate
+number of terminal pad characters such that the transmission time of
+the pad characters will take
+.Fa ms
+milliseconds.
+.Pp
+Calling
+.Fn def_prog_mode
+will cause the current terminal curses setting to be saved.
+A subsequent call to
+.Fn reset_prog_mode ,
+will restore the saved settings.
+This is useful when calls to external programs are made that may
+reset the terminal characteristics.
+.Pp
+The
+.Fn def_shell_mode
+function saves the current terminal line settings.
+These settings are the ones that will be restored when the curses
+application exits.
+Conversely,
+.Fn reset_shell_mode
+will save the current terminal curses settings for later restoration and
+restores the previously saved terminal line settings.
+.Pp
+The
+.Fn echo
+function turns on curses echo mode, characters entered will be echoed
+to the terminal by curses.
+The
+.Fn noecho
+function disables this feature.
+.Pp
+The current erase character for the terminal can be determined by
+calling the
+.Fn erasechar
+function.
+.Pp
+The
+.Fn flushinp
+function discards any pending input for the current screen.
+.Pp
+The modes
+for the current terminal can be reset by calling
+.Fn gettmode ,
+this will perform the initialisation on the terminal that is normally
+done by curses at start up.
+.Pp
+The
+.Fn has_ic
+function returns either
+.Dv TRUE
+or
+.Dv FALSE
+depending on whether or not the terminal has a insert character
+capability or not.
+Similarly the
+.Fn has_il
+function does the same test but for a insert line capability.
+.Pp
+The use of the insert character capability in curses operations can be
+enabled or disabled by calling
+.Fn idcok
+on the desired window.
+Similarly, the use of the insert line capability can be controlled using the
+.Fn idlok
+function.
+.Pp
+The
+.Fn intrflush
+function controls whether or not a flush of the input buffer is
+performed when an interrupt key (kill, suspend or quit) is pressed.
+The
+.Fa win
+parameter is ignored.
+The
+.Fn noqiflush
+function is equivalent to
+.Fn intrflush stdscr FALSE .
+The
+.Fn qiflush
+function is equivalent to
+.Fn intrflush stdscr TRUE .
+.Pp
+The character that performs the line kill function can be determined
+by calling the
+.Fn killchar
+function.
+.Pp
+The
+.Fn meta
+function turns on and off the generation of 8 bit characters by the
+terminal, if
+.Fa flag
+is
+.Dv FALSE
+then only 7 bit characters will be returned, if
+.Fa flag
+is
+.Dv TRUE
+then 8 bit characters will be returned by the terminal.
+.Pp
+The
+.Fn napms
+causes the application to sleep for the number of milliseconds
+specified by
+.Fa ms .
+.Pp
+Calling
+.Fn nl
+will cause curses to map all carriage returns to newlines on input,
+this functionality is enabled by default.
+The
+.Fn nonl
+function disables this behaviour.
+.Pp
+The
+.Fn cbreak
+function will put the terminal into cbreak mode, which means that
+characters will be returned one at a time instead of waiting for a
+newline character, line discipline processing will be performed.
+The
+.Fn nocbreak
+function disables this mode.
+.Pp
+Calling
+.Fn halfdelay
+puts the terminal into the same mode as
+.Fn cbreak
+with the exception that if no character is received within the specified
+number of tenths of a second then the input routine will return
+.Er ERR .
+This mode can be cancelled by calling
+.Fn nocbreak .
+The valid range for the timeout is from 1 to 255 tenths of a second.
+.Pp
+The
+.Fn noraw
+function sets the input mode for the current terminal into Cooked mode,
+that is input character translation and signal character processing is
+performed.
+The
+.Fn raw
+function puts the terminal into Raw mode, no input character
+translation is done nor is signal character processing.
+.Pp
+The terminal
+tty flags can be saved by calling
+.Fn savetty
+and may be restored by calling
+.Fn resetty ,
+the use of these functions is discouraged as they may cause the
+terminal to be put into a state that is incompatible with curses
+operation.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr getch 3 ,
+.Xr termios 4
+.Sh NOTES
+The
+.Fn idcok
+and
+.Fn idlok
+currently have no effect on the curses code at all, currently curses
+will always use the terminal insert character and insert line
+capabilities if available.
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/curses_underscore.3 b/lib/libcurses/curses_underscore.3
new file mode 100644 (file)
index 0000000..b0b1498
--- /dev/null
@@ -0,0 +1,100 @@
+.\"    $NetBSD: curses_underscore.3,v 1.5 2008/04/30 13:10:51 martin Exp $
+.\" Copyright (c) 2002 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Julian Coleman.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd October 13, 2002
+.Dt CURSES_UNDERSCORE 3
+.Os
+.Sh NAME
+.Nm curses_underscore ,
+.Nm underscore ,
+.Nm underend ,
+.Nm wunderscore ,
+.Nm wunderend
+.Nd curses underscore attribute manipulation routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fn underscore void
+.Ft int
+.Fn underend void
+.Ft int
+.Fn wunderscore void
+.Ft int
+.Fn wunderend void
+.Sh DESCRIPTION
+These functions manipulate the underscore attribute on
+.Dv stdscr
+or on the specified window.
+.Pp
+The
+.Fn underscore
+function turns on the underscore attribute
+on
+.Dv stdscr .
+The
+.Fn underend
+function turns off the underscore attribute on
+.Dv stdscr .
+.Pp
+The
+.Fn wunderscore
+and
+.Fn wunderend
+functions
+are equivalent to
+.Fn underscore
+and
+.Fn underend ,
+respectively, excepting that the attribute is manipulated on the
+window specified by
+.Fa win .
+.Pp
+The
+.Fn underscore
+and
+.Fn underend
+functions
+are equivalent to
+.Fn wattron A_UNDERLINE
+and
+.Fn wattroff A_UNDERLINE ,
+respectively.
+.Sh RETURN VALUES
+These functions always return 1.
+.Sh SEE ALSO
+.Xr curses_attributes 3 ,
+.Xr curses_standout 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+These functions first appeared in
+.Nx 1.5 .
diff --git a/lib/libcurses/curses_window.3 b/lib/libcurses/curses_window.3
new file mode 100644 (file)
index 0000000..cb1a301
--- /dev/null
@@ -0,0 +1,259 @@
+.\"    $NetBSD: curses_window.3,v 1.13 2009/05/18 09:30:31 wiz Exp $
+.\"
+.\" Copyright (c) 2002
+.\"    Brett Lymn (blymn@NetBSD.org, brett_lymn@yahoo.com.au)
+.\"
+.\" This code is donated to the NetBSD Foundation by the Author.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 3. The name of the Author may not be used to endorse or promote
+.\"    products derived from this software without specific prior written
+.\"    permission.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\"
+.Dd March 31, 2008
+.Dt CURSES_WINDOW 3
+.Os
+.Sh NAME
+.Nm curses_window ,
+.Nm copywin ,
+.Nm dupwin ,
+.Nm delwin ,
+.Nm derwin ,
+.Nm mvwin ,
+.Nm mvderwin ,
+.Nm newwin ,
+.Nm overlay ,
+.Nm overwrite ,
+.Nm subwin ,
+.Nm wresize
+.Nd curses window routines
+.Sh LIBRARY
+.Lb libcurses
+.Sh SYNOPSIS
+.In curses.h
+.Ft int
+.Fo copywin
+.Fa "WINDOW *source"
+.Fa "WINDOW *dest"
+.Fa "int sminrow"
+.Fa "int smincol"
+.Fa "int dminrow"
+.Fa "int dmincol"
+.Fa "int dmaxrow"
+.Fa "int dmaxcol"
+.Fa "int overlay"
+.Fc
+.Ft WINDOW *
+.Fn dupwin "WINDOW *win"
+.Ft WINDOW *
+.Fn derwin "WINDOW *win" "int lines" "int cols" "int y" "int x"
+.Ft int
+.Fn delwin "WINDOW *win"
+.Ft int
+.Fn mvwin "WINDOW *win" "int y" "int x"
+.Ft int
+.Fn mvderwin "WINDOW *win" "int y" "int x"
+.Ft WINDOW *
+.Fn newwin "int lines" "int cols" "int begin_y" "int begin_x"
+.Ft WINDOW *
+.Fn subwin "WINDOW *win" "int lines" "int cols" "int begin_y" "int begin_x"
+.Ft int
+.Fn overlay "WINDOW *source" "WINDOW *dest"
+.Ft int
+.Fn overwrite "WINDOW *source" "WINDOW *dest"
+.Ft int
+.Fn wresize "WINDOW *win" "int lines" "int cols"
+.Sh DESCRIPTION
+These functions create, modify and delete windows on the current screen.
+.Pp
+The contents of a window may be copied to another window by using the
+.Fn copywin
+function, a section of the destination window
+.Fa dest
+bounded by
+.Fa (dminrow ,
+.Fa dmincol )
+and
+.Fa (dmaxrow ,
+.Fa dmaxcol )
+will be overwritten with the contents of the window
+.Fa source
+starting at the coordinates
+.Fa (sminrow ,
+.Fa smincol ) .
+If the
+.Fa overlay
+flag is
+.Dv TRUE
+then only non-blank characters from
+.Fa source
+will be copied to
+.Fa dest ,
+if
+.Fa overlay
+is
+.Dv FALSE
+then all characters from
+.Fa source
+will be copied to
+.Fa dest .
+If the bounding rectangles of either the source or the destination
+windows lay outside the maximum size of the respective windows then
+the size of the window copied will be adjusted to be within the bounds
+of both the source and destination windows.
+.Pp
+The
+.Fn dupwin
+function creates an exact duplicate of
+.Fa win
+and returns a pointer to it.
+.Pp
+Calling
+.Fn derwin
+will create a subwindow of
+.Fa win
+in the same manner as
+.Fn subwin
+excepting that the starting column and row
+.Fa y ,
+.Fa x
+are relative to the parent window origin.
+.Pp
+A window may deleted and all resources freed by calling the
+.Fn delwin
+function with the pointer to the window to be deleted in
+.Fa win .
+.Pp
+A window can be moved to a new position by calling the
+.Fn mvwin
+function.
+The
+.Fa y
+and
+.Fa x
+positions are the new origin of the window on the screen.
+If the new position would cause the any part of the window to lie outside
+the screen, it is an error and the window is not moved.
+.Pp
+A subwindow can be moved relative to the parent window by calling the
+.Fn mvderwin
+function, the
+.Fa y
+and
+.Fa x
+positions are relative to the origin of the parent window.
+If the given window in
+.Fa win
+is not a subwindow then an error will be returned.
+If the new position would cause the any part of the window to lie outside
+the parent window, it is an error and the window is not moved.
+.Pp
+The
+.Fn newwin
+function creates a new window of size
+.Fa lines ,
+.Fa cols
+with an origin at
+.Fa begin_y ,
+.Fa begin_x .
+If
+.Fa lines
+is less than or equal to zero then the number of rows
+for the window is set to
+.Dv LINES -
+.Fa begin_x
++
+.Fa lines .
+Similarly if
+.Fa cols
+is less than or equal to zero then the number of columns
+for the window is set to
+.Dv COLS -
+.Fa begin_y
++
+.Fa cols .
+.Pp
+.Fn subwin
+is similar to
+.Fn newwin
+excepting that the size of the subwindow is bounded by the parent
+window
+.Fa win .
+The subwindow shares internal data structures with the parent window
+and will be refreshed when the parent window is refreshed.
+The subwindow inherits the background character and attributes of the
+parent window.
+.Pp
+The
+.Fn overlay
+function copies the contents of the source window
+.Fa source
+to the destination window
+.Fa dest ,
+only the characters that are not the background character in the
+source window are copied to the destination.
+The windows need not be the same size, only the overlapping portion of both
+windows will be copied.
+The
+.Fn overwrite
+function performs the same functions as
+.Fn overlay
+excepting that characters from the source window are copied to the
+destination without exception.
+.Pp
+.Fn wresize
+resizes the specified window to the new number of lines and columns
+given, all internal curses structures are resized.
+Any subwindows of the specified window will also be resized if any part
+of them falls outside the new parent window size.
+The application must redraw the window after it has been resized.
+Note that
+.Dv curscr
+and
+.Dv stdscr
+can not be resized to be larger than the size of the screen.
+.Sh RETURN VALUES
+Functions returning pointers will return
+.Dv NULL
+if an error is detected.
+The functions that return an int will return one of the following
+values:
+.Pp
+.Bl -tag -width ERR -compact
+.It Er OK
+The function completed successfully.
+.It Er ERR
+An error occurred in the function.
+.El
+.Sh SEE ALSO
+.Xr curses_fileio 3 ,
+.Xr curses_pad 3 ,
+.Xr curses_screen 3
+.Sh STANDARDS
+The
+.Nx
+Curses library complies with the X/Open Curses specification, part of the
+Single Unix Specification.
+.Sh HISTORY
+The Curses package appeared in
+.Bx 4.0 .
diff --git a/lib/libcurses/cursesio.c b/lib/libcurses/cursesio.c
deleted file mode 100644 (file)
index faf7208..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-#include <stdlib.h>
-#include <termcap.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <curses.h>
-#include "curspriv.h"
-
-struct termios _orig_tty, _tty;
-cursv _cursvar;
-
-WINDOW *stdscr, *curscr;
-int LINES, COLS;
-bool NONL;
-
-char termcap[1024];            /* termcap buffer */
-char tc[200];                  /* area to hold string capabilities */
-char *ttytype;                 /* terminal type from env */
-static char *arp;              /* pointer for use in tgetstr */
-char *cp;                      /* character pointer */
-
-char *cl;                      /* clear screen capability */
-char *cm;                      /* cursor motion capability */
-char *so;                      /* start standout capability */
-char *se;                      /* end standout capability */
-char *mr;                      /* start of reverse */
-char *me;                      /* revert to normal */
-char *mb;                      /* start of blink */
-char *md;                      /* start of bold */
-char *us;                      /* start of underscore */
-char *ue;                      /* end of underscore */
-char *vi;                      /* cursor invisible */
-char *ve;                      /* cursor normal */
-char *vs;                      /* cursor good visible */
-char *as;                      /* alternative charset start */
-char *ae;                      /* alternative charset end */
-char *bl;                      /* ring the bell */
-char *vb;                      /* visual bell */
-
-/* fatal - report error and die. Never returns */
-void fatal(s)
-char *s;
-{
-  (void) fprintf(stderr, "curses: %s\n", s);
-  exit(1);
-}
-
-/* Outc - call putchar, necessary because putchar is a macro. */
-void outc(c)
-int c;
-{
-  (void) putchar(c);
-}
-
-/* Move cursor to r,c */
-void poscur(r, c)
-int r, c;
-{
-  tputs(tgoto(cm, c, r), 1, outc);
-}
-
-/* Clear the screen */
-void clrscr()
-{
-  tputs(cl, 1, outc);
-}
-
-/* This are terminal independent characters which can be used in curses */
-
-unsigned int ACS_ULCORNER;
-unsigned int ACS_LLCORNER;
-unsigned int ACS_URCORNER;
-unsigned int ACS_LRCORNER;
-unsigned int ACS_RTEE;
-unsigned int ACS_LTEE;
-unsigned int ACS_BTEE;
-unsigned int ACS_TTEE;
-unsigned int ACS_HLINE;
-unsigned int ACS_VLINE;
-unsigned int ACS_PLUS;
-unsigned int ACS_S1;
-unsigned int ACS_S9;
-unsigned int ACS_DIAMOND;
-unsigned int ACS_CKBOARD;
-unsigned int ACS_DEGREE;
-unsigned int ACS_PLMINUS;
-unsigned int ACS_BULLET;
-unsigned int ACS_LARROW;
-unsigned int ACS_RARROW;
-unsigned int ACS_DARROW;
-unsigned int ACS_UARROW;
-unsigned int ACS_BOARD;
-unsigned int ACS_LANTERN;
-unsigned int ACS_BLOCK;
-
-/* These defines describe the full set of grafic block characters which
- * can be defined via termcap.
- */
-
-#define RIGHTARROW  0
-#define LEFTARROW   1
-#define DOWNARROW   2
-#define UPARROW     3
-#define FULLSQUARE  4
-#define GREYSQUARE  5
-#define EMPTYSQUARE 6
-#define LATERN      7
-#define DIAMOND     8
-#define DEGREE      9
-#define PLUSMINUS  10
-#define DOWNRIGHT  11
-#define UPRIGHT    12
-#define UPLEFT     13
-#define DOWNLEFT   14
-#define CROSS      15
-#define UPLINE     16
-#define UPMIDLINE  17
-#define MIDLINE    18
-#define DOMIDLINE  19
-#define DOWNLINE   20
-#define TEELEFT    21
-#define TEERIGHT   22
-#define TEEHEAD    23
-#define TEENORMAL  24
-#define VERTLINE   25
-#define PARAGRAPH  26
-
-unsigned int _cursgraftable[27] =
-{
- '>', '<', 'v', '^', '#', ':', ' ', '#', '+', '\'', '#', '+', '+',
- '+', '+', '+', '-', ' ', '-', ' ', '_', '+', '+', '+', '+', '|'
-};
-char _cursident[28] = "+,.-0ahI`fgjklmnopqrstuvwx~";
-
-int setterm(type)
-char *type;
-{
-  unsigned char *ac;
-  int i;
-#ifdef TIOCGWINSZ
-  struct winsize wsize;
-#endif
-
-  if (tgetent(termcap, type) != 1) return ERR;
-
-#ifdef TIOCGWINSZ
-  if (ioctl(0, TIOCGWINSZ, &wsize) == 0) {
-       LINES = wsize.ws_row != 0 ? wsize.ws_row : tgetnum("li");
-       COLS = wsize.ws_col != 0 ? wsize.ws_col : tgetnum("co");
-  } else {
-#endif
-       LINES = tgetnum("li");
-       COLS = tgetnum("co");
-#ifdef TIOCGWINSZ
-  }
-#endif
-  arp = tc;
-  cl = tgetstr("cl", &arp);
-  so = tgetstr("so", &arp);
-  se = tgetstr("se", &arp);
-  cm = tgetstr("cm", &arp);
-  mr = tgetstr("mr", &arp);
-  me = tgetstr("me", &arp);
-  mb = tgetstr("mb", &arp);
-  md = tgetstr("md", &arp);
-  us = tgetstr("us", &arp);
-  ue = tgetstr("ue", &arp);
-  vi = tgetstr("vi", &arp);
-  ve = tgetstr("ve", &arp);
-  vs = tgetstr("vs", &arp);
-  as = tgetstr("as", &arp);
-  ae = tgetstr("ae", &arp);
-  ac = (unsigned char *) tgetstr("ac", &arp);
-  bl = tgetstr("bl", &arp);
-  vb = tgetstr("vb", &arp);
-
-  if (ac) {
-       while (*ac) {
-               i = 0;
-               while (*ac != _cursident[i]) i++;
-               _cursgraftable[i] = *++ac | A_ALTCHARSET;
-               ac++;
-       }
-  }
-
-  ACS_ULCORNER = _cursgraftable[UPLEFT];
-  ACS_LLCORNER = _cursgraftable[DOWNLEFT];
-  ACS_URCORNER = _cursgraftable[UPRIGHT];
-  ACS_LRCORNER = _cursgraftable[DOWNRIGHT];
-  ACS_RTEE = _cursgraftable[TEERIGHT];
-  ACS_LTEE = _cursgraftable[TEELEFT];
-  ACS_BTEE = _cursgraftable[TEEHEAD];
-  ACS_TTEE = _cursgraftable[TEENORMAL];
-  ACS_HLINE = _cursgraftable[MIDLINE];
-  ACS_VLINE = _cursgraftable[VERTLINE];
-  ACS_PLUS = _cursgraftable[CROSS];
-  ACS_S1 = _cursgraftable[UPLINE];
-  ACS_S9 = _cursgraftable[DOWNLINE];
-  ACS_DIAMOND = _cursgraftable[DIAMOND];
-  ACS_CKBOARD = _cursgraftable[GREYSQUARE];
-  ACS_DEGREE = _cursgraftable[DEGREE];
-  ACS_PLMINUS = _cursgraftable[PLUSMINUS];
-  ACS_BULLET = 'o';            /* where the hell is a bullet defined in
-                        * termcap ??? */
-  ACS_LARROW = _cursgraftable[LEFTARROW];
-  ACS_RARROW = _cursgraftable[RIGHTARROW];
-  ACS_DARROW = _cursgraftable[DOWNARROW];
-  ACS_UARROW = _cursgraftable[UPARROW];
-  ACS_BOARD = _cursgraftable[EMPTYSQUARE];
-  ACS_LANTERN = _cursgraftable[LATERN];
-  ACS_BLOCK = _cursgraftable[FULLSQUARE];
-  /* Wow, I got it! */
-  return OK;
-}
-
-void gettmode()
-{
-  tcgetattr(0, &_orig_tty);
-  tcgetattr(0, &_tty);
-  _cursvar.echoit = (_tty.c_lflag & ECHO) != 0;
-  _cursvar.rawmode = (_tty.c_lflag & (ICANON|ISIG)) == 0;
-  _cursvar.cbrkmode = (_tty.c_lflag & (ICANON|ISIG)) == ISIG;
-  NONL = (_tty.c_iflag & ICRNL) != 0;
-}
diff --git a/lib/libcurses/curspriv.h b/lib/libcurses/curspriv.h
deleted file mode 100644 (file)
index 9fd616b..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Constants */
-#define        _SUBWIN         1               /* window is a subwindow */
-#define        _ENDLINE        2               /* last winline is last screen line */
-#define        _FULLWIN        4               /* window fills screen */
-#define        _SCROLLWIN      8               /* window lwr rgt is screen lwr rgt */
-
-#define        _NO_CHANGE      (-1)            /* flags line edge unchanged */
-#define        _BREAKCHAR      0x03            /* ^C character */
-#define _DCCHAR                0x08            /* Delete Char char (BS) */
-#define _DLCHAR                0x1b            /* Delete Line char (ESC) */
-#define        _GOCHAR         0x11            /* ^Q character */
-#define        _PRINTCHAR      0x10            /* ^P character */
-#define        _STOPCHAR       0x13            /* ^S character */
-#define         NUNGETCH       10              /* max # chars to ungetch() */
-
-#define max(a,b) (((a) > (b)) ? (a) : (b))
-#define min(a,b) (((a) < (b)) ? (a) : (b))
-
-/* Character mask definitions. */
-#define CHR_MSK        ((int) 0x00ff)          /* ASCIIZ character mask */
-#define        ATR_MSK ((int) 0xff00)          /* attribute mask */
-#define ATR_NRM        ((int) 0x0000)          /* no special attributes */
-
-/* Type declarations. */
-
-typedef        struct {
-  WINDOW  *tmpwin;                     /* window used for updates */
-  int     cursrow;                     /* position of physical cursor */
-  int     curscol;
-  bool     rawmode;
-  bool     cbrkmode;
-  bool     echoit;
-} cursv;
-
-/* External variables */
-extern cursv   _cursvar;               /* curses variables */
diff --git a/lib/libcurses/delch.c b/lib/libcurses/delch.c
new file mode 100644 (file)
index 0000000..c41d1bd
--- /dev/null
@@ -0,0 +1,147 @@
+/*     $NetBSD: delch.c,v 1.22 2009/07/22 16:57:14 roy Exp $   */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)delch.c    8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: delch.c,v 1.22 2009/07/22 16:57:14 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+/*
+ * delch --
+ *     Do a delete-char on the line, leaving (cury, curx) unchanged.
+ */
+int
+delch(void)
+{
+       return wdelch(stdscr);
+}
+
+/*
+ * mvdelch --
+ *     Do a delete-char on the line at (y, x) on stdscr.
+ */
+int
+mvdelch(int y, int x)
+{
+       return mvwdelch(stdscr, y, x);
+}
+
+/*
+ * mvwdelch --
+ *     Do a delete-char on the line at (y, x) of the given window.
+ */
+int
+mvwdelch(WINDOW *win, int y, int x)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wdelch(win);
+}
+
+#endif
+
+/*
+ * wdelch --
+ *     Do a delete-char on the line, leaving (cury, curx) unchanged.
+ */
+int
+wdelch(WINDOW *win)
+{
+       __LDATA *end, *temp1, *temp2;
+
+#ifndef HAVE_WCHAR
+       end = &win->alines[win->cury]->line[win->maxx - 1];
+       temp1 = &win->alines[win->cury]->line[win->curx];
+       temp2 = temp1 + 1;
+       while (temp1 < end) {
+               (void) memcpy(temp1, temp2, sizeof(__LDATA));
+               temp1++, temp2++;
+       }
+       temp1->ch = win->bch;
+       if (__using_color && win != curscr)
+               temp1->attr = win->battr & __COLOR;
+       else
+               temp1->attr = 0;
+       __touchline(win, (int) win->cury, (int) win->curx, (int) win->maxx - 1);
+       return (OK);
+#else
+       int cw, sx;
+       nschar_t *np, *tnp;
+
+       end = &win->alines[win->cury]->line[win->maxx - 1];
+       sx = win->curx;
+       temp1 = &win->alines[win->cury]->line[win->curx];
+       cw = WCOL( *temp1 );
+       if ( cw < 0 ) {
+               temp1 += cw;
+               sx += cw;
+               cw = WCOL( *temp1 );
+       }
+       np = temp1->nsp;
+       if (np) {
+               while ( np ) {
+                       tnp = np->next;
+                       free( np );
+                       np = tnp;
+               }
+               temp1->nsp = NULL;
+       }
+       if ( sx + cw < win->maxx ) {
+               temp2 = temp1 + cw;
+               while ( temp1 < end - ( cw - 1 )) {
+                       ( void )memcpy( temp1, temp2, sizeof( __LDATA ));
+                       temp1++, temp2++;
+               }
+       }
+       while ( temp1 <= end ) {
+               temp1->ch = ( wchar_t )btowc(( int ) win->bch );
+               temp1->attr = 0;
+               if (_cursesi_copy_nsp(win->bnsp, temp1) == ERR)
+                       return ERR;
+               SET_WCOL(*temp1, 1);
+               temp1++;
+       }
+       __touchline(win, (int) win->cury, sx, (int) win->maxx - 1);
+       return (OK);
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/deleteln.c b/lib/libcurses/deleteln.c
new file mode 100644 (file)
index 0000000..355d5f8
--- /dev/null
@@ -0,0 +1,65 @@
+/*     $NetBSD: deleteln.c,v 1.14 2003/08/07 16:44:21 agc Exp $        */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)deleteln.c 8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: deleteln.c,v 1.14 2003/08/07 16:44:21 agc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+/*
+ * deleteln --
+ *     Delete a line from stdscr.  It leaves (cury, curx) unchanged.
+ */
+int
+deleteln(void)
+{
+       return(winsdelln(stdscr, -1));
+}
+
+#endif
+
+/*
+ * wdeleteln --
+ *     Delete a line from the screen.  It leaves (cury, curx) unchanged.
+ */
+int
+wdeleteln(WINDOW *win)
+{
+       return(winsdelln(win, -1));
+}
diff --git a/lib/libcurses/delwin.c b/lib/libcurses/delwin.c
new file mode 100644 (file)
index 0000000..fbe77c4
--- /dev/null
@@ -0,0 +1,113 @@
+/*     $NetBSD: delwin.c,v 1.17 2009/07/22 16:57:14 roy Exp $  */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)delwin.c   8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: delwin.c,v 1.17 2009/07/22 16:57:14 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * delwin --
+ *     Delete a window and release it back to the system.
+ */
+int
+delwin(WINDOW *win)
+{
+       WINDOW *wp, *np;
+       struct __winlist *wl, *pwl;
+       SCREEN *screen;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "delwin(%p)\n", win);
+#endif
+       /*
+        * Free any storage used by non-spacing characters in the window.
+        */
+#ifdef HAVE_WCHAR
+       __cursesi_win_free_nsp(win);
+#endif
+
+       if (win->orig == NULL) {
+               /*
+                * If we are the original window, delete the space for all
+                * the subwindows and the window space.
+                */
+               free(win->wspace);
+               wp = win->nextp;
+               while (wp != win) {
+                       np = wp->nextp;
+                       delwin(wp);
+                       wp = np;
+               }
+               /* Remove ourselves from the list of windows on the screen. */
+               pwl = NULL;
+               screen = win->screen;
+               for (wl = screen->winlistp; wl; pwl = wl, wl = wl->nextp) {
+                       if (wl->winp != win)
+                               continue;
+                       if (pwl != NULL)
+                               pwl->nextp = wl->nextp;
+                       else
+                               screen->winlistp = wl->nextp;
+                       free(wl);
+                       break;
+               }
+       } else {
+               /*
+                * If we are a subwindow, take ourselves out of the list.
+                * NOTE: if we are a subwindow, the minimum list is orig
+                * followed by this subwindow, so there are always at least
+                * two windows in the list.
+                */
+               for (wp = win->nextp; wp->nextp != win; wp = wp->nextp)
+                       continue;
+               wp->nextp = win->nextp;
+       }
+       free(win->lspace);
+       free(win->alines);
+       if (win == _cursesi_screen->curscr)
+               _cursesi_screen->curscr = NULL;
+       if (win == _cursesi_screen->stdscr)
+               _cursesi_screen->stdscr = NULL;
+       if (win == _cursesi_screen->__virtscr)
+               _cursesi_screen->__virtscr = NULL;
+       free(win);
+       return (OK);
+}
diff --git a/lib/libcurses/echo_wchar.c b/lib/libcurses/echo_wchar.c
new file mode 100644 (file)
index 0000000..a7a9e7c
--- /dev/null
@@ -0,0 +1,97 @@
+/*   $NetBSD: echo_wchar.c,v 1.2 2007/05/28 15:01:55 blymn Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: echo_wchar.c,v 1.2 2007/05/28 15:01:55 blymn Exp $");
+#endif                                           /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * echo_wchar --
+ *     Echo wide character and attributes on stdscr and refresh stdscr.
+ */
+int
+echo_wchar(const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wecho_wchar(stdscr, wch);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * echo_wchar --
+ *     Echo wide character and attributes on "win" and refresh "win".
+ */
+int
+wecho_wchar(WINDOW *win, const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       int retval;
+
+       retval = wadd_wch(win, wch);
+       if (retval == OK)
+                retval = wrefresh(win);
+       return retval;
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * pecho_wchar --
+ *     Echo character and attributes on "pad" and refresh "pad" at
+ *     its previous position on the screen.
+ */
+int
+pecho_wchar(WINDOW *pad, const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       int retval;
+
+       retval = wadd_wch(pad, wch);
+       if (retval == OK)
+                retval = prefresh(pad, pad->pbegy, pad->pbegx,
+                       pad->sbegy, pad->sbegx, pad->smaxy, pad->smaxx);
+       return retval;
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/echochar.c b/lib/libcurses/echochar.c
new file mode 100644 (file)
index 0000000..a615fc7
--- /dev/null
@@ -0,0 +1,83 @@
+/*     $NetBSD: echochar.c,v 1.2 2008/04/29 06:53:01 martin Exp $      */
+
+/*-
+ * Copyright (c) 2004 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: echochar.c,v 1.2 2008/04/29 06:53:01 martin Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+/*
+ * echochar --
+ *     Echo character and attributes on stdscr and refresh stdscr.
+ */
+int
+echochar(const chtype ch)
+{
+
+       return wechochar(stdscr, ch);
+}
+#endif /* _CURSES_USE_MACROS */
+
+/*
+ * echochar --
+ *     Echo character and attributes on "win" and refresh "win".
+ */
+int
+wechochar(WINDOW *win, const chtype ch)
+{
+       int retval;
+
+       retval = waddch(win, ch);
+       if (retval == OK)
+                retval = wrefresh(win);
+       return retval;
+}
+
+/*
+ * pechochar --
+ *     Echo character and attributes on "pad" and refresh "pad" at
+ *     its previous position on the screen.
+ */
+int
+pechochar(WINDOW *pad, const chtype ch)
+{
+       int retval;
+
+       retval = waddch(pad, ch);
+       if (retval == OK)
+                retval = prefresh(pad, pad->pbegy, pad->pbegx,
+                   pad->sbegy, pad->sbegx, pad->smaxy, pad->smaxx);
+       return retval;
+}
diff --git a/lib/libcurses/endwin.c b/lib/libcurses/endwin.c
deleted file mode 100644 (file)
index 269cbfa..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-#include <termcap.h>
-
-int endwin()
-{
-  extern char *me;
-
-  curs_set(1);
-  poscur(LINES - 1, 0);
-  refresh();
-  tputs(me, 1, outc);
-  delwin(stdscr);
-  delwin(curscr);
-  delwin(_cursvar.tmpwin);
-  resetty();
-  return(OK);
-}
diff --git a/lib/libcurses/erase.c b/lib/libcurses/erase.c
new file mode 100644 (file)
index 0000000..9b6983a
--- /dev/null
@@ -0,0 +1,107 @@
+/*     $NetBSD: erase.c,v 1.24 2009/07/22 16:57:14 roy Exp $   */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)erase.c    8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: erase.c,v 1.24 2009/07/22 16:57:14 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * erase --
+ *     Erases everything on stdscr.
+ */
+int
+erase(void)
+{
+       return werase(stdscr);
+}
+
+#endif
+
+/*
+ * werase --
+ *     Erases everything on the window.
+ */
+int
+werase(WINDOW *win)
+{
+
+       int     y;
+       __LDATA *sp, *end, *start;
+       attr_t  attr;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_ERASE, "werase: (%p)\n", win);
+#endif
+       if (__using_color && win != curscr)
+               attr = win->battr & __COLOR;
+       else
+               attr = 0;
+       for (y = 0; y < win->maxy; y++) {
+               start = win->alines[y]->line;
+               end = &start[win->maxx];
+               for (sp = start; sp < end; sp++)
+#ifndef HAVE_WCHAR
+                       if (sp->ch != win->bch || sp->attr != 0) {
+#else
+                       if (sp->ch != ( wchar_t )btowc(( int ) win->bch ) ||
+                           (sp->attr & WA_ATTRIBUTES) != 0 || sp->nsp) {
+#endif /* HAVE_WCHAR */
+                               sp->attr = attr;
+#ifdef HAVE_WCHAR
+                               sp->ch = ( wchar_t )btowc(( int ) win->bch);
+                               if (_cursesi_copy_nsp(win->bnsp, sp) == ERR)
+                                       return ERR;
+                               SET_WCOL( *sp, 1 );
+#else
+                               sp->ch = win->bch;
+#endif /* HAVE_WCHAR */
+                       }
+       }
+       /*
+        * Mark the whole window as changed in case we have overlapping
+        * windows - this will result in the (intended) clearing of the
+        * screen over the area covered by the window. */
+       __touchwin(win);
+       wmove(win, 0, 0);
+       return (OK);
+}
diff --git a/lib/libcurses/fileio.c b/lib/libcurses/fileio.c
new file mode 100644 (file)
index 0000000..4065fc1
--- /dev/null
@@ -0,0 +1,249 @@
+/*     $NetBSD: fileio.c,v 1.4 2009/07/22 16:57:14 roy Exp $   */
+
+/*-
+ * Copyright (c) 2008 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: fileio.c,v 1.4 2009/07/22 16:57:14 roy Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+#include "fileio.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef HAVE_WCHAR
+static int __putnsp(nschar_t *, FILE *);
+static int __getnsp(nschar_t *, FILE *);
+#endif /* HAVE_WCHAR */
+
+#ifdef HAVE_WCHAR
+/*
+ * __putnsp --
+ *     Write non-spacing character chain to file, consisting of:
+ *     ((int) 1, (wchar_t) ch) pairs followed by (int) 0.
+ */
+static int
+__putnsp(nschar_t *nsp, FILE *fp)
+{
+       int n;
+
+       n = 1;
+       while (nsp != NULL) {
+               if (fwrite(&n, sizeof(int), 1, fp) != 1)
+                       return ERR;
+               if (fwrite(&nsp->ch, sizeof(wchar_t), 1, fp) != 1)
+                       return ERR;
+       }
+       n = 0;
+       if (fwrite(&n, sizeof(int), 1, fp) != 1)
+               return ERR;
+
+       return OK;
+}
+#endif /* HAVE_WCHAR */
+
+/*
+ * putwin --
+ *     Write window data to file
+ */
+int
+putwin(WINDOW *win, FILE *fp)
+{
+       int major = CURSES_LIB_MAJOR;
+       int minor = CURSES_LIB_MINOR;
+       int y, x;
+       __LDATA *sp;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_FILEIO, "putwin: win %p\n", win);
+#endif
+
+       if (win == NULL)
+               return ERR;
+
+       /* win can't be a subwin */
+       if (win->orig != NULL)
+               return ERR;
+
+       /* Library version */
+       if (fwrite(&major, sizeof(int), 1, fp) != 1)
+               return ERR;
+       if (fwrite(&minor, sizeof(int), 1, fp) != 1)
+               return ERR;
+
+       /* Window parameters */
+       if (fwrite(win, sizeof(WINDOW), 1, fp) != 1)
+               return ERR;
+#ifdef HAVE_WCHAR
+       /* Background non-spacing character */
+       if (__putnsp(win->bnsp, fp) == ERR)
+               return ERR;
+#endif /* HAVE_WCHAR */
+
+       /* Lines and line data */
+       for (y = 0; y < win->maxy; y++)
+               for (sp = win->alines[y]->line, x = 0; x < win->maxx;
+                   x++, sp++) {
+                       if (fwrite(&sp->ch, sizeof(wchar_t), 1, fp) != 1)
+                               return ERR;
+                       if (fwrite(&sp->attr, sizeof(attr_t), 1, fp) != 1)
+                               return ERR;
+#ifdef HAVE_WCHAR
+                       if (sp->nsp != NULL) {
+                               if (__putnsp(win->bnsp, fp) == ERR)
+                                       return ERR;
+                       }
+#endif /* HAVE_WCHAR */
+               }
+
+       return OK;
+}
+
+#ifdef HAVE_WCHAR
+/*
+ * __getnsp --
+ *     Read non-spacing character chain from file
+ */
+static int
+__getnsp(nschar_t *nsp, FILE *fp)
+{
+       int n;
+       nschar_t *onsp, *tnsp;
+
+       if (fread(&n, sizeof(int), 1, fp) != 1)
+               return ERR;
+       onsp = nsp;
+       while (n != 0) {
+               tnsp = (nschar_t *)malloc(sizeof(nschar_t));
+               if (tnsp == NULL) {
+                       __cursesi_free_nsp(nsp);
+                       return OK;
+               }
+               if (fread(&tnsp->ch, sizeof(wchar_t), 1, fp) != 1) {
+                       __cursesi_free_nsp(nsp);
+                       return OK;
+               }
+               tnsp->next = NULL;
+               onsp->next = tnsp;
+               onsp = onsp->next;
+               if (fread(&n, sizeof(int), 1, fp) != 1) {
+                       __cursesi_free_nsp(nsp);
+                       return ERR;
+               }
+       }
+       return OK;
+}
+#endif /* HAVE_WCHAR */
+
+/*
+ * getwin --
+ *     Read window data from file
+ */
+WINDOW *
+getwin(FILE *fp)
+{
+       int major, minor;
+       WINDOW *wtmp, *win;
+       int y, x;
+       __LDATA *sp;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_FILEIO, "getwin\n");
+#endif
+
+       /* Check library version */
+       if (fread(&major, sizeof(int), 1, fp) != 1)
+               return NULL;
+       if (fread(&minor, sizeof(int), 1, fp) != 1)
+               return NULL;
+       if(major != CURSES_LIB_MAJOR || minor != CURSES_LIB_MINOR)
+               return NULL;
+
+       /* Window parameters */
+       wtmp = (WINDOW *)malloc(sizeof(WINDOW));
+       if (wtmp == NULL)
+               return NULL;
+       if (fread(wtmp, sizeof(WINDOW), 1, fp) != 1)
+               goto error0;
+       win = __newwin(_cursesi_screen, wtmp->maxy, wtmp->maxx,
+           wtmp->begy, wtmp->begx, FALSE);
+       if (win == NULL)
+               goto error0;
+       win->cury = wtmp->cury;
+       win->curx = wtmp->curx;
+       win->reqy = wtmp->reqy;
+       win->reqx = wtmp->reqx;
+       win->flags = wtmp->flags;
+       win->delay = wtmp->delay;
+       win->wattr = wtmp->wattr;
+       win->bch = wtmp->bch;
+       win->battr = wtmp->battr;
+       win->scr_t = wtmp->scr_t;
+       win->scr_b = wtmp->scr_b;
+       free(wtmp);
+       wtmp = NULL;
+       __swflags(win);
+
+#ifdef HAVE_WCHAR
+       if (__getnsp(win->bnsp, fp) == ERR)
+               goto error1;
+#endif /* HAVE_WCHAR */
+
+       /* Lines and line data */
+       for (y = 0; y < win->maxy; y++) {
+               for (sp = win->alines[y]->line, x = 0; x < win->maxx;
+                   x++, sp++) {
+                       if (fread(&sp->ch, sizeof(wchar_t), 1, fp) != 1)
+                               goto error1;
+                       if (fread(&sp->attr, sizeof(attr_t), 1, fp) != 1)
+                               goto error1;
+#ifdef HAVE_WCHAR
+                       if (sp->nsp != NULL) {
+                               if (__getnsp(win->bnsp, fp) == ERR)
+                                       goto error1;
+                       }
+#endif /* HAVE_WCHAR */
+               }
+               __touchline(win, y, 0, (int) win->maxx - 1);
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_FILEIO, "getwin: win = 0x%p\n", win);
+#endif
+       return win;
+
+error1:
+       delwin(win);
+error0:
+       if (wtmp)
+               free(wtmp);
+       return NULL;
+}
diff --git a/lib/libcurses/fileio.h b/lib/libcurses/fileio.h
new file mode 100644 (file)
index 0000000..ef38907
--- /dev/null
@@ -0,0 +1,8 @@
+/*
+ * Do not edit!  Automatically generated file:
+ *   from: NetBSD: shlib_version,v 1.40 2009/01/11 03:07:47 christos Exp 
+ *   by  : NetBSD: genfileioh.awk,v 1.2 2008/05/02 11:13:02 martin Exp 
+ */
+
+#define CURSES_LIB_MAJOR 7
+#define CURSES_LIB_MINOR 0
diff --git a/lib/libcurses/flash.c b/lib/libcurses/flash.c
deleted file mode 100644 (file)
index 2de4560..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-#include <termcap.h>
-
-extern char *bl, *vb;
-
-/* Flash() flashes the terminal screen. */
-void flash()
-{
-  if (vb)
-       tputs(vb, 1, outc);
-  else if (bl)
-       tputs(bl, 1, outc);
-}
diff --git a/lib/libcurses/flushok.c b/lib/libcurses/flushok.c
new file mode 100644 (file)
index 0000000..25f8674
--- /dev/null
@@ -0,0 +1,52 @@
+/*     $NetBSD: flushok.c,v 1.5 2008/04/28 20:23:01 martin Exp $       */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: flushok.c,v 1.5 2008/04/28 20:23:01 martin Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * flushok --
+ *     Turn on and off Fflush(stdout) after refresh for the given window.
+ */
+int
+flushok(WINDOW *win, bool bf)
+{
+       if (bf)
+               win->flags |= __FLUSH;
+       else
+               win->flags &= ~__FLUSH;
+       return (OK);
+}
diff --git a/lib/libcurses/fullname.c b/lib/libcurses/fullname.c
new file mode 100644 (file)
index 0000000..026c5c7
--- /dev/null
@@ -0,0 +1,64 @@
+/*     $NetBSD: fullname.c,v 1.11 2003/08/07 16:44:21 agc Exp $        */
+
+/*
+ * Copyright (c) 1981, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)fullname.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: fullname.c,v 1.11 2003/08/07 16:44:21 agc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+
+/*
+ * fullname --
+ *     This routine fills in "def" with the full name of the terminal.
+ *     This is assumed to be the last name in the list of aliases.
+ */
+char   *
+fullname(const char *bp, char *def)
+{
+       char   *cp;
+
+       *def = '\0';            /* In case no name. */
+
+       while (*bp && *bp != ':') {
+               cp = def;       /* Start of answer. */
+               while (*bp && *bp != ':' && *bp != '|')
+                       *cp++ = *bp++;  /* Copy name over. */
+               *cp = '\0';     /* Zero end of name. */
+               if (*bp == '|')
+                       bp++;   /* Skip over '|' if that is case. */
+       }
+       return (def);
+}
diff --git a/lib/libcurses/genfileioh.awk b/lib/libcurses/genfileioh.awk
new file mode 100644 (file)
index 0000000..3106d4d
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/awk -F
+#
+#      $NetBSD: genfileioh.awk,v 1.2 2008/05/02 11:13:02 martin Exp $
+#
+# Copyright (c) 2008 The NetBSD Foundation, Inc.
+# All rights reserved.
+#
+# This code is derived from software contributed to The NetBSD Foundation
+# by Julian Coleman.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+function mangle_vers(vers) {
+       sub("^.*\\$NetBSD", "NetBSD", vers);
+       sub("\\$[^$]*$", "", vers);
+       return vers;
+}
+
+BEGIN {
+       MYVER="$NetBSD: genfileioh.awk,v 1.2 2008/05/02 11:13:02 martin Exp $";
+       MYVER=mangle_vers(MYVER);
+}
+
+{
+       if ($0 ~/\$NetBSD:/) {
+               SHVER=mangle_vers($0);
+       }
+       if ($1 ~ /^major=/) {
+               MAJ=$1;
+               sub("^major=", "", MAJ);
+       }
+       if ($1 ~ /^minor=/) {
+               MIN=$1;
+               sub("^minor=", "", MIN);
+       }
+}
+
+END {
+       printf("/*\n");
+       printf(" * Do not edit!  Automatically generated file:\n");
+       printf(" *   from: %s\n", SHVER);
+       printf(" *   by  : %s\n", MYVER);
+       printf(" */\n");
+       printf("\n");
+       printf("#define CURSES_LIB_MAJOR %s\n", MAJ);
+       printf("#define CURSES_LIB_MINOR %s\n", MIN);
+}
diff --git a/lib/libcurses/get_wch.c b/lib/libcurses/get_wch.c
new file mode 100644 (file)
index 0000000..4430467
--- /dev/null
@@ -0,0 +1,658 @@
+/*   $NetBSD: get_wch.c,v 1.9 2010/12/16 17:42:28 wiz Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: get_wch.c,v 1.9 2010/12/16 17:42:28 wiz Exp $");
+#endif                                           /* not lint */
+
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include "curses.h"
+#include "curses_private.h"
+#include "keymap.h"
+
+#ifdef HAVE_WCHAR
+static short   wstate;           /* state of the wcinkey function */
+#endif /* HAVE_WCHAR */
+extern short state;            /* storage declared in getch.c */
+
+/* prototypes for private functions */
+#ifdef HAVE_WCHAR
+static int inkey(wchar_t *wc, int to, int delay);
+#endif /* HAVE_WCHAR */
+
+#ifdef HAVE_WCHAR
+/*
+ * __init_get_wch - initialise all the pointers & structures needed to make
+ * get_wch work in keypad mode.
+ *
+ */
+void
+__init_get_wch(SCREEN *screen)
+{
+       wstate = INKEY_NORM;
+       memset( &screen->cbuf, 0, MAX_CBUF_SIZE * sizeof( int ));
+       screen->cbuf_head = screen->cbuf_tail = screen->cbuf_cur = 0;
+}
+#endif /* HAVE_WCHAR */
+
+
+#ifdef HAVE_WCHAR
+/*
+ * inkey - do the work to process keyboard input, check for multi-key
+ * sequences and return the appropriate symbol if we get a match.
+ *
+ */
+static int
+inkey(wchar_t *wc, int to, int delay)
+{
+       wchar_t          k = 0;
+       int               c, mapping, ret = 0;
+       size_t    mlen = 0;
+       keymap_t        *current = _cursesi_screen->base_keymap;
+       FILE            *infd = _cursesi_screen->infd;
+       int              *start = &_cursesi_screen->cbuf_head,
+                               *working = &_cursesi_screen->cbuf_cur,
+                               *end = &_cursesi_screen->cbuf_tail;
+       char            *inbuf = &_cursesi_screen->cbuf[ 0 ];
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "inkey (%p, %d, %d)\n", wc, to, delay);
+#endif
+       for (;;) { /* loop until we get a complete key sequence */
+               if (wstate == INKEY_NORM) {
+                       if (delay && __timeout(delay) == ERR)
+                               return ERR;
+                       c = fgetc(infd);
+                       if (c == WEOF) {
+                               clearerr(infd);
+                               return ERR;
+                       }
+
+                       if (delay && (__notimeout() == ERR))
+                               return ERR;
+
+                       k = (wchar_t) c;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "inkey (wstate normal) got '%s'\n", unctrl(k));
+#endif
+
+                       inbuf[ *end ] = k;
+                       *end = ( *end + 1 ) % MAX_CBUF_SIZE;
+                       *working = *start;
+                       wstate = INKEY_ASSEMBLING; /* go to assembling state */
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "inkey: NORM=>ASSEMBLING: start(%d), "
+                           "current(%d), end(%d)\n", *start, *working, *end);
+#endif /* DEBUG */
+               } else if (wstate == INKEY_BACKOUT) {
+                       k = inbuf[*working];
+                       *working = ( *working + 1 ) % MAX_CBUF_SIZE;
+                       if (*working == *end) { /* see if run out of keys */
+                               /* if so, switch to assembling */
+                               wstate = INKEY_ASSEMBLING;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: BACKOUT=>ASSEMBLING, start(%d), "
+                                   "current(%d), end(%d)\n",
+                                   *start, *working, *end);
+#endif /* DEBUG */
+                       }
+               } else if (wstate == INKEY_ASSEMBLING) {
+                       /* assembling a key sequence */
+                       if (delay) {
+                               if (__timeout(to ? (ESCDELAY / 100) : delay)
+                                               == ERR)
+                                       return ERR;
+                       } else {
+                               if (to && (__timeout(ESCDELAY / 100) == ERR))
+                                       return ERR;
+                       }
+
+                       c = fgetc(infd);
+                       if (ferror(infd)) {
+                               clearerr(infd);
+                               return ERR;
+                       }
+
+                       if ((to || delay) && (__notimeout() == ERR))
+                               return ERR;
+
+                       k = (wchar_t) c;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "inkey (wstate assembling) got '%s'\n", unctrl(k));
+#endif /* DEBUG */
+                       if (feof(infd)) { /* inter-char T/O, start backout */
+                               clearerr(infd);
+                               if (*start == *end)
+                                       /* no chars in the buffer, restart */
+                                       continue;
+
+                               k = inbuf[*start];
+                               wstate = INKEY_TIMEOUT;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: ASSEMBLING=>TIMEOUT, start(%d), "
+                                   "current(%d), end(%d)\n",
+                                   *start, *working, *end);
+#endif /* DEBUG */
+                       } else {
+                               inbuf[ *end ] = k;
+                               *working = *end;
+                               *end = ( *end + 1 ) % MAX_CBUF_SIZE;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: ASSEMBLING: start(%d), "
+                                   "current(%d), end(%d)",
+                                   *start, *working, *end);
+#endif /* DEBUG */
+                       }
+               } else if (wstate == INKEY_WCASSEMBLING) {
+                       /* assembling a wide-char sequence */
+                       if (delay) {
+                               if (__timeout(to ? (ESCDELAY / 100) : delay)
+                                               == ERR)
+                                       return ERR;
+                       } else {
+                               if (to && (__timeout(ESCDELAY / 100) == ERR))
+                                       return ERR;
+                       }
+
+                       c = fgetc(infd);
+                       if (ferror(infd)) {
+                               clearerr(infd);
+                               return ERR;
+                       }
+
+                       if ((to || delay) && (__notimeout() == ERR))
+                               return ERR;
+
+                       k = (wchar_t) c;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "inkey (wstate wcassembling) got '%s'\n",
+                               unctrl(k));
+#endif
+                       if (feof(infd)) { /* inter-char T/O, start backout */
+                               clearerr(infd);
+                               if (*start == *end)
+                                       /* no chars in the buffer, restart */
+                                       continue;
+
+                               *wc = inbuf[*start];
+                               *working = *start
+                                       = ( *start + 1 ) % MAX_CBUF_SIZE;
+                               if (*start == *end) {
+                                       state = wstate = INKEY_NORM;
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_INPUT,
+                                           "inkey: WCASSEMBLING=>NORM, "
+                                           "start(%d), current(%d), end(%d)",
+                                           *start, *working, *end);
+#endif /* DEBUG */
+                               } else {
+                                       state = wstate = INKEY_BACKOUT;
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_INPUT,
+                                           "inkey: WCASSEMBLING=>BACKOUT, "
+                                           "start(%d), current(%d), end(%d)",
+                                           *start, *working, *end);
+#endif /* DEBUG */
+                               }
+                               return OK;
+                       } else {
+                               /* assembling wide characters */
+                               inbuf[ *end ] = k;
+                               *working = *end;
+                               *end = ( *end + 1 ) % MAX_CBUF_SIZE;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: WCASSEMBLING[head(%d), "
+                                   "urrent(%d), tail(%d)]\n",
+                                   *start, *working, *end);
+#endif /* DEBUG */
+                               ret = (int) mbrtowc( wc, inbuf + (*working), 1,
+                                       &_cursesi_screen->sp );
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: mbrtowc returns %d, wc(%x)\n",
+                                   ret, *wc );
+#endif /* DEBUG */
+                               if ( ret == -2 ) {
+                                       *working = (*working + 1)
+                                               % MAX_CBUF_SIZE;
+                                       continue;
+                               }
+                               if ( ret == 0 )
+                                       ret = 1;
+                               if ( ret == -1 ) {
+                                       /* return the 1st character we know */
+                                       *wc = inbuf[ *start ];
+                                       *working = *start = ( *start + 1 ) % MAX_CBUF_SIZE;
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_INPUT,
+                                           "inkey: Invalid wide char(%x) "
+                                           "[head(%d), current(%d), "
+                                           "tail(%d)]\n",
+                                           *wc, *start, *working, *end);
+#endif /* DEBUG */
+                               } else { /* > 0 */
+                                       /* return the wide character */
+                                       *start = *working
+                                              = (*working + ret)%MAX_CBUF_SIZE;
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_INPUT,
+                                           "inkey: Wide char found(%x) "
+                                           "[head(%d), current(%d), "
+                                           "tail(%d)]\n",
+                                           *wc, *start, *working, *end);
+#endif /* DEBUG */
+                               }
+
+                               if (*start == *end) {   /* only one char processed */
+                                       state = wstate = INKEY_NORM;
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_INPUT,
+                                           "inkey: WCASSEMBLING=>NORM, "
+                                           "start(%d), current(%d), end(%d)",
+                                           *start, *working, *end);
+#endif /* DEBUG */
+                               } else {
+                                       /* otherwise we must have more than one char to backout */
+                                       state = wstate = INKEY_BACKOUT;
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_INPUT,
+                                           "inkey: WCASSEMBLING=>BACKOUT, "
+                                           "start(%d), current(%d), end(%d)",
+                                           *start, *working, *end);
+#endif /* DEBUG */
+                               }
+                               return OK;
+                       }
+               } else {
+                       fprintf(stderr, "Inkey wstate screwed - exiting!!!");
+                       exit(2);
+               }
+
+               /*
+                * Check key has no special meaning and we have not
+                * timed out and the key has not been disabled
+                */
+               mapping = current->mapping[k];
+               if (((wstate == INKEY_TIMEOUT) || (mapping < 0))
+                               || ((current->key[mapping]->type
+                                       == KEYMAP_LEAF)
+                               && (current->key[mapping]->enable == FALSE))) {
+                       /* wide-character specific code */
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "inkey: Checking for wide char\n");
+#endif /* DEBUG */
+                       mbrtowc( NULL, NULL, 1, &_cursesi_screen->sp );
+                       *working = *start;
+                       mlen = *end > *working ?
+                               *end - *working : MAX_CBUF_SIZE - *working;
+                       if ( !mlen )
+                               return ERR;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "inkey: Check wide char[head(%d), "
+                           "current(%d), tail(%d), mlen(%ld)]\n",
+                           *start, *working, *end, (long) mlen);
+#endif /* DEBUG */
+                       ret = (int) mbrtowc( wc, inbuf + (*working), mlen,
+                               &_cursesi_screen->sp );
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "inkey: mbrtowc returns %d, wc(%x)\n", ret, *wc);
+#endif /* DEBUG */
+                       if ( ret == -2 && *end < *working ) {
+                               /* second half of a wide character */
+                               *working = 0;
+                               mlen = *end;
+                               if ( mlen )
+                                       ret = (int) mbrtowc( wc, inbuf, mlen,
+                                               &_cursesi_screen->sp );
+                       }
+                       if ( ret == -2 && wstate != INKEY_TIMEOUT ) {
+                               *working = (*working + (int) mlen)
+                                       % MAX_CBUF_SIZE;
+                               wstate = INKEY_WCASSEMBLING;
+                               continue;
+                       }
+                       if ( ret == 0 )
+                               ret = 1;
+                       if ( ret == -1 ) {
+                               /* return the first key we know about */
+                               *wc = inbuf[ *start ];
+                               *working = *start
+                                       = ( *start + 1 ) % MAX_CBUF_SIZE;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: Invalid wide char(%x)[head(%d), "
+                                   "current(%d), tail(%d)]\n",
+                                   *wc, *start, *working, *end);
+#endif /* DEBUG */
+                       } else { /* > 0 */
+                               /* return the wide character */
+                               *start = *working
+                                       = ( *working + ret ) % MAX_CBUF_SIZE;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: Wide char found(%x)[head(%d), "
+                                   "current(%d), tail(%d)]\n",
+                                   *wc, *start, *working, *end);
+#endif /* DEBUG */
+                       }
+
+                       if (*start == *end) {   /* only one char processed */
+                               state = wstate = INKEY_NORM;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: Empty cbuf=>NORM, "
+                                   "start(%d), current(%d), end(%d)\n",
+                                   *start, *working, *end);
+#endif /* DEBUG */
+                       } else {
+                               /* otherwise we must have more than one char to backout */
+                               state = wstate = INKEY_BACKOUT;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: Non-empty cbuf=>BACKOUT, "
+                                   "start(%d), current(%d), end(%d)\n",
+                                   *start, *working, *end);
+#endif /* DEBUG */
+                       }
+                       return OK;
+               } else {        /* must be part of a multikey sequence */
+                                       /* check for completed key sequence */
+                       if (current->key[current->mapping[k]]->type
+                                       == KEYMAP_LEAF) {
+                               /* eat the key sequence in cbuf */
+                               *start = *working = ( *working + 1 ) % MAX_CBUF_SIZE;
+
+                               /* check if inbuf empty now */
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "inkey: Key found(%s)\n",
+                                   key_name(current->key[mapping]->value.symbol));
+#endif /* DEBUG */
+                               if (*start == *end) {
+                                       /* if it is go back to normal */
+                                       state = wstate = INKEY_NORM;
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_INPUT,
+                                           "[inkey]=>NORM, start(%d), "
+                                           "current(%d), end(%d)",
+                                           *start, *working, *end);
+#endif /* DEBUG */
+                               } else {
+                                       /* otherwise go to backout state */
+                                       state = wstate = INKEY_BACKOUT;
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_INPUT,
+                                           "[inkey]=>BACKOUT, start(%d), "
+                                           "current(%d), end(%d)",
+                                           *start, *working, *end );
+#endif /* DEBUG */
+                               }
+
+                               /* return the symbol */
+                               *wc = current->key[mapping]->value.symbol;
+                               return KEY_CODE_YES;
+                       } else {
+                               /* Step to next part of multi-key sequence */
+                               current = current->key[current->mapping[k]]->value.next;
+                       }
+               }
+       }
+}
+#endif /* HAVE_WCHAR */
+
+/*
+ * get_wch --
+ *     Read in a wide character from stdscr.
+ */
+int
+get_wch(wint_t *ch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wget_wch(stdscr, ch);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvget_wch --
+ *       Read in a character from stdscr at the given location.
+ */
+int
+mvget_wch(int y, int x, wint_t *ch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwget_wch(stdscr, y, x, ch);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvwget_wch --
+ *       Read in a character from stdscr at the given location in the
+ *       given window.
+ */
+int
+mvwget_wch(WINDOW *win, int y, int x, wint_t *ch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wget_wch(win, ch);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * wget_wch --
+ *     Read in a wide character from the window.
+ */
+int
+wget_wch(WINDOW *win, wint_t *ch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       int ret, weset;
+       int c;
+       FILE *infd = _cursesi_screen->infd;
+       cchar_t wc;
+       wchar_t inp, ws[ 2 ];
+
+       if (!(win->flags & __SCROLLOK) && (win->flags & __FULLWIN)
+                       && win->curx == win->maxx - 1
+                       && win->cury == win->maxy - 1
+                       && __echoit)
+               return (ERR);
+
+       if (is_wintouched(win))
+               wrefresh(win);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wget_wch: __echoit = %d, "
+           "__rawmode = %d, __nl = %d, flags = %#.4x\n",
+           __echoit, __rawmode, _cursesi_screen->nl, win->flags);
+#endif
+       if (_cursesi_screen->resized) {
+               _cursesi_screen->resized = 0;
+               *ch = KEY_RESIZE;
+               return KEY_CODE_YES;
+       }
+       if (_cursesi_screen->unget_pos) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "wget_wch returning char at %d\n",
+                   _cursesi_screen->unget_pos);
+#endif
+               _cursesi_screen->unget_pos--;
+               *ch = _cursesi_screen->unget_list[_cursesi_screen->unget_pos];
+               if (__echoit) {
+                       ws[0] = *ch, ws[1] = L'\0';
+                       setcchar(&wc, ws, win->wattr, 0, NULL);
+                       wadd_wch(win, &wc);
+               }
+               return KEY_CODE_YES;
+       }
+       if (__echoit && !__rawmode) {
+               cbreak();
+               weset = 1;
+       } else
+               weset = 0;
+
+       __save_termios();
+
+       if (win->flags & __KEYPAD) {
+               switch (win->delay) {
+                       case -1:
+                               ret = inkey(&inp,
+                                       win->flags & __NOTIMEOUT ? 0 : 1, 0);
+                               break;
+                       case 0:
+                               if (__nodelay() == ERR)
+                                       return ERR;
+                               ret = inkey(&inp, 0, 0);
+                               break;
+                       default:
+                               ret = inkey(&inp,
+                                       win->flags & __NOTIMEOUT ? 0 : 1,
+                                       win->delay);
+                               break;
+               }
+               if ( ret == ERR )
+                       return ERR;
+       } else {
+               switch (win->delay) {
+                       case -1:
+                               break;
+                       case 0:
+                               if (__nodelay() == ERR)
+                                       return ERR;
+                               break;
+                       default:
+                               if (__timeout(win->delay) == ERR)
+                                       return ERR;
+                               break;
+               }
+
+               c = getwchar();
+               if (feof(infd)) {
+                       clearerr(infd);
+                       __restore_termios();
+                       return ERR;     /* we have timed out */
+               }
+
+               if (ferror(infd)) {
+                       clearerr(infd);
+                       return ERR;
+               } else {
+                       ret = c;
+                       inp = c;
+               }
+       }
+#ifdef DEBUG
+       if (inp > 255)
+               /* we have a key symbol - treat it differently */
+               /* XXXX perhaps __unctrl should be expanded to include
+                * XXXX the keysyms in the table....
+                */
+               __CTRACE(__CTRACE_INPUT, "wget_wch assembled keysym 0x%x\n",
+                   inp);
+       else
+               __CTRACE(__CTRACE_INPUT, "wget_wch got '%s'\n", unctrl(inp));
+#endif
+       if (win->delay > -1) {
+               if (__delay() == ERR)
+                       return ERR;
+       }
+
+       __restore_termios();
+
+       if (__echoit) {
+               if ( ret == KEY_CODE_YES ) {
+                       /* handle [DEL], [BS], and [LEFT] */
+                       if ( win->curx &&
+                                       ( inp == KEY_DC ||
+                                         inp == KEY_BACKSPACE ||
+                                         inp == KEY_LEFT )) {
+                               wmove( win, win->cury, win->curx - 1 );
+                               wdelch( win );
+                       }
+               } else {
+                       ws[ 0 ] = inp, ws[ 1 ] = L'\0';
+                       setcchar( &wc, ws, win->wattr, 0, NULL );
+                       wadd_wch( win, &wc );
+               }
+       }
+
+       if (weset)
+               nocbreak();
+
+       if (_cursesi_screen->nl && inp == 13)
+               inp = 10;
+
+       *ch = inp;
+
+       if ( ret == KEY_CODE_YES )
+               return KEY_CODE_YES;
+       return ( inp < 0 ? ERR : OK );
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * unget_wch --
+ *      Put the wide character back into the input queue.
+ */
+int
+unget_wch(const wchar_t c)
+{
+       return __unget((wint_t) c);
+}
diff --git a/lib/libcurses/get_wstr.c b/lib/libcurses/get_wstr.c
new file mode 100644 (file)
index 0000000..b95c827
--- /dev/null
@@ -0,0 +1,291 @@
+/*   $NetBSD: get_wstr.c,v 1.3 2008/04/14 20:33:59 jdc Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: get_wstr.c,v 1.3 2008/04/14 20:33:59 jdc Exp $");
+#endif                                           /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/* prototypes for private functions */
+#ifdef HAVE_WCHAR
+static int __wgetn_wstr(WINDOW *, wchar_t *, int);
+#endif /* HAVE_WCHAR */
+
+/*
+ * getn_wstr --
+ *     Get a string (of maximum n) characters from stdscr starting at
+ *     (cury, curx).
+ */
+int
+getn_wstr(wchar_t *wstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wgetn_wstr(stdscr, wstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * get_wstr --
+ *     Get a string from stdscr starting at (cury, curx).
+ */
+__warn_references(get_wstr,
+       "warning: this program uses get_wstr(), which is unsafe.")
+int
+get_wstr(wchar_t *wstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wget_wstr(stdscr, wstr);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvgetn_wstr --
+ *  Get a string (of maximum n) characters from stdscr starting at (y, x).
+ */
+int
+mvgetn_wstr(int y, int x, wchar_t *wstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwgetn_wstr(stdscr, y, x, wstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvget_wstr --
+ *       Get a string from stdscr starting at (y, x).
+ */
+__warn_references(mvget_wstr,
+       "warning: this program uses mvget_wstr(), which is unsafe.")
+int
+mvget_wstr(int y, int x, wchar_t *wstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwget_wstr(stdscr, y, x, wstr);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvwgetn_wstr --
+ *  Get a string (of maximum n) characters from the given window starting
+ *     at (y, x).
+ */
+int
+mvwgetn_wstr(WINDOW *win, int y, int x, wchar_t *wstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wgetn_wstr(win, wstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvwget_wstr --
+ *       Get a string from the given window starting at (y, x).
+ */
+__warn_references(mvget_wstr,
+       "warning: this program uses mvget_wstr(), which is unsafe.")
+int
+mvwget_wstr(WINDOW *win, int y, int x, wchar_t *wstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wget_wstr(win, wstr);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * wget_wstr --
+ *     Get a string starting at (cury, curx).
+ */
+__warn_references(wget_wstr,
+       "warning: this program uses wget_wstr(), which is unsafe.")
+int
+wget_wstr(WINDOW *win, wchar_t *wstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return __wgetn_wstr(win, wstr, -1);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * wgetn_wstr --
+ *     Get a string starting at (cury, curx).
+ *     Note that n <  2 means that we return ERR (SUSv2 specification).
+ */
+int
+wgetn_wstr(WINDOW *win, wchar_t *wstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (n < 1)
+               return (ERR);
+       if (n == 1) {
+               wstr[0] = L'\0';
+               return (ERR);
+       }
+       return __wgetn_wstr(win, wstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+#ifdef HAVE_WCHAR
+/*
+ * __wgetn_wstr --
+ *     The actual implementation.
+ *     Note that we include a trailing L'\0' for safety, so str will contain
+ *     at most n - 1 other characters.
+ */
+int
+__wgetn_wstr(WINDOW *win, wchar_t *wstr, int n)
+{
+       wchar_t *ostr, ec, kc, sc[ 2 ];
+       int oldx, remain;
+       wint_t wc;
+       cchar_t cc;
+
+       ostr = wstr;
+       if ( erasewchar( &ec ) == ERR )
+               return ERR;
+       if ( killwchar( &kc ) == ERR )
+               return ERR;
+       sc[ 0 ] = ( wchar_t )btowc( ' ' );
+       sc[ 1 ] = L'\0';
+       setcchar( &cc, sc, win->wattr, 0, NULL );
+       oldx = win->curx;
+       remain = n - 1;
+
+       while (wget_wch(win, &wc) != ERR
+              && wc != L'\n' && wc != L'\r') {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT,
+                   "__wgetn_wstr: win %p, char 0x%x, remain %d\n",
+                   win, wc, remain);
+#endif
+               *wstr = wc;
+               touchline(win, win->cury, 1);
+               if (wc == ec || wc == KEY_BACKSPACE || wc == KEY_LEFT) {
+                       *wstr = L'\0';
+                       if (wstr != ostr) {
+                               if ((wchar_t)wc == ec) {
+                                       mvwadd_wch(win, win->cury,
+                                               win->curx, &cc);
+                                       wmove(win, win->cury, win->curx - 1);
+                               }
+                               if (wc == KEY_BACKSPACE || wc == KEY_LEFT) {
+                                       /* getch() displays the key sequence */
+                                       mvwadd_wch(win, win->cury,
+                                               win->curx - 1, &cc);
+                                       mvwadd_wch(win, win->cury,
+                                               win->curx - 2, &cc);
+                                       wmove(win, win->cury, win->curx - 1);
+                               }
+                               wstr--;
+                               if (n != -1) {
+                                       /* We're counting chars */
+                                       remain++;
+                               }
+                       } else { /* str == ostr */
+                               if (wc == KEY_BACKSPACE || wc == KEY_LEFT)
+                                       /* getch() displays the other keys */
+                                       mvwadd_wch(win, win->cury,
+                                               win->curx - 1, &cc);
+                               wmove(win, win->cury, oldx);
+                       }
+               } else if (wc == kc) {
+                       *wstr = L'\0';
+                       if (wstr != ostr) {
+                               /* getch() displays the kill character */
+                               mvwadd_wch(win, win->cury, win->curx - 1, &cc);
+                               /* Clear the characters from screen and str */
+                               while (wstr != ostr) {
+                                       mvwadd_wch(win, win->cury,
+                                               win->curx - 1, &cc);
+                                       wmove(win, win->cury, win->curx - 1);
+                                       wstr--;
+                                       if (n != -1)
+                                               /* We're counting chars */
+                                               remain++;
+                               }
+                               mvwadd_wch(win, win->cury, win->curx - 1, &cc);
+                               wmove(win, win->cury, win->curx - 1);
+                       } else
+                               /* getch() displays the kill character */
+                               mvwadd_wch( win, win->cury, oldx, &cc );
+                       wmove(win, win->cury, oldx);
+               } else if (wc >= KEY_MIN && wc <= KEY_MAX) {
+                       /* get_wch() displays these characters */
+                       mvwadd_wch( win, win->cury, win->curx - 1, &cc );
+                       wmove(win, win->cury, win->curx - 1);
+               } else {
+                       if (remain) {
+                               wstr++;
+                               remain--;
+                       } else {
+                               mvwadd_wch(win, win->cury, win->curx - 1, &cc);
+                               wmove(win, win->cury, win->curx - 1);
+                       }
+               }
+       }
+
+       if (wc == ERR) {
+               *wstr = L'\0';
+               return ERR;
+       }
+       *wstr = L'\0';
+       return OK;
+}
+#endif /* HAVE_WCHAR */
diff --git a/lib/libcurses/getch.c b/lib/libcurses/getch.c
new file mode 100644 (file)
index 0000000..4c1163f
--- /dev/null
@@ -0,0 +1,967 @@
+/*     $NetBSD: getch.c,v 1.57 2010/12/07 22:02:52 joerg Exp $ */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)getch.c    8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: getch.c,v 1.57 2010/12/07 22:02:52 joerg Exp $");
+#endif
+#endif                                 /* not lint */
+
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include "curses.h"
+#include "curses_private.h"
+#include "keymap.h"
+
+short  state;          /* state of the inkey function */
+
+static const struct tcdata tc[] = {
+       {TICODE_kSAV, KEY_SSAVE},
+       {TICODE_kSPD, KEY_SSUSPEND},
+       {TICODE_kUND, KEY_SUNDO},
+       {TICODE_kHLP, KEY_SHELP},
+       {TICODE_kHOM, KEY_SHOME},
+       {TICODE_kIC, KEY_SIC},
+       {TICODE_kLFT, KEY_SLEFT},
+       {TICODE_krdo, KEY_REDO},
+       {TICODE_khlp, KEY_HELP},
+       {TICODE_kmrk, KEY_MARK},
+       {TICODE_kmsg, KEY_MESSAGE},
+       {TICODE_kmov, KEY_MOVE},
+       {TICODE_knxt, KEY_NEXT},
+       {TICODE_kopn, KEY_OPEN},
+       {TICODE_kopt, KEY_OPTIONS},
+       {TICODE_kprv, KEY_PREVIOUS},
+       {TICODE_kprt, KEY_PRINT},
+       {TICODE_kMSG, KEY_SMESSAGE},
+       {TICODE_kMOV, KEY_SMOVE},
+       {TICODE_kNXT, KEY_SNEXT},
+       {TICODE_kOPT, KEY_SOPTIONS},
+       {TICODE_kPRV, KEY_SPREVIOUS},
+       {TICODE_kPRT, KEY_SPRINT},
+       {TICODE_kRDO, KEY_SREDO},
+       {TICODE_kRPL, KEY_SREPLACE},
+       {TICODE_kRIT, KEY_SRIGHT},
+       {TICODE_kRES, KEY_SRSUME},
+       {TICODE_kCAN, KEY_SCANCEL},
+       {TICODE_kref, KEY_REFERENCE},
+       {TICODE_krfr, KEY_REFRESH},
+       {TICODE_krpl, KEY_REPLACE},
+       {TICODE_krst, KEY_RESTART},
+       {TICODE_kres, KEY_RESUME},
+       {TICODE_ksav, KEY_SAVE},
+       {TICODE_kspd, KEY_SUSPEND},
+       {TICODE_kund, KEY_UNDO},
+       {TICODE_kBEG, KEY_SBEG},
+       {TICODE_kFND, KEY_SFIND},
+       {TICODE_kCMD, KEY_SCOMMAND},
+       {TICODE_kCPY, KEY_SCOPY},
+       {TICODE_kCRT, KEY_SCREATE},
+       {TICODE_kDC, KEY_SDC},
+       {TICODE_kDL, KEY_SDL},
+       {TICODE_kslt, KEY_SELECT},
+       {TICODE_kEND, KEY_SEND},
+       {TICODE_kEOL, KEY_SEOL},
+       {TICODE_kEXT, KEY_SEXIT},
+       {TICODE_kfnd, KEY_FIND},
+       {TICODE_kbeg, KEY_BEG},
+       {TICODE_kcan, KEY_CANCEL},
+       {TICODE_kclo, KEY_CLOSE},
+       {TICODE_kcmd, KEY_COMMAND},
+       {TICODE_kcpy, KEY_COPY},
+       {TICODE_kcrt, KEY_CREATE},
+       {TICODE_kend, KEY_END},
+       {TICODE_kent, KEY_ENTER},
+       {TICODE_kext, KEY_EXIT},
+       {TICODE_kf11, KEY_F(11)},
+       {TICODE_kf12, KEY_F(12)},
+       {TICODE_kf13, KEY_F(13)},
+       {TICODE_kf14, KEY_F(14)},
+       {TICODE_kf15, KEY_F(15)},
+       {TICODE_kf16, KEY_F(16)},
+       {TICODE_kf17, KEY_F(17)},
+       {TICODE_kf18, KEY_F(18)},
+       {TICODE_kf19, KEY_F(19)},
+       {TICODE_kf20, KEY_F(20)},
+       {TICODE_kf21, KEY_F(21)},
+       {TICODE_kf22, KEY_F(22)},
+       {TICODE_kf23, KEY_F(23)},
+       {TICODE_kf24, KEY_F(24)},
+       {TICODE_kf25, KEY_F(25)},
+       {TICODE_kf26, KEY_F(26)},
+       {TICODE_kf27, KEY_F(27)},
+       {TICODE_kf28, KEY_F(28)},
+       {TICODE_kf29, KEY_F(29)},
+       {TICODE_kf30, KEY_F(30)},
+       {TICODE_kf31, KEY_F(31)},
+       {TICODE_kf32, KEY_F(32)},
+       {TICODE_kf33, KEY_F(33)},
+       {TICODE_kf34, KEY_F(34)},
+       {TICODE_kf35, KEY_F(35)},
+       {TICODE_kf36, KEY_F(36)},
+       {TICODE_kf37, KEY_F(37)},
+       {TICODE_kf38, KEY_F(38)},
+       {TICODE_kf39, KEY_F(39)},
+       {TICODE_kf40, KEY_F(40)},
+       {TICODE_kf41, KEY_F(41)},
+       {TICODE_kf42, KEY_F(42)},
+       {TICODE_kf43, KEY_F(43)},
+       {TICODE_kf44, KEY_F(44)},
+       {TICODE_kf45, KEY_F(45)},
+       {TICODE_kf46, KEY_F(46)},
+       {TICODE_kf47, KEY_F(47)},
+       {TICODE_kf48, KEY_F(48)},
+       {TICODE_kf49, KEY_F(49)},
+       {TICODE_kf50, KEY_F(50)},
+       {TICODE_kf51, KEY_F(51)},
+       {TICODE_kf52, KEY_F(52)},
+       {TICODE_kf53, KEY_F(53)},
+       {TICODE_kf54, KEY_F(54)},
+       {TICODE_kf55, KEY_F(55)},
+       {TICODE_kf56, KEY_F(56)},
+       {TICODE_kf57, KEY_F(57)},
+       {TICODE_kf58, KEY_F(58)},
+       {TICODE_kf59, KEY_F(59)},
+       {TICODE_kf60, KEY_F(60)},
+       {TICODE_kf61, KEY_F(61)},
+       {TICODE_kf62, KEY_F(62)},
+       {TICODE_kf63, KEY_F(63)},
+       {TICODE_ka1, KEY_A1},
+       {TICODE_kb2, KEY_B2},
+       {TICODE_ka3, KEY_A3},
+       {TICODE_kc1, KEY_C1},
+       {TICODE_kc3, KEY_C3},
+       {TICODE_kmous, KEY_MOUSE},
+       {TICODE_kf0, KEY_F0},
+       {TICODE_kf1, KEY_F(1)},
+       {TICODE_kf2, KEY_F(2)},
+       {TICODE_kf3, KEY_F(3)},
+       {TICODE_kf4, KEY_F(4)},
+       {TICODE_kf5, KEY_F(5)},
+       {TICODE_kf6, KEY_F(6)},
+       {TICODE_kf7, KEY_F(7)},
+       {TICODE_kf8, KEY_F(8)},
+       {TICODE_kf9, KEY_F(9)},
+       {TICODE_kf10, KEY_F(10)},
+       {TICODE_kil1, KEY_IL},
+       {TICODE_ktbc, KEY_CATAB},
+       {TICODE_kcbt, KEY_BTAB},
+       {TICODE_kbs, KEY_BACKSPACE},
+       {TICODE_kclr, KEY_CLEAR},
+       {TICODE_kdch1, KEY_DC},
+       {TICODE_kcud1, KEY_DOWN},
+       {TICODE_kel, KEY_EOL},
+       {TICODE_kind, KEY_SF},
+       {TICODE_kll, KEY_LL},
+       {TICODE_khome, KEY_HOME},
+       {TICODE_kich1, KEY_IC},
+       {TICODE_kdl1, KEY_DL},
+       {TICODE_kcub1, KEY_LEFT},
+       {TICODE_krmir, KEY_EIC},
+       {TICODE_knp, KEY_NPAGE},
+       {TICODE_kpp, KEY_PPAGE},
+       {TICODE_kri, KEY_SR},
+       {TICODE_kcuf1, KEY_RIGHT},
+       {TICODE_ked, KEY_EOS},
+       {TICODE_khts, KEY_STAB},
+       {TICODE_kctab, KEY_CTAB},
+       {TICODE_kcuu1, KEY_UP}
+};
+/* Number of TC entries .... */
+static const int num_tcs = (sizeof(tc) / sizeof(struct tcdata));
+
+int    ESCDELAY = 300;         /* Delay in ms between keys for esc seq's */
+
+/* Key buffer */
+#define INBUF_SZ 16            /* size of key buffer - must be larger than
+                                * longest multi-key sequence */
+static wchar_t inbuf[INBUF_SZ];
+static int     start, end, working; /* pointers for manipulating inbuf data */
+
+/* prototypes for private functions */
+static void add_key_sequence(SCREEN *screen, char *sequence, int key_type);
+static key_entry_t *add_new_key(keymap_t *current, char ch, int key_type,
+        int symbol);
+static void delete_key_sequence(keymap_t *current, int key_type);
+static void do_keyok(keymap_t *current, int key_type, bool flag, int *retval);
+static keymap_t *new_keymap(void); /* create a new keymap */
+static key_entry_t *new_key(void); /* create a new key entry */
+static wchar_t         inkey(int to, int delay);
+
+/*
+ * Free the storage associated with the given keymap
+ */
+void
+_cursesi_free_keymap(keymap_t *map)
+{
+       int i;
+
+         /* check for, and free, child keymaps */
+       for (i = 0; i < MAX_CHAR; i++) {
+               if (map->mapping[i] >= 0) {
+                       if (map->key[map->mapping[i]]->type == KEYMAP_MULTI)
+                               _cursesi_free_keymap(
+                                       map->key[map->mapping[i]]->value.next);
+               }
+       }
+
+         /* now free any allocated keymap structs */
+       for (i = 0; i < map->count; i += KEYMAP_ALLOC_CHUNK) {
+               free(map->key[i]);
+       }
+
+       free(map->key);
+       free(map);
+}
+
+
+/*
+ * Add a new key entry to the keymap pointed to by current.  Entry
+ * contains the character to add to the keymap, type is the type of
+ * entry to add (either multikey or leaf) and symbol is the symbolic
+ * value for a leaf type entry.  The function returns a pointer to the
+ * new keymap entry.
+ */
+static key_entry_t *
+add_new_key(keymap_t *current, char chr, int key_type, int symbol)
+{
+       key_entry_t *the_key;
+        int i, ki;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC,
+           "Adding character %s of type %d, symbol 0x%x\n",
+           unctrl(chr), key_type, symbol);
+#endif
+       if (current->mapping[(unsigned char) chr] < 0) {
+               if (current->mapping[(unsigned char) chr] == MAPPING_UNUSED) {
+                         /* first time for this char */
+                       current->mapping[(unsigned char) chr] =
+                               current->count; /* map new entry */
+                       ki = current->count;
+
+                         /* make sure we have room in the key array first */
+                       if ((current->count & (KEYMAP_ALLOC_CHUNK - 1)) == 0)
+                       {
+                               if ((current->key =
+                                    realloc(current->key,
+                                            ki * sizeof(key_entry_t *)
+                                            + KEYMAP_ALLOC_CHUNK * sizeof(key_entry_t *))) == NULL) {
+                                       fprintf(stderr,
+                                         "Could not malloc for key entry\n");
+                                       exit(1);
+                               }
+
+                               the_key = new_key();
+                               for (i = 0; i < KEYMAP_ALLOC_CHUNK; i++) {
+                                       current->key[ki + i] = &the_key[i];
+                               }
+                       }
+                } else {
+                         /* the mapping was used but freed, reuse it */
+                       ki = - current->mapping[(unsigned char) chr];
+                       current->mapping[(unsigned char) chr] = ki;
+               }
+
+               current->count++;
+
+                 /* point at the current key array element to use */
+               the_key = current->key[ki];
+
+               the_key->type = key_type;
+
+               switch (key_type) {
+                 case KEYMAP_MULTI:
+                           /* need for next key */
+#ifdef DEBUG
+                         __CTRACE(__CTRACE_MISC, "Creating new keymap\n");
+#endif
+                         the_key->value.next = new_keymap();
+                         the_key->enable = TRUE;
+                         break;
+
+                 case KEYMAP_LEAF:
+                               /* the associated symbol for the key */
+#ifdef DEBUG
+                         __CTRACE(__CTRACE_MISC, "Adding leaf key\n");
+#endif
+                         the_key->value.symbol = symbol;
+                         the_key->enable = TRUE;
+                         break;
+
+                 default:
+                         fprintf(stderr, "add_new_key: bad type passed\n");
+                         exit(1);
+               }
+       } else {
+                 /* the key is already known - just return the address. */
+#ifdef DEBUG
+               __CTRACE(__CTRACE_MISC, "Keymap already known\n");
+#endif
+               the_key = current->key[current->mapping[(unsigned char) chr]];
+       }
+
+        return the_key;
+}
+
+/*
+ * Delete the given key symbol from the key mappings for the screen.
+ *
+ */
+void
+delete_key_sequence(keymap_t *current, int key_type)
+{
+       key_entry_t *key;
+       int i;
+
+         /*
+          * we need to iterate over all the keys as there may be
+          * multiple instances of the leaf symbol.
+          */
+       for (i = 0; i < MAX_CHAR; i++) {
+               if (current->mapping[i] < 0)
+                       continue; /* no mapping for the key, next! */
+
+               key = current->key[current->mapping[i]];
+
+               if (key->type == KEYMAP_MULTI) {
+                         /* have not found the leaf, recurse down */
+                       delete_key_sequence(key->value.next, key_type);
+                         /* if we deleted the last key in the map, free */
+                       if (key->value.next->count == 0)
+                               _cursesi_free_keymap(key->value.next);
+               } else if ((key->type == KEYMAP_LEAF)
+                          && (key->value.symbol == key_type)) {
+                         /*
+                          * delete the mapping by negating the current
+                          * index - this "holds" the position in the
+                          * allocation just in case we later re-add
+                          * the key for that mapping.
+                          */
+                       current->mapping[i] = - current->mapping[i];
+                       current->count--;
+               }
+       }
+}
+
+/*
+ * Add the sequence of characters given in sequence as the key mapping
+ * for the given key symbol.
+ */
+void
+add_key_sequence(SCREEN *screen, char *sequence, int key_type)
+{
+       key_entry_t *tmp_key;
+       keymap_t *current;
+       int length, j, key_ent;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "add_key_sequence: add key sequence: %s(%s)\n",
+           sequence, keyname(key_type));
+#endif /* DEBUG */
+       current = screen->base_keymap;  /* always start with
+                                        * base keymap. */
+       length = (int) strlen(sequence);
+
+       /*
+        * OK - we really should never get a zero length string here, either
+        * the termcap entry is there and it has a value or we are not called
+        * at all.  Unfortunately, if someone assigns a termcap string to the
+        * ^@ value we get passed a null string which messes up our length.
+        * So, if we get a null string then just insert a leaf value in
+        * the 0th char position of the root keymap.  Note that we are
+        * totally screwed if someone terminates a multichar sequence
+        * with ^@... oh well.
+        */
+       if (length == 0)
+               length = 1;
+
+       for (j = 0; j < length - 1; j++) {
+                 /* add the entry to the struct */
+               tmp_key = add_new_key(current, sequence[j], KEYMAP_MULTI, 0);
+
+                 /* index into the key array - it's
+                    clearer if we stash this */
+               key_ent = current->mapping[(unsigned char) sequence[j]];
+
+               current->key[key_ent] = tmp_key;
+
+                 /* next key uses this map... */
+               current = current->key[key_ent]->value.next;
+       }
+
+       /*
+        * This is the last key in the sequence (it may have been the
+        * only one but that does not matter) this means it is a leaf
+        * key and should have a symbol associated with it.
+        */
+       tmp_key = add_new_key(current, sequence[length - 1], KEYMAP_LEAF,
+                             key_type);
+       current->key[current->mapping[(int)sequence[length - 1]]] = tmp_key;
+}
+
+/*
+ * Init_getch - initialise all the pointers & structures needed to make
+ * getch work in keypad mode.
+ *
+ */
+void
+__init_getch(SCREEN *screen)
+{
+       char entry[1024], *p;
+       const char *s;
+       int     i;
+       size_t limit, l;
+#ifdef DEBUG
+       int k, length;
+#endif
+
+       /* init the inkey state variable */
+       state = INKEY_NORM;
+
+       /* init the base keymap */
+       screen->base_keymap = new_keymap();
+
+       /* key input buffer pointers */
+       start = end = working = 0;
+
+       /* now do the terminfo snarfing ... */
+
+       for (i = 0; i < num_tcs; i++) {
+               p = entry;
+               limit = 1023;
+               s = screen->term->strs[tc[i].code];
+               if (s == NULL)
+                       continue;
+               l = strlen(s) + 1;
+               if (limit < l)
+                       continue;
+               strlcpy(p, s, limit);
+               p += l;
+               limit -= l;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INIT,
+                           "Processing termcap entry %d, sequence ",
+                           tc[i].code);
+                       length = (int) strlen(entry);
+                       for (k = 0; k <= length -1; k++)
+                               __CTRACE(__CTRACE_INIT, "%s", unctrl(entry[k]));
+                       __CTRACE(__CTRACE_INIT, "\n");
+#endif
+               add_key_sequence(screen, entry, tc[i].symbol);
+       }
+}
+
+
+/*
+ * new_keymap - allocates & initialises a new keymap structure.  This
+ * function returns a pointer to the new keymap.
+ *
+ */
+static keymap_t *
+new_keymap(void)
+{
+       int     i;
+       keymap_t *new_map;
+
+       if ((new_map = malloc(sizeof(keymap_t))) == NULL) {
+               perror("Inkey: Cannot allocate new keymap");
+               exit(2);
+       }
+
+       /* Initialise the new map */
+       new_map->count = 0;
+       for (i = 0; i < MAX_CHAR; i++) {
+               new_map->mapping[i] = MAPPING_UNUSED; /* no mapping for char */
+       }
+
+       /* key array will be allocated when first key is added */
+       new_map->key = NULL;
+
+       return new_map;
+}
+
+/*
+ * new_key - allocates & initialises a new key entry.  This function returns
+ * a pointer to the newly allocated key entry.
+ *
+ */
+static key_entry_t *
+new_key(void)
+{
+       key_entry_t *new_one;
+       int i;
+
+       if ((new_one = malloc(KEYMAP_ALLOC_CHUNK * sizeof(key_entry_t)))
+           == NULL) {
+               perror("inkey: Cannot allocate new key entry chunk");
+               exit(2);
+       }
+
+       for (i = 0; i < KEYMAP_ALLOC_CHUNK; i++) {
+               new_one[i].type = 0;
+               new_one[i].value.next = NULL;
+       }
+
+       return new_one;
+}
+
+/*
+ * inkey - do the work to process keyboard input, check for multi-key
+ * sequences and return the appropriate symbol if we get a match.
+ *
+ */
+
+wchar_t
+inkey(int to, int delay)
+{
+       wchar_t          k;
+       int              c, mapping;
+       keymap_t        *current = _cursesi_screen->base_keymap;
+       FILE            *infd = _cursesi_screen->infd;
+
+       k = 0;          /* XXX gcc -Wuninitialized */
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "inkey (%d, %d)\n", to, delay);
+#endif
+       for (;;) {              /* loop until we get a complete key sequence */
+reread:
+               if (state == INKEY_NORM) {
+                       if (delay && __timeout(delay) == ERR)
+                               return ERR;
+                       c = fgetc(infd);
+                       if (c == EOF) {
+                               clearerr(infd);
+                               return ERR;
+                       }
+
+                       if (delay && (__notimeout() == ERR))
+                               return ERR;
+
+                       k = (wchar_t) c;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "inkey (state normal) got '%s'\n", unctrl(k));
+#endif
+
+                       working = start;
+                       inbuf[working] = k;
+                       INC_POINTER(working);
+                       end = working;
+                       state = INKEY_ASSEMBLING;       /* go to the assembling
+                                                        * state now */
+               } else if (state == INKEY_BACKOUT) {
+                       k = inbuf[working];
+                       INC_POINTER(working);
+                       if (working == end) {   /* see if we have run
+                                                * out of keys in the
+                                                * backlog */
+
+                               /* if we have then switch to assembling */
+                               state = INKEY_ASSEMBLING;
+                       }
+               } else if (state == INKEY_ASSEMBLING) {
+                       /* assembling a key sequence */
+                       if (delay) {
+                               if (__timeout(to ? (ESCDELAY / 100) : delay)
+                                   == ERR)
+                                       return ERR;
+                       } else {
+                               if (to && (__timeout(ESCDELAY / 100) == ERR))
+                                       return ERR;
+                       }
+
+                       c = fgetc(infd);
+                       if (ferror(infd)) {
+                               clearerr(infd);
+                               return ERR;
+                       }
+
+                       if ((to || delay) && (__notimeout() == ERR))
+                                       return ERR;
+
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "inkey (state assembling) got '%s'\n", unctrl(k));
+#endif
+                       if (feof(infd) || c == -1) {    /* inter-char timeout,
+                                                        * start backing out */
+                               clearerr(infd);
+                               if (start == end)
+                                       /* no chars in the buffer, restart */
+                                       goto reread;
+
+                               k = inbuf[start];
+                               state = INKEY_TIMEOUT;
+                       } else {
+                               k = (wchar_t) c;
+                               inbuf[working] = k;
+                               INC_POINTER(working);
+                               end = working;
+                       }
+               } else {
+                       fprintf(stderr, "Inkey state screwed - exiting!!!");
+                       exit(2);
+               }
+
+                 /*
+                  * Check key has no special meaning and we have not
+                  * timed out and the key has not been disabled
+                  */
+               mapping = current->mapping[k];
+               if (((state == INKEY_TIMEOUT) || (mapping < 0))
+                       || ((current->key[mapping]->type == KEYMAP_LEAF)
+                           && (current->key[mapping]->enable == FALSE))) {
+                       /* return the first key we know about */
+                       k = inbuf[start];
+
+                       INC_POINTER(start);
+                       working = start;
+
+                       if (start == end) {     /* only one char processed */
+                               state = INKEY_NORM;
+                       } else {/* otherwise we must have more than one char
+                                * to backout */
+                               state = INKEY_BACKOUT;
+                       }
+                       return k;
+               } else {        /* must be part of a multikey sequence */
+                       /* check for completed key sequence */
+                       if (current->key[current->mapping[k]]->type == KEYMAP_LEAF) {
+                               start = working;        /* eat the key sequence
+                                                        * in inbuf */
+
+                               /* check if inbuf empty now */
+                               if (start == end) {
+                                       /* if it is go back to normal */
+                                       state = INKEY_NORM;
+                               } else {
+                                       /* otherwise go to backout state */
+                                       state = INKEY_BACKOUT;
+                               }
+
+                               /* return the symbol */
+                               return current->key[current->mapping[k]]->value.symbol;
+
+                       } else {
+                               /*
+                                * Step on to next part of the multi-key
+                                * sequence.
+                                */
+                               current = current->key[current->mapping[k]]->value.next;
+                       }
+               }
+       }
+}
+
+#ifndef _CURSES_USE_MACROS
+/*
+ * getch --
+ *     Read in a character from stdscr.
+ */
+int
+getch(void)
+{
+       return wgetch(stdscr);
+}
+
+/*
+ * mvgetch --
+ *      Read in a character from stdscr at the given location.
+ */
+int
+mvgetch(int y, int x)
+{
+       return mvwgetch(stdscr, y, x);
+}
+
+/*
+ * mvwgetch --
+ *      Read in a character from stdscr at the given location in the
+ *      given window.
+ */
+int
+mvwgetch(WINDOW *win, int y, int x)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wgetch(win);
+}
+
+#endif
+
+/*
+ * keyok --
+ *      Set the enable flag for a keysym, if the flag is false then
+ * getch will not return this keysym even if the matching key sequence
+ * is seen.
+ */
+int
+keyok(int key_type, bool flag)
+{
+       int result = ERR;
+
+       do_keyok(_cursesi_screen->base_keymap, key_type, flag, &result);
+       return result;
+}
+
+/*
+ * do_keyok --
+ *       Does the actual work for keyok, we need to recurse through the
+ * keymaps finding the passed key symbol.
+ */
+void
+do_keyok(keymap_t *current, int key_type, bool flag, int *retval)
+{
+       key_entry_t *key;
+       int i;
+
+         /*
+          * we need to iterate over all the keys as there may be
+          * multiple instances of the leaf symbol.
+          */
+       for (i = 0; i < MAX_CHAR; i++) {
+               if (current->mapping[i] < 0)
+                       continue; /* no mapping for the key, next! */
+
+               key = current->key[current->mapping[i]];
+
+               if (key->type == KEYMAP_MULTI)
+                       do_keyok(key->value.next, key_type, flag, retval);
+               else if ((key->type == KEYMAP_LEAF)
+                        && (key->value.symbol == key_type)) {
+                       key->enable = flag;
+                       *retval = OK; /* we found at least one instance, ok */
+               }
+       }
+}
+
+/*
+ * define_key --
+ *      Add a custom mapping of a key sequence to key symbol.
+ *
+ */
+int
+define_key(char *sequence, int symbol)
+{
+
+       if (symbol <= 0)
+               return ERR;
+
+       if (sequence == NULL)
+               delete_key_sequence(_cursesi_screen->base_keymap, symbol);
+       else
+               add_key_sequence(_cursesi_screen, sequence, symbol);
+
+       return OK;
+}
+
+/*
+ * wgetch --
+ *     Read in a character from the window.
+ */
+int
+wgetch(WINDOW *win)
+{
+       int inp, weset;
+       int c;
+       FILE *infd = _cursesi_screen->infd;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wgetch: win(%p)\n", win);
+#endif
+       if (!(win->flags & __SCROLLOK) && (win->flags & __FULLWIN)
+           && win->curx == win->maxx - 1 && win->cury == win->maxy - 1
+           && __echoit)
+               return (ERR);
+
+       if (is_wintouched(win))
+               wrefresh(win);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wgetch: __echoit = %d, "
+           "__rawmode = %d, __nl = %d, flags = %#.4x, delay = %d\n",
+           __echoit, __rawmode, _cursesi_screen->nl, win->flags, win->delay);
+#endif
+       if (_cursesi_screen->resized) {
+               _cursesi_screen->resized = 0;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "wgetch returning KEY_RESIZE\n");
+#endif
+               return KEY_RESIZE;
+       }
+       if (_cursesi_screen->unget_pos) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "wgetch returning char at %d\n",
+                   _cursesi_screen->unget_pos);
+#endif
+               _cursesi_screen->unget_pos--;
+               c = _cursesi_screen->unget_list[_cursesi_screen->unget_pos];
+               if (__echoit)
+                       waddch(win, (chtype) c);
+               return c;
+       }
+       if (__echoit && !__rawmode) {
+               cbreak();
+               weset = 1;
+       } else
+               weset = 0;
+
+       __save_termios();
+
+       if (win->flags & __KEYPAD) {
+               switch (win->delay)
+               {
+               case -1:
+                       inp = inkey (win->flags & __NOTIMEOUT ? 0 : 1, 0);
+                       break;
+               case 0:
+                       if (__nodelay() == ERR)
+                               return ERR;
+                       inp = inkey(0, 0);
+                       break;
+               default:
+                       inp = inkey(win->flags & __NOTIMEOUT ? 0 : 1, win->delay);
+                       break;
+               }
+       } else {
+               switch (win->delay)
+               {
+               case -1:
+                       if (__delay() == ERR)
+                               return ERR;
+                       break;
+               case 0:
+                       if (__nodelay() == ERR)
+                               return ERR;
+                       break;
+               default:
+                       if (__timeout(win->delay) == ERR)
+                               return ERR;
+                       break;
+               }
+
+               c = fgetc(infd);
+               if (feof(infd)) {
+                       clearerr(infd);
+                       __restore_termios();
+                       return ERR;     /* we have timed out */
+               }
+
+               if (ferror(infd)) {
+                       clearerr(infd);
+                       inp = ERR;
+               } else {
+                       inp = c;
+               }
+       }
+#ifdef DEBUG
+       if (inp > 255)
+                 /* we have a key symbol - treat it differently */
+                 /* XXXX perhaps __unctrl should be expanded to include
+                  * XXXX the keysyms in the table....
+                  */
+               __CTRACE(__CTRACE_INPUT, "wgetch assembled keysym 0x%x\n", inp);
+       else
+               __CTRACE(__CTRACE_INPUT, "wgetch got '%s'\n", unctrl(inp));
+#endif
+       if (win->delay > -1) {
+               if (__delay() == ERR)
+                       return ERR;
+       }
+
+       __restore_termios();
+
+       if ((__echoit) && (inp < KEY_MIN))
+               waddch(win, (chtype) inp);
+
+       if (weset)
+               nocbreak();
+
+       if (_cursesi_screen->nl && inp == 13)
+               inp = 10;
+
+       return ((inp < 0) || (inp == ERR) ? ERR : inp);
+}
+
+/*
+ * ungetch --
+ *     Put the character back into the input queue.
+ */
+int
+ungetch(int c)
+{
+       return __unget((wint_t) c);
+}
+
+/*
+ * __unget --
+ *    Do the work for ungetch() and unget_wch();
+ */
+int
+__unget(wint_t c)
+{
+       wchar_t *p;
+       int     len;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "__unget(%x)\n", c);
+#endif
+       if (_cursesi_screen->unget_pos >= _cursesi_screen->unget_len) {
+               len = _cursesi_screen->unget_len + 32;
+               if ((p = realloc(_cursesi_screen->unget_list,
+                   sizeof(wchar_t) * len)) == NULL) {
+                       /* Can't realloc(), so just lose the oldest entry */
+                       memmove(_cursesi_screen->unget_list,
+                           _cursesi_screen->unget_list + sizeof(wchar_t),
+                           _cursesi_screen->unget_len - 1);
+                       _cursesi_screen->unget_list[_cursesi_screen->unget_len
+                           - 1] = c;
+                       _cursesi_screen->unget_pos =
+                           _cursesi_screen->unget_len;
+                       return OK;
+               } else {
+                       _cursesi_screen->unget_pos =
+                           _cursesi_screen->unget_len;
+                       _cursesi_screen->unget_len = len;
+                       _cursesi_screen->unget_list = p;
+               }
+       }
+       _cursesi_screen->unget_list[_cursesi_screen->unget_pos] = c;
+       _cursesi_screen->unget_pos++;
+       return OK;
+}
diff --git a/lib/libcurses/getstr.c b/lib/libcurses/getstr.c
new file mode 100644 (file)
index 0000000..291238e
--- /dev/null
@@ -0,0 +1,251 @@
+/*     $NetBSD: getstr.c,v 1.20 2007/05/28 15:01:55 blymn Exp $        */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <assert.h>
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)getstr.c   8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: getstr.c,v 1.20 2007/05/28 15:01:55 blymn Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * getnstr --
+ *     Get a string (of maximum n) characters from stdscr starting at
+ *     (cury, curx).
+ */
+int
+getnstr(char *str, int n)
+{
+       return wgetnstr(stdscr, str, n);
+}
+
+/*
+ * getstr --
+ *     Get a string from stdscr starting at (cury, curx).
+ */
+__warn_references(getstr,
+    "warning: this program uses getstr(), which is unsafe.")
+int
+getstr(char *str)
+{
+       return wgetstr(stdscr, str);
+}
+
+/*
+ * mvgetnstr --
+ *      Get a string (of maximum n) characters from stdscr starting at (y, x).
+ */
+int
+mvgetnstr(int y, int x, char *str, int n)
+{
+       return mvwgetnstr(stdscr, y, x, str, n);
+}
+
+/*
+ * mvgetstr --
+ *      Get a string from stdscr starting at (y, x).
+ */
+__warn_references(mvgetstr,
+    "warning: this program uses mvgetstr(), which is unsafe.")
+int
+mvgetstr(int y, int x, char *str)
+{
+       return mvwgetstr(stdscr, y, x, str);
+}
+
+/*
+ * mvwgetnstr --
+ *      Get a string (of maximum n) characters from the given window starting
+ *     at (y, x).
+ */
+int
+mvwgetnstr(WINDOW *win, int y, int x, char *str, int n)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wgetnstr(win, str, n);
+}
+
+/*
+ * mvwgetstr --
+ *      Get a string from the given window starting at (y, x).
+ */
+__warn_references(mvgetstr,
+    "warning: this program uses mvgetstr(), which is unsafe.")
+int
+mvwgetstr(WINDOW *win, int y, int x, char *str)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wgetstr(win, str);
+}
+
+#endif
+
+/*
+ * wgetstr --
+ *     Get a string starting at (cury, curx).
+ */
+__warn_references(wgetstr,
+    "warning: this program uses wgetstr(), which is unsafe.")
+int
+wgetstr(WINDOW *win, char *str)
+{
+       return __wgetnstr(win, str, -1);
+}
+
+/*
+ * wgetnstr --
+ *     Get a string starting at (cury, curx).
+ *     Note that n <  2 means that we return ERR (SUSv2 specification).
+ */
+int
+wgetnstr(WINDOW *win, char *str, int n)
+{
+       if (n < 1)
+               return (ERR);
+       if (n == 1) {
+               str[0] = '\0';
+               return (ERR);
+       }
+       return __wgetnstr(win, str, n);
+}
+
+/*
+ * __wgetnstr --
+ *     The actual implementation.
+ *     Note that we include a trailing '\0' for safety, so str will contain
+ *     at most n - 1 other characters.
+ *     XXX: character deletion from screen is based on how the characters
+ *     are displayed by wgetch().
+ */
+int
+__wgetnstr(WINDOW *win, char *str, int n)
+{
+       char *ostr, ec, kc;
+       int c, oldx, remain;
+
+       ostr = str;
+       ec = erasechar();
+       kc = killchar();
+       oldx = win->curx;
+       _DIAGASSERT(n == -1 || n > 1);
+       remain = n - 1;
+
+       while ((c = wgetch(win)) != ERR && c != '\n' && c != '\r') {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT,
+                   "__wgetnstr: win %p, char 0x%x, remain %d\n",
+                   win, c, remain);
+#endif
+               *str = c;
+               touchline(win, win->cury, 1);
+               if (c == ec || c == KEY_BACKSPACE || c == KEY_LEFT) {
+                       *str = '\0';
+                       if (str != ostr) {
+                               if ((char) c == ec) {
+                                       mvwaddch(win, win->cury, win->curx,
+                                           ' ');
+                                       wmove(win, win->cury, win->curx - 1);
+                               }
+                               if (c == KEY_BACKSPACE || c == KEY_LEFT) {
+                                       /* getch() displays the key sequence */
+                                       mvwaddch(win, win->cury, win->curx - 1,
+                                           ' ');
+                                       mvwaddch(win, win->cury, win->curx - 2,
+                                           ' ');
+                                       wmove(win, win->cury, win->curx - 1);
+                               }
+                               str--;
+                               if (n != -1) {
+                                       /* We're counting chars */
+                                       remain++;
+                               }
+                       } else {        /* str == ostr */
+                               if (c == KEY_BACKSPACE || c == KEY_LEFT)
+                                       /* getch() displays the other keys */
+                                       mvwaddch(win, win->cury, win->curx - 1,
+                                           ' ');
+                               wmove(win, win->cury, oldx);
+                       }
+               } else if (c == kc) {
+                       *str = '\0';
+                       if (str != ostr) {
+                               /* getch() displays the kill character */
+                               mvwaddch(win, win->cury, win->curx - 1, ' ');
+                               /* Clear the characters from screen and str */
+                               while (str != ostr) {
+                                       mvwaddch(win, win->cury, win->curx - 1,
+                                           ' ');
+                                       wmove(win, win->cury, win->curx - 1);
+                                       str--;
+                                       if (n != -1)
+                                               /* We're counting chars */
+                                               remain++;
+                               }
+                               mvwaddch(win, win->cury, win->curx - 1, ' ');
+                               wmove(win, win->cury, win->curx - 1);
+                       } else
+                               /* getch() displays the kill character */
+                               mvwaddch(win, win->cury, oldx, ' ');
+                       wmove(win, win->cury, oldx);
+               } else if (c >= KEY_MIN && c <= KEY_MAX) {
+                       /* getch() displays these characters */
+                       mvwaddch(win, win->cury, win->curx - 1, ' ');
+                       wmove(win, win->cury, win->curx - 1);
+               } else {
+                       if (remain) {
+                               str++;
+                               remain--;
+                       } else {
+                               mvwaddch(win, win->cury, win->curx - 1, ' ');
+                               wmove(win, win->cury, win->curx - 1);
+                       }
+               }
+       }
+
+       if (c == ERR) {
+               *str = '\0';
+               return (ERR);
+       }
+       *str = '\0';
+       return (OK);
+}
diff --git a/lib/libcurses/getyx.c b/lib/libcurses/getyx.c
new file mode 100644 (file)
index 0000000..671f08e
--- /dev/null
@@ -0,0 +1,134 @@
+/*     $NetBSD: getyx.c,v 1.5 2008/04/28 20:23:01 martin Exp $ */
+
+/*
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: getyx.c,v 1.5 2008/04/28 20:23:01 martin Exp $");
+#endif                         /* not lint */
+
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * getpary --
+ *      Get the y postion of the window relative to the parent window
+ * return -1 if not a subwindow.
+ */
+int
+getpary(WINDOW *win)
+{
+       if (win == NULL)
+               return -1;
+
+       if (win->orig == NULL)
+               return -1;
+
+       return (win->begy - win->orig->begy);
+}
+
+/*
+ * getparx --
+ *      Get the x postion of the window relative to the parent window
+ * return -1 if not a subwindow.
+ */
+int
+getparx(WINDOW *win)
+{
+       if (win == NULL)
+               return -1;
+
+       if (win->orig == NULL)
+               return -1;
+
+       return (win->begx - win->orig->begx);
+}
+
+/*
+ * getcury --
+ *     Get current y position on window.
+ */
+int
+getcury(WINDOW *win)
+{
+       return(win->cury);
+}
+
+/*
+ * getcurx --
+ *     Get current x position on window.
+ */
+int
+getcurx(WINDOW *win)
+{
+       return(win->curx);
+}
+
+/*
+ * getbegy --
+ *     Get begin y position on window.
+ */
+int
+getbegy(WINDOW *win)
+{
+       return(win->begy);
+}
+
+/*
+ * getbegx --
+ *     Get begin x position on window.
+ */
+int
+getbegx(WINDOW *win)
+{
+       return(win->begx);
+}
+
+/*
+ * getmaxy --
+ *     Get maximum y position on window.
+ */
+int
+getmaxy(WINDOW *win)
+{
+       return(win->maxy);
+}
+
+/*
+ * getmaxx --
+ *     Get maximum x position on window.
+ */
+int
+getmaxx(WINDOW *win)
+{
+       return(win->maxx);
+}
diff --git a/lib/libcurses/id_subwins.c b/lib/libcurses/id_subwins.c
new file mode 100644 (file)
index 0000000..c91a500
--- /dev/null
@@ -0,0 +1,60 @@
+/*     $NetBSD: id_subwins.c,v 1.14 2009/07/22 16:57:14 roy Exp $      */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)id_subwins.c       8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: id_subwins.c,v 1.14 2009/07/22 16:57:14 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * __id_subwins --
+ *     Re-sync the pointers to lines for all the subwindows.
+ */
+void
+__id_subwins(WINDOW *orig)
+{
+       WINDOW *win;
+       int     oy, y;
+
+       for (win = orig->nextp; win != orig; win = win->nextp) {
+               oy = win->begy - orig->begy;
+               for (y = 0; y < win->maxy; y++)
+                       win->alines[y]->line =
+                           &orig->alines[oy + y]->line[win->ch_off];
+       }
+}
diff --git a/lib/libcurses/idcok.c b/lib/libcurses/idcok.c
new file mode 100644 (file)
index 0000000..0af687b
--- /dev/null
@@ -0,0 +1,58 @@
+/*     $NetBSD: idcok.c,v 1.1 2002/07/19 13:22:41 blymn Exp $  */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com)
+ * All rights reserved.
+ *
+ * This software has been donated to the NetBSD Foundation by the
+ * Author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)idcok.c    blymn 2002/06/06";
+#else
+__RCSID("$NetBSD: idcok.c,v 1.1 2002/07/19 13:22:41 blymn Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * idcok --
+ *     Turn on and off using insert/delete char sequences for the
+ *     given window.  Note, currently, the ic/dc capabilities are not
+ *      used, this function is only provided for compatibility.
+ */
+int
+idcok(WINDOW *win, bool bf)
+{
+       if (bf)
+               win->flags |= __IDCHAR;
+       else
+               win->flags &= ~__IDCHAR;
+       return (OK);
+}
diff --git a/lib/libcurses/idlok.c b/lib/libcurses/idlok.c
new file mode 100644 (file)
index 0000000..27a1ae6
--- /dev/null
@@ -0,0 +1,57 @@
+/*     $NetBSD: idlok.c,v 1.11 2003/08/07 16:44:22 agc Exp $   */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)idlok.c    8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: idlok.c,v 1.11 2003/08/07 16:44:22 agc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * idlok --
+ *     Turn on and off using insert/deleteln sequences for the
+ *     given window.
+ */
+int
+idlok(WINDOW *win, bool bf)
+{
+       if (bf)
+               win->flags |= __IDLINE;
+       else
+               win->flags &= ~__IDLINE;
+       return (OK);
+}
diff --git a/lib/libcurses/in_wch.c b/lib/libcurses/in_wch.c
new file mode 100644 (file)
index 0000000..46b0138
--- /dev/null
@@ -0,0 +1,119 @@
+/*   $NetBSD: in_wch.c,v 1.3 2009/07/22 16:57:14 roy Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: in_wch.c,v 1.3 2009/07/22 16:57:14 roy Exp $");
+#endif                                           /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * in_wch --
+ *     Return wide character at cursor position from stdscr.
+ */
+int
+in_wch(cchar_t *wcval)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return win_wch(stdscr, wcval);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvin_wch --
+ *  Return wide character at position (y, x) from stdscr.
+ */
+int
+mvin_wch(int y, int x, cchar_t *wcval)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwin_wch(stdscr, y, x, wcval);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvwin_wch --
+ *  Return wide character at position (y, x) from the given window.
+ */
+int
+mvwin_wch(WINDOW *win, int y, int x, cchar_t *wcval)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return win_wch(win, wcval);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * win_wch --
+ *     Return wide character at cursor position.
+ */
+int
+win_wch(WINDOW *win, cchar_t *wcval)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       nschar_t *np;
+       __LDATA *lp = &win->alines[ win->cury ]->line[ win->curx ];
+       int cw = WCOL( *lp );
+
+       if ( cw < 0 ) 
+               lp += cw;
+       wcval->vals[ 0 ] = lp->ch;
+       wcval->attributes = lp->attr;
+       wcval->elements = 1;
+       np = lp->nsp;
+       if (np) {
+               do {
+                       wcval->vals[ wcval->elements++ ] = np->ch;
+                       np = np-> next;
+               } while ( np );
+       }
+
+       return OK;
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/in_wchstr.c b/lib/libcurses/in_wchstr.c
new file mode 100644 (file)
index 0000000..b6d3d75
--- /dev/null
@@ -0,0 +1,197 @@
+/*   $NetBSD: in_wchstr.c,v 1.3 2009/07/22 16:57:14 roy Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: in_wchstr.c,v 1.3 2009/07/22 16:57:14 roy Exp $");
+#endif                                           /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * in_wchstr, in_wchnstr --
+ *     Return an array of wide characters at cursor position from stdscr.
+ */
+__warn_references(in_wchstr,
+       "warning: this program uses in_wchstr(), which is unsafe.")
+int
+in_wchstr(cchar_t *wchstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return win_wchstr(stdscr, wchstr);
+#endif /* HAVE_WCHAR */
+}
+
+int
+in_wchnstr(cchar_t *wchstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return win_wchnstr(stdscr, wchstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvin_wchstr, mv_winchnstr --
+ *  Return an array of wide characters at position (y, x) from stdscr.
+ */
+__warn_references(mvin_wchstr,
+       "warning: this program uses mvin_wchstr(), which is unsafe.")
+int
+mvin_wchstr(int y, int x, cchar_t *wchstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwin_wchstr(stdscr, y, x, wchstr);
+#endif /* HAVE_WCHAR */
+}
+
+int
+mvin_wchnstr(int y, int x, cchar_t *wchstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwin_wchnstr(stdscr, y, x, wchstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvwin_wchstr, mvwin_wchnstr --
+ *  Return an array wide characters at position (y, x) from the given window.
+ */
+__warn_references(mvwin_wchstr,
+       "warning: this program uses mvwin_wchstr(), which is unsafe.")
+int
+mvwin_wchstr(WINDOW *win, int y, int x, cchar_t *wchstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return win_wchstr(win, wchstr);
+#endif /* HAVE_WCHAR */
+}
+
+int
+mvwin_wchnstr(WINDOW *win, int y, int x, cchar_t *wchstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return win_wchnstr(win, wchstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * win_wchstr, win_wchnstr --
+ *     Return an array of characters at cursor position.
+ */
+__warn_references(win_wchstr,
+       "warning: this program uses win_wchstr(), which is unsafe.")
+int
+win_wchstr(WINDOW *win, cchar_t *wchstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+
+       return win_wchnstr(win, wchstr, -1);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * - SUSv2/xcurses doesn't document whether the trailing 0 is included
+ *   in the length count or not.  For safety's sake it _is_ included.
+ */
+int
+win_wchnstr(WINDOW *win, cchar_t *wchstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       __LDATA *start;
+       int x = 0, cw = 0, cnt = 0;
+       cchar_t *wcp;
+       nschar_t *np;
+
+       if (wchstr == NULL)
+               return ERR;
+
+       start = &win->alines[win->cury]->line[win->curx];
+       x = win->curx;
+       cw = WCOL(*start);
+       if (cw < 0) {
+               start += cw;
+               x += cw;
+       }
+       wcp = wchstr;
+       /* (n - 1) to leave room for the trailing 0 element */
+       while ((x < win->maxx) && ((n < 0) || ((n > 1) && (cnt < n - 1)))) {
+               cw = WCOL( *start );
+               wcp->vals[ 0 ] = start->ch;
+               wcp->attributes = start->attr;
+               wcp->elements = 1;
+               np = start->nsp;
+               if (np) {
+                       do {
+                               wcp->vals[ wcp->elements++ ] = np->ch;
+                               np = np->next;
+                       } while ( np );
+               }
+               wcp++;
+               cnt++;
+               x += cw;
+               if ( x < win->maxx ) 
+                       start += cw;
+       }
+       wcp->vals[ 0 ] = L'\0';
+       wcp->elements = 1;
+       wcp->attributes = win->wattr;
+
+       return OK;
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/inch.c b/lib/libcurses/inch.c
new file mode 100644 (file)
index 0000000..908eef5
--- /dev/null
@@ -0,0 +1,94 @@
+/*     $NetBSD: inch.c,v 1.10 2009/10/06 20:03:27 jdc Exp $    */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: inch.c,v 1.10 2009/10/06 20:03:27 jdc Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * inch --
+ *     Return character at cursor position from stdscr.
+ */
+chtype
+inch(void)
+{
+       return winch(stdscr);
+}
+
+/*
+ * mvinch --
+ *      Return character at position (y, x) from stdscr.
+ */
+chtype
+mvinch(int y, int x)
+{
+       return mvwinch(stdscr, y, x);
+}
+
+/*
+ * mvwinch --
+ *      Return character at position (y, x) from the given window.
+ */
+chtype
+mvwinch(WINDOW *win, int y, int x)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winch(win);
+}
+
+#endif
+
+/*
+ * winch --
+ *     Return character at cursor position.
+ */
+chtype
+winch(WINDOW *win)
+{
+       chtype  ch;
+       attr_t  attr;
+
+       ch = (chtype) ((win)->alines[(win)->cury]->line[(win)->curx].ch &
+           __CHARTEXT);
+       attr = (attr_t) ((win)->alines[(win)->cury]->line[(win)->curx].attr &
+           __ATTRIBUTES);
+       if (__using_color && ((attr & __COLOR) == __default_color))
+               attr &= ~__default_color;
+       return (ch | attr);
+}
diff --git a/lib/libcurses/inchstr.c b/lib/libcurses/inchstr.c
new file mode 100644 (file)
index 0000000..00318e5
--- /dev/null
@@ -0,0 +1,154 @@
+/*     $NetBSD: inchstr.c,v 1.3 2009/07/22 16:57:14 roy Exp $  */
+
+/*
+ * Copyright 2001 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Simon Burge for Wasabi Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed for the NetBSD Project by
+ *      Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC. BE 
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: inchstr.c,v 1.3 2009/07/22 16:57:14 roy Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * inchstr, inchnstr --
+ *     Return an array of characters at cursor position from stdscr.
+ */
+__warn_references(inchstr,
+    "warning: this program uses inchstr(), which is unsafe.")
+int
+inchstr(chtype *chstr)
+{
+       return winchstr(stdscr, chstr);
+}
+
+int
+inchnstr(chtype *chstr, int n)
+{
+       return winchnstr(stdscr, chstr, n);
+}
+
+/*
+ * mvinchstr, mvinchnstr --
+ *      Return an array of characters at position (y, x) from stdscr.
+ */
+__warn_references(mvinchstr,
+    "warning: this program uses mvinchstr(), which is unsafe.")
+int
+mvinchstr(int y, int x, chtype *chstr)
+{
+       return mvwinchstr(stdscr, y, x, chstr);
+}
+
+int
+mvinchnstr(int y, int x, chtype *chstr, int n)
+{
+       return mvwinchnstr(stdscr, y, x, chstr, n);
+}
+
+/*
+ * mvwinchstr, mvwinchnstr --
+ *      Return an array characters at position (y, x) from the given window.
+ */
+__warn_references(mvwinchstr,
+    "warning: this program uses mvwinchstr(), which is unsafe.")
+int
+mvwinchstr(WINDOW *win, int y, int x, chtype *chstr)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winchstr(win, chstr);
+}
+
+int
+mvwinchnstr(WINDOW *win, int y, int x, chtype *chstr, int n)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winchnstr(win, chstr, n);
+}
+
+#endif /* _CURSES_USE_MACROS */
+
+/*
+ * winchstr, winchnstr --
+ *     Return an array of characters at cursor position.
+ */
+__warn_references(winchstr,
+    "warning: this program uses winchstr(), which is unsafe.")
+int
+winchstr(WINDOW *win, chtype *chstr)
+{
+
+       return winchnstr(win, chstr, -1);
+}
+
+/*
+ * XXX: This should go in a manpage!
+ * - SUSv2/xcurses doesn't document whether the trailing 0 is included
+ *   in the length count or not.  For safety's sake it _is_ included.
+ */
+int
+winchnstr(WINDOW *win, chtype *chstr, int n)
+{
+       __LDATA *end, *start;
+       int epos;
+
+       if (chstr == NULL)
+               return ERR;
+
+       start = &win->alines[win->cury]->line[win->curx];
+       /* (n - 1) to leave room for the trailing 0 element */
+       if (n < 0 || (n - 1) > win->maxx - win->curx - 1)
+               epos = win->maxx - 1;
+       else
+               /* extra -1 for trailing NUL */
+               epos = win->curx + n -1 - 1;
+       end = &win->alines[win->cury]->line[epos];
+
+       while (start <= end) {
+               *chstr = start->ch;
+               chstr++;
+               start++;
+       }
+       *chstr = 0;
+
+       return OK;
+}
index 7ed2f9d1126d5bfff13c7fa3eaa654d596edbf7a..b82c68ce4325b353e65fcd9bd430b100d2fd6b88 100644 (file)
@@ -1,19 +1,87 @@
-/* initscr.c - initialize the curses library */
+/*     $NetBSD: initscr.c,v 1.29 2007/01/22 21:14:53 jdc Exp $ */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)initscr.c  8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: initscr.c,v 1.29 2007/01/22 21:14:53 jdc Exp $");
+#endif
+#endif /* not lint */
 
 #include <stdlib.h>
-#include <curses.h>
-#include "curspriv.h"
 
-WINDOW *initscr()
+#include "curses.h"
+#include "curses_private.h"
+
+
+/*
+ * initscr --
+ *     Initialize the current and standard screen.
+ */
+WINDOW *
+initscr(void)
 {
-  char *term;
-
-  if ((term = getenv("TERM")) == NULL) return NULL;
-  setterm(term);
-  gettmode();
-  if ((_cursvar.tmpwin = newwin(LINES, COLS, 0, 0)) == NULL) return NULL;
-  if ((curscr = newwin(LINES, COLS, 0, 0)) == NULL) return NULL;
-  if ((stdscr = newwin(LINES, COLS, 0, 0)) == NULL) return NULL;
-  clearok(curscr, TRUE);
-  return(stdscr);
+       const char *sp;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INIT, "initscr\n");
+#endif
+
+       /*
+        * If My_term is set, or can't find a terminal in the environment,
+        * use Def_term.
+        */
+       if (My_term || (sp = getenv("TERM")) == NULL)
+               sp = Def_term;
+
+       /* LINTED const castaway; newterm does not modify sp! */
+       if ((_cursesi_screen = newterm((char *) sp, stdout, stdin)) == NULL)
+               return NULL;
+
+       __echoit = _cursesi_screen->echoit;
+        __pfast = _cursesi_screen->pfast;
+       __rawmode = _cursesi_screen->rawmode;
+       __noqch = _cursesi_screen->noqch;
+       COLS = _cursesi_screen->COLS;
+       LINES = _cursesi_screen->LINES;
+       COLORS = _cursesi_screen->COLORS;
+       COLOR_PAIRS = _cursesi_screen->COLOR_PAIRS;
+       __GT = _cursesi_screen->GT;
+       __NONL = _cursesi_screen->NONL;
+       __UPPERCASE = _cursesi_screen->UPPERCASE;
+
+       set_term(_cursesi_screen);
+       wrefresh(curscr);
+
+       return (stdscr);
 }
diff --git a/lib/libcurses/ins_wch.c b/lib/libcurses/ins_wch.c
new file mode 100644 (file)
index 0000000..1481280
--- /dev/null
@@ -0,0 +1,253 @@
+/*   $NetBSD: ins_wch.c,v 1.5 2010/02/23 19:48:26 drochner Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: ins_wch.c,v 1.5 2010/02/23 19:48:26 drochner Exp $");
+#endif                                           /* not lint */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * ins_wch --
+ *     Do an insert-char on the line, leaving (cury, curx) unchanged.
+ */
+int
+ins_wch(const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wins_wch(stdscr, wch);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvins_wch --
+ *       Do an insert-char on the line at (y, x).
+ */
+int
+mvins_wch(int y, int x, const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwins_wch(stdscr, y, x, wch);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvwins_wch --
+ *       Do an insert-char on the line at (y, x) in the given window.
+ */
+int
+mvwins_wch(WINDOW *win, int y, int x, const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wins_wch(stdscr, wch);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * wins_wch --
+ *     Do an insert-char on the line, leaving (cury, curx) unchanged.
+ */
+int
+wins_wch(WINDOW *win, const cchar_t *wch)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       __LDATA *start, *temp1, *temp2;
+       __LINE *lnp;
+       int cw, pcw, x, y, sx, ex, newx, i;
+       nschar_t *np, *tnp;
+       wchar_t ws[] = L"               ";
+
+       /* check for non-spacing characters */
+       if ( !wch )
+               return OK;
+       cw = wcwidth(wch->vals[0]);
+       if (cw < 0)
+               cw = 1;
+       if (!cw)
+               return wadd_wch( win, wch );
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "--before--\n");
+       for ( x = 0; x < win->maxx; x++ )
+               __CTRACE(__CTRACE_INPUT, "wins_wch: (0,%d)=(%x,%x,%p)\n", x,
+                   win->alines[0]->line[x].ch,
+                   win->alines[0]->line[x].attr,
+                   win->alines[0]->line[x].nsp);
+#endif /* DEBUG */
+       x = win->curx;
+       y = win->cury;
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wins_wch: (%d,%d)\n", y, x);
+#endif /* DEBUG */
+       switch ( wch->vals[ 0 ]) {
+               case L'\b':
+                       if ( --x < 0 )
+                               x = 0;
+                       win->curx = x;
+                       return OK;
+               case L'\r':
+                       win->curx = 0;
+                       return OK;
+               case L'\n':
+                       wclrtoeol( win );
+                       if (y == win->scr_b) {
+                               if (!(win->flags & __SCROLLOK))
+                                       return ERR;
+                               scroll(win);
+                       }
+                       return OK;
+               case L'\t':
+                       if (wins_nwstr(win, ws, min(win->maxx - x, 8-(x % 8)))
+                                       == ERR)
+                               return ERR;
+                       return OK;
+       }
+
+       /* locate current cell */
+       x = win->curx;
+       y = win->cury;
+       lnp = win->alines[ y ];
+       start = &win->alines[ y ]->line[ x ];
+       sx = x;
+       pcw = WCOL( *start );
+       if (pcw < 0) {
+               start += pcw;
+               sx += pcw;
+       }
+       if ( cw > win->maxx - sx )
+               return ERR;
+       lnp->flags |= __ISDIRTY;
+       newx = sx + win->ch_off;
+       if ( newx < *lnp->firstchp )
+               *lnp->firstchp = newx;
+
+       /* shift all complete characters */
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wins_wch: shift all characters\n");
+#endif /* DEBUG */
+       temp1 = &win->alines[ y ]->line[ win->maxx - 1 ];
+       temp2 = temp1 - cw;
+       pcw = WCOL(*(temp2 + 1));
+       if (pcw < 0) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "wins_wch: clear EOL\n");
+#endif /* DEBUG */
+               temp2 += pcw;
+               while ( temp1 > temp2 + cw ) {
+                       np = temp1->nsp;
+                       if (np) {
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               temp1->nsp = NULL;
+                       }
+                       temp1->ch = ( wchar_t )btowc(( int ) win->bch );
+                       if (_cursesi_copy_nsp(win->bnsp, temp1) == ERR)
+                               return ERR;
+                       temp1->attr = win->battr;
+                       SET_WCOL( *temp1, 1 );
+                       temp1--;
+               }
+       }
+       while ( temp2 >= start ) {
+               ( void )memcpy( temp1, temp2, sizeof( __LDATA ));
+               temp1--, temp2--;
+       }
+
+       /* update character under cursor */
+       start->nsp = NULL;
+       start->ch = wch->vals[ 0 ];
+       start->attr = wch->attributes & WA_ATTRIBUTES;
+       SET_WCOL( *start, cw );
+       if ( wch->elements > 1 ) {
+               for ( i = 1; i < wch->elements; i++ ) {
+                       np = (nschar_t *)malloc(sizeof(nschar_t));
+                       if (!np)
+                               return ERR;
+                       np->ch = wch->vals[ i ];
+                       np->next = start->nsp;
+                       start->nsp = np;
+               }
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wins_wch: insert (%x,%x,%p)\n",
+           start->ch, start->attr, start->nsp);
+#endif /* DEBUG */
+       temp1 = start + 1;
+       ex = x + 1;
+       while ( ex - x < cw ) {
+               temp1->ch = wch->vals[ 0 ];
+               SET_WCOL( *temp1, x - ex );
+               temp1->nsp = NULL;
+               ex++, temp1++;
+       }
+#ifdef DEBUG
+       {
+               __CTRACE(__CTRACE_INPUT, "--after---\n");
+               for ( x = 0; x < win->maxx; x++ )
+                       __CTRACE(__CTRACE_INPUT,
+                           "wins_wch: (0,%d)=(%x,%x,%p)\n", x,
+                           win->alines[0]->line[x].ch,
+                           win->alines[0]->line[x].attr,
+                           win->alines[0]->line[x].nsp);
+       }
+#endif /* DEBUG */
+       newx = win->maxx - 1 + win->ch_off;
+       if ( newx > *lnp->lastchp )
+               *lnp->lastchp = newx;
+       __touchline(win, y, sx, (int) win->maxx - 1);
+
+       return OK;
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/ins_wstr.c b/lib/libcurses/ins_wstr.c
new file mode 100644 (file)
index 0000000..05b3ac0
--- /dev/null
@@ -0,0 +1,333 @@
+/*   $NetBSD: ins_wstr.c,v 1.6 2010/12/16 17:42:28 wiz Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: ins_wstr.c,v 1.6 2010/12/16 17:42:28 wiz Exp $");
+#endif                                           /* not lint */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * ins_wstr --
+ *     insert a multi-character wide-character string into the current window
+ */
+int
+ins_wstr(const wchar_t *wstr)
+{
+       return wins_wstr(stdscr, wstr);
+}
+
+/*
+ * ins_nwstr --
+ *     insert a multi-character wide-character string into the current window
+ *     with at most n characters
+ */
+int
+ins_nwstr(const wchar_t *wstr, int n)
+{
+       return wins_nwstr(stdscr, wstr, n);
+}
+
+/*
+ * mvins_wstr --
+ *       Do an insert-string on the line at (y, x).
+ */
+int
+mvins_wstr(int y, int x, const wchar_t *wstr)
+{
+       return mvwins_wstr(stdscr, y, x, wstr);
+}
+
+/*
+ * mvins_nwstr --
+ *       Do an insert-n-string on the line at (y, x).
+ */
+int
+mvins_nwstr(int y, int x, const wchar_t *wstr, int n)
+{
+       return mvwins_nwstr(stdscr, y, x, wstr, n);
+}
+
+/*
+ * mvwins_wstr --
+ *       Do an insert-string on the line at (y, x) in the given window.
+ */
+int
+mvwins_wstr(WINDOW *win, int y, int x, const wchar_t *wstr)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wins_wstr(stdscr, wstr);
+}
+
+/*
+ * mvwins_nwstr --
+ *       Do an insert-n-string on the line at (y, x) in the given window.
+ */
+int
+mvwins_nwstr(WINDOW *win, int y, int x, const wchar_t *wstr, int n)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wins_nwstr(stdscr, wstr, n);
+}
+
+
+/*
+ * wins_wstr --
+ *     Do an insert-string on the line, leaving (cury, curx) unchanged.
+ */
+int
+wins_wstr(WINDOW *win, const wchar_t *wstr)
+{
+       return wins_nwstr(win, wstr, -1);
+}
+
+/*
+ * wins_nwstr --
+ *     Do an insert-n-string on the line, leaving (cury, curx) unchanged.
+ */
+int
+wins_nwstr(WINDOW *win, const wchar_t *wstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       __LDATA  *start, *temp1, *temp2;
+       __LINE    *lnp;
+       const wchar_t *scp;
+       int width, len, sx, x, y, cw, pcw, newx;
+       nschar_t *np;
+       wchar_t ws[] = L"               ";
+
+       /* check for leading non-spacing character */
+       if (!wstr)
+               return OK;
+       cw = wcwidth(*wstr);
+       if (cw < 0)
+               cw = 1;
+       if (!cw)
+               return ERR;
+
+       scp = wstr + 1;
+       width = cw;
+       len = 1;
+       n--;
+       while (*scp) {
+               int w;
+               if (!n)
+                       break;
+               w = wcwidth(*scp);
+               if (w < 0)
+                       w = 1;
+               n--, len++, width += w;
+               scp++;
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wins_nwstr: width=%d,len=%d\n", width, len);
+#endif /* DEBUG */
+
+       if (cw > win->maxx - win->curx + 1)
+               return ERR;
+       start = &win->alines[win->cury]->line[win->curx];
+       sx = win->curx;
+       lnp = win->alines[win->cury];
+       pcw = WCOL(*start);
+       if (pcw < 0) {
+               sx += pcw;
+               start += pcw;
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "wins_nwstr: start@(%d)\n", sx);
+#endif /* DEBUG */
+       pcw = WCOL(*start);
+       lnp->flags |= __ISDIRTY;
+       newx = sx + win->ch_off;
+       if (newx < *lnp->firstchp)
+               *lnp->firstchp = newx;
+#ifdef DEBUG
+       {
+               __CTRACE(__CTRACE_INPUT, "========before=======\n");
+               for (x = 0; x < win->maxx; x++)
+                       __CTRACE(__CTRACE_INPUT,
+                           "wins_nwstr: (%d,%d)=(%x,%x,%p)\n",
+                           (int) win->cury, x,
+                           win->alines[win->cury]->line[x].ch,
+                           win->alines[win->cury]->line[x].attr,
+                           win->alines[win->cury]->line[x].nsp);
+       }
+#endif /* DEBUG */
+
+       /* shift all complete characters */
+       if (sx + width + pcw <= win->maxx) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "wins_nwstr: shift all characters\n");
+#endif /* DEBUG */
+               temp1 = &win->alines[win->cury]->line[win->maxx - 1];
+               temp2 = temp1 - width;
+               pcw = WCOL(*(temp2 + 1));
+               if (pcw < 0) {
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "wins_nwstr: clear from %d to EOL(%d)\n",
+                           win->maxx + pcw, win->maxx - 1);
+#endif /* DEBUG */
+                       temp2 += pcw;
+                       while (temp1 > temp2 + width) {
+                               temp1->ch = (wchar_t)btowc((int) win->bch);
+                               if (_cursesi_copy_nsp(win->bnsp, temp1) == ERR)
+                                       return ERR;
+                               temp1->attr = win->battr;
+                               SET_WCOL(*temp1, 1);
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_INPUT,
+                                   "wins_nwstr: empty cell(%p)\n", temp1);
+#endif /* DEBUG */
+                               temp1--;
+                       }
+               }
+               while (temp2 >= start) {
+                       (void)memcpy(temp1, temp2, sizeof(__LDATA));
+                       temp1--, temp2--;
+               }
+#ifdef DEBUG
+               {
+                       __CTRACE(__CTRACE_INPUT, "=====after shift====\n");
+                       for (x = 0; x < win->maxx; x++)
+                               __CTRACE(__CTRACE_INPUT,
+                                   "wins_nwstr: (%d,%d)=(%x,%x,%p)\n",
+                                   (int) win->cury, x,
+                                   win->alines[win->cury]->line[x].ch,
+                                   win->alines[win->cury]->line[x].attr,
+                                   win->alines[win->cury]->line[x].nsp);
+               }
+#endif /* DEBUG */
+       }
+
+       /* update string columns */
+       x = win->curx;
+       y = win->cury;
+       for (scp = wstr, temp1 = start; len; len--, scp++) {
+               switch (*scp) {
+                       case L'\b':
+                               if (--x < 0)
+                                       x = 0;
+                               win->curx = x;
+                               continue;;
+                       case L'\r':
+                               win->curx = 0;
+                               continue;
+                       case L'\n':
+                               wclrtoeol(win);
+                               if (y == win->scr_b) {
+                                       if (!(win->flags & __SCROLLOK))
+                                               return ERR;
+                                       scroll(win);
+                               }
+                               continue;
+                       case L'\t':
+                               if (wins_nwstr(win, ws,
+                                               min(win->maxx - x, 8-(x % 8)))
+                                                       == ERR)
+                                       return ERR;
+                               continue;
+               }
+               cw = wcwidth(*scp);
+               if (cw < 0)
+                       cw = 1;
+               if (cw) {
+                       /* 1st column */
+                       temp1->ch = (wchar_t)*scp;
+                       temp1->attr = win->wattr;
+                       SET_WCOL(*temp1, cw);
+                       temp1->nsp = NULL;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "wins_nwstr: add spacing char(%x)\n", temp1->ch);
+#endif /* DEBUG */
+                       temp2 = temp1++;
+                       if (cw > 1) {
+                               x = -1;
+                               while (temp1 < temp2 + cw) {
+                                       /* the rest columns */
+                                       temp1->ch = (wchar_t)*scp;
+                                       temp1->attr = win->wattr;
+                                       temp1->nsp = NULL;
+                                       SET_WCOL(*temp1, x);
+                                       temp1++, x--;
+                               }
+                               temp1--;
+                       }
+               } else {
+                       /* non-spacing character */
+                       np = (nschar_t *)malloc(sizeof(nschar_t));
+                       if (!np)
+                               return ERR;
+                       np->ch = *scp;
+                       np->next = temp1->nsp;
+                       temp1->nsp = np;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_INPUT,
+                           "wins_nstr: add non-spacing char(%x)\n", np->ch);
+#endif /* DEBUG */
+               }
+       }
+#ifdef DEBUG
+       {
+               __CTRACE(__CTRACE_INPUT, "========after=======\n");
+               for (x = 0; x < win->maxx; x++)
+                       __CTRACE(__CTRACE_INPUT,
+                           "wins_nwstr: (%d,%d)=(%x,%x,%p)\n",
+                           (int) win->cury, x,
+                           win->alines[win->cury]->line[x].ch,
+                           win->alines[win->cury]->line[x].attr,
+                           win->alines[win->cury]->line[x].nsp);
+       }
+#endif /* DEBUG */
+       newx = win->maxx - 1 + win->ch_off;
+       if (newx > *lnp->lastchp)
+               *lnp->lastchp = newx;
+       __touchline(win, (int) win->cury, sx, (int) win->maxx - 1);
+       return OK;
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/insch.c b/lib/libcurses/insch.c
new file mode 100644 (file)
index 0000000..317dfb0
--- /dev/null
@@ -0,0 +1,131 @@
+/*     $NetBSD: insch.c,v 1.22 2009/07/22 16:57:15 roy Exp $   */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)insch.c    8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: insch.c,v 1.22 2009/07/22 16:57:15 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * insch --
+ *     Do an insert-char on the line, leaving (cury, curx) unchanged.
+ */
+int
+insch(chtype ch)
+{
+       return winsch(stdscr, ch);
+}
+
+/*
+ * mvinsch --
+ *     Do an insert-char on the line at (y, x).
+ */
+int
+mvinsch(int y, int x, chtype ch)
+{
+       return mvwinsch(stdscr, y, x, ch);
+}
+
+/*
+ * mvwinsch --
+ *     Do an insert-char on the line at (y, x) in the given window.
+ */
+int
+mvwinsch(WINDOW *win, int y, int x, chtype ch)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winsch(stdscr, ch);
+}
+
+#endif
+
+/*
+ * winsch --
+ *     Do an insert-char on the line, leaving (cury, curx) unchanged.
+ */
+int
+winsch(WINDOW *win, chtype ch)
+{
+
+       __LDATA *end, *temp1, *temp2;
+       attr_t attr;
+
+       if (__using_color)
+               attr = win->battr & __COLOR;
+       else
+               attr = 0;
+       end = &win->alines[win->cury]->line[win->curx];
+       temp1 = &win->alines[win->cury]->line[win->maxx - 1];
+       temp2 = temp1 - 1;
+       while (temp1 > end) {
+               (void) memcpy(temp1, temp2, sizeof(__LDATA));
+               temp1--, temp2--;
+       }
+       temp1->ch = (wchar_t) ch & __CHARTEXT;
+       if (temp1->ch == ' ')
+               temp1->ch = win->bch;
+       temp1->attr = (attr_t) ch & __ATTRIBUTES;
+       if (temp1->attr & __COLOR)
+               temp1->attr |= (win->battr & ~__COLOR);
+       else
+               temp1->attr |= win->battr;
+#ifdef HAVE_WCHAR
+       if (_cursesi_copy_nsp(win->bnsp, temp1) == ERR)
+               return ERR;
+       SET_WCOL(*temp1, 1);
+#endif /* HAVE_WCHAR */
+       __touchline(win, (int) win->cury, (int) win->curx, (int) win->maxx - 1);
+       if (win->cury == LINES - 1 &&
+           (win->alines[LINES - 1]->line[COLS - 1].ch != ' ' ||
+               win->alines[LINES - 1]->line[COLS - 1].attr != attr)) {
+               if (win->flags & __SCROLLOK) {
+                       wrefresh(win);
+                       scroll(win);
+                       win->cury--;
+               } else
+                       return (ERR);
+       }
+       return (OK);
+}
diff --git a/lib/libcurses/insdelln.c b/lib/libcurses/insdelln.c
new file mode 100644 (file)
index 0000000..2a150b5
--- /dev/null
@@ -0,0 +1,181 @@
+/*     $NetBSD: insdelln.c,v 1.16 2009/07/22 16:57:15 roy Exp $        */
+
+/*
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: insdelln.c,v 1.16 2009/07/22 16:57:15 roy Exp $");
+#endif                         /* not lint */
+
+/*
+ * Based on deleteln.c and insertln.c -
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * insdelln --
+ *     Insert or delete lines on stdscr, leaving (cury, curx) unchanged.
+ */
+int
+insdelln(int nlines)
+{
+       return winsdelln(stdscr, nlines);
+}
+
+#endif
+
+/*
+ * winsdelln --
+ *     Insert or delete lines on the window, leaving (cury, curx) unchanged.
+ */
+int
+winsdelln(WINDOW *win, int nlines)
+{
+       int     y, i, last;
+       __LINE *temp;
+#ifdef HAVE_WCHAR
+       __LDATA *lp;
+#endif /* HAVE_WCHAR */
+       attr_t  attr;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE,
+           "winsdelln: (%p) cury=%d lines=%d\n", win, win->cury, nlines);
+#endif
+
+       if (!nlines)
+               return(OK);
+
+       if (__using_color && win != curscr)
+               attr = win->battr & __COLOR;
+       else
+               attr = 0;
+
+       if (nlines > 0) {
+               /* Insert lines */
+               if (win->cury < win->scr_t || win->cury > win->scr_b) {
+                       /*  Outside scrolling region */
+                       if (nlines > win->maxy - win->cury)
+                               nlines = win->maxy - win->cury;
+                       last = win->maxy - 1;
+               } else {
+                       /* Inside scrolling region */
+                       if (nlines > win->scr_b + 1 - win->cury)
+                               nlines = win->scr_b + 1 - win->cury;
+                       last = win->scr_b;
+               }
+               for (y = last - nlines; y >= win->cury; --y) {
+                       win->alines[y]->flags &= ~__ISPASTEOL;
+                       win->alines[y + nlines]->flags &= ~__ISPASTEOL;
+                       if (win->orig == NULL) {
+                               temp = win->alines[y + nlines];
+                               win->alines[y + nlines] = win->alines[y];
+                               win->alines[y] = temp;
+                       } else {
+                               (void) memcpy(win->alines[y + nlines]->line,
+                                   win->alines[y]->line,
+                                   (size_t) win->maxx * __LDATASIZE);
+                       }
+               }
+               for (y = win->cury - 1 + nlines; y >= win->cury; --y)
+                       for (i = 0; i < win->maxx; i++) {
+                               win->alines[y]->line[i].ch = win->bch;
+                               win->alines[y]->line[i].attr = attr;
+#ifndef HAVE_WCHAR
+                               win->alines[y]->line[i].ch = win->bch;
+#else
+                               win->alines[y]->line[i].ch
+                                       = ( wchar_t )btowc(( int ) win->bch );
+                               lp = &win->alines[y]->line[i];
+                               if (_cursesi_copy_nsp(win->bnsp, lp) == ERR)
+                                       return ERR;
+                               SET_WCOL( *lp, 1 );
+#endif /* HAVE_WCHAR */
+                       }
+               for (y = last; y >= win->cury; --y)
+                       __touchline(win, y, 0, (int) win->maxx - 1);
+       } else {
+               /* Delete nlines */
+               nlines = 0 - nlines;
+               if (win->cury < win->scr_t || win->cury > win->scr_b) {
+                       /*  Outside scrolling region */
+                       if (nlines > win->maxy - win->cury)
+                               nlines = win->maxy - win->cury;
+                       last = win->maxy;
+               } else {
+                       /* Inside scrolling region */
+                       if (nlines > win->scr_b + 1 - win->cury)
+                               nlines = win->scr_b + 1 - win->cury;
+                       last = win->scr_b + 1;
+               }
+               for (y = win->cury; y < last - nlines; y++) {
+                       win->alines[y]->flags &= ~__ISPASTEOL;
+                       win->alines[y + nlines]->flags &= ~__ISPASTEOL;
+                       if (win->orig == NULL) {
+                               temp = win->alines[y];
+                               win->alines[y] = win->alines[y + nlines];
+                               win->alines[y + nlines] = temp;
+                       } else {
+                               (void) memcpy(win->alines[y]->line,
+                                   win->alines[y + nlines]->line,
+                                   (size_t) win->maxx * __LDATASIZE);
+                       }
+               }
+               for (y = last - nlines; y < last; y++)
+                       for (i = 0; i < win->maxx; i++) {
+                               win->alines[y]->line[i].ch = win->bch;
+                               win->alines[y]->line[i].attr = attr;
+#ifndef HAVE_WCHAR
+                               win->alines[y]->line[i].ch = win->bch;
+#else
+                               win->alines[y]->line[i].ch
+                                       = (wchar_t)btowc((int) win->bch);
+                               lp = &win->alines[y]->line[i];
+                               SET_WCOL( *lp, 1 );
+                               if (_cursesi_copy_nsp(win->bnsp, lp) == ERR)
+                                       return ERR;
+#endif /* HAVE_WCHAR */
+                       }
+               for (y = win->cury; y < last; y++)
+                       __touchline(win, y, 0, (int) win->maxx - 1);
+       }
+       if (win->orig != NULL)
+               __id_subwins(win->orig);
+       return (OK);
+}
diff --git a/lib/libcurses/insertln.c b/lib/libcurses/insertln.c
new file mode 100644 (file)
index 0000000..0515c07
--- /dev/null
@@ -0,0 +1,66 @@
+/*     $NetBSD: insertln.c,v 1.13 2003/08/07 16:44:22 agc Exp $        */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)insertln.c 8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: insertln.c,v 1.13 2003/08/07 16:44:22 agc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * insertln --
+ *     Do an insert-line on stdscr, leaving (cury, curx) unchanged.
+ */
+int
+insertln(void)
+{
+       return(winsdelln(stdscr, 1));
+}
+
+#endif
+
+/*
+ * winsertln --
+ *     Do an insert-line on the window, leaving (cury, curx) unchanged.
+ */
+int
+winsertln(WINDOW *win)
+{
+       return(winsdelln(win, 1));
+}
diff --git a/lib/libcurses/insstr.c b/lib/libcurses/insstr.c
new file mode 100644 (file)
index 0000000..56c8169
--- /dev/null
@@ -0,0 +1,209 @@
+/*   $NetBSD: insstr.c,v 1.3 2009/07/22 16:57:15 roy Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: insstr.c,v 1.3 2009/07/22 16:57:15 roy Exp $");
+#endif                                           /* not lint */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * insstr --
+ *     insert a multi-byte character string into the current window
+ */
+int
+insstr(const char *str)
+{
+       return winsstr(stdscr, str);
+}
+
+/*
+ * insnstr --
+ *     insert a multi-byte character string into the current window
+ *     with at most n characters
+ */
+int
+insnstr(const char *str, int n)
+{
+       return winsnstr(stdscr, str, n);
+}
+
+/*
+ * mvinsstr --
+ *       Do an insert-string on the line at (y, x).
+ */
+int
+mvinsstr(int y, int x, const char *str)
+{
+       return mvwinsstr(stdscr, y, x, str);
+}
+
+/*
+ * mvinsnstr --
+ *       Do an insert-n-string on the line at (y, x).
+ */
+int
+mvinsnstr(int y, int x, const char *str, int n)
+{
+       return mvwinsnstr(stdscr, y, x, str, n);
+}
+
+/*
+ * mvwinsstr --
+ *       Do an insert-string on the line at (y, x) in the given window.
+ */
+int
+mvwinsstr(WINDOW *win, int y, int x, const char *str)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winsstr(stdscr, str);
+}
+
+/*
+ * mvwinsnstr --
+ *       Do an insert-n-string on the line at (y, x) in the given window.
+ */
+int
+mvwinsnstr(WINDOW *win, int y, int x, const char *str, int n)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winsnstr(stdscr, str, n);
+}
+
+#endif
+
+/*
+ * winsstr --
+ *     Do an insert-string on the line, leaving (cury, curx) unchanged.
+ *     No wrapping.
+ */
+int
+winsstr(WINDOW *win, const char *str)
+{
+       return winsnstr( win, str, -1 );
+}
+
+/*
+ * winsnstr --
+ *     Do an insert-n-string on the line, leaving (cury, curx) unchanged.
+ *     Performs wrapping.
+ */
+int
+winsnstr(WINDOW *win, const char *str, int n)
+{
+       __LDATA *end, *temp1, *temp2;
+       const char *scp;
+       int len, x;
+       __LINE *lnp;
+#ifdef HAVE_WCHAR
+       nschar_t *np, *tnp;
+#endif /* HAVE_WCHAR */
+
+       /* find string length */
+       if ( n > 0 )
+               for ( scp = str, len = 0; n-- && *scp++; ++len );
+       else
+               for ( scp = str, len = 0; *scp++; ++len );
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INPUT, "winsnstr: len = %d\n", len);
+#endif /* DEBUG */
+
+       /* move string */
+       end = &win->alines[win->cury]->line[win->curx];
+       if ( len < win->maxx - win->curx ) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_INPUT, "winsnstr: shift %d cells\n", len);
+#endif /* DEBUG */
+               temp1 = &win->alines[win->cury]->line[win->maxx - 1];
+               temp2 = temp1 - len;
+               while (temp2 >= end) {
+#ifdef HAVE_WCHAR
+                       np = temp1->nsp;
+                       if (np){
+                               while ( np ) {
+                                       tnp = np->next;
+                                       free( np );
+                                       np = tnp;
+                               }
+                               temp1->nsp = NULL;
+                       }
+#endif /* HAVE_WCHAR */
+                       (void) memcpy(temp1, temp2, sizeof(__LDATA));
+                       temp1--, temp2--;
+               }
+       }
+
+       for ( scp = str, temp1 = end, x = win->curx;
+                       *scp && x < len + win->curx && x < win->maxx;
+                       scp++, temp1++, x++ ) {
+               temp1->ch = (wchar_t)*scp & __CHARTEXT;
+               temp1->attr = win->wattr;
+#ifdef HAVE_WCHAR
+               SET_WCOL( *temp1, 1 );
+#endif /* HAVE_WCHAR */
+       }
+#ifdef DEBUG
+       {
+               int i;
+
+               for ( i = win->curx; i < win->curx + len; i++ ) {
+                       __CTRACE(__CTRACE_INPUT,
+                           "winsnstr: (%d,%d)=('%c',%x)\n", win->cury, i,
+                           win->alines[win->cury]->line[i].ch,
+                           win->alines[win->cury]->line[i].attr);
+               }
+       }
+#endif /* DEBUG */
+       lnp = win->alines[ win->cury ];
+       lnp->flags |= __ISDIRTY;
+       if ( win->ch_off < *lnp->firstchp )
+               *lnp->firstchp = win->ch_off;
+       if ( win->ch_off + win->maxx - 1 > *lnp->lastchp )
+               *lnp->lastchp = win->ch_off + win->maxx - 1;
+       __touchline(win, (int)win->cury, (int)win->curx, (int)win->maxx - 1);
+       return OK;
+}
diff --git a/lib/libcurses/instr.c b/lib/libcurses/instr.c
new file mode 100644 (file)
index 0000000..c470f5a
--- /dev/null
@@ -0,0 +1,168 @@
+/*     $NetBSD: instr.c,v 1.3 2009/07/22 16:57:15 roy Exp $    */
+
+/*
+ * Copyright 2001 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Simon Burge for Wasabi Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed for the NetBSD Project by
+ *      Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ *    or promote products derived from this software without specific prior
+ *    written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC. BE 
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: instr.c,v 1.3 2009/07/22 16:57:15 roy Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * instr, innstr --
+ *     Return a string of characters at cursor position from stdscr.
+ */
+__warn_references(instr,
+    "warning: this program uses instr(), which is unsafe.")
+int
+instr(char *str)
+{
+       return winstr(stdscr, str);
+}
+
+int
+innstr(char *str, int n)
+{
+       return winnstr(stdscr, str, n);
+}
+
+/*
+ * mvinstr, mvinnstr --
+ *      Return a string of characters at position (y, x) from stdscr.
+ *     XXX: should be multi-byte characters for SUSv2.
+ */
+__warn_references(mvinstr,
+    "warning: this program uses mvinstr(), which is unsafe.")
+int
+mvinstr(int y, int x, char *str)
+{
+       return mvwinstr(stdscr, y, x, str);
+}
+
+int
+mvinnstr(int y, int x, char *str, int n)
+{
+       return mvwinnstr(stdscr, y, x, str, n);
+}
+
+/*
+ * mvwinstr, mvwinnstr --
+ *      Return an array characters at position (y, x) from the given window.
+ *     XXX: should be multi-byte characters for SUSv2.
+ */
+__warn_references(mvwinstr,
+    "warning: this program uses mvwinstr(), which is unsafe.")
+int
+mvwinstr(WINDOW *win, int y, int x, char *str)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winstr(win, str);
+}
+
+int
+mvwinnstr(WINDOW *win, int y, int x, char *str, int n)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winnstr(win, str, n);
+}
+
+#endif /* _CURSES_USE_MACROS */
+
+/*
+ * winstr, winnstr --
+ *     Return a string of characters at cursor position.
+ *     XXX: should be multi-byte characters for SUSv2.
+ */
+__warn_references(winstr,
+    "warning: this program uses winstr(), which is unsafe.")
+int
+winstr(WINDOW *win, char *str)
+{
+
+       return winnstr(win, str, -1);
+}
+
+/*
+ * XXX: This should go in a manpage!
+ * - winnstr() returns the number of characters copied only of if it is
+ *   called with n >= 0 (ie, as inchnstr(), mvinchnstr(), mvwinchnstr()
+ *   or winchnstr()).  If N < 0, it returns `OK'.
+ * - SUSv2/xcurses doesn't document whether the trailing NUL is included
+ *   in the length count or not.  For safety's sake it _is_ included.
+ * - This implementation does not (yet) support multi-byte characters
+ *   strings.
+ */
+int
+winnstr(WINDOW *win, char *str, int n)
+{
+       __LDATA *end, *start;
+       int epos;
+
+       if (str == NULL)
+               return ERR;
+
+       start = &win->alines[win->cury]->line[win->curx];
+       /* (n - 1) to leave room for the trailing NUL */
+       if (n < 0 || (n - 1) > win->maxx - win->curx - 1) {
+               epos = win->maxx - 1;
+               n = win->maxx - win->curx;
+       } else {
+               /* extra -1 for trailing NUL */
+               epos = win->curx + n - 1 - 1;
+               n--;
+       }
+       end = &win->alines[win->cury]->line[epos];
+
+       while (start <= end) {
+               *str = start->ch & __CHARTEXT;
+               str++;
+               start++;
+       }
+       *str = '\0';
+
+       if (n < 0)
+               return OK;
+       else
+               return n;
+}
diff --git a/lib/libcurses/inwstr.c b/lib/libcurses/inwstr.c
new file mode 100644 (file)
index 0000000..3af1d5c
--- /dev/null
@@ -0,0 +1,194 @@
+/*   $NetBSD: inwstr.c,v 1.3 2009/07/22 16:57:15 roy Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: inwstr.c,v 1.3 2009/07/22 16:57:15 roy Exp $");
+#endif                                           /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * inwstr, innwstr --
+ *     Return a string of wide characters at cursor position from stdscr.
+ */
+__warn_references(inwstr,
+       "warning: this program uses inwstr(), which is unsafe.")
+int
+inwstr(wchar_t *wstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return winwstr(stdscr, wstr);
+#endif /* HAVE_WCHAR */
+}
+
+int
+innwstr(wchar_t *wstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return winnwstr(stdscr, wstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvinwstr, mvinnwstr --
+ *  Return a string of wide characters at position (y, x) from stdscr.
+ */
+__warn_references(mvinwstr,
+       "warning: this program uses mvinwstr(), which is unsafe.")
+int
+mvinwstr(int y, int x, wchar_t *wstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwinwstr(stdscr, y, x, wstr);
+#endif /* HAVE_WCHAR */
+}
+
+int
+mvinnwstr(int y, int x, wchar_t *wstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwinnwstr(stdscr, y, x, wstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * mvwinwstr, mvwinnwstr --
+ *  Return an array wide characters at position (y, x) from the given window.
+ */
+__warn_references(mvwinwstr,
+       "warning: this program uses mvwinwstr(), which is unsafe.")
+int
+mvwinwstr(WINDOW *win, int y, int x, wchar_t *wstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winwstr(win, wstr);
+#endif /* HAVE_WCHAR */
+}
+
+int
+mvwinnwstr(WINDOW *win, int y, int x, wchar_t *wstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return winnwstr(win, wstr, n);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * winwstr, winnwstr --
+ *     Return a string of wide characters at cursor position.
+ */
+__warn_references(winwstr,
+       "warning: this program uses winwstr(), which is unsafe.")
+int
+winwstr(WINDOW *win, wchar_t *wstr)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+
+       return winnwstr(win, wstr, -1);
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * - winnwstr() returns the number of characters copied only of if it is
+ *   called with n >= 0 (ie, as in_wchnstr(), mvin_wchnstr(), mvwin_wchnstr()
+ *   or win_wchnstr()).  If N < 0, it returns `OK'.
+ * - SUSv2/xcurses doesn't document whether the trailing NUL is included
+ *   in the length count or not.  For safety's sake it _is_ included.
+ * - This implementation does not (yet) support multi-byte characters
+ *   strings.
+ */
+int
+winnwstr(WINDOW *win, wchar_t *wstr, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       __LDATA *start;
+       int x, cw, cnt;
+       wchar_t *wcp;
+
+       if (wstr == NULL)
+               return ERR;
+
+       start = &win->alines[win->cury]->line[win->curx];
+       x = win->curx;
+       cw = WCOL( *start );
+       if (cw < 0) {
+               start += cw;
+               x += cw;
+       }
+    cnt = 0;
+       wcp = wstr;
+       /* (n - 1) to leave room for the trailing 0 element */
+       while ((x < win->maxx) && ((n < 0) || ((n > 1) && (cnt < n - 1)))) {
+               cw = WCOL( *start );
+               *wcp = start->ch;
+               wcp++;
+               cnt++;
+               x += cw;
+               if ( x < win->maxx ) 
+                       start += cw;
+       }
+       *wcp = L'\0';
+
+       if (n < 0)
+               return OK;
+       else
+               return cnt;
+#endif /* HAVE_WCHAR */
+}
diff --git a/lib/libcurses/keymap.h b/lib/libcurses/keymap.h
new file mode 100644 (file)
index 0000000..2940b49
--- /dev/null
@@ -0,0 +1,116 @@
+/*   $NetBSD: keymap.h,v 1.3 2010/02/03 15:34:40 roy Exp $ */
+
+/*
+ * Copyright (c) 2005 The NetBSD Foundation Inc.
+ * All rights reserved.
+ *
+ * This code is derived from code donated to the NetBSD Foundation
+ * by Ruibiao Qiu <ruibiao@arl.wustl.edu,ruibiao@gmail.com>.
+ *
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
+ * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _KEYMAP_H_
+#define _KEYMAP_H_
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: keymap.h,v 1.3 2010/02/03 15:34:40 roy Exp $");
+#endif                          /* not lint */
+
+/* keymap related stuff */
+/*
+ * moved here by Ruibiao Qiu
+ * because it is needed by both getch() and get_wch()
+ *
+ * Keyboard input handler.  Do this by snarfing
+ * all the info we can out of the termcap entry for TERM and putting it
+ * into a set of keymaps.  A keymap is an array the size of all the possible
+ * single characters we can get, the contents of the array is a structure
+ * that contains the type of entry this character is (i.e. part/end of a
+ * multi-char sequence or a plain char) and either a pointer which will point
+ * to another keymap (in the case of a multi-char sequence) OR the data value
+ * that this key should return.
+ *
+ */
+
+/* private data structures for holding the key definitions */
+typedef struct key_entry key_entry_t;
+
+struct key_entry {
+       short   type;           /* type of key this is */
+       bool    enable;         /* true if the key is active */
+       union {
+               keymap_t *next; /* next keymap is key is multi-key sequence */
+               wchar_t   symbol;       /* key symbol if key is a leaf entry */
+       } value;
+};
+/* Types of key structures we can have */
+#define KEYMAP_MULTI  1                /* part of a multi char sequence */
+#define KEYMAP_LEAF   2                /* key has a symbol associated with it, either
+                                * it is the end of a multi-char sequence or a
+                                * single char key that generates a symbol */
+
+/* allocate this many key_entry structs at once to speed start up must
+ * be a power of 2.
+ */
+#define KEYMAP_ALLOC_CHUNK 4
+
+/* The max number of different chars we can receive */
+#define MAX_CHAR 256
+
+/*
+ * Unused mapping flag.
+ */
+#define MAPPING_UNUSED (0 - MAX_CHAR) /* never been used */
+
+struct keymap {
+       int     count;         /* count of number of key structs allocated */
+       short   mapping[MAX_CHAR]; /* mapping of key to allocated structs */
+       key_entry_t **key;     /* dynamic array of keys */
+};
+
+#define INC_POINTER(ptr)  do { \
+       (ptr)++;                \
+       (ptr) %= INBUF_SZ;      \
+} while(/*CONSTCOND*/0)
+
+#define INKEY_NORM        0 /* no key backlog to process */
+#define INKEY_ASSEMBLING   1 /* assembling a multi-key sequence */
+#define INKEY_BACKOUT     2 /* recovering from an unrecognised key */
+#define INKEY_TIMEOUT     3 /* multi-key sequence timeout */
+#ifdef HAVE_WCHAR
+#define INKEY_WCASSEMBLING 4 /* assembling a wide char sequence */
+#endif /* HAVE_WCHAR */
+
+/* The termcap data we are interested in and the symbols they map to */
+struct tcdata {
+       int code;               /* code of the terminfo entry */
+       wchar_t symbol;         /* the symbol associated with it */
+};
+
+#endif /* _KEYMAP_H_ */
diff --git a/lib/libcurses/keyname.c b/lib/libcurses/keyname.c
new file mode 100644 (file)
index 0000000..2adef1d
--- /dev/null
@@ -0,0 +1,508 @@
+/*     $NetBSD: keyname.c,v 1.6 2008/04/28 20:23:01 martin Exp $       */
+
+/*-
+ * Copyright (c) 2003 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: keyname.c,v 1.6 2008/04/28 20:23:01 martin Exp $");
+#endif                         /* not lint */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+#define KEYNAMEMAX (size_t) 14 /* "KEY_BACKSPACE\0" */
+static char name[KEYNAMEMAX + 1];
+
+/*
+ * keyname --
+ *     Return name of key or NULL;
+ */
+char *
+keyname(int key)
+{
+/* We don't bother with the large keyname table if SMALL is defined. */
+#ifdef SMALL
+       strcpy(name, "-1\0");
+       return name;
+#else
+       if (key < 0) {
+               strcpy(name, "-1\0");
+               return name;
+       }
+
+       /* No name. */
+       if (key == 0x100) {
+               strcpy(name, "-1\0");
+               return name;
+       }
+
+       /* Control codes */
+       if (key < 0x20) {
+               name[0] = '^';
+               name[1] = (char) (key + 64);    /* Offset of '@' */
+               name[2] = '\0';
+               return name;
+       }
+
+       /* "Normal" keys */
+       if (key < 0x7F) {
+               name[0] = (char) key;
+               name[1] = '\0';
+               return name;
+       }
+
+       /* Delete key */
+       if (key == 0x7F) {
+               strcpy(name, "^?\0");
+               return name;
+       }
+
+       /* Meta + control codes */
+       if (key < 0x9F) {
+               strcpy(name, "M-^"); 
+               name[3] = (char) (key - 64);    /* Offset of '@' */
+               name[4] = '\0';
+               return name;
+       }
+
+       /* Meta + "normal" keys */
+       if (key < 0xFF) {
+               strcpy (name, "M-");
+               name[2] = (char) (key - 128);
+               name[3] = '\0';
+               return name;
+       }
+
+       /* Meta + delete key */
+       if (key == 0xFF) {
+               strcpy(name, "M-^?\0");
+               return name;
+       }
+
+       /* Key names.  Synchronise this with curses.h. */
+       if (key == 0x101) {
+               strncpy(name, "KEY_BREAK\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x102) {
+               strncpy(name, "KEY_DOWN\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x103) {
+               strncpy(name, "KEY_UP\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x104) {
+               strncpy(name, "KEY_LEFT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x105) {
+               strncpy(name, "KEY_RIGHT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x106) {
+               strncpy(name, "KEY_HOME\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x107) {
+               strncpy(name, "KEY_BACKSPACE\0", KEYNAMEMAX);
+               return name;
+       }
+       /* Function key block (64 keys). */
+       if (key < 0x148) {
+               int i;
+
+               strcpy(name, "KEY_F(");
+               i = snprintf(&name[6], (size_t) 3, "%d", key - 0x108);
+               name[6 + i] = ')';
+               name[7 + i] = '\0';
+               return name;
+       }
+       if (key == 0x148) {
+               strncpy(name, "KEY_DL\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x149) {
+               strncpy(name, "KEY_IL\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x14A) {
+               strncpy(name, "KEY_DC\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x14B) {
+               strncpy(name, "KEY_IC\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x14C) {
+               strncpy(name, "KEY_EIC\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x14D) {
+               strncpy(name, "KEY_CLEAR\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x14E) {
+               strncpy(name, "KEY_EOS\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x14F) {
+               strncpy(name, "KEY_EOL\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x150) {
+               strncpy(name, "KEY_SF\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x151) {
+               strncpy(name, "KEY_SR\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x152) {
+               strncpy(name, "KEY_NPAGE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x153) {
+               strncpy(name, "KEY_PPAGE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x154) {
+               strncpy(name, "KEY_STAB\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x155) {
+               strncpy(name, "KEY_CTAB\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x156) {
+               strncpy(name, "KEY_CATAB\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x157) {
+               strncpy(name, "KEY_ENTER\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x158) {
+               strncpy(name, "KEY_SRESET\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x159) {
+               strncpy(name, "KEY_RESET\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x15A) {
+               strncpy(name, "KEY_PRINT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x15B) {
+               strncpy(name, "KEY_LL\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x15C) {
+               strncpy(name, "KEY_A1\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x15D) {
+               strncpy(name, "KEY_A3\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x15E) {
+               strncpy(name, "KEY_B2\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x15F) {
+               strncpy(name, "KEY_C1\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x160) {
+               strncpy(name, "KEY_C3\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x161) {
+               strncpy(name, "KEY_BTAB\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x162) {
+               strncpy(name, "KEY_BEG\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x163) {
+               strncpy(name, "KEY_CANCEL\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x164) {
+               strncpy(name, "KEY_CLOSE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x165) {
+               strncpy(name, "KEY_COMMAND\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x166) {
+               strncpy(name, "KEY_COPY\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x167) {
+               strncpy(name, "KEY_CREATE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x168) {
+               strncpy(name, "KEY_END\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x169) {
+               strncpy(name, "KEY_EXIT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x16A) {
+               strncpy(name, "KEY_FIND\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x16B) {
+               strncpy(name, "KEY_HELP\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x16C) {
+               strncpy(name, "KEY_MARK\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x16D) {
+               strncpy(name, "KEY_MESSAGE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x16E) {
+               strncpy(name, "KEY_MOVE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x16F) {
+               strncpy(name, "KEY_NEXT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x170) {
+               strncpy(name, "KEY_OPEN\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x171) {
+               strncpy(name, "KEY_OPTIONS\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x172) {
+               strncpy(name, "KEY_PREVIOUS\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x173) {
+               strncpy(name, "KEY_REDO\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x174) {
+               strncpy(name, "KEY_REFERENCE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x175) {
+               strncpy(name, "KEY_REFRESH\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x176) {
+               strncpy(name, "KEY_REPLACE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x177) {
+               strncpy(name, "KEY_RESTART\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x178) {
+               strncpy(name, "KEY_RESUME\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x179) {
+               strncpy(name, "KEY_SAVE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x17A) {
+               strncpy(name, "KEY_SBEG\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x17B) {
+               strncpy(name, "KEY_SCANCEL\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x17C) {
+               strncpy(name, "KEY_SCOMMAND\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x17D) {
+               strncpy(name, "KEY_SCOPY\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x17E) {
+               strncpy(name, "KEY_SCREATE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x17F) {
+               strncpy(name, "KEY_SDC\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x180) {
+               strncpy(name, "KEY_SDL\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x181) {
+               strncpy(name, "KEY_SELECT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x182) {
+               strncpy(name, "KEY_SEND\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x183) {
+               strncpy(name, "KEY_SEOL\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x184) {
+               strncpy(name, "KEY_SEXIT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x185) {
+               strncpy(name, "KEY_SFIND\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x186) {
+               strncpy(name, "KEY_SHELP\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x187) {
+               strncpy(name, "KEY_SHOME\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x188) {
+               strncpy(name, "KEY_SIC\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x189) {
+               strncpy(name, "KEY_SLEFT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x18A) {
+               strncpy(name, "KEY_SMESSAGE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x18B) {
+               strncpy(name, "KEY_SMOVE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x18C) {
+               strncpy(name, "KEY_SNEXT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x18D) {
+               strncpy(name, "KEY_SOPTIONS\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x18E) {
+               strncpy(name, "KEY_SPREVIOUS\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x18F) {
+               strncpy(name, "KEY_SPRINT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x190) {
+               strncpy(name, "KEY_SREDO\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x191) {
+               strncpy(name, "KEY_SREPLACE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x192) {
+               strncpy(name, "KEY_SRIGHT\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x193) {
+               strncpy(name, "KEY_SRSUME\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x194) {
+               strncpy(name, "KEY_SSAVE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x195) {
+               strncpy(name, "KEY_SSUSPEND\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x196) {
+               strncpy(name, "KEY_SUNDO\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x197) {
+               strncpy(name, "KEY_SUSPEND\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x198) {
+               strncpy(name, "KEY_UNDO\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x199) {
+               strncpy(name, "KEY_MOUSE\0", KEYNAMEMAX);
+               return name;
+       }
+       if (key == 0x200) {
+               strncpy(name, "KEY_RESIZE\0", KEYNAMEMAX);
+               return name;
+       }
+       /* No more names. */
+       strncpy(name, "UNKOWN KEY\0", KEYNAMEMAX);
+       return name;
+#endif
+}
+/*
+ * key_name --
+ *     Return name of key or NULL;
+ */
+char *
+key_name(wchar_t key)
+{
+#ifndef HAVE_WCHAR
+       return NULL;
+#else
+       (void) keyname((int) key);
+
+       if (!strncmp(name, "M-", 2)) {
+               /* Remove the "M-" */
+               name[0] = name[2];
+               name[1] = '\0';
+       }
+       return name;
+#endif /* HAVE_WCHAR */
+}
+
diff --git a/lib/libcurses/keypad.c b/lib/libcurses/keypad.c
new file mode 100644 (file)
index 0000000..94640a2
--- /dev/null
@@ -0,0 +1,59 @@
+/*     $NetBSD: keypad.c,v 1.12 2010/02/03 15:34:40 roy Exp $  */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: keypad.c,v 1.12 2010/02/03 15:34:40 roy Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * keypad --
+ *     Turn on and off interpretation of function/keypad keys in the
+ *     given window.
+ */
+int
+keypad(WINDOW *win, bool bf)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC,
+           "keypad: win %p, %s\n", win, bf ? "TRUE" : "FALSE");
+#endif
+       if (bf) {
+               win->flags |= __KEYPAD;
+               if (!(curscr->flags & __KEYPAD)) {
+                       tputs (keypad_xmit, 0, __cputchar);
+                       curscr->flags |= __KEYPAD;
+               }
+       } else
+               win->flags &= ~__KEYPAD;
+
+       return OK;
+}
diff --git a/lib/libcurses/leaveok.c b/lib/libcurses/leaveok.c
new file mode 100644 (file)
index 0000000..e997763
--- /dev/null
@@ -0,0 +1,52 @@
+/*     $NetBSD: leaveok.c,v 1.5 2008/04/28 20:23:01 martin Exp $       */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: leaveok.c,v 1.5 2008/04/28 20:23:01 martin Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * leaveok --
+ *     Turn on and off leave cursor after refresh for the given window.
+ */
+int
+leaveok(WINDOW *win, bool bf)
+{
+       if (bf)
+               win->flags |= __LEAVEOK;
+       else
+               win->flags &= ~__LEAVEOK;
+       return (OK);
+}
diff --git a/lib/libcurses/line.c b/lib/libcurses/line.c
new file mode 100644 (file)
index 0000000..50c9303
--- /dev/null
@@ -0,0 +1,305 @@
+/*     $NetBSD: line.c,v 1.6 2010/02/23 19:48:26 drochner Exp $        */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn
+ *                                              (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * This code has been donated to The NetBSD Foundation by the Author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: line.c,v 1.6 2010/02/23 19:48:26 drochner Exp $");
+#endif                         /* not lint */
+
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * hline --
+ *     Draw a horizontal line of character c on stdscr.
+ */
+int
+hline(chtype ch, int count)
+{
+       return whline(stdscr, ch, count);
+}
+
+/*
+ * mvhline --
+ *     Move to location (y, x) and draw a horizontal line of character c
+ *     on stdscr.
+ */
+int
+mvhline(int y, int x, chtype ch, int count)
+{
+       return mvwhline(stdscr, y, x, ch, count);
+}
+
+/*
+ * mvwhline --
+ *     Move to location (y, x) and draw a horizontal line of character c
+ *     in the given window.
+ */
+int
+mvwhline(WINDOW *win, int y, int x, chtype ch, int count)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return whline(win, ch, count);
+}
+
+/*
+ * whline --
+ *     Draw a horizontal line of character c in the given window moving
+ *     towards the rightmost column.  At most count characters are drawn
+ *     or until the edge of the screen, whichever comes first.
+ */
+int
+whline(WINDOW *win, chtype ch, int count)
+{
+#ifndef HAVE_WCHAR
+       int ocurx, n, i;
+
+       n = min(count, win->maxx - win->curx);
+       ocurx = win->curx;
+
+       if (!(ch & __CHARTEXT))
+               ch |= ACS_HLINE;
+       for (i = 0; i < n; i++)
+               mvwaddch(win, win->cury, ocurx + i, ch);
+               
+       wmove(win, win->cury, ocurx);
+       return OK;
+#else
+       cchar_t cch, *cchp;
+
+       if (ch & __CHARTEXT) {
+               __cursesi_chtype_to_cchar(ch, &cch);
+               cchp = & cch;
+       } else
+               cchp = WACS_HLINE;
+
+       return whline_set(win, cchp, count);
+#endif
+}
+
+/*
+ * vline --
+ *     Draw a vertical line of character ch on stdscr.
+ */
+int
+vline(chtype ch, int count)
+{
+       return wvline(stdscr, ch, count);
+}
+
+/*
+ * mvvline --
+ *     Move to the given location an draw a vertical line of character ch.
+ */
+int
+mvvline(int y, int x, chtype ch, int count)
+{
+       return mvwvline(stdscr, y, x, ch, count);
+}
+
+/*
+ * mvwvline --
+ *     Move to the given location and draw a vertical line of character ch
+ *     on the given window.
+ */
+int
+mvwvline(WINDOW *win, int y, int x, chtype ch, int count)
+{
+       if (wmove(win, y, x) == ERR)
+               return ERR;
+
+       return wvline(win, ch, count);
+}
+
+/*
+ * wvline --
+ *     Draw a vertical line of character ch in the given window moving
+ *     towards the bottom of the screen.  At most count characters are drawn
+ *     or until the edge of the screen, whichever comes first.
+ */
+int
+wvline(WINDOW *win, chtype ch, int count)
+{
+#ifndef HAVE_WCHAR
+       int ocury, ocurx, n, i;
+
+       n = min(count, win->maxy - win->cury);
+       ocury = win->cury;
+       ocurx = win->curx;
+
+       if (!(ch & __CHARTEXT))
+               ch |= ACS_VLINE;
+       for (i = 0; i < n; i++)
+               mvwaddch(win, ocury + i, ocurx, ch);
+
+       wmove(win, ocury, ocurx);
+       return OK;
+#else
+       cchar_t cch, *cchp;
+
+       if (ch & __CHARTEXT) {
+               __cursesi_chtype_to_cchar(ch, &cch);
+               cchp = & cch;
+       } else
+               cchp = WACS_VLINE;
+
+       return wvline_set(win, cchp, count);
+#endif
+}
+
+int hline_set(const cchar_t *wch, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return whline_set( stdscr, wch, n );
+#endif /* HAVE_WCHAR */
+}
+
+int mvhline_set(int y, int x, const cchar_t *wch, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwhline_set( stdscr, y, x, wch, n );
+#endif /* HAVE_WCHAR */
+}
+
+int mvwhline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if ( wmove( win, y , x ) == ERR )
+               return ERR;
+
+       return whline_set( win, wch, n );
+#endif /* HAVE_WCHAR */
+}
+
+int whline_set(WINDOW *win, const cchar_t *wch, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       int ocurx, wcn, i, cw;
+       cchar_t cc;
+
+       cw = wcwidth( wch->vals[ 0 ]);
+       if (cw < 0)
+               cw = 1;
+       if ( ( win->maxx - win->curx ) < cw )
+               return ERR;
+       wcn = min( n, ( win->maxx - win->curx ) / cw );
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "whline_set: line of %d\n", wcn);
+#endif /* DEBUG */
+       ocurx = win->curx;
+
+       memcpy( &cc, wch, sizeof( cchar_t ));
+       if (!(wch->vals[ 0 ]))
+               cc.vals[ 0 ] |= WACS_HLINE->vals[0];
+       for (i = 0; i < wcn; i++ ) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_LINE, "whline_set: (%d,%d)\n",
+                  win->cury, ocurx + i * cw);
+#endif /* DEBUG */
+               mvwadd_wch(win, win->cury, ocurx + i * cw, &cc);
+       }
+               
+       wmove(win, win->cury, ocurx);
+       return OK;
+#endif /* HAVE_WCHAR */
+}
+
+int vline_set(const cchar_t *wch, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return wvline_set( stdscr, wch, n );
+#endif /* HAVE_WCHAR */
+}
+
+int mvvline_set(int y, int x, const cchar_t *wch, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       return mvwvline_set( stdscr, y, x, wch, n );
+#endif /* HAVE_WCHAR */
+}
+
+int mvwvline_set(WINDOW *win, int y, int x, const cchar_t *wch, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if ( wmove( win, y, x ) == ERR )
+               return ERR;
+
+       return wvline_set( win, wch, n );
+#endif /* HAVE_WCHAR */
+}
+
+int wvline_set(WINDOW *win, const cchar_t *wch, int n)
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       int ocury, ocurx, wcn, i;
+       cchar_t cc;
+
+       wcn = min( n, win->maxy - win->cury);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "wvline_set: line of %d\n", wcn);
+#endif /* DEBUG */
+       ocury = win->cury;
+       ocurx = win->curx;
+
+       memcpy( &cc, wch, sizeof( cchar_t ));
+       if (!(wch->vals[ 0 ]))
+               cc.vals[ 0 ] |= WACS_VLINE->vals[0];
+       for (i = 0; i < wcn; i++) {
+               mvwadd_wch(win, ocury + i, ocurx, &cc);
+#ifdef DEBUG
+               __CTRACE(__CTRACE_LINE, "wvline_set: (%d,%d)\n",
+                   ocury + i, ocurx);
+#endif /* DEBUG */
+       }
+       wmove(win, ocury, ocurx);
+       return OK;
+#endif /* HAVE_WCHAR */
+}
index ca9ac523dbe794589d6fc659140058a38e5efd2d..64adbd81fb42932a2087bfff43488fa98e67575b 100644 (file)
@@ -1,12 +1,88 @@
-#include <curses.h>
-#include "curspriv.h"
+/*     $NetBSD: longname.c,v 1.16 2004/01/20 08:29:29 wiz Exp $        */
 
-/****************************************************************/
-/* Longname() returns a pointer to a string describing the     */
-/* User terminal.                                              */
-/****************************************************************/
+/*
+ * Copyright (c) 1981, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
 
-char *longname()
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)longname.c 8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: longname.c,v 1.16 2004/01/20 08:29:29 wiz Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * __longname --
+ *     Fill in "def" with the long name of the terminal.
+ *      This is the original BSD version of longname(), modified to return
+ *     at most 128 characters.
+ */
+char   *
+__longname(char *bp, char *def)
+{
+       char   *cp, *last_bp;
+       int     i = 0;
+
+       last_bp = NULL;
+       do {
+               while (*bp && *bp != ':' && *bp != '|')
+                       bp++;
+               if (*bp == '|') {
+                       last_bp = bp;
+                       bp++;
+               }
+       } while (*bp && *bp != ':');
+
+       if (last_bp != NULL)
+               bp = last_bp;
+
+       if (*bp == '|') {
+               for (cp = def, ++bp; *bp && *bp != ':' && *bp != '|' &&
+                   i < 127;)
+                       *cp++ = *bp++;
+                       i++;
+               *cp = '\0';
+       }
+       return (def);
+}
+
+/*
+ * longname --
+ *     Return pointer to the long name of the terminal.
+ *     This is the SUS version of longname()
+ */
+char   *
+longname(void)
 {
-  return("not implemented");
+       return (_cursesi_screen->ttytype);
 }
diff --git a/lib/libcurses/meta.c b/lib/libcurses/meta.c
new file mode 100644 (file)
index 0000000..917c549
--- /dev/null
@@ -0,0 +1,77 @@
+/*     $NetBSD: meta.c,v 1.7 2010/02/03 15:34:40 roy Exp $     */
+
+/*-
+ * Copyright (c) 1998-2000 Brett Lymn
+ *                         (blymn@baea.com.au, brett_lymn@yahoo.com.au)
+ * All rights reserved.
+ *
+ * This code has been donated to The NetBSD Foundation by the Author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: meta.c,v 1.7 2010/02/03 15:34:40 roy Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * meta --
+ *    Turn on or off the terminal meta mode.
+ */
+int
+meta(/*ARGSUSED*/ WINDOW *win, bool bf)
+{
+       if (bf == TRUE) {
+               if (meta_on != NULL) {
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_MISC, "meta: TRUE\n");
+#endif
+                       tputs(meta_on, 0, __cputchar);
+                       _cursesi_screen->meta_state = TRUE;
+               }
+       } else {
+               if (meta_off != NULL) {
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_MISC, "meta: FALSE\n");
+#endif
+                       tputs(meta_off, 0, __cputchar);
+                       _cursesi_screen->meta_state = FALSE;
+               }
+       }
+
+       return OK;
+}
+
+/*
+ * __restore_meta_state --
+ *    Restore old meta state.
+ */
+void
+__restore_meta_state(void)
+{
+       meta(NULL, _cursesi_screen->meta_state);
+}
+
index e5059c959b9e477b34196157efe818a163c6807a..b964105efacab367e0de66bf34e755e05c20be01 100644 (file)
@@ -1,18 +1,88 @@
-#include <curses.h>
-#include "curspriv.h"
+/*     $NetBSD: move.c,v 1.17 2010/02/23 19:48:26 drochner Exp $       */
 
-/****************************************************************/
-/* Wmove() moves the cursor in window 'win' to position (x,y). */
-/****************************************************************/
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
 
-int wmove(win, y, x)
-WINDOW *win;
-int y;
-int x;
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)move.c     8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: move.c,v 1.17 2010/02/23 19:48:26 drochner Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+/*
+ * move --
+ *     Moves the cursor to the given point on stdscr.
+ */
+int
+move(int y, int x)
+{
+       return wmove(stdscr, y, x);
+}
+
+#endif
+
+/*
+ * wmove --
+ *     Moves the cursor to the given point.
+ */
+int
+wmove(WINDOW *win, int y, int x)
 {
-  if ((x<0) || (x>win->_maxx) || (y<win->_regtop) || (y>win->_regbottom)) 
-       return(ERR);
-  win->_curx = x;
-  win->_cury = y;
-  return(OK);
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "wmove: (%d, %d)\n", y, x);
+#endif
+       if (x < 0 || y < 0)
+               return (ERR);
+       if (x >= win->maxx || y >= win->maxy)
+               return (ERR);
+       win->curx = x;
+       win->alines[win->cury]->flags &= ~__ISPASTEOL;
+       win->cury = y;
+       win->alines[y]->flags &= ~__ISPASTEOL;
+       return (OK);
+}
+
+void
+wcursyncup(WINDOW *win)
+{
+
+       while (win->orig) {
+               wmove(win->orig, win->cury + win->begy - win->orig->begy,
+                       win->curx + win->begx - win->orig->begx);
+               win = win->orig;
+       }
 }
diff --git a/lib/libcurses/mvcursor.c b/lib/libcurses/mvcursor.c
deleted file mode 100644 (file)
index e166154..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Mvcur(oldy,oldx,newy,newx) the display cursor to <newy,newx>        */
-/****************************************************************/
-
-int mvcur(oldy, oldx, newy, newx)
-int oldy;
-int oldx;
-int newy;
-int newx;
-{
-  if ((newy >= LINES) || (newx >= COLS) || (newy < 0) || (newx < 0))
-       return(ERR);
-  poscur(newy, newx);
-  _cursvar.cursrow = newy;
-  _cursvar.curscol = newx;
-  return(OK);
-}
diff --git a/lib/libcurses/mvwin.c b/lib/libcurses/mvwin.c
new file mode 100644 (file)
index 0000000..ddc9ff0
--- /dev/null
@@ -0,0 +1,103 @@
+/*     $NetBSD: mvwin.c,v 1.15 2003/08/07 16:44:22 agc Exp $   */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)mvwin.c    8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: mvwin.c,v 1.15 2003/08/07 16:44:22 agc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * mvderwin --
+ *      Move a derived window.
+ *
+ */
+int
+mvderwin(WINDOW *win, int dy, int dx)
+{
+       WINDOW *parent;
+       int x, y;
+
+       if (win == NULL)
+               return ERR;
+
+       parent = win->orig;
+
+       if (parent == NULL)
+               return ERR;
+
+       x = parent->begx + dx;
+       y = parent->begy + dy;
+       return mvwin(win, y, x);
+}
+
+/*
+ * mvwin --
+ *     Relocate the starting position of a window.
+ */
+int
+mvwin(WINDOW *win, int by, int bx)
+{
+       WINDOW *orig;
+       int     dy, dx;
+
+       if (by < 0 || by + win->maxy > LINES || bx < 0 || bx + win->maxx > COLS)
+               return (ERR);
+       dy = by - win->begy;
+       dx = bx - win->begx;
+       orig = win->orig;
+       if (orig == NULL) {
+               orig = win;
+               do {
+                       win->begy += dy;
+                       win->begx += dx;
+                       __swflags(win);
+                       win = win->nextp;
+               } while (win != orig);
+       } else {
+               if (by < orig->begy || win->maxy + dy > orig->maxy)
+                       return (ERR);
+               if (bx < orig->begx || win->maxx + dx > orig->maxx)
+                       return (ERR);
+               win->begy = by;
+               win->begx = bx;
+               __swflags(win);
+               __set_subwin(orig, win);
+       }
+       __touchwin(win);
+       return (OK);
+}
index 23f2471a6722f6261d1c089674514866d20aca4e..4084b66e971b4e9bf411460d4daa89ead30d6953 100644 (file)
+/*     $NetBSD: newwin.c,v 1.47 2009/07/22 16:57:15 roy Exp $  */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)newwin.c   8.3 (Berkeley) 7/27/94";
+#else
+__RCSID("$NetBSD: newwin.c,v 1.47 2009/07/22 16:57:15 roy Exp $");
+#endif
+#endif                         /* not lint */
+
 #include <stdlib.h>
-#include <curses.h>
-#include "curspriv.h"
 
-/****************************************************************/
-/* Makenew() allocates all data for a new window except the    */
-/* Actual lines themselves.                                    */
-/****************************************************************/
+#include "curses.h"
+#include "curses_private.h"
+
+
+static WINDOW *__makenew(SCREEN *screen, int nlines, int ncols, int by,
+                        int bx, int sub, int ispad);
+static WINDOW *__subwin(WINDOW *orig, int nlines, int ncols, int by, int bx,
+                        int ispad);
+
+/*
+ * derwin --
+ *      Create a new window in the same manner as subwin but (by, bx)
+ *      are relative to the origin of window orig instead of absolute.
+ */
+WINDOW *
+derwin(WINDOW *orig, int nlines, int ncols, int by, int bx)
+{
 
-_PROTOTYPE(static WINDOW *makenew, (int nlines, int ncols, int begy,int begx));
+       return __subwin(orig, nlines, ncols, orig->begy + by, orig->begx + bx,
+           FALSE);
+}
 
-static WINDOW *makenew(num_lines, num_columns, begy, begx)
-int num_lines, num_columns, begy, begx;
+/*
+ * subpad --
+ *      Create a new pad in the same manner as subwin but (by, bx)
+ *      are relative to the origin of window orig instead of absolute.
+ */
+WINDOW *
+subpad(WINDOW *orig, int nlines, int ncols, int by, int bx)
 {
-  int i;
-  WINDOW *win;
-
-  /* Allocate the window structure itself */
-  if ((win = (WINDOW *) malloc(sizeof(WINDOW))) == NULL) 
-       return((WINDOW *) ERR);
-
-  /* Allocate the line pointer array */
-  if ((win->_line = (int **) calloc(num_lines, sizeof(int *))) == NULL) {
-       free(win);
-       return((WINDOW *) ERR);
-  }
-
-  /* Allocate the minchng and maxchng arrays */
-  if ((win->_minchng = (int *) calloc(num_lines, sizeof(int))) == NULL) {
-       free(win->_line);
-       free(win);
-       return((WINDOW *) ERR);
-  }
-  if ((win->_maxchng = (int *) calloc(num_lines, sizeof(int))) == NULL) {
-       free(win->_line);
-       free(win->_minchng);
-       free(win);
-       return((WINDOW *) ERR);
-  }
-
-  /* Initialize window variables */
-  win->_curx = 0;
-  win->_cury = 0;
-  win->_maxy = num_lines - 1;
-  win->_maxx = num_columns - 1;
-  win->_begy = begy;
-  win->_begx = begx;
-  win->_flags = 0;
-  win->_attrs = ATR_NRM;
-  win->_tabsize = 8;
-  win->_clear = FALSE;
-  win->_leave = FALSE;
-  win->_scroll = FALSE;
-  win->_nodelay = FALSE;
-  win->_keypad = FALSE;
-  win->_regtop = 0;
-  win->_regbottom = num_lines - 1;
-
-  /* Init to say window unchanged */
-  for (i = 0; i < num_lines; i++) {
-       win->_minchng[i] = 0;
-       win->_maxchng[i] = num_columns - 1;
-  }
-
-  /* Set flags for window properties */
-  if ((begy + num_lines) == LINES) {
-       win->_flags |= _ENDLINE;
-       if ((begx == 0) && (num_columns == COLS) && (begy == 0))
-               win->_flags |= _FULLWIN;
-  }                            /* if */
-  if (((begy + num_lines) == LINES) && ((begx + num_columns) == COLS))
-       win->_flags |= _SCROLLWIN;
-  return(win);
+
+       return __subwin(orig, nlines, ncols, orig->begy + by, orig->begx + bx,
+           TRUE);
 }
 
+/*
+ * dupwin --
+ *      Create a copy of the given window.
+ */
+WINDOW *
+dupwin(WINDOW *win)
+{
+       WINDOW *new_one;
+
+       if ((new_one = __newwin(_cursesi_screen, win->maxy, win->maxx,
+                               win->begy, win->begx, FALSE)) == NULL)
+               return NULL;
 
-/****************************************************************/
-/* Newwin() creates a new window with size num_lines * num_co- */
-/* Lumns, and origin begx,begy relative to the SCREEN. Special */
-/* Case: if num_lines and/or num_columns is 0, the remainder of        */
-/* The screen is used.                                         */
-/****************************************************************/
-WINDOW *newwin(num_lines, num_columns, begy, begx)
-int num_lines, num_columns, begy, begx;
+       overwrite(win, new_one);
+       return new_one;
+}
+
+/*
+ * newwin --
+ *     Allocate space for and set up defaults for a new window.
+ */
+WINDOW *
+newwin(int nlines, int ncols, int by, int bx)
 {
-  WINDOW *win;
-  int *ptr;
-  int i, j;
-
-  if (num_lines == 0) num_lines = LINES - begy;
-  if (num_columns == 0) num_columns = COLS - begx;
-  if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR)
-       return((WINDOW *) ERR);
-  for (i = 0; i < num_lines; i++) {    /* make and clear the lines */
-       if ((win->_line[i] = (int *)calloc(num_columns, sizeof(int))) == NULL){
-               for (j = 0; j < i; j++) /* if error, free all the data */
-                       free(win->_line[j]);
-               free(win->_minchng);
-               free(win->_maxchng);
-               free(win->_line);
-               free(win);
-               return((WINDOW *) ERR);
-       } else {
-               for (ptr = win->_line[i]; ptr < win->_line[i] + num_columns;)
-                       *ptr++ = ' ' | ATR_NRM;
+       return __newwin(_cursesi_screen, nlines, ncols, by, bx, FALSE);
+}
+
+/*
+ * newpad --
+ *     Allocate space for and set up defaults for a new pad.
+ */
+WINDOW *
+newpad(int nlines, int ncols)
+{
+       if (nlines < 1 || ncols < 1)
+               return NULL;
+       return __newwin(_cursesi_screen, nlines, ncols, 0, 0, TRUE);
+}
+
+WINDOW *
+__newwin(SCREEN *screen, int nlines, int ncols, int by, int bx, int ispad)
+{
+       WINDOW *win;
+       __LINE *lp;
+       int     i, j;
+       int     maxy, maxx;
+       __LDATA *sp;
+
+       if (by < 0 || bx < 0)
+               return (NULL);
+
+       maxy = nlines > 0 ? nlines : LINES - by + nlines;
+       maxx = ncols > 0 ? ncols : COLS - bx + ncols;
+
+       if ((win = __makenew(screen, maxy, maxx, by, bx, 0, ispad)) == NULL)
+               return (NULL);
+
+       win->bch = ' ';
+       if (__using_color)
+               win->battr = __default_color;
+       else
+               win->battr = 0;
+       win->nextp = win;
+       win->ch_off = 0;
+       win->orig = NULL;
+       win->reqy = nlines;
+       win->reqx = ncols;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "newwin: win->ch_off = %d\n", win->ch_off);
+#endif
+
+       for (i = 0; i < maxy; i++) {
+               lp = win->alines[i];
+               if (ispad)
+                       lp->flags = __ISDIRTY;
+               else
+                       lp->flags = 0;
+               for (sp = lp->line, j = 0; j < maxx; j++, sp++) {
+                       sp->attr = 0;
+#ifndef HAVE_WCHAR
+                       sp->ch = win->bch;
+#else
+                       sp->ch = ( wchar_t )btowc(( int ) win->bch );
+                       sp->nsp = NULL;
+                       SET_WCOL( *sp, 1 );
+#endif /* HAVE_WCHAR */
+               }
+               lp->hash = __hash((char *)(void *)lp->line,
+                   (size_t) (ncols * __LDATASIZE));
        }
-  }
-  return(win);
+       return (win);
 }
 
+WINDOW *
+subwin(WINDOW *orig, int nlines, int ncols, int by, int bx)
+{
 
-/****************************************************************/
-/* Subwin() creates a sub-window in the 'orig' window, with    */
-/* Size num_lines * num_columns, and with origin begx, begy    */
-/* Relative to the SCREEN. Special case: if num_lines and/or   */
-/* Num_columns is 0, the remainder of the original window is   */
-/* Used. The subwindow uses the original window's line buffers */
-/* To store it's own lines.                                    */
-/****************************************************************/
-WINDOW *subwin(orig, num_lines, num_columns, begy, begx)
-WINDOW *orig;
-int num_lines, num_columns, begy, begx;
+       return __subwin(orig, nlines, ncols, by, bx, FALSE);
+}
+
+static WINDOW *
+__subwin(WINDOW *orig, int nlines, int ncols, int by, int bx, int ispad)
+{
+       int     i;
+       __LINE *lp;
+       WINDOW *win;
+       int     maxy, maxx;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "subwin: (%p, %d, %d, %d, %d, %d)\n",
+           orig, nlines, ncols, by, bx, ispad);
+#endif
+       if (orig == NULL || orig->orig != NULL)
+               return NULL;
+
+       /* Make sure window fits inside the original one. */
+       maxy = nlines > 0 ? nlines : orig->maxy + orig->begy - by + nlines;
+       maxx = ncols > 0 ? ncols : orig->maxx + orig->begx - bx + ncols;
+       if (by < orig->begy || bx < orig->begx
+           || by + maxy > orig->maxy + orig->begy
+           || bx + maxx > orig->maxx + orig->begx)
+               return (NULL);
+       if ((win = __makenew(_cursesi_screen, maxy, maxx,
+                            by, bx, 1, ispad)) == NULL)
+               return (NULL);
+       win->bch = orig->bch;
+       win->battr = orig->battr;
+       win->reqy = nlines;
+       win->reqx = ncols;
+       win->nextp = orig->nextp;
+       orig->nextp = win;
+       win->orig = orig;
+
+       /* Initialize flags here so that refresh can also use __set_subwin. */
+       for (lp = win->lspace, i = 0; i < win->maxy; i++, lp++)
+               lp->flags = 0;
+       __set_subwin(orig, win);
+       return (win);
+}
+/*
+ * This code is shared with mvwin().
+ */
+void
+__set_subwin(WINDOW *orig, WINDOW *win)
+{
+       int     i;
+       __LINE *lp, *olp;
+#ifdef HAVE_WCHAR
+       __LDATA *cp;
+       int j;
+       nschar_t *np;
+#endif /* HAVE_WCHAR */
+
+       win->ch_off = win->begx - orig->begx;
+       /* Point line pointers to line space. */
+       for (lp = win->lspace, i = 0; i < win->maxy; i++, lp++) {
+               win->alines[i] = lp;
+               olp = orig->alines[i + win->begy - orig->begy];
+#ifdef DEBUG
+               lp->sentinel = SENTINEL_VALUE;
+#endif
+               lp->line = &olp->line[win->ch_off];
+               lp->firstchp = &olp->firstch;
+               lp->lastchp = &olp->lastch;
+#ifndef HAVE_WCHAR
+               lp->hash = __hash((char *)(void *)lp->line,
+                   (size_t) (win->maxx * __LDATASIZE));
+#else
+               for ( cp = lp->line, j = 0; j < win->maxx; j++, cp++ ) {
+                       lp->hash = __hash_more( &cp->ch,
+                               sizeof( wchar_t ), lp->hash );
+                       lp->hash = __hash_more( &cp->attr,
+                               sizeof( wchar_t ), lp->hash );
+                       if ( cp->nsp ) {
+                               np = cp->nsp;
+                               while ( np ) {
+                                       lp->hash = __hash_more( &np->ch,
+                                               sizeof( wchar_t ), lp->hash );
+                                       np = np->next;
+                               }
+                       }
+               }
+#endif /* HAVE_WCHAR */
+       }
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "__set_subwin: win->ch_off = %d\n",
+           win->ch_off);
+#endif
+}
+/*
+ * __makenew --
+ *     Set up a window buffer and returns a pointer to it.
+ */
+static WINDOW *
+__makenew(SCREEN *screen, int nlines, int ncols, int by, int bx, int sub,
+       int ispad)
+{
+       WINDOW                  *win;
+       __LINE                  *lp;
+       struct __winlist        *wlp, *wlp2;
+       int                      i;
+
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "makenew: (%d, %d, %d, %d)\n",
+           nlines, ncols, by, bx);
+#endif
+       if (nlines <= 0 || ncols <= 0)
+               return NULL;
+
+       if ((win = malloc(sizeof(WINDOW))) == NULL)
+               return (NULL);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "makenew: win = %p\n", win);
+#endif
+
+       /* Set up line pointer array and line space. */
+       if ((win->alines = malloc(nlines * sizeof(__LINE *))) == NULL) {
+               free(win);
+               return NULL;
+       }
+       if ((win->lspace = malloc(nlines * sizeof(__LINE))) == NULL) {
+               free(win->alines);
+               free(win);
+               return NULL;
+       }
+       /* Don't allocate window and line space if it's a subwindow */
+       if (sub)
+               win->wspace = NULL;
+       else {
+               /*
+                * Allocate window space in one chunk.
+                */
+               if ((win->wspace =
+                       malloc(ncols * nlines * sizeof(__LDATA))) == NULL) {
+                       free(win->lspace);
+                       free(win->alines);
+                       free(win);
+                       return NULL;
+               }
+               /*
+                * Append window to window list.
+                */
+               if ((wlp = malloc(sizeof(struct __winlist))) == NULL) {
+                       free(win->wspace);
+                       free(win->lspace);
+                       free(win->alines);
+                       free(win);
+                       return NULL;
+               }
+               wlp->winp = win;
+               wlp->nextp = NULL;
+               if (screen->winlistp == NULL)
+                       screen->winlistp = wlp;
+               else {
+                       wlp2 = screen->winlistp;
+                       while (wlp2->nextp != NULL)
+                               wlp2 = wlp2->nextp;
+                       wlp2->nextp = wlp;
+               }
+               /*
+                * Point line pointers to line space, and lines themselves into
+                * window space.
+                */
+               for (lp = win->lspace, i = 0; i < nlines; i++, lp++) {
+                       win->alines[i] = lp;
+                       lp->line = &win->wspace[i * ncols];
+#ifdef DEBUG
+                       lp->sentinel = SENTINEL_VALUE;
+#endif
+                       lp->firstchp = &lp->firstch;
+                       lp->lastchp = &lp->lastch;
+                       if (ispad) {
+                               lp->firstch = 0;
+                               lp->lastch = ncols;
+                       } else {
+                               lp->firstch = ncols;
+                               lp->lastch = 0;
+                       }
+               }
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "makenew: ncols = %d\n", ncols);
+#endif
+       win->screen = screen;
+       win->cury = win->curx = 0;
+       win->maxy = nlines;
+       win->maxx = ncols;
+       win->reqy = nlines;
+       win->reqx = ncols;
+
+       win->begy = by;
+       win->begx = bx;
+       win->flags = (__IDLINE | __IDCHAR);
+       win->delay = -1;
+       win->wattr = 0;
+#ifdef HAVE_WCHAR
+       win->bnsp = NULL;
+       SET_BGWCOL( *win, 1 );
+#endif /* HAVE_WCHAR */
+       win->scr_t = 0;
+       win->scr_b = win->maxy - 1;
+       if (ispad) {
+               win->flags |= __ISPAD;
+               win->pbegy = 0;
+               win->pbegx = 0;
+               win->sbegy = 0;
+               win->sbegx = 0;
+               win->smaxy = 0;
+               win->smaxx = 0;
+       } else
+               __swflags(win);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "makenew: win->wattr = %08x\n", win->wattr);
+       __CTRACE(__CTRACE_WINDOW, "makenew: win->flags = %#.4x\n", win->flags);
+       __CTRACE(__CTRACE_WINDOW, "makenew: win->maxy = %d\n", win->maxy);
+       __CTRACE(__CTRACE_WINDOW, "makenew: win->maxx = %d\n", win->maxx);
+       __CTRACE(__CTRACE_WINDOW, "makenew: win->begy = %d\n", win->begy);
+       __CTRACE(__CTRACE_WINDOW, "makenew: win->begx = %d\n", win->begx);
+       __CTRACE(__CTRACE_WINDOW, "makenew: win->scr_t = %d\n", win->scr_t);
+       __CTRACE(__CTRACE_WINDOW, "makenew: win->scr_b = %d\n", win->scr_b);
+#endif
+       return (win);
+}
+
+void
+__swflags(WINDOW *win)
 {
-  WINDOW *win;
-  int i, j, k;
-
-  /* Make sure window fits inside the original one */
-  if (begy < orig->_begy || begx < orig->_begx ||
-                     (begy + num_lines) > (orig->_begy + orig->_maxy) ||
-                     (begx + num_columns) > (orig->_begx + orig->_maxx) )
-       return((WINDOW *) ERR);
-
-  if (num_lines == 0) num_lines = orig->_maxy - (begy - orig->_begy);
-  if (num_columns == 0) num_columns = orig->_maxx - (begx - orig->_begx);
-  if ((win = makenew(num_lines, num_columns, begy, begx)) == (WINDOW *) ERR)
-       return((WINDOW *) ERR);
-
-  /* Set line pointers the same as in the original window */
-  j = begy - orig->_begy;
-  k = begx - orig->_begx;
-  for (i = 0; i < num_lines; i++) win->_line[i] = (orig->_line[j++]) + k;
-  win->_flags |= _SUBWIN;
-  return(win);
+       win->flags &= ~(__ENDLINE | __FULLWIN | __SCROLLWIN | __LEAVEOK);
+       if (win->begx + win->maxx == COLS && !(win->flags & __ISPAD)) {
+               win->flags |= __ENDLINE;
+               if (win->begx == 0 && win->maxy == LINES && win->begy == 0)
+                       win->flags |= __FULLWIN;
+               if (win->begy + win->maxy == LINES)
+                       win->flags |= __SCROLLWIN;
+       }
 }
diff --git a/lib/libcurses/nodelay.c b/lib/libcurses/nodelay.c
new file mode 100644 (file)
index 0000000..12748a5
--- /dev/null
@@ -0,0 +1,50 @@
+/*      $NetBSD: nodelay.c,v 1.6 2003/12/04 21:24:36 jdc Exp $  */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: nodelay.c,v 1.6 2003/12/04 21:24:36 jdc Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * nodelay --
+ *     Turn on and off blocking reads in getch for a
+ *     given window.
+ */
+int
+nodelay(WINDOW *win, bool bf)
+{
+       if (bf)
+               win->delay = 0;
+       else
+               win->delay = -1;
+       return(OK);
+}
diff --git a/lib/libcurses/notimeout.c b/lib/libcurses/notimeout.c
new file mode 100644 (file)
index 0000000..9e20f57
--- /dev/null
@@ -0,0 +1,51 @@
+/*      $NetBSD: notimeout.c,v 1.5 2001/06/13 10:45:58 wiz Exp $  */
+
+/*-
+ * Copyright (c) 1998-1999 Brett Lymn (blymn@baea.com.au, brett_lymn@yahoo.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: notimeout.c,v 1.5 2001/06/13 10:45:58 wiz Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * notimeout --
+ *     Turn on and off inter-key timeout when assembling function keys for a
+ *     given window.
+ */
+int
+notimeout(WINDOW *win, bool bf)
+{
+       if (bf)
+               win->flags &= ~__NOTIMEOUT;
+       else
+               win->flags |= __NOTIMEOUT;
+
+       return OK;
+}
diff --git a/lib/libcurses/options.c b/lib/libcurses/options.c
deleted file mode 100644 (file)
index 2ab0ac3..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Idlok() is used to set  flag for using the terminal insert/ */
-/* Delete line capabilities. This is not relevant for the PC   */
-/* Version of curses, and thus nothing is done.                        */
-/****************************************************************/
-void idlok(win, flag)
-WINDOW *win;
-bool flag;
-{
-}
-
-/****************************************************************/
-/* Clearok() marks window 'win' to cause screen clearing and   */
-/* Redraw the next time a refresh is done.                     */
-/****************************************************************/
-void clearok(win, flag)
-WINDOW *win;
-bool flag;
-{
-  if (win == curscr)
-       _cursvar.tmpwin->_clear = flag;
-  else
-       win->_clear = flag;
-}
-
-/****************************************************************/
-/* Leaveok() marks window 'win' to allow the update routines   */
-/* To leave the hardware cursor where it happens to be at the  */
-/* End of update. Usually used in combination with cursoff().  */
-/****************************************************************/
-
-void leaveok(win, flag)
-WINDOW *win;
-bool flag;
-{
-  win->_leave = flag;
-}
-
-/****************************************************************/
-/* Scrollok() marks window 'win' to allow the scrolling region */
-/* Of it to actually scroll.                                   */
-/****************************************************************/
-void scrollok(win, flag)
-WINDOW *win;
-bool flag;
-{
-  win->_scroll = flag;
-}
-
-/****************************************************************/
-/* Nodelay() marks the window to make character input non-     */
-/* Waiting, i.e. if there is no character to get, -1 will be   */
-/* Returned.                                                   */
-/****************************************************************/
-void nodelay(win, flag)
-WINDOW *win;
-bool flag;
-{
-  win->_nodelay = flag;
-}
-
-/****************************************************************/
-/* Keypad() marks window 'win' to use the special keypad mode. */
-/****************************************************************/
-void keypad(win, flag)
-WINDOW *win;
-bool flag;
-{
-  win->_keypad = flag;
-}
-
-/****************************************************************/
-/* Meta() allows use of any alternate character set allowed by */
-/* The terminal. We always allow this on the PC, so this one   */
-/* Does nothing.                                               */
-/****************************************************************/
-void meta(win, flag)
-WINDOW *win;
-bool flag;
-{
-}
index c62b5ad971d8df3d0cb2a2e25737dc0129663c82..75f5cb39b7440406703cdcf47c3bc722c598794d 100644 (file)
-/****************************************************************/
-/* Overlay() and overwrite() functions of the PCcurses package */
-/*                                                             */
-/****************************************************************/
-/* This version of curses is based on ncurses, a curses version        */
-/* Originally written by Pavel Curtis at Cornell University.   */
-/* I have made substantial changes to make it run on IBM PC's, */
-/* And therefore consider myself free to make it public domain.        */
-/*             Bjorn Larsson (...mcvax!enea!infovax!bl)        */
-/****************************************************************/
-/* 1.0:        Release:                                        870515  */
-/****************************************************************/
-/* Modified to run under the MINIX operating system by Don Cope */
-/* These changes are also released into the public domain.      */
-/*                                                     900906  */
-/****************************************************************/
-
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Overlay() overwrites 'win1' upon 'win2', with origins alig- */
-/* Ned. Overlay is transparent; blanks from 'win1' are not     */
-/* Copied to 'win2'.                                           */
-/****************************************************************/
-void overlay(win1, win2)
-WINDOW *win1, *win2;
-{
-  int *minchng;
-  int *maxchng;
-  int *w1ptr;
-  int *w2ptr;
-  int attrs;
-  int col;
-  int line;
-  int last_line;
-  int last_col;
-
-  last_col = min(win1->_maxx, win2->_maxx);
-  last_line = min(win1->_maxy, win2->_maxy);
-  attrs = win2->_attrs & ATR_MSK;
-  minchng = win2->_minchng;
-  maxchng = win2->_maxchng;
-
-  for (line = 0; line <= last_line; line++) {
-       register short fc, lc = 0;
-       w1ptr = win1->_line[line];
-       w2ptr = win2->_line[line];
-       fc = _NO_CHANGE;
-       for (col = 0; col <= last_col; col++) {
-               if ((*w1ptr & CHR_MSK) != ' ') {
-                       *w2ptr = (*w1ptr & CHR_MSK) | attrs;
-                       if (fc == _NO_CHANGE) fc = col;
-                       lc = col;
-               }
-               w1ptr++;
-               w2ptr++;
-       }
-
-       if (*minchng == _NO_CHANGE) {
-               *minchng = fc;
-               *maxchng = lc;
-       } else if (fc != _NO_CHANGE) {
-               if (fc < *minchng) *minchng = fc;
-               if (lc > *maxchng) *maxchng = lc;
-       }
-       minchng++;
-       maxchng++;
-  }                            /* for */
-}                              /* overlay */
-
-/****************************************************************/
-/* Overwrite() overwrites 'win1' upon 'win2', with origins     */
-/* Aligned. Overwrite is non-transparent; blanks from 'win1'   */
-/* Are copied to 'win2'.                                       */
-/****************************************************************/
-void overwrite(win1, win2)
-WINDOW *win1, *win2;
+/*     $NetBSD: overlay.c,v 1.17 2007/01/21 13:25:36 jdc Exp $ */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)overlay.c  8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: overlay.c,v 1.17 2007/01/21 13:25:36 jdc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <ctype.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * overlay --
+ *     Writes win1 on win2 non-destructively.
+ */
+int
+overlay(const WINDOW *win1, WINDOW *win2)
 {
-  int *minchng;
-  int *maxchng;
-  int *w1ptr;
-  int *w2ptr;
-  int attrs;
-  int col;
-  int line;
-  int last_line;
-  int last_col;
-
-  last_col = min(win1->_maxx, win2->_maxx);
-  last_line = min(win1->_maxy, win2->_maxy);
-  attrs = win2->_attrs & ATR_MSK;
-  minchng = win2->_minchng;
-  maxchng = win2->_maxchng;
-
-  for (line = 0; line <= last_line; line++) {
-       register short fc, lc = 0;
-
-       w1ptr = win1->_line[line];
-       w2ptr = win2->_line[line];
-       fc = _NO_CHANGE;
-
-       for (col = 0; col <= last_col; col++) {
-               if ((*w1ptr & CHR_MSK) != (*w2ptr & CHR_MSK)) {
-                       *w2ptr = (*w1ptr & CHR_MSK) | attrs;
-
-                       if (fc == _NO_CHANGE) fc = col;
-                       lc = col;
-               }
-               w1ptr++;
-               w2ptr++;
-       }                       /* for */
 
-       if (*minchng == _NO_CHANGE) {
-               *minchng = fc;
-               *maxchng = lc;
-       } else if (fc != _NO_CHANGE) {
-               if (fc < *minchng) *minchng = fc;
-               if (lc > *maxchng) *maxchng = lc;
-       }
-       minchng++;
-       maxchng++;
-  }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "overlay: (%p, %p);\n", win1, win2);
+#endif
+       return copywin(win1, win2,
+                       win2->begy - win1->begy, win2->begx - win1->begx,
+                       0, 0, win2->maxy - 1, win2->maxx - 1, TRUE);
 }
diff --git a/lib/libcurses/overwrite.c b/lib/libcurses/overwrite.c
new file mode 100644 (file)
index 0000000..5900b80
--- /dev/null
@@ -0,0 +1,60 @@
+/*     $NetBSD: overwrite.c,v 1.18 2007/01/21 13:25:36 jdc Exp $       */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)overwrite.c        8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: overwrite.c,v 1.18 2007/01/21 13:25:36 jdc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <ctype.h>
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * overwrite --
+ *     Writes win1 on win2 destructively.
+ */
+int
+overwrite(const WINDOW *win1, WINDOW *win2)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "overwrite: (%p, %p);\n", win1, win2);
+#endif
+       return copywin(win1, win2,
+                       win2->begy - win1->begy, win2->begx - win1->begx,
+                       0, 0, win2->maxy - 1, win2->maxx - 1, FALSE);
+}
diff --git a/lib/libcurses/pause.c b/lib/libcurses/pause.c
new file mode 100644 (file)
index 0000000..ab2cee6
--- /dev/null
@@ -0,0 +1,82 @@
+/*     $NetBSD: pause.c,v 1.9 2009/07/22 16:57:15 roy Exp $    */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: pause.c,v 1.9 2009/07/22 16:57:15 roy Exp $");
+#endif                         /* not lint */
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <sys/time.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * napms --
+ *     Sleep for ms milliseconds.
+ */
+int
+napms(int ms)
+{
+       struct timespec ts;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "napms: %d\n", ms);
+#endif
+       ts.tv_sec = ms / 1000;
+       ts.tv_nsec = (ms % 1000) * 1000000;
+       (void) nanosleep(&ts, NULL);
+       return(OK);
+}
+
+/*
+ * delay_output --
+ *     Pause output using terminal pad character.
+ */
+int
+delay_output(int ms)
+{
+       char *delstr;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "delay_output: %d\n", ms);
+#endif
+       if (!_cursesi_screen->padchar)
+               return(napms(ms));
+
+       if (asprintf(&delstr, "%d", ms) == -1)
+               return (ERR);
+       tputs (delstr, 0, __cputchar);
+       free(delstr);
+       return (OK);
+}
diff --git a/lib/libcurses/printw.c b/lib/libcurses/printw.c
new file mode 100644 (file)
index 0000000..625a7a4
--- /dev/null
@@ -0,0 +1,152 @@
+/*     $NetBSD: printw.c,v 1.21 2009/07/07 10:16:52 joerg Exp $        */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)printw.c   8.3 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: printw.c,v 1.21 2009/07/07 10:16:52 joerg Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <stdarg.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * printw and friends.
+ */
+
+static int __winwrite __P((void *, const char *, int));
+
+/*
+ * printw --
+ *     Printf on the standard screen.
+ */
+int
+printw(const char *fmt,...)
+{
+       va_list ap;
+       int     ret;
+
+       va_start(ap, fmt);
+       ret = vw_printw(stdscr, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
+/*
+ * wprintw --
+ *     Printf on the given window.
+ */
+int
+wprintw(WINDOW *win, const char *fmt,...)
+{
+       va_list ap;
+       int     ret;
+
+       va_start(ap, fmt);
+       ret = vw_printw(win, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
+/*
+ * mvprintw, mvwprintw --
+ *     Implement the mvprintw commands.  Due to the variable number of
+ *     arguments, they cannot be macros.  Sigh....
+ */
+int
+mvprintw(int y, int x, const char *fmt,...)
+{
+       va_list ap;
+       int     ret;
+
+       if (move(y, x) != OK)
+               return (ERR);
+       va_start(ap, fmt);
+       ret = vw_printw(stdscr, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
+
+int
+mvwprintw(WINDOW * win, int y, int x, const char *fmt,...)
+{
+       va_list ap;
+       int     ret;
+
+       if (wmove(win, y, x) != OK)
+               return (ERR);
+
+       va_start(ap, fmt);
+       ret = vw_printw(win, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
+/*
+ * Internal write-buffer-to-window function.
+ */
+static int
+__winwrite(cookie, buf, n)
+       void   *cookie;
+       const char *buf;
+       int     n;
+{
+       WINDOW *win;
+       int     c;
+
+       for (c = n, win = cookie; --c >= 0;)
+       {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_MISC, "__winwrite: %c\n", *buf);
+#endif
+               if (waddch(win, (chtype) (*buf++ & __CHARTEXT)) == ERR)
+                       return (-1);
+       }
+       return (n);
+}
+/*
+ * vw_printw --
+ *     This routine actually executes the printf and adds it to the window.
+ */
+int
+vw_printw(WINDOW *win, const char *fmt, _BSD_VA_LIST_ ap)
+{
+       FILE   *f;
+
+       if ((f = funopen(win, NULL, __winwrite, NULL, NULL)) == NULL)
+               return (ERR);
+       (void) vfprintf(f, fmt, ap);
+       return (fclose(f) ? ERR : OK);
+}
+
+__strong_alias(vwprintw, vw_printw)
diff --git a/lib/libcurses/prntscan.c b/lib/libcurses/prntscan.c
deleted file mode 100644 (file)
index 80257f1..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-#include <string.h>
-#include <curses.h>
-#include "curspriv.h"
-
-static char printscanbuf[513]; /* buffer used during I/O */
-
-/****************************************************************/
-/* Wprintw(win,fmt,args) does a printf() in window 'win'.      */
-/****************************************************************/
-int wprintw(WINDOW *win, const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  vsprintf(printscanbuf, fmt, args);
-  if (waddstr(win, printscanbuf) == ERR) return(ERR);
-  return(strlen(printscanbuf));
-}
-
-/****************************************************************/
-/* Printw(fmt,args) does a printf() in stdscr.                 */
-/****************************************************************/
-int printw(const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  vsprintf(printscanbuf, fmt, args);
-  if (waddstr(stdscr, printscanbuf) == ERR) return(ERR);
-  return(strlen(printscanbuf));
-}                              /* printw */
-
-/****************************************************************/
-/* Mvprintw(fmt,args) moves the stdscr cursor to a new posi-   */
-/* tion, then does a printf() in stdscr.                       */
-/****************************************************************/
-int mvprintw(int y, int x, const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  if (wmove(stdscr, y, x) == ERR) return(ERR);
-  vsprintf(printscanbuf, fmt, args);
-  if (waddstr(stdscr, printscanbuf) == ERR) return(ERR);
-  return(strlen(printscanbuf));
-}
-
-/****************************************************************/
-/* Mvwprintw(win,fmt,args) moves the window 'win's cursor to   */
-/* A new position, then does a printf() in window 'win'.       */
-/****************************************************************/
-int mvwprintw(WINDOW *win, int y, int x, const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  if (wmove(win, y, x) == ERR) return(ERR);
-  vsprintf(printscanbuf, fmt, args);
-  if (waddstr(win, printscanbuf) == ERR) return(ERR);
-  return(strlen(printscanbuf));
-}                              /* mvwprintw */
-
-/****************************************************************/
-/* Wscanw(win,fmt,args) gets a string via window 'win', then   */
-/* Scans the string using format 'fmt' to extract the values   */
-/* And put them in the variables pointed to the arguments.     */
-/****************************************************************/
-int wscanw(WINDOW *win, const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  wrefresh(win);               /* set cursor */
-  if (wgetstr(win, printscanbuf) == ERR)       /* get string */
-       return(ERR);
-  return(vsscanf(printscanbuf, fmt, args));
-}                              /* wscanw */
-
-/****************************************************************/
-/* Scanw(fmt,args) gets a string via stdscr, then scans the    */
-/* String using format 'fmt' to extract the values and put them        */
-/* In the variables pointed to the arguments.                  */
-/****************************************************************/
-int scanw(const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  wrefresh(stdscr);            /* set cursor */
-  if (wgetstr(stdscr, printscanbuf) == ERR)    /* get string */
-       return(ERR);
-  return(vsscanf(printscanbuf, fmt, args));
-}                              /* scanw */
-
-/****************************************************************/
-/* Mvscanw(y,x,fmt,args) moves stdscr's cursor to a new posi-  */
-/* Tion, then gets a string via stdscr and scans the string    */
-/* Using format 'fmt' to extract the values and put them in the        */
-/* Variables pointed to the arguments.                         */
-/****************************************************************/
-int mvscanw(int y, int x, const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  if (wmove(stdscr, y, x) == ERR) return(ERR);
-  wrefresh(stdscr);            /* set cursor */
-  if (wgetstr(stdscr, printscanbuf) == ERR)    /* get string */
-       return(ERR);
-  return(vsscanf(printscanbuf, fmt, args));
-}                              /* mvscanw */
-
-/****************************************************************/
-/* Mvwscanw(win,y,x,fmt,args) moves window 'win's cursor to a  */
-/* New position, then gets a string via 'win' and scans the    */
-/* String using format 'fmt' to extract the values and put them        */
-/* In the variables pointed to the arguments.                  */
-/****************************************************************/
-int mvwscanw(WINDOW *win, int y, int x, const char *fmt, ...)
-{
-  va_list args;
-
-  va_start(args, fmt);
-  if (wmove(win, y, x) == ERR) return(ERR);
-  wrefresh(win);               /* set cursor */
-  if (wgetstr(win, printscanbuf) == ERR)       /* get string */
-       return(ERR);
-  return(vsscanf(printscanbuf, fmt, args));
-}                              /* mvwscanw */
diff --git a/lib/libcurses/putchar.c b/lib/libcurses/putchar.c
new file mode 100644 (file)
index 0000000..f3c8243
--- /dev/null
@@ -0,0 +1,97 @@
+/*     $NetBSD: putchar.c,v 1.21 2010/02/03 15:34:40 roy Exp $ */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)putchar.c  8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: putchar.c,v 1.21 2010/02/03 15:34:40 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+int
+__cputchar(int ch)
+{
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_OUTPUT, "__cputchar: %s\n", unctrl(ch));
+#endif
+       return (putc(ch, _cursesi_screen->outfd));
+}
+
+/*
+ * This is the same as __cputchar but the extra argument holds the file
+ * descriptor to write the output to.  This function can only be used with
+ * the "new" libterm interface.
+ */
+int
+__cputchar_args(int ch, void *args)
+{
+       FILE *outfd = (FILE *) args;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_OUTPUT, "__cputchar_args: %s on fd %d\n",
+           unctrl(ch), outfd->_file);
+#endif
+       return putc(ch, outfd);
+}
+
+#ifdef HAVE_WCHAR
+int
+__cputwchar(wchar_t wch)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_OUTPUT, "__cputwchar: 0x%x\n", wch);
+#endif
+       return (putwc(wch, _cursesi_screen->outfd));
+}
+
+/*
+ * This is the same as __cputchar but the extra argument holds the file
+ * descriptor to write the output to.  This function can only be used with
+ * the "new" libterm interface.
+ */
+int
+__cputwchar_args(wchar_t wch, void *args)
+{
+       FILE *outfd = (FILE *) args;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_OUTPUT, "__cputwchar_args: 0x%x on fd %d\n",
+           wch, outfd->_file);
+#endif
+       return putwc(wch, outfd);
+}
+#endif /* HAVE_WCHAR */
index a16a1b93dceea159588733035e5feb71e1622047..5264bd3bd258820d9da6d4478187950eeed4d436 100644 (file)
-/* refresh.c */
+/*     $NetBSD: refresh.c,v 1.73 2010/02/08 20:45:22 roy Exp $ */
 
-#include <curses.h>
-#include "curspriv.h"
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
 
-/* Wrefresh() updates window win's area of the physical screen.        */
-void wrefresh(win)
-WINDOW *win;
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)refresh.c  8.7 (Berkeley) 8/13/94";
+#else
+__RCSID("$NetBSD: refresh.c,v 1.73 2010/02/08 20:45:22 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+static void    domvcur(int, int, int, int);
+static int     makech(int);
+static void    quickch(void);
+static void    scrolln(int, int, int, int, int);
+
+static int _cursesi_wnoutrefresh(SCREEN *, WINDOW *,
+                                int, int, int, int, int, int);
+
+#ifdef HAVE_WCHAR
+int cellcmp( __LDATA *, __LDATA * );
+int linecmp( __LDATA *, __LDATA *, size_t );
+#endif /* HAVE_WCHAR */
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * refresh --
+ *     Make the current screen look like "stdscr" over the area covered by
+ *     stdscr.
+ */
+int
+refresh(void)
 {
-  if (win == curscr)
-       curscr->_clear = TRUE;
-  else
-       wnoutrefresh(win);
-  doupdate();
+       return wrefresh(stdscr);
 }
 
-/****************************************************************/
-/* Wnoutrefresh() updates the image of the desired screen,     */
-/* Without doing physical update (copies window win's image to */
-/* The _cursvar.tmpwin window, which is hidden from the user). */
-/****************************************************************/
+#endif
+
+/*
+ * wnoutrefresh --
+ *     Add the contents of "win" to the virtual window.
+ */
+int
+wnoutrefresh(WINDOW *win)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "wnoutrefresh: win %p\n", win);
+#endif
+
+       return _cursesi_wnoutrefresh(_cursesi_screen, win, 0, 0, win->begy,
+           win->begx, win->maxy, win->maxx);
+}
 
-void wnoutrefresh(win)
-register WINDOW *win;
+/*
+ * pnoutrefresh --
+ *     Add the contents of "pad" to the virtual window.
+ */
+int
+pnoutrefresh(WINDOW *pad, int pbegy, int pbegx, int sbegy, int sbegx,
+       int smaxy, int smaxx)
 {
-  register int *dst;           /* start destination in temp window */
-  register int *end;           /* end destination in temp window */
-  register int *src;           /* source in user window */
-  register int first;          /* first changed char on line */
-  register int last;           /* last changed char on line */
-  WINDOW *nscr;
-  int begy;                    /* window's place on screen */
-  int begx;
-  int i;
-  int j;
-
-  nscr = _cursvar.tmpwin;
-  begy = win->_begy;
-  begx = win->_begx;
-
-  for (i = 0, j = begy; i <= win->_maxy; i++, j++) {
-       if (win->_minchng[i] != _NO_CHANGE) {
-               first = win->_minchng[i];
-               last = win->_maxchng[i];
-               dst = &(nscr->_line[j][begx + first]);
-               end = &(nscr->_line[j][begx + last]);
-               src = &(win->_line[i][first]);
-
-               while (dst <= end)      /* copy user line to temp window */
-                       *dst++ = *src++;
-
-               first += begx;  /* nscr's min/max change positions */
-               last += begx;
-
-               if ((nscr->_minchng[j] == _NO_CHANGE) || (nscr->_minchng[j] > first))
-                       nscr->_minchng[j] = first;
-               if (last > nscr->_maxchng[j]) nscr->_maxchng[j] = last;
-
-               win->_minchng[i] = _NO_CHANGE;  /* updated now */
-       }                       /* if */
-       win->_maxchng[i] = _NO_CHANGE;  /* updated now */
-  }                            /* for */
-
-  if (win->_clear) {
-       win->_clear = FALSE;
-       nscr->_clear = TRUE;
-  }                            /* if */
-  if (!win->_leave) {
-       nscr->_cury = win->_cury + begy;
-       nscr->_curx = win->_curx + begx;
-  }                            /* if */
-}                              /* wnoutrefresh */
+       int pmaxy, pmaxx;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "pnoutrefresh: pad %p, flags 0x%08x\n",
+           pad, pad->flags);
+       __CTRACE(__CTRACE_REFRESH,
+           "pnoutrefresh: (%d, %d), (%d, %d), (%d, %d)\n",
+           pbegy, pbegx, sbegy, sbegx, smaxy, smaxx);
+#endif
+
+       /* SUS says if these are negative, they should be treated as zero */
+       if (pbegy < 0)
+               pbegy = 0;
+       if (pbegx < 0)
+               pbegx = 0;
+       if (sbegy < 0)
+               sbegy = 0;
+       if (sbegx < 0)
+               sbegx = 0;
+
+       /* Calculate rectangle on pad - used by _cursesi_wnoutrefresh */
+       pmaxy = pbegy + smaxy - sbegy + 1;
+       pmaxx = pbegx + smaxx - sbegx + 1;
+
+       /* Check rectangle fits in pad */
+       if (pmaxy > pad->maxy - pad->begy)
+               pmaxy = pad->maxy - pad->begy;
+       if (pmaxx > pad->maxx - pad->begx)
+               pmaxx = pad->maxx - pad->begx;
+
+       if (smaxy - sbegy < 0 || smaxx - sbegx < 0 )
+               return ERR;
+
+       return _cursesi_wnoutrefresh(_cursesi_screen, pad,
+           pad->begy + pbegy, pad->begx + pbegx, pad->begy + sbegy,
+           pad->begx + sbegx, pmaxy, pmaxx);
+}
+
+/*
+ * _cursesi_wnoutrefresh --
+ *     Does the grunt work for wnoutrefresh to the given screen.
+ *     Copies the part of the window given by the rectangle
+ *     (begy, begx) to (maxy, maxx) at screen position (wbegy, wbegx).
+ */
+int
+_cursesi_wnoutrefresh(SCREEN *screen, WINDOW *win, int begy, int begx,
+       int wbegy, int wbegx, int maxy, int maxx)
+{
+
+       short   sy, wy, wx, y_off, x_off, mx;
+       __LINE  *wlp, *vlp;
+       WINDOW  *sub_win, *orig;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "_wnoutrefresh: win %p, flags 0x%08x\n",
+           win, win->flags);
+       __CTRACE(__CTRACE_REFRESH,
+           "_wnoutrefresh: (%d, %d), (%d, %d), (%d, %d)\n",
+           begy, begx, wbegy, wbegx, maxy, maxx);
+#endif
+
+       if (screen->curwin)
+               return OK;
+
+       /*
+        * Recurse through any sub-windows, mark as dirty lines on the parent
+        * window that are dirty on the sub-window and clear the dirty flag on
+        * the sub-window.
+        */
+       if (win->orig == 0) {
+               orig = win;
+               for (sub_win = win->nextp; sub_win != win;
+                   sub_win = sub_win->nextp) {
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_REFRESH,
+                           "wnout_refresh: win %p, sub_win %p\n",
+                           orig, sub_win);
+#endif
+                       for (sy = 0; sy < sub_win->maxy; sy++) {
+                               if (sub_win->alines[sy]->flags == __ISDIRTY) {
+                                       orig->alines[sy + sub_win->begy - orig->begy]->flags
+                                           |= __ISDIRTY;
+                                       sub_win->alines[sy]->flags
+                                           &= ~__ISDIRTY;
+                               }
+                       }
+               }
+       }
+
+       /* Check that cursor position on "win" is valid for "__virtscr" */
+       if (win->cury + wbegy - begy < screen->__virtscr->maxy &&
+           win->cury + wbegy - begy >= 0 && win->cury < maxy - begy)
+               screen->__virtscr->cury = win->cury + wbegy - begy;
+       if (win->curx + wbegx - begx < screen->__virtscr->maxx &&
+           win->curx + wbegx - begx >= 0 && win->curx < maxx - begx)
+               screen->__virtscr->curx = win->curx + wbegx - begx;
+
+       /* Copy the window flags from "win" to "__virtscr" */
+       if (win->flags & __CLEAROK) {
+               if (win->flags & __FULLWIN)
+                       screen->__virtscr->flags |= __CLEAROK;
+               win->flags &= ~__CLEAROK;
+       }
+       screen->__virtscr->flags &= ~__LEAVEOK;
+       screen->__virtscr->flags |= win->flags;
+
+       for (wy = begy, y_off = wbegy; wy < maxy &&
+           y_off < screen->__virtscr->maxy; wy++, y_off++) {
+               wlp = win->alines[wy];
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH,
+                   "_wnoutrefresh: wy %d\tf %d\tl %d\tflags %x\n",
+                   wy, *wlp->firstchp, *wlp->lastchp, wlp->flags);
+#endif
+               if ((wlp->flags & __ISDIRTY) == 0)
+                       continue;
+               vlp = screen->__virtscr->alines[y_off];
+
+               if (*wlp->firstchp < maxx + win->ch_off &&
+                   *wlp->lastchp >= win->ch_off) {
+                       /* Set start column */
+                       wx = begx;
+                       x_off = wbegx;
+                       if (*wlp->firstchp - win->ch_off > 0) {
+                               wx += *wlp->firstchp - win->ch_off;
+                               x_off += *wlp->firstchp - win->ch_off;
+                       }
+                       /* Set finish column */
+                       mx = maxx;
+                       if (mx > *wlp->lastchp - win->ch_off + 1)
+                               mx = *wlp->lastchp - win->ch_off + 1;
+                       if (x_off + (mx - wx) > __virtscr->maxx)
+                               mx -= (x_off + maxx) - __virtscr->maxx;
+                       /* Copy line from "win" to "__virtscr". */
+                       while (wx < mx) {
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_REFRESH,
+                                   "_wnoutrefresh: copy from %d, "
+                                   "%d to %d, %d\n",
+                                   wy, wx, y_off, x_off);
+#endif
+                               /* Copy character */
+                               vlp->line[x_off].ch = wlp->line[wx].ch;
+                               /* Copy attributes  */
+                               vlp->line[x_off].attr = wlp->line[wx].attr;
+                               /* Check for nca conflict with colour */
+                               if ((vlp->line[x_off].attr & __COLOR) &&
+                                   (vlp->line[x_off].attr &
+                                   _cursesi_screen->nca))
+                                       vlp->line[x_off].attr &= ~__COLOR;
+#ifdef HAVE_WCHAR
+                               if (wlp->line[wx].ch
+                                   == (wchar_t)btowc((int) win->bch)) {
+                                       vlp->line[x_off].ch = win->bch;
+                                       SET_WCOL( vlp->line[x_off], 1 );
+                                       if (_cursesi_copy_nsp(win->bnsp,
+                                                             &vlp->line[x_off])
+                                           == ERR)
+                                               return ERR;
+                               }
+#endif /* HAVE_WCHAR */
+                               wx++;
+                               x_off++;
+                       }
+
+                       /* Set flags on "__virtscr" and unset on "win". */
+                       if (wlp->flags & __ISPASTEOL)
+                               vlp->flags |= __ISPASTEOL;
+                       else
+                               vlp->flags &= ~__ISPASTEOL;
+                       if (wlp->flags & __ISDIRTY)
+                               vlp->flags |= __ISDIRTY;
+
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_REFRESH,
+                           "win: firstch = %d, lastch = %d\n",
+                           *wlp->firstchp, *wlp->lastchp);
+#endif
+                       /* Set change pointers on "__virtscr". */
+                       if (*vlp->firstchp >
+                           *wlp->firstchp + wbegx - win->ch_off)
+                               *vlp->firstchp =
+                                   *wlp->firstchp + wbegx - win->ch_off;
+                       if (*vlp->lastchp <
+                           *wlp->lastchp + wbegx - win->ch_off)
+                               *vlp->lastchp =
+                                   *wlp->lastchp + wbegx - win->ch_off;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_REFRESH,
+                           "__virtscr: firstch = %d, lastch = %d\n",
+                           *vlp->firstchp, *vlp->lastchp);
+#endif
+                       /*
+                        * Unset change pointers only if a window, as a pad
+                        * can be displayed again without any of the contents
+                        * changing.
+                        */
+                       if (!(win->flags & __ISPAD)) {
+                               /* Set change pointers on "win". */
+                               if (*wlp->firstchp >= win->ch_off)
+                                       *wlp->firstchp = maxx + win->ch_off;
+                               if (*wlp->lastchp < maxx + win->ch_off)
+                                       *wlp->lastchp = win->ch_off;
+                               if ((*wlp->lastchp < *wlp->firstchp) ||
+                                   (*wlp->firstchp >= maxx + win->ch_off) ||
+                                   (*wlp->lastchp <= win->ch_off)) {
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_REFRESH,
+                                           "_wnoutrefresh: "
+                                           "line %d notdirty\n", wy);
+#endif
+                                       wlp->flags &= ~__ISDIRTY;
+                               }
+                       }
+               }
+       }
+       return OK;
+}
+
+/*
+ * wrefresh --
+ *     Make the current screen look like "win" over the area covered by
+ *     win.
+ */
+int
+wrefresh(WINDOW *win)
+{
+       int retval;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "wrefresh: win %p\n", win);
+#endif
+
+       _cursesi_screen->curwin = (win == _cursesi_screen->curscr);
+       if (!_cursesi_screen->curwin)
+               retval = _cursesi_wnoutrefresh(_cursesi_screen, win, 0, 0,
+                   win->begy, win->begx, win->maxy, win->maxx);
+       else
+               retval = OK;
+       if (retval == OK) {
+               retval = doupdate();
+               if (!(win->flags & __LEAVEOK)) {
+                       win->cury = max(0, curscr->cury - win->begy);
+                       win->curx = max(0, curscr->curx - win->begx);
+               }
+       }
+       _cursesi_screen->curwin = 0;
+       return(retval);
+}
+
+ /*
+ * prefresh --
+ *     Make the current screen look like "pad" over the area coverd by
+ *     the specified area of pad.
+ */
+int
+prefresh(WINDOW *pad, int pbegy, int pbegx, int sbegy, int sbegx,
+       int smaxy, int smaxx)
+{
+       int retval;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "prefresh: pad %p, flags 0x%08x\n",
+           pad, pad->flags);
+#endif
+       /* Retain values in case pechochar() is called. */
+       pad->pbegy = pbegy;
+       pad->pbegx = pbegx;
+       pad->sbegy = sbegy;
+       pad->sbegx = sbegx;
+       pad->smaxy = smaxy;
+       pad->smaxx = smaxx;
+
+       /* Use pnoutrefresh() to avoid duplicating code here */
+       retval = pnoutrefresh(pad, pbegy, pbegx, sbegy, sbegx, smaxy, smaxx);
+       if (retval == OK) {
+               retval = doupdate();
+               if (!(pad->flags & __LEAVEOK)) {
+                       pad->cury = max(0, curscr->cury - pad->begy);
+                       pad->curx = max(0, curscr->curx - pad->begx);
+               }
+       }
+       return(retval);
+}
+
+/*
+ * doupdate --
+ *     Make the current screen look like the virtual window "__virtscr".
+ */
+int
+doupdate(void)
+{
+       WINDOW  *win;
+       __LINE  *wlp;
+       short    wy;
+       int      dnum;
+#ifdef HAVE_WCHAR
+       __LDATA *lp;
+       nschar_t *np;
+       int x;
+#endif /* HAVE_WCHAR */
+
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->curwin)
+               win = curscr;
+       else
+               win = _cursesi_screen->__virtscr;
+
+       /* Initialize loop parameters. */
+       _cursesi_screen->ly = curscr->cury;
+       _cursesi_screen->lx = curscr->curx;
+       wy = 0;
+
+       if (!_cursesi_screen->curwin) {
+               for (wy = 0; wy < win->maxy; wy++) {
+                       wlp = win->alines[wy];
+                       if (wlp->flags & __ISDIRTY) {
+#ifndef HAVE_WCHAR
+                               wlp->hash = __hash(wlp->line,
+                                   (size_t)(win->maxx * __LDATASIZE));
+#else
+                               wlp->hash = 0;
+                               for ( x = 0; x < win->maxx; x++ ) {
+                                       lp = &wlp->line[ x ];
+                                       wlp->hash = __hash_more( &lp->ch,
+                                               sizeof( wchar_t ), wlp->hash );
+                                       wlp->hash = __hash_more( &lp->attr,
+                                               sizeof( attr_t ), wlp->hash );
+                                       np = lp->nsp;
+                                       if (np) {
+                                               while ( np ) {
+                                                       wlp->hash
+                                                           = __hash_more(
+                                                               &np->ch,
+                                                               sizeof(wchar_t),
+                                                               wlp->hash );
+                                                       np = np->next;
+                                               }
+                                       }
+                               }
+#endif /* HAVE_WCHAR */
+                       }
+               }
+       }
+
+       if ((win->flags & __CLEAROK) || (curscr->flags & __CLEAROK) ||
+           _cursesi_screen->curwin) {
+               if (curscr->wattr & __COLOR)
+                       __unsetattr(0);
+               tputs(clear_screen, 0, __cputchar);
+               _cursesi_screen->ly = 0;
+               _cursesi_screen->lx = 0;
+               if (!_cursesi_screen->curwin) {
+                       curscr->flags &= ~__CLEAROK;
+                       curscr->cury = 0;
+                       curscr->curx = 0;
+                       werase(curscr);
+               }
+               __touchwin(win);
+               win->flags &= ~__CLEAROK;
+       }
+       if (!cursor_address) {
+               if (win->curx != 0)
+                       __cputchar('\n');
+               if (!_cursesi_screen->curwin)
+                       werase(curscr);
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "doupdate: (%p): curwin = %d\n", win,
+           _cursesi_screen->curwin);
+       __CTRACE(__CTRACE_REFRESH, "doupdate: \tfirstch\tlastch\n");
+#endif
+
+       if (!_cursesi_screen->curwin) {
+               /*
+                * Invoke quickch() only if more than a quarter of the lines
+                * in the window are dirty.
+                */
+               for (wy = 0, dnum = 0; wy < win->maxy; wy++)
+                       if (win->alines[wy]->flags & __ISDIRTY)
+                               dnum++;
+               if (!__noqch && dnum > (int) win->maxy / 4)
+                       quickch();
+       }
+
+#ifdef DEBUG
+       {
+               int     i, j;
+
+               __CTRACE(__CTRACE_REFRESH,
+                   "#####################################\n");
+               __CTRACE(__CTRACE_REFRESH,
+                   "stdscr(%p)-curscr(%p)-__virtscr(%p)\n",
+                   stdscr, curscr, _cursesi_screen->__virtscr);
+               for (i = 0; i < curscr->maxy; i++) {
+                       __CTRACE(__CTRACE_REFRESH, "C: %d:", i);
+                       __CTRACE(__CTRACE_REFRESH, " 0x%x \n",
+                           curscr->alines[i]->hash);
+                       for (j = 0; j < curscr->maxx; j++)
+                               __CTRACE(__CTRACE_REFRESH, "%c",
+                                   curscr->alines[i]->line[j].ch);
+                       __CTRACE(__CTRACE_REFRESH, "\n");
+                       __CTRACE(__CTRACE_REFRESH, " attr:");
+                       for (j = 0; j < curscr->maxx; j++)
+                               __CTRACE(__CTRACE_REFRESH, " %x",
+                                   curscr->alines[i]->line[j].attr);
+                       __CTRACE(__CTRACE_REFRESH, "\n");
+                       __CTRACE(__CTRACE_REFRESH, "W: %d:", i);
+                       __CTRACE(__CTRACE_REFRESH, " 0x%x \n",
+                           win->alines[i]->hash);
+                       __CTRACE(__CTRACE_REFRESH, " 0x%x ",
+                           win->alines[i]->flags);
+                       for (j = 0; j < win->maxx; j++)
+                               __CTRACE(__CTRACE_REFRESH, "%c",
+                                   win->alines[i]->line[j].ch);
+                       __CTRACE(__CTRACE_REFRESH, "\n");
+                       __CTRACE(__CTRACE_REFRESH, " attr:");
+                       for (j = 0; j < win->maxx; j++)
+                               __CTRACE(__CTRACE_REFRESH, " %x",
+                                   win->alines[i]->line[j].attr);
+                       __CTRACE(__CTRACE_REFRESH, "\n");
+#ifdef HAVE_WCHAR
+                       __CTRACE(__CTRACE_REFRESH, " nsp:");
+                       for (j = 0; j < curscr->maxx; j++)
+                               __CTRACE(__CTRACE_REFRESH, " %p",
+                                   win->alines[i]->line[j].nsp);
+                       __CTRACE(__CTRACE_REFRESH, "\n");
+                       __CTRACE(__CTRACE_REFRESH, " bnsp:");
+                       for (j = 0; j < curscr->maxx; j++)
+                               __CTRACE(__CTRACE_REFRESH, " %p",
+                                   win->bnsp);
+                       __CTRACE(__CTRACE_REFRESH, "\n");
+#endif /* HAVE_WCHAR */
+               }
+       }
+#endif /* DEBUG */
+
+       for (wy = 0; wy < win->maxy; wy++) {
+               wlp = win->alines[wy];
+/* XXX: remove this debug */
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH,
+                   "doupdate: wy %d\tf: %d\tl:%d\tflags %x\n",
+                   wy, *wlp->firstchp, *wlp->lastchp, wlp->flags);
+#endif /* DEBUG */
+               if (!_cursesi_screen->curwin)
+                       curscr->alines[wy]->hash = wlp->hash;
+               if (wlp->flags & __ISDIRTY) {
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_REFRESH,
+                           "doupdate: [ISDIRTY]wy:%d\tf:%d\tl:%d\n", wy,
+                           *wlp->firstchp, *wlp->lastchp);
+#endif /* DEBUG */
+                       if (makech(wy) == ERR)
+                               return (ERR);
+                       else {
+                               if (*wlp->firstchp >= 0)
+                                       *wlp->firstchp = win->maxx;
+                               if (*wlp->lastchp < win->maxx)
+                                       *wlp->lastchp = 0;
+                               if (*wlp->lastchp < *wlp->firstchp) {
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_REFRESH,
+                                           "doupdate: line %d notdirty\n", wy);
+#endif /* DEBUG */
+                                       wlp->flags &= ~__ISDIRTY;
+                               }
+                       }
+
+               }
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH, "\t%d\t%d\n",
+                   *wlp->firstchp, *wlp->lastchp);
+#endif /* DEBUG */
+       }
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "doupdate: ly=%d, lx=%d\n",
+           _cursesi_screen->ly, _cursesi_screen->lx);
+#endif /* DEBUG */
+
+       if (_cursesi_screen->curwin)
+               domvcur(_cursesi_screen->ly, _cursesi_screen->lx,
+                       win->cury, win->curx);
+       else {
+               if (win->flags & __LEAVEOK) {
+                       curscr->cury = _cursesi_screen->ly;
+                       curscr->curx = _cursesi_screen->lx;
+               } else {
+                       domvcur(_cursesi_screen->ly, _cursesi_screen->lx,
+                               win->cury, win->curx);
+                       curscr->cury = win->cury;
+                       curscr->curx = win->curx;
+               }
+       }
+
+       /* Don't leave the screen with attributes set. */
+       __unsetattr(0);
+#ifdef DEBUG
+#ifdef HAVE_WCHAR
+       {
+               int     i, j;
+
+               __CTRACE(__CTRACE_REFRESH,
+                   "***********after*****************\n");
+               __CTRACE(__CTRACE_REFRESH,
+                   "stdscr(%p)-curscr(%p)-__virtscr(%p)\n",
+                   stdscr, curscr, _cursesi_screen->__virtscr);
+               for (i = 0; i < curscr->maxy; i++) {
+                       for (j = 0; j < curscr->maxx; j++)
+                               __CTRACE(__CTRACE_REFRESH,
+                                   "[%d,%d](%x,%x,%p)-(%x,%x,%p)\n",
+                                   i, j,
+                                   curscr->alines[i]->line[j].ch,
+                                   curscr->alines[i]->line[j].attr,
+                                   curscr->alines[i]->line[j].nsp,
+                                   _cursesi_screen->__virtscr->alines[i]->line[j].ch,
+                                   _cursesi_screen->__virtscr->alines[i]->line[j].attr,
+                                   _cursesi_screen->__virtscr->alines[i]->line[j].nsp);
+               }
+       }
+#endif /* HAVE_WCHAR */
+#endif /* DEBUG */
+       return fflush(_cursesi_screen->outfd) == EOF ? ERR : OK;
+}
+
+/*
+ * makech --
+ *     Make a change on the screen.
+ */
+static int
+makech(int wy)
+{
+       WINDOW  *win;
+       static __LDATA blank;
+       __LDATA *nsp, *csp, *cp, *cep;
+       size_t  clsp, nlsp;     /* Last space in lines. */
+       int     lch, wx;
+       const char      *ce;
+       attr_t  lspc;           /* Last space colour */
+       attr_t  off, on;
+
+#ifdef __GNUC__
+       nlsp = lspc = 0;        /* XXX gcc -Wuninitialized */
+#endif
+       if (_cursesi_screen->curwin)
+               win = curscr;
+       else
+               win = __virtscr;
+#ifdef HAVE_WCHAR
+       blank.ch = ( wchar_t )btowc(( int ) win->bch );
+       blank.attr = 0;
+       if (_cursesi_copy_nsp(win->bnsp, &blank) == ERR)
+               return ERR;
+       SET_WCOL( blank, 1 );
+#endif /* HAVE_WCHAR */
+#ifdef DEBUG
+#if HAVE_WCHAR
+       {
+               int x;
+               __LDATA *lp, *vlp;
+
+               __CTRACE(__CTRACE_REFRESH,
+                   "[makech-before]wy=%d,curscr(%p)-__virtscr(%p)\n",
+                   wy, curscr, __virtscr);
+               for (x = 0; x < curscr->maxx; x++) {
+                       lp = &curscr->alines[wy]->line[x];
+                       vlp = &__virtscr->alines[wy]->line[x];
+                       __CTRACE(__CTRACE_REFRESH,
+                           "[%d,%d](%x,%x,%x,%x,%p)-"
+                           "(%x,%x,%x,%x,%p)\n",
+                           wy, x, lp->ch, lp->attr,
+                           win->bch, win->battr, lp->nsp,
+                           vlp->ch, vlp->attr,
+                           win->bch, win->battr, vlp->nsp);
+               }
+       }
+#endif /* HAVE_WCHAR */
+#endif /* DEBUG */
+       /* Is the cursor still on the end of the last line? */
+       if (wy > 0 && curscr->alines[wy - 1]->flags & __ISPASTEOL) {
+               domvcur(_cursesi_screen->ly, _cursesi_screen->lx,
+                       _cursesi_screen->ly + 1, 0);
+               _cursesi_screen->ly++;
+               _cursesi_screen->lx = 0;
+       }
+       wx = *win->alines[wy]->firstchp;
+       if (wx < 0)
+               wx = 0;
+       else
+               if (wx >= win->maxx)
+                       return (OK);
+       lch = *win->alines[wy]->lastchp;
+       if (lch < 0)
+               return (OK);
+       else
+               if (lch >= (int) win->maxx)
+                       lch = win->maxx - 1;
+
+       if (_cursesi_screen->curwin) {
+               csp = &blank;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH, "makech: csp is blank\n");
+#endif /* DEBUG */
+       } else {
+               csp = &curscr->alines[wy]->line[wx];
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH,
+                   "makech: csp is on curscr:(%d,%d)\n", wy, wx);
+#endif /* DEBUG */
+       }
+
+       nsp = &win->alines[wy]->line[wx];
+#ifdef DEBUG
+       if ( _cursesi_screen->curwin )
+               __CTRACE(__CTRACE_REFRESH,
+                   "makech: nsp is at curscr:(%d,%d)\n", wy, wx);
+       else
+               __CTRACE(__CTRACE_REFRESH,
+                   "makech: nsp is at __virtscr:(%d,%d)\n", wy, wx);
+#endif /* DEBUG */
+       if (clr_eol && !_cursesi_screen->curwin) {
+               cp = &win->alines[wy]->line[win->maxx - 1];
+               lspc = cp->attr & __COLOR;
+#ifndef HAVE_WCHAR
+               while (cp->ch == ' ' && cp->attr == lspc) /* XXX */
+                       if (cp-- <= win->alines[wy]->line)
+                               break;
+#else
+               while (cp->ch == ( wchar_t )btowc(( int )' ' )
+                               && ( cp->attr & WA_ATTRIBUTES ) == lspc)
+                       if (cp-- <= win->alines[wy]->line)
+                               break;
+#endif /* HAVE_WCHAR */
+               if (win->alines[wy]->line > cp)
+                       nlsp = 0;
+               else
+                       nlsp = cp - win->alines[wy]->line;
+       }
+       if (!_cursesi_screen->curwin)
+               ce = clr_eol;
+       else
+               ce = NULL;
+
+       while (wx <= lch) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH, "makech: wx=%d,lch=%d\n", wx, lch);
+#endif /* DEBUG */
+#ifndef HAVE_WCHAR
+               if (memcmp(nsp, csp, sizeof(__LDATA)) == 0) {
+                       if (wx <= lch) {
+                               while (wx <= lch &&
+                                   memcmp(nsp, csp, sizeof(__LDATA)) == 0) {
+                                       nsp++;
+                                       if (!_cursesi_screen->curwin)
+                                               ++csp;
+                                       ++wx;
+                               }
+                               continue;
+                       }
+                       break;
+               }
+#else
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH, "makech: nsp=(%x,%x,%x,%x,%p)\n",
+                       nsp->ch, nsp->attr, win->bch, win->battr, nsp->nsp);
+               __CTRACE(__CTRACE_REFRESH, "makech: csp=(%x,%x,%x,%x,%p)\n",
+                       csp->ch, csp->attr, win->bch, win->battr, csp->nsp);
+#endif /* DEBUG */
+               if (((nsp->attr & __WCWIDTH) != __WCWIDTH) &&
+                   cellcmp(nsp, csp)) {
+                       if (wx <= lch) {
+                               while (wx <= lch && cellcmp( csp, nsp )) {
+                                       nsp++;
+                                       if (!_cursesi_screen->curwin)
+                                               ++csp;
+                                       ++wx;
+                               }
+                               continue;
+                       }
+                       break;
+               }
+#endif /* HAVE_WCHAR */
+               domvcur(_cursesi_screen->ly, _cursesi_screen->lx, wy, wx);
+
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH, "makech: 1: wx = %d, ly= %d, "
+                   "lx = %d, newy = %d, newx = %d\n",
+                   wx, _cursesi_screen->ly, _cursesi_screen->lx, wy, wx);
+#endif
+               _cursesi_screen->ly = wy;
+               _cursesi_screen->lx = wx;
+#ifndef HAVE_WCHAR
+               while (wx <= lch && memcmp(nsp, csp, sizeof(__LDATA)) != 0) {
+                       if (ce != NULL &&
+                           wx >= nlsp && nsp->ch == ' ' && nsp->attr == lspc) {
+#else
+               while (!cellcmp(nsp, csp) && wx <= lch) {
+                       if (ce != NULL && wx >= nlsp
+                          && nsp->ch == (wchar_t)btowc((int)' ') /* XXX */
+                          && (nsp->attr & WA_ATTRIBUTES) == lspc) {
+
+#endif
+                               /* Check for clear to end-of-line. */
+                               cep = &curscr->alines[wy]->line[win->maxx - 1];
+#ifndef HAVE_WCHAR
+                               while (cep->ch == ' ' && cep->attr == lspc) /* XXX */
+#else
+                               while (cep->ch == (wchar_t)btowc((int)' ')
+                                      && (cep->attr & WA_ATTRIBUTES) == lspc)
+#endif /* HAVE_WCHAR */
+                                       if (cep-- <= csp)
+                                               break;
+                               clsp = cep - curscr->alines[wy]->line -
+                                   win->begx * __LDATASIZE;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_REFRESH,
+                                   "makech: clsp = %zu, nlsp = %zu\n",
+                                   clsp, nlsp);
+#endif
+                               if (((clsp - nlsp >= strlen(clr_eol) &&
+                                   clsp < win->maxx * __LDATASIZE) ||
+                                   wy == win->maxy - 1) &&
+                                   (!(lspc & __COLOR) ||
+                                   ((lspc & __COLOR) && back_color_erase))) {
+                                       __unsetattr(0);
+                                       if (__using_color &&
+                                           ((lspc & __COLOR) !=
+                                           (curscr->wattr & __COLOR)))
+                                               __set_color(curscr, lspc &
+                                                   __COLOR);
+                                       tputs(clr_eol, 0, __cputchar);
+                                       _cursesi_screen->lx = wx + win->begx;
+                                       while (wx++ <= clsp) {
+                                               csp->attr = lspc;
+#ifndef HAVE_WCHAR
+                                               csp->ch = ' '; /* XXX */
+#else
+                                               csp->ch = (wchar_t)btowc((int)' ');
+                                               SET_WCOL( *csp, 1 );
+#endif /* HAVE_WCHAR */
+                                               csp++;
+                                       }
+                                       return (OK);
+                               }
+                               ce = NULL;
+                       }
+
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_REFRESH,
+                                   "makech: have attr %08x, need attr %08x\n",
+                                   curscr->wattr & WA_ATTRIBUTES,
+                                   nsp->attr & WA_ATTRIBUTES);
+#endif
+
+                       off = (~nsp->attr & curscr->wattr)
+#ifndef HAVE_WCHAR
+                                & __ATTRIBUTES
+#else
+                                & WA_ATTRIBUTES
+#endif
+                               ;
+
+                       /*
+                        * Unset attributes as appropriate.  Unset first
+                        * so that the relevant attributes can be reset
+                        * (because 'me' unsets 'mb', 'md', 'mh', 'mk',
+                        * 'mp' and 'mr').  Check to see if we also turn off
+                        * standout, attributes and colour.
+                        */
+                       if (off & __TERMATTR && exit_attribute_mode != NULL) {
+                               tputs(exit_attribute_mode, 0, __cputchar);
+                               curscr->wattr &= __mask_me;
+                               off &= __mask_me;
+                       }
+
+                       /*
+                        * Exit underscore mode if appropriate.
+                        * Check to see if we also turn off standout,
+                        * attributes and colour.
+                        */
+                       if (off & __UNDERSCORE && exit_underline_mode != NULL) {
+                               tputs(exit_underline_mode, 0, __cputchar);
+                               curscr->wattr &= __mask_ue;
+                               off &= __mask_ue;
+                       }
+
+                       /*
+                        * Exit standout mode as appropriate.
+                        * Check to see if we also turn off underscore,
+                        * attributes and colour.
+                        * XXX
+                        * Should use uc if so/se not available.
+                        */
+                       if (off & __STANDOUT && exit_standout_mode != NULL) {
+                               tputs(exit_standout_mode, 0, __cputchar);
+                               curscr->wattr &= __mask_se;
+                               off &= __mask_se;
+                       }
+
+                       if (off & __ALTCHARSET && exit_alt_charset_mode != NULL) {
+                               tputs(exit_alt_charset_mode, 0, __cputchar);
+                               curscr->wattr &= ~__ALTCHARSET;
+                       }
+
+                       /* Set/change colour as appropriate. */
+                       if (__using_color)
+                               __set_color(curscr, nsp->attr & __COLOR);
+
+                       on = (nsp->attr & ~curscr->wattr)
+#ifndef HAVE_WCHAR
+                                & __ATTRIBUTES
+#else
+                                & WA_ATTRIBUTES
+#endif
+                                ;
+
+                       /*
+                        * Enter standout mode if appropriate.
+                        */
+                       if (on & __STANDOUT &&
+                           enter_standout_mode != NULL &&
+                           exit_standout_mode != NULL)
+                       {
+                               tputs(enter_standout_mode, 0, __cputchar);
+                               curscr->wattr |= __STANDOUT;
+                       }
+
+                       /*
+                        * Enter underscore mode if appropriate.
+                        * XXX
+                        * Should use uc if us/ue not available.
+                        */
+                       if (on & __UNDERSCORE &&
+                           enter_underline_mode != NULL &&
+                           exit_underline_mode != NULL)
+                       {
+                               tputs(enter_underline_mode, 0, __cputchar);
+                               curscr->wattr |= __UNDERSCORE;
+                       }
+
+                       /*
+                        * Set other attributes as appropriate.
+                        */
+                       if (exit_attribute_mode != NULL) {
+                               if (on & __BLINK &&
+                                   enter_blink_mode != NULL)
+                               {
+                                       tputs(enter_blink_mode, 0, __cputchar);
+                                       curscr->wattr |= __BLINK;
+                               }
+                               if (on & __BOLD &&
+                                   enter_bold_mode != NULL)
+                               {
+                                       tputs(enter_bold_mode, 0, __cputchar);
+                                       curscr->wattr |= __BOLD;
+                               }
+                               if (on & __DIM &&
+                                   enter_dim_mode != NULL)
+                               {
+                                       tputs(enter_dim_mode, 0, __cputchar);
+                                       curscr->wattr |= __DIM;
+                               }
+                               if (on & __BLANK &&
+                                   enter_secure_mode != NULL)
+                               {
+                                       tputs(enter_secure_mode, 0, __cputchar);
+                                       curscr->wattr |= __BLANK;
+                               }
+                               if (on & __PROTECT &&
+                                   enter_protected_mode != NULL)
+                               {
+                                       tputs(enter_protected_mode, 0, __cputchar);
+                                       curscr->wattr |= __PROTECT;
+                               }
+                               if (on & __REVERSE &&
+                                   enter_reverse_mode != NULL)
+                               {
+                                       tputs(enter_reverse_mode, 0, __cputchar);
+                                       curscr->wattr |= __REVERSE;
+                               }
+#ifdef HAVE_WCHAR
+                               if (on & WA_TOP &&
+                                   enter_top_hl_mode != NULL)
+                               {
+                                       tputs(enter_top_hl_mode, 0, __cputchar);
+                                       curscr->wattr |= WA_TOP;
+                               }
+                               if (on & WA_LOW &&
+                                   enter_low_hl_mode != NULL)
+                               {
+                                       tputs(enter_low_hl_mode, 0, __cputchar);
+                                       curscr->wattr |= WA_LOW;
+                               }
+                               if (on & WA_LEFT &&
+                                   enter_left_hl_mode != NULL)
+                               {
+                                       tputs(enter_left_hl_mode, 0, __cputchar);
+                                       curscr->wattr |= WA_LEFT;
+                               }
+                               if (on & WA_RIGHT &&
+                                   enter_right_hl_mode != NULL)
+                               {
+                                       tputs(enter_right_hl_mode, 0, __cputchar);
+                                       curscr->wattr |= WA_RIGHT;
+                               }
+                               if (on & WA_HORIZONTAL &&
+                                   enter_horizontal_hl_mode != NULL)
+                               {
+                                       tputs(enter_horizontal_hl_mode, 0, __cputchar);
+                                       curscr->wattr |= WA_HORIZONTAL;
+                               }
+                               if (on & WA_VERTICAL &&
+                                   enter_vertical_hl_mode != NULL)
+                               {
+                                       tputs(enter_vertical_hl_mode, 0, __cputchar);
+                                       curscr->wattr |= WA_VERTICAL;
+                               }
+#endif /* HAVE_WCHAR */
+                       }
+
+                       /* Enter/exit altcharset mode as appropriate. */
+                       if (on & __ALTCHARSET && enter_alt_charset_mode != NULL &&
+                           exit_alt_charset_mode != NULL) {
+                               tputs(enter_alt_charset_mode, 0, __cputchar);
+                               curscr->wattr |= __ALTCHARSET;
+                       }
+
+                       wx++;
+                       if (wx >= win->maxx &&
+                           wy == win->maxy - 1 && !_cursesi_screen->curwin) {
+                               if (win->flags & __SCROLLOK) {
+                                       if (win->flags & __ENDLINE)
+                                               __unsetattr(1);
+                                       if (!(win->flags & __SCROLLWIN)) {
+                                               if (!_cursesi_screen->curwin) {
+                                                       csp->attr = nsp->attr;
+                                                       csp->ch = nsp->ch;
+#ifdef HAVE_WCHAR
+                                                       if (_cursesi_copy_nsp(nsp->nsp, csp) == ERR)
+                                                               return ERR;
+#endif /* HAVE_WCHAR */
+                                               }
+#ifndef HAVE_WCHAR
+                                               __cputchar((int) nsp->ch);
+#else
+                                               if ( WCOL( *nsp ) > 0 ) {
+                                                       __cputwchar((int)nsp->ch);
+#ifdef DEBUG
+                                                       __CTRACE(__CTRACE_REFRESH,
+                                                           "makech: (%d,%d)putwchar(0x%x)\n",
+                                                               wy, wx - 1,
+                                                               nsp->ch );
+#endif /* DEBUG */
+                                                       /*
+                                                        * Output non-spacing
+                                                        * characters for the
+                                                        * cell.
+                                                        */
+                                                       __cursesi_putnsp(nsp->nsp,
+                                                                        wy, wx);
+
+                                               }
+#endif /* HAVE_WCHAR */
+                                       }
+                                       if (wx < curscr->maxx) {
+                                               domvcur(_cursesi_screen->ly, wx,
+                                                   (int) (win->maxy - 1),
+                                                   (int) (win->maxx - 1));
+                                       }
+                                       _cursesi_screen->ly = win->maxy - 1;
+                                       _cursesi_screen->lx = win->maxx - 1;
+                                       return (OK);
+                               }
+                       }
+                       if (wx < win->maxx || wy < win->maxy - 1 ||
+                           !(win->flags & __SCROLLWIN)) {
+                               if (!_cursesi_screen->curwin) {
+                                       csp->attr = nsp->attr;
+                                       csp->ch = nsp->ch;
+#ifdef HAVE_WCHAR
+                                       if (_cursesi_copy_nsp(nsp->nsp,
+                                                             csp) == ERR)
+                                               return ERR;
+#endif /* HAVE_WCHAR */
+                                       csp++;
+                               }
+#ifndef HAVE_WCHAR
+                               __cputchar((int) nsp->ch);
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_REFRESH,
+                                   "makech: putchar(%c)\n", nsp->ch & 0177);
+#endif
+#else
+                               if (WCOL(*nsp) > 0) {
+                                       __cputwchar((int) nsp->ch);
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_REFRESH,
+                                           "makech:(%d,%d) putwchar(%x)\n",
+                                           wy, wx - 1, nsp->ch);
+                                       __cursesi_putnsp(nsp->nsp, wy, wx);
+#endif /* DEBUG */
+                               }
+#endif /* HAVE_WCHAR */
+                       }
+                       if (underline_char && ((nsp->attr & __STANDOUT) ||
+                           (nsp->attr & __UNDERSCORE))) {
+                               __cputchar('\b');
+                               tputs(underline_char, 0, __cputchar);
+                       }
+                       nsp++;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_REFRESH,
+                           "makech: 2: wx = %d, lx = %d\n",
+                           wx, _cursesi_screen->lx);
+#endif
+               }
+               if (_cursesi_screen->lx == wx)  /* If no change. */
+                       break;
+               _cursesi_screen->lx = wx;
+               if (_cursesi_screen->lx >= COLS && auto_right_margin)
+                       _cursesi_screen->lx = COLS - 1;
+               else
+                       if (wx >= win->maxx) {
+                               domvcur(_cursesi_screen->ly,
+                                       _cursesi_screen->lx,
+                                       _cursesi_screen->ly,
+                                       (int) (win->maxx - 1));
+                               _cursesi_screen->lx = win->maxx - 1;
+                       }
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH, "makech: 3: wx = %d, lx = %d\n",
+                   wx, _cursesi_screen->lx);
+#endif
+       }
+#ifdef DEBUG
+#if HAVE_WCHAR
+       {
+               int x;
+               __LDATA *lp, *vlp;
+
+               __CTRACE(__CTRACE_REFRESH,
+                   "makech-after: curscr(%p)-__virtscr(%p)\n",
+                   curscr, __virtscr );
+               for (x = 0; x < curscr->maxx; x++) {
+                       lp = &curscr->alines[wy]->line[x];
+                       vlp = &__virtscr->alines[wy]->line[x];
+                       __CTRACE(__CTRACE_REFRESH,
+                           "[%d,%d](%x,%x,%x,%x,%p)-"
+                           "(%x,%x,%x,%x,%p)\n",
+                           wy, x, lp->ch, lp->attr,
+                           win->bch, win->battr, lp->nsp,
+                           vlp->ch, vlp->attr,
+                           win->bch, win->battr, vlp->nsp);
+               }
+       }
+#endif /* HAVE_WCHAR */
+#endif /* DEBUG */
+
+       return (OK);
+}
+
+/*
+ * domvcur --
+ *     Do a mvcur, leaving attributes if necessary.
+ */
+static void
+domvcur(oy, ox, ny, nx)
+       int     oy, ox, ny, nx;
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "domvcur: (%x,%d)=>(%d,%d)\n",
+           oy, ox, ny, nx );
+#endif /* DEBUG */
+       __unsetattr(1);
+       if ( oy == ny && ox == nx )
+               return;
+       __mvcur(oy, ox, ny, nx, 1);
+}
+
+/*
+ * Quickch() attempts to detect a pattern in the change of the window
+ * in order to optimize the change, e.g., scroll n lines as opposed to
+ * repainting the screen line by line.
+ */
+
+static __LDATA buf[128];
+static  u_int last_hash;
+static  size_t last_hash_len;
+#define BLANKSIZE (sizeof(buf) / sizeof(buf[0]))
+
+static void
+quickch(void)
+{
+#define THRESH         (int) __virtscr->maxy / 4
+
+       __LINE *clp, *tmp1, *tmp2;
+       int     bsize, curs, curw, starts, startw, i, j;
+       int     n, target, cur_period, bot, top, sc_region;
+       u_int   blank_hash;
+       attr_t  bcolor;
+
+#ifdef __GNUC__
+       curs = curw = starts = startw = 0;      /* XXX gcc -Wuninitialized */
+#endif
+       /*
+        * Find how many lines from the top of the screen are unchanged.
+        */
+       for (top = 0; top < __virtscr->maxy; top++)
+#ifndef HAVE_WCHAR
+               if (__virtscr->alines[top]->flags & __ISDIRTY &&
+                   (__virtscr->alines[top]->hash != curscr->alines[top]->hash ||
+                   memcmp(__virtscr->alines[top]->line,
+                   curscr->alines[top]->line,
+                   (size_t) __virtscr->maxx * __LDATASIZE)
+                   != 0))
+                       break;
+#else
+               if (__virtscr->alines[top]->flags & __ISDIRTY &&
+                   (__virtscr->alines[top]->hash != curscr->alines[top]->hash ||
+                   !linecmp(__virtscr->alines[top]->line,
+                   curscr->alines[top]->line,
+       (size_t) __virtscr->maxx )))
+                       break;
+#endif /* HAVE_WCHAR */
+               else
+                       __virtscr->alines[top]->flags &= ~__ISDIRTY;
+       /*
+        * Find how many lines from bottom of screen are unchanged.
+        */
+       for (bot = __virtscr->maxy - 1; bot >= 0; bot--)
+#ifndef HAVE_WCHAR
+               if (__virtscr->alines[bot]->flags & __ISDIRTY &&
+                   (__virtscr->alines[bot]->hash != curscr->alines[bot]->hash ||
+                   memcmp(__virtscr->alines[bot]->line,
+                   curscr->alines[bot]->line,
+                   (size_t) __virtscr->maxx * __LDATASIZE)
+                   != 0))
+                       break;
+#else
+               if (__virtscr->alines[bot]->flags & __ISDIRTY &&
+                   (__virtscr->alines[bot]->hash != curscr->alines[bot]->hash ||
+                   !linecmp(__virtscr->alines[bot]->line,
+                   curscr->alines[bot]->line,
+                   (size_t) __virtscr->maxx )))
+                       break;
+#endif /* HAVE_WCHAR */
+               else
+                       __virtscr->alines[bot]->flags &= ~__ISDIRTY;
+
+       /*
+        * Work round an xterm bug where inserting lines causes all the
+        * inserted lines to be covered with the background colour we
+        * set on the first line (even if we unset it for subsequent
+        * lines).
+        */
+       bcolor = __virtscr->alines[min(top,
+           __virtscr->maxy - 1)]->line[0].attr & __COLOR;
+       for (i = top + 1, j = 0; i < bot; i++) {
+               if ((__virtscr->alines[i]->line[0].attr & __COLOR) != bcolor) {
+                       bcolor = __virtscr->alines[i]->line[__virtscr->maxx].
+                           attr & __COLOR;
+                       j = i - top;
+               } else
+                       break;
+       }
+       top += j;
+
+#ifdef NO_JERKINESS
+       /*
+        * If we have a bottom unchanged region return.  Scrolling the
+        * bottom region up and then back down causes a screen jitter.
+        * This will increase the number of characters sent to the screen
+        * but it looks better.
+        */
+       if (bot < __virtscr->maxy - 1)
+               return;
+#endif                         /* NO_JERKINESS */
+
+       /*
+        * Search for the largest block of text not changed.
+        * Invariants of the loop:
+        * - Startw is the index of the beginning of the examined block in
+        *   __virtscr.
+        * - Starts is the index of the beginning of the examined block in
+        *   curscr.
+        * - Curw is the index of one past the end of the exmined block in
+        *   __virtscr.
+        * - Curs is the index of one past the end of the exmined block in
+        *   curscr.
+        * - bsize is the current size of the examined block.
+       */
+
+       for (bsize = bot - top; bsize >= THRESH; bsize--) {
+               for (startw = top; startw <= bot - bsize; startw++)
+                       for (starts = top; starts <= bot - bsize;
+                               starts++) {
+                               for (curw = startw, curs = starts;
+                                   curs < starts + bsize; curw++, curs++)
+                                       if (__virtscr->alines[curw]->hash !=
+                                           curscr->alines[curs]->hash)
+                                               break;
+                               if (curs != starts + bsize)
+                                       continue;
+                               for (curw = startw, curs = starts;
+                                       curs < starts + bsize; curw++, curs++)
+#ifndef HAVE_WCHAR
+                                       if (memcmp(__virtscr->alines[curw]->line,
+                                           curscr->alines[curs]->line,
+                                           (size_t) __virtscr->maxx *
+                                           __LDATASIZE) != 0)
+                                               break;
+#else
+                                       if (!linecmp(__virtscr->alines[curw]->line,
+                                           curscr->alines[curs]->line,
+                                           (size_t) __virtscr->maxx))
+                                               break;
+#endif /* HAVE_WCHAR */
+                               if (curs == starts + bsize)
+                                       goto done;
+                       }
+       }
+done:
+
+       /* Did not find anything */
+       if (bsize < THRESH)
+               return;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "quickch:bsize=%d, starts=%d, startw=%d, "
+           "curw=%d, curs=%d, top=%d, bot=%d\n",
+           bsize, starts, startw, curw, curs, top, bot);
+#endif
+
+       /*
+        * Make sure that there is no overlap between the bottom and top
+        * regions and the middle scrolled block.
+        */
+       if (bot < curs)
+               bot = curs - 1;
+       if (top > starts)
+               top = starts;
+
+       n = startw - starts;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "#####################################\n");
+       for (i = 0; i < curscr->maxy; i++) {
+               __CTRACE(__CTRACE_REFRESH, "C: %d:", i);
+               __CTRACE(__CTRACE_REFRESH, " 0x%x \n", curscr->alines[i]->hash);
+               for (j = 0; j < curscr->maxx; j++)
+                       __CTRACE(__CTRACE_REFRESH, "%c",
+                           curscr->alines[i]->line[j].ch);
+               __CTRACE(__CTRACE_REFRESH, "\n");
+               __CTRACE(__CTRACE_REFRESH, " attr:");
+               for (j = 0; j < curscr->maxx; j++)
+                       __CTRACE(__CTRACE_REFRESH, " %x",
+                           curscr->alines[i]->line[j].attr);
+               __CTRACE(__CTRACE_REFRESH, "\n");
+               __CTRACE(__CTRACE_REFRESH, "W: %d:", i);
+               __CTRACE(__CTRACE_REFRESH, " 0x%x \n",
+                   __virtscr->alines[i]->hash);
+               __CTRACE(__CTRACE_REFRESH, " 0x%x ",
+                   __virtscr->alines[i]->flags);
+               for (j = 0; j < __virtscr->maxx; j++)
+                       __CTRACE(__CTRACE_REFRESH, "%c",
+                           __virtscr->alines[i]->line[j].ch);
+               __CTRACE(__CTRACE_REFRESH, "\n");
+               __CTRACE(__CTRACE_REFRESH, " attr:");
+               for (j = 0; j < __virtscr->maxx; j++)
+                       __CTRACE(__CTRACE_REFRESH, " %x",
+                           __virtscr->alines[i]->line[j].attr);
+               __CTRACE(__CTRACE_REFRESH, "\n");
+       }
+#endif
+
+#ifndef HAVE_WCHAR
+       if (buf[0].ch != ' ') {
+               for (i = 0; i < BLANKSIZE; i++) {
+                       buf[i].ch = ' ';
+                       buf[i].attr = 0;
+               }
+       }
+#else
+       if (buf[0].ch != ( wchar_t )btowc(( int ) curscr->bch )) {
+               for (i = 0; i < BLANKSIZE; i++) {
+                       buf[i].ch = ( wchar_t )btowc(( int ) curscr->bch );
+                       if (_cursesi_copy_nsp(curscr->bnsp, &buf[i]) == ERR)
+                               return;
+                       buf[i].attr = 0;
+                       SET_WCOL( buf[ i ], 1 );
+               }
+       }
+#endif /* HAVE_WCHAR */
+
+       if (__virtscr->maxx != last_hash_len) {
+               blank_hash = 0;
+               for (i = __virtscr->maxx; i > BLANKSIZE; i -= BLANKSIZE) {
+                       blank_hash = __hash_more(buf, sizeof(buf), blank_hash);
+               }
+               blank_hash = __hash_more((char *)(void *)buf,
+                   i * sizeof(buf[0]), blank_hash);
+               /* cache result in static data - screen width doesn't change often */
+               last_hash_len = __virtscr->maxx;
+               last_hash = blank_hash;
+       } else
+               blank_hash = last_hash;
+
+       /*
+        * Perform the rotation to maintain the consistency of curscr.
+        * This is hairy since we are doing an *in place* rotation.
+        * Invariants of the loop:
+        * - I is the index of the current line.
+        * - Target is the index of the target of line i.
+        * - Tmp1 points to current line (i).
+        * - Tmp2 and points to target line (target);
+        * - Cur_period is the index of the end of the current period.
+        *   (see below).
+        *
+        * There are 2 major issues here that make this rotation non-trivial:
+        * 1.  Scrolling in a scrolling region bounded by the top
+        *     and bottom regions determined (whose size is sc_region).
+        * 2.  As a result of the use of the mod function, there may be a
+        *     period introduced, i.e., 2 maps to 4, 4 to 6, n-2 to 0, and
+        *     0 to 2, which then causes all odd lines not to be rotated.
+        *     To remedy this, an index of the end ( = beginning) of the
+        *     current 'period' is kept, cur_period, and when it is reached,
+        *     the next period is started from cur_period + 1 which is
+        *     guaranteed not to have been reached since that would mean that
+        *     all records would have been reached. (think about it...).
+        *
+        * Lines in the rotation can have 3 attributes which are marked on the
+        * line so that curscr is consistent with the visual screen.
+        * 1.  Not dirty -- lines inside the scrolled block, top region or
+        *                  bottom region.
+        * 2.  Blank lines -- lines in the differential of the scrolling
+        *                    region adjacent to top and bot regions
+        *                    depending on scrolling direction.
+        * 3.  Dirty line -- all other lines are marked dirty.
+        */
+       sc_region = bot - top + 1;
+       i = top;
+       tmp1 = curscr->alines[top];
+       cur_period = top;
+       for (j = top; j <= bot; j++) {
+               target = (i - top + n + sc_region) % sc_region + top;
+               tmp2 = curscr->alines[target];
+               curscr->alines[target] = tmp1;
+               /* Mark block as clean and blank out scrolled lines. */
+               clp = curscr->alines[target];
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH,
+                   "quickch: n=%d startw=%d curw=%d i = %d target=%d ",
+                   n, startw, curw, i, target);
+#endif
+               if ((target >= startw && target < curw) || target < top
+                   || target > bot) {
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_REFRESH, " notdirty\n");
+#endif
+                       __virtscr->alines[target]->flags &= ~__ISDIRTY;
+               } else
+                       if ((n > 0 && target >= top && target < top + n) ||
+                           (n < 0 && target <= bot && target > bot + n)) {
+#ifndef HAVE_WCHAR
+                               if (clp->hash != blank_hash ||
+                                   memcmp(clp->line, clp->line + 1,
+                                   (__virtscr->maxx - 1)
+                                   * __LDATASIZE) ||
+                                   memcmp(clp->line, buf, __LDATASIZE)) {
+#else
+                               if (clp->hash != blank_hash
+                                   || linecmp(clp->line, clp->line + 1,
+                                   (unsigned int) (__virtscr->maxx - 1))
+                                   || cellcmp(clp->line, buf)) {
+#endif /* HAVE_WCHAR */
+                                       for (i = __virtscr->maxx;
+                                           i > BLANKSIZE;
+                                           i -= BLANKSIZE) {
+                                               (void) memcpy(clp->line + i -
+                                                   BLANKSIZE, buf, sizeof(buf));
+                                       }
+                                       (void) memcpy(clp->line , buf, i *
+                                           sizeof(buf[0]));
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_REFRESH,
+                                           " blanked out: dirty\n");
+#endif
+                                       clp->hash = blank_hash;
+                                       __touchline(__virtscr, target, 0, (int) __virtscr->maxx - 1);
+                               } else {
+#ifdef DEBUG
+                                       __CTRACE(__CTRACE_REFRESH,
+                                           " -- blank line already: dirty\n");
+#endif
+                                       __touchline(__virtscr, target, 0, (int) __virtscr->maxx - 1);
+                               }
+                       } else {
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_REFRESH, " -- dirty\n");
+#endif
+                               __touchline(__virtscr, target, 0, (int) __virtscr->maxx - 1);
+                       }
+               if (target == cur_period) {
+                       i = target + 1;
+                       tmp1 = curscr->alines[i];
+                       cur_period = i;
+               } else {
+                       tmp1 = tmp2;
+                       i = target;
+               }
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
+       for (i = 0; i < curscr->maxy; i++) {
+               __CTRACE(__CTRACE_REFRESH, "C: %d:", i);
+               for (j = 0; j < curscr->maxx; j++)
+                       __CTRACE(__CTRACE_REFRESH, "%c",
+                           curscr->alines[i]->line[j].ch);
+               __CTRACE(__CTRACE_REFRESH, "\n");
+               __CTRACE(__CTRACE_REFRESH, "W: %d:", i);
+               for (j = 0; j < __virtscr->maxx; j++)
+                       __CTRACE(__CTRACE_REFRESH, "%c",
+                           __virtscr->alines[i]->line[j].ch);
+               __CTRACE(__CTRACE_REFRESH, "\n");
+       }
+#endif
+       if (n != 0)
+               scrolln(starts, startw, curs, bot, top);
+}
+
+/*
+ * scrolln --
+ *     Scroll n lines, where n is starts - startw.
+ */
+static void /* ARGSUSED */
+scrolln(starts, startw, curs, bot, top)
+       int     starts, startw, curs, bot, top;
+{
+       int     i, oy, ox, n;
+
+       oy = curscr->cury;
+       ox = curscr->curx;
+       n = starts - startw;
+
+       /*
+        * XXX
+        * The initial tests that set __noqch don't let us reach here unless
+        * we have either cs + ho + SF/sf/SR/sr, or AL + DL.  SF/sf and SR/sr
+        * scrolling can only shift the entire scrolling region, not just a
+        * part of it, which means that the quickch() routine is going to be
+        * sadly disappointed in us if we don't have cs as well.
+        *
+        * If cs, ho and SF/sf are set, can use the scrolling region.  Because
+        * the cursor position after cs is undefined, we need ho which gives us
+        * the ability to move to somewhere without knowledge of the current
+        * location of the cursor.  Still call __mvcur() anyway, to update its
+        * idea of where the cursor is.
+        *
+        * When the scrolling region has been set, the cursor has to be at the
+        * last line of the region to make the scroll happen.
+        *
+        * Doing SF/SR or AL/DL appears faster on the screen than either sf/sr
+        * or AL/DL, and, some terminals have AL/DL, sf/sr, and cs, but not
+        * SF/SR.  So, if we're scrolling almost all of the screen, try and use
+        * AL/DL, otherwise use the scrolling region.  The "almost all" is a
+        * shameless hack for vi.
+        */
+       if (n > 0) {
+               if (change_scroll_region != NULL && cursor_home != NULL &&
+                   (parm_index != NULL ||
+                   ((parm_insert_line == NULL || parm_delete_line == NULL ||
+                   top > 3 || bot + 3 < __virtscr->maxy) &&
+                   scroll_forward != NULL)))
+               {
+                       tputs(vtparm(change_scroll_region, top, bot),
+                           0, __cputchar);
+                       __mvcur(oy, ox, 0, 0, 1);
+                       tputs(cursor_home, 0, __cputchar);
+                       __mvcur(0, 0, bot, 0, 1);
+                       if (parm_index != NULL)
+                               tputs(vtparm(parm_index, n),
+                                   0, __cputchar);
+                       else
+                               for (i = 0; i < n; i++)
+                                       tputs(scroll_forward, 0, __cputchar);
+                       tputs(vtparm(change_scroll_region,
+                           0, (int) __virtscr->maxy - 1), 0, __cputchar);
+                       __mvcur(bot, 0, 0, 0, 1);
+                       tputs(cursor_home, 0, __cputchar);
+                       __mvcur(0, 0, oy, ox, 1);
+                       return;
+               }
+
+               /* Scroll up the block. */
+               if (parm_index != NULL && top == 0) {
+                       __mvcur(oy, ox, bot, 0, 1);
+                       tputs(vtparm(parm_index, n), 0, __cputchar);
+               } else
+                       if (parm_delete_line != NULL) {
+                               __mvcur(oy, ox, top, 0, 1);
+                               tputs(vtparm(parm_delete_line, n),
+                                   0, __cputchar);
+                       } else
+                               if (delete_line != NULL) {
+                                       __mvcur(oy, ox, top, 0, 1);
+                                       for (i = 0; i < n; i++)
+                                               tputs(delete_line,
+                                                   0, __cputchar);
+                               } else
+                                       if (scroll_forward != NULL && top == 0) {
+                                               __mvcur(oy, ox, bot, 0, 1);
+                                               for (i = 0; i < n; i++)
+                                                       tputs(scroll_forward, 0,
+                                                           __cputchar);
+                                       } else
+                                               abort();
+
+               /* Push down the bottom region. */
+               __mvcur(top, 0, bot - n + 1, 0, 1);
+               if (parm_insert_line != NULL)
+                       tputs(vtparm(parm_insert_line, n), 0, __cputchar);
+               else
+                       if (insert_line != NULL)
+                               for (i = 0; i < n; i++)
+                                       tputs(insert_line, 0, __cputchar);
+                       else
+                               abort();
+               __mvcur(bot - n + 1, 0, oy, ox, 1);
+       } else {
+               /*
+                * !!!
+                * n < 0
+                *
+                * If cs, ho and SR/sr are set, can use the scrolling region.
+                * See the above comments for details.
+                */
+               if (change_scroll_region != NULL && cursor_home != NULL &&
+                   (parm_rindex != NULL ||
+                   ((parm_insert_line == NULL || parm_delete_line == NULL ||
+                   top > 3 ||
+                   bot + 3 < __virtscr->maxy) && scroll_reverse != NULL)))
+               {
+                       tputs(vtparm(change_scroll_region, top, bot),
+                           0, __cputchar);
+                       __mvcur(oy, ox, 0, 0, 1);
+                       tputs(cursor_home, 0, __cputchar);
+                       __mvcur(0, 0, top, 0, 1);
+
+                       if (parm_rindex != NULL)
+                               tputs(vtparm(parm_rindex, -n),
+                                   0, __cputchar);
+                       else
+                               for (i = n; i < 0; i++)
+                                       tputs(scroll_reverse, 0, __cputchar);
+                       tputs(vtparm(change_scroll_region,
+                           0, (int) __virtscr->maxy - 1), 0, __cputchar);
+                       __mvcur(top, 0, 0, 0, 1);
+                       tputs(cursor_home, 0, __cputchar);
+                       __mvcur(0, 0, oy, ox, 1);
+                       return;
+               }
+
+               /* Preserve the bottom lines. */
+               __mvcur(oy, ox, bot + n + 1, 0, 1);
+               if (parm_rindex != NULL && bot == __virtscr->maxy)
+                       tputs(vtparm(parm_rindex, -n), 0, __cputchar);
+               else
+                       if (parm_delete_line != NULL)
+                               tputs(vtparm(parm_delete_line, -n),
+                                   0, __cputchar);
+                       else
+                               if (delete_line != NULL)
+                                       for (i = n; i < 0; i++)
+                                               tputs(delete_line,
+                                                   0, __cputchar);
+                               else
+                                       if (scroll_reverse != NULL &&
+                                           bot == __virtscr->maxy)
+                                               for (i = n; i < 0; i++)
+                                                       tputs(scroll_reverse, 0,
+                                                           __cputchar);
+                                       else
+                                               abort();
+
+               /* Scroll the block down. */
+               __mvcur(bot + n + 1, 0, top, 0, 1);
+               if (parm_insert_line != NULL)
+                       tputs(vtparm(parm_insert_line, -n), 0, __cputchar);
+               else
+                       if (insert_line != NULL)
+                               for (i = n; i < 0; i++)
+                                       tputs(insert_line, 0, __cputchar);
+                       else
+                               abort();
+               __mvcur(top, 0, oy, ox, 1);
+       }
+}
+
+/*
+ * __unsetattr --
+ *     Unset attributes on curscr.  Leave standout, attribute and colour
+ *     modes if necessary (!ms).  Always leave altcharset (xterm at least
+ *     ignores a cursor move if we don't).
+ */
+void /* ARGSUSED */
+__unsetattr(int checkms)
+{
+       int     isms;
+
+       if (checkms)
+               if (!move_standout_mode) {
+                       isms = 1;
+               } else {
+                       isms = 0;
+               }
+       else
+               isms = 1;
+#ifdef DEBUG
+       __CTRACE(__CTRACE_REFRESH,
+           "__unsetattr: checkms = %d, ms = %s, wattr = %08x\n",
+           checkms, move_standout_mode ? "TRUE" : "FALSE", curscr->wattr);
+#endif
+
+       /*
+        * Don't leave the screen in standout mode (check against ms).  Check
+        * to see if we also turn off underscore, attributes and colour.
+        */
+       if (curscr->wattr & __STANDOUT && isms) {
+               tputs(exit_standout_mode, 0, __cputchar);
+               curscr->wattr &= __mask_se;
+       }
+       /*
+        * Don't leave the screen in underscore mode (check against ms).
+        * Check to see if we also turn off attributes.  Assume that we
+        * also turn off colour.
+        */
+       if (curscr->wattr & __UNDERSCORE && isms) {
+               tputs(exit_underline_mode, 0, __cputchar);
+               curscr->wattr &= __mask_ue;
+       }
+       /*
+        * Don't leave the screen with attributes set (check against ms).
+        * Assume that also turn off colour.
+        */
+       if (curscr->wattr & __TERMATTR && isms) {
+               tputs(exit_attribute_mode, 0, __cputchar);
+               curscr->wattr &= __mask_me;
+       }
+       /* Don't leave the screen with altcharset set (don't check ms). */
+       if (curscr->wattr & __ALTCHARSET) {
+               tputs(exit_alt_charset_mode, 0, __cputchar);
+               curscr->wattr &= ~__ALTCHARSET;
+       }
+       /* Don't leave the screen with colour set (check against ms). */
+       if (__using_color && isms)
+               __unset_color(curscr);
+}
+
+#ifdef HAVE_WCHAR
+/* compare two cells on screen, must have the same forground/background,
+ * and the same sequence of non-spacing characters */
+int
+cellcmp( __LDATA *x, __LDATA *y )
+{
+       nschar_t *xnp = x->nsp, *ynp = y->nsp;
+       int ret = ( x->ch == y->ch ) & ( x->attr == y->attr );
+
+       if ( !ret )
+               return 0;
+       if ( !xnp && !ynp )
+               return 1;
+       if (( xnp && !ynp ) || ( !xnp && ynp ))
+               return 0;
+
+       while ( xnp && ynp ) {
+               if ( xnp->ch != ynp->ch )
+                       return 0;
+               xnp = xnp->next;
+               ynp = ynp->next;
+       }
+       return ( !xnp && !ynp );
+}
+
+/* compare two line segments */
+int
+linecmp( __LDATA *xl, __LDATA *yl, size_t len )
+{
+       int i = 0;
+       __LDATA *xp = xl, *yp = yl;
+
+       for ( i = 0; i < len; i++, xp++, yp++ ) {
+               if ( !cellcmp( xp, yp ))
+                       return 0;
+       }
+       return 1;
+}
+
+/*
+ * Output the non-spacing characters associated with the given character
+ * cell to the screen.
+ */
+
+void
+__cursesi_putnsp(nschar_t *nsp, const int wy, const int wx)
+{
+       nschar_t *p;
+
+       /* this shuts up gcc warnings about wx and wy not being used */
+       if (wx > wy) {
+       }
+
+       p = nsp;
+       while (p != NULL) {
+               __cputwchar((int) p->ch);
+#ifdef DEBUG
+               __CTRACE(__CTRACE_REFRESH,
+                      "_cursesi_putnsp: (%d,%d) non-spacing putwchar(0x%x)\n",
+                        wy, wx - 1, p->ch);
+#endif
+               p = p->next;
+       }
+}
+
+#endif /* HAVE_WCHAR */
diff --git a/lib/libcurses/resize.c b/lib/libcurses/resize.c
new file mode 100644 (file)
index 0000000..1f1f4a2
--- /dev/null
@@ -0,0 +1,361 @@
+/*     $NetBSD: resize.c,v 1.20 2009/07/22 16:57:15 roy Exp $  */
+
+/*
+ * Copyright (c) 2001
+ *     Brett Lymn.
+ *
+ * This code has been donated to The NetBSD Foundation by the Author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)resize.c   blymn 2001/08/26";
+#else
+__RCSID("$NetBSD: resize.c,v 1.20 2009/07/22 16:57:15 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+static int __resizeterm(WINDOW *win, int nlines, int ncols);
+static int __resizewin(WINDOW *win, int nlines, int ncols);
+
+/*
+ * wresize --
+ *     Resize the given window to the new size.
+ */
+int
+wresize(WINDOW *win, int req_nlines, int req_ncols)
+{
+       int     nlines = req_nlines;
+       int     ncols = req_ncols;
+
+       if (win == NULL)
+               return ERR;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "wresize: (%p, %d, %d)\n",
+           win, nlines, ncols);
+#endif
+       if (win->orig == NULL) {
+               /* bound "our" windows by the screen size */
+               if (win == curscr || win == __virtscr || win == stdscr) {
+                       if (nlines > LINES)
+                               nlines = LINES;
+                       if (nlines < 1)
+                               nlines = 1;
+                       if (ncols > COLS)
+                               ncols = COLS;
+                       if (ncols < 1)
+                               ncols = 1;
+               } else {
+                       if (win->begy > LINES)
+                               win->begy = 0;
+                       if (win->begy + nlines > LINES)
+                               nlines = 0;
+                       if (nlines <= 0)
+                               nlines += LINES - win->begy;
+                       if (nlines < 1)
+                               nlines = 1;
+                       if (win->begx > COLS)
+                               win->begx = 0;
+                       if (win->begx + ncols > COLS)
+                               ncols = 0;
+                       if (ncols <= 0)
+                               ncols += COLS - win->begx;
+                       if (ncols < 1)
+                               ncols = 1;
+               }
+       } else {
+               /* subwins must fit inside the parent - check this */
+               if (win->begy > win->orig->begy + win->orig->maxy)
+                       win->begy = win->orig->begy + win->orig->maxy - 1;
+               if (win->begy + nlines > win->orig->begy + win->orig->maxy)
+                       nlines = 0;
+               if (nlines <= 0)
+                       nlines += win->orig->begy + win->orig->maxy - win->begy;
+               if (nlines < 1)
+                       nlines = 1;
+               if (win->begx > win->orig->begx + win->orig->maxx)
+                       win->begx = win->orig->begx + win->orig->maxx - 1;
+               if (win->begx + ncols > win->orig->begx + win->orig->maxx)
+                       ncols = 0;
+               if (ncols <= 0)
+                       ncols += win->orig->begx + win->orig->maxx - win->begx;
+               if (ncols < 1)
+                       ncols = 1;
+       }
+
+       if ((__resizewin(win, nlines, ncols)) == ERR)
+               return ERR;
+
+       win->reqy = req_nlines;
+       win->reqx = req_ncols;
+
+       /* If someone resizes curscr, we must also resize __virtscr */
+       if (win == curscr) {
+               if ((__resizewin(__virtscr, nlines, ncols)) == ERR)
+                       return ERR;
+               __virtscr->reqy = req_nlines;
+               __virtscr->reqx = req_ncols;
+       }
+
+       return OK;
+}
+
+/*
+ * resizeterm --
+ *     Resize the terminal window, resizing the dependent windows.
+ */
+int
+resizeterm(int nlines, int ncols)
+{
+       WINDOW *win;
+       struct __winlist *list;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "resizeterm: (%d, %d)\n", nlines, ncols);
+#endif
+
+       if (__resizeterm(curscr, nlines, ncols) == ERR)
+               return ERR;
+       if (__resizeterm(__virtscr, nlines, ncols) == ERR)
+               return ERR;
+       if (__resizeterm(stdscr, nlines, ncols) == ERR)
+               return ERR;
+
+       LINES = nlines;
+       COLS = ncols;
+
+         /* tweak the flags now that we have updated the LINES and COLS */
+       for (list = _cursesi_screen->winlistp; list != NULL; list = list->nextp) {
+               win = list->winp;
+
+               if (!(win->flags & __ISPAD))
+                       __swflags(win);
+       }
+
+       wrefresh(curscr);
+       return OK;
+}
+
+/*
+ * __resizeterm
+ *     Setup window for resizing.
+ */
+static int
+__resizeterm(WINDOW *win, int nlines, int ncols)
+{
+       int newlines, newcols;
+
+       newlines = win->reqy;
+       if (win->begy + newlines >= nlines)
+               newlines = 0;
+       if (newlines == 0)
+               newlines = nlines - win->begy;
+
+       newcols = win->reqx;
+       if (win->begx + newcols >= ncols)
+               newcols = 0;
+       if (newcols == 0)
+               newcols = ncols - win->begx;
+
+       return __resizewin(win, newlines, newcols);
+}
+
+/*
+ * __resizewin --
+ *     Resize the given window.
+ */
+static int
+__resizewin(WINDOW *win, int nlines, int ncols)
+{
+       __LINE                  *lp, *olp, **newlines, *newlspace;
+       __LDATA                 *sp;
+       __LDATA                 *newwspace;
+       int                      i, j;
+       int                      y, x;
+       WINDOW                  *swin;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "resize: (%p, %d, %d)\n", win, nlines, ncols);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->wattr = %08x\n", win->wattr);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->flags = %#.4x\n", win->flags);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->maxy = %d\n", win->maxy);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->maxx = %d\n", win->maxx);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->begy = %d\n", win->begy);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->begx = %d\n", win->begx);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->scr_t = %d\n", win->scr_t);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->scr_b = %d\n", win->scr_b);
+#endif
+
+       /*
+        * free up any non-spacing storage before we lose the
+        * pointers...
+        */
+#ifdef HAVE_WCHAR
+       __cursesi_win_free_nsp(win);
+#endif
+
+       if (nlines <= 0 || ncols <= 0)
+               nlines = ncols = 0;
+       else {
+               /* Reallocate line pointer array and line space. */
+               newlines = realloc(win->alines, nlines * sizeof(__LINE *));
+               if (newlines == NULL)
+                       return ERR;
+               win->alines = newlines;
+
+               newlspace = realloc(win->lspace, nlines * sizeof(__LINE));
+               if (newlspace == NULL)
+                       return ERR;
+               win->lspace = newlspace;
+       }
+
+       /* Don't allocate window and line space if it's a subwindow */
+       if (win->orig == NULL) {
+               /*
+                * Allocate window space in one chunk.
+                */
+               if (ncols != 0) {
+                       newwspace = realloc(win->wspace,
+                                           ncols * nlines * sizeof(__LDATA));
+                       if (newwspace == NULL)
+                               return ERR;
+                       win->wspace = newwspace;
+               }
+
+               /*
+                * Point line pointers to line space, and lines themselves into
+                * window space.
+                */
+               for (lp = win->lspace, i = 0; i < nlines; i++, lp++) {
+                       win->alines[i] = lp;
+                       lp->line = &win->wspace[i * ncols];
+#ifdef DEBUG
+                       lp->sentinel = SENTINEL_VALUE;
+#endif
+                       lp->firstchp = &lp->firstch;
+                       lp->lastchp = &lp->lastch;
+                       lp->firstch = 0;
+                       lp->lastch = ncols - 1;
+                       lp->flags = __ISDIRTY;
+               }
+       } else {
+
+               win->ch_off = win->begx - win->orig->begx;
+                 /* Point line pointers to line space. */
+               for (lp = win->lspace, i = 0; i < nlines; i++, lp++) {
+                       win->alines[i] = lp;
+                       olp = win->orig->alines[i + win->begy - win->orig->begy];
+                       lp->line = &olp->line[win->ch_off];
+#ifdef DEBUG
+                       lp->sentinel = SENTINEL_VALUE;
+#endif
+                       lp->firstchp = &olp->firstch;
+                       lp->lastchp = &olp->lastch;
+                       lp->flags = __ISDIRTY;
+               }
+       }
+
+
+       win->cury = win->curx = 0;
+       win->maxy = nlines;
+       win->maxx = ncols;
+       win->scr_b = win->maxy - 1;
+       __swflags(win);
+
+         /*
+          * we must zot the window contents otherwise lines may pick
+          * up attributes from the previous line when the window is
+          * made smaller.  The client will redraw the window anyway
+          * so this is no big deal.
+          */
+       for (i = 0; i < win->maxy; i++) {
+               lp = win->alines[i];
+               for (sp = lp->line, j = 0; j < win->maxx; j++, sp++) {
+                       sp->attr = 0;
+#ifndef HAVE_WCHAR
+                       sp->ch = win->bch;
+#else
+                       sp->ch = ( wchar_t )btowc(( int ) win->bch );
+                       sp->nsp = NULL;
+                       if (_cursesi_copy_nsp(win->bnsp, sp) == ERR)
+                               return ERR;
+                       SET_WCOL( *sp, 1 );
+#endif /* HAVE_WCHAR */
+               }
+               lp->hash = __hash((char *)(void *)lp->line,
+                                 (size_t) (ncols * __LDATASIZE));
+       }
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "resize: win->wattr = %08x\n", win->wattr);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->flags = %#.4x\n", win->flags);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->maxy = %d\n", win->maxy);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->maxx = %d\n", win->maxx);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->begy = %d\n", win->begy);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->begx = %d\n", win->begx);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->scr_t = %d\n", win->scr_t);
+       __CTRACE(__CTRACE_WINDOW, "resize: win->scr_b = %d\n", win->scr_b);
+#endif
+
+       if (win->orig == NULL) {
+               /* bound subwindows to new size and fixup their pointers */
+               for (swin = win->nextp; swin != win; swin = swin->nextp) {
+                       y = swin->reqy;
+                       if (swin->begy > win->begy + win->maxy)
+                               swin->begy = win->begy + win->maxy - 1;
+                       if (swin->begy + y > win->begy + win->maxy)
+                               y = 0;
+                       if (y <= 0)
+                               y += win->begy + win->maxy - swin->begy;
+                       if (y < 1)
+                               y = 1;
+                       x = swin->reqx;
+                       if (swin->begx > win->begx + win->maxx)
+                               swin->begx = win->begx + win->maxx - 1;
+                       if (swin->begx + x > win->begx + win->maxx)
+                               x = 0;
+                       if (x <= 0)
+                               x += win->begy + win->maxx - swin->begx;
+                       if (x < 1)
+                               x = 1;
+                       __resizewin(swin, y, x);
+               }
+       }
+
+       return OK;
+}
diff --git a/lib/libcurses/scanw.c b/lib/libcurses/scanw.c
new file mode 100644 (file)
index 0000000..deeb473
--- /dev/null
@@ -0,0 +1,125 @@
+/*     $NetBSD: scanw.c,v 1.20 2009/07/07 10:16:52 joerg Exp $ */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)scanw.c    8.3 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: scanw.c,v 1.20 2009/07/07 10:16:52 joerg Exp $");
+#endif
+#endif                         /* not lint */
+
+/*
+ * scanw and friends.
+ */
+
+#include <stdarg.h>
+
+#include "curses.h"
+
+/*
+ * scanw --
+ *     Implement a scanf on the standard screen.
+ */
+int
+scanw(const char *fmt,...)
+{
+       va_list ap;
+       int     ret;
+
+       va_start(ap, fmt);
+       ret = vw_scanw(stdscr, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
+/*
+ * wscanw --
+ *     Implements a scanf on the given window.
+ */
+int
+wscanw(WINDOW *win, const char *fmt,...)
+{
+       va_list ap;
+       int     ret;
+
+       va_start(ap, fmt);
+       ret = vw_scanw(win, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
+/*
+ * mvscanw, mvwscanw --
+ *     Implement the mvscanw commands.  Due to the variable number of
+ *     arguments, they cannot be macros.  Another sigh....
+ */
+int
+mvscanw(int y, int x, const char *fmt,...)
+{
+       va_list ap;
+       int     ret;
+
+       if (move(y, x) != OK)
+               return (ERR);
+       va_start(ap, fmt);
+       ret = vw_scanw(stdscr, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
+
+int
+mvwscanw(WINDOW * win, int y, int x, const char *fmt,...)
+{
+       va_list ap;
+       int     ret;
+
+       if (move(y, x) != OK)
+               return (ERR);
+       va_start(ap, fmt);
+       ret = vw_scanw(win, fmt, ap);
+       va_end(ap);
+       return (ret);
+}
+/*
+ * vwscanw --
+ *     This routine actually executes the scanf from the window.
+ */
+int
+vw_scanw(WINDOW *win, const char *fmt, _BSD_VA_LIST_ ap)
+{
+
+       char    buf[1024];
+
+       return (wgetnstr(win, buf, (int) sizeof(buf)) == OK ?
+           vsscanf(buf, fmt, ap) : ERR);
+}
+
+__strong_alias(vwscanw, vw_scanw)
diff --git a/lib/libcurses/screen.c b/lib/libcurses/screen.c
new file mode 100644 (file)
index 0000000..439dcff
--- /dev/null
@@ -0,0 +1,246 @@
+/*     $NetBSD: screen.c,v 1.23 2010/06/10 05:24:55 dholland Exp $     */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)screen.c   8.2 (blymn) 11/27/2001";
+#else
+__RCSID("$NetBSD: screen.c,v 1.23 2010/06/10 05:24:55 dholland Exp $");
+#endif
+#endif                                 /* not lint */
+
+#include <stdlib.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * set_term --
+ *      Change the term to the given screen.
+ *
+ */
+SCREEN *
+set_term(SCREEN *new)
+{
+       SCREEN *old_screen = _cursesi_screen;
+
+       if (_cursesi_screen != NULL) {
+                 /* save changes made to the current screen... */
+               old_screen->echoit = __echoit;
+               old_screen->pfast = __pfast;
+               old_screen->rawmode = __rawmode;
+               old_screen->noqch = __noqch;
+               old_screen->COLS = COLS;
+               old_screen->LINES = LINES;
+               old_screen->COLORS = COLORS;
+               old_screen->COLOR_PAIRS = COLOR_PAIRS;
+               old_screen->GT = __GT;
+               old_screen->NONL = __NONL;
+               old_screen->UPPERCASE = __UPPERCASE;
+       }
+
+       _cursesi_screen = new;
+
+       __echoit = new->echoit;
+        __pfast = new->pfast;
+       __rawmode = new->rawmode;
+       __noqch = new->noqch;
+       COLS = new->COLS;
+       LINES = new->LINES;
+       COLORS = new->COLORS;
+       COLOR_PAIRS = new->COLOR_PAIRS;
+       __GT = new->GT;
+       __NONL = new->NONL;
+       __UPPERCASE = new->UPPERCASE;
+
+       _cursesi_resetterm(new);
+
+       curscr = new->curscr;
+       clearok(curscr, new->clearok);
+       stdscr = new->stdscr;
+       __virtscr = new->__virtscr;
+
+       _cursesi_reset_acs(new);
+#ifdef HAVE_WCHAR
+    _cursesi_reset_wacs(new);
+#endif /* HAVE_WCHAR */
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_SCREEN, "set_term: LINES = %d, COLS = %d\n",
+           LINES, COLS);
+#endif
+
+       return old_screen;
+}
+
+/*
+ * newterm --
+ *      Set up a new screen.
+ *
+ */
+SCREEN *
+newterm(char *type, FILE *outfd, FILE *infd)
+{
+       SCREEN *new_screen;
+       char *sp;
+
+       sp = type;
+       if ((type == NULL) && (sp = getenv("TERM")) == NULL)
+               return NULL;
+
+       if ((new_screen = calloc(1, sizeof(SCREEN))) == NULL)
+               return NULL;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INIT, "newterm\n");
+#endif
+
+       new_screen->infd = infd;
+       new_screen->outfd = outfd;
+       new_screen->echoit = new_screen->nl = 1;
+       new_screen->pfast = new_screen->rawmode = new_screen->noqch = 0;
+       new_screen->nca = A_NORMAL;
+       new_screen->color_type = COLOR_NONE;
+       new_screen->COLOR_PAIRS = 0;
+       new_screen->old_mode = 2;
+       new_screen->stdbuf = NULL;
+       new_screen->stdscr = NULL;
+       new_screen->curscr = NULL;
+       new_screen->__virtscr = NULL;
+       new_screen->curwin = 0;
+       new_screen->notty = FALSE;
+       new_screen->half_delay = FALSE;
+       new_screen->resized = 0;
+       new_screen->unget_len = 32;
+
+       if ((new_screen->unget_list =
+           malloc(sizeof(wchar_t) * new_screen->unget_len)) == NULL) {
+               goto error_exit;
+       }
+       new_screen->unget_pos = 0;
+
+       if (_cursesi_gettmode(new_screen) == ERR)
+               goto error_exit;
+
+       if (_cursesi_setterm((char *)sp, new_screen) == ERR)
+               goto error_exit;
+
+       /* Need either homing or cursor motion for refreshes */
+       if (!t_cursor_home(new_screen->term) &&
+           !t_cursor_address(new_screen->term))
+               goto error_exit;
+
+       new_screen->winlistp = NULL;
+
+       if ((new_screen->curscr = __newwin(new_screen, 0,
+           0, 0, 0, FALSE)) == NULL)
+               goto error_exit;
+
+       if ((new_screen->stdscr = __newwin(new_screen, 0,
+           0, 0, 0, FALSE)) == NULL) {
+               delwin(new_screen->curscr);
+               goto error_exit;
+       }
+
+       clearok(new_screen->stdscr, 1);
+
+       if ((new_screen->__virtscr = __newwin(new_screen, 0,
+           0, 0, 0, FALSE)) == NULL) {
+               delwin(new_screen->curscr);
+               delwin(new_screen->stdscr);
+               goto error_exit;
+       }
+
+       __init_getch(new_screen);
+       __init_acs(new_screen);
+#ifdef HAVE_WCHAR
+       __init_get_wch( new_screen );
+       __init_wacs(new_screen);
+#endif /* HAVE_WCHAR */
+
+       __set_stophandler();
+       __set_winchhandler();
+
+         /*
+          * bleh - it seems that apps expect the first newterm to set
+          * up the curses screen.... emulate this.
+          */
+       if (_cursesi_screen == NULL || _cursesi_screen->endwin) {
+               set_term(new_screen);
+       }
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_SCREEN, "newterm: LINES = %d, COLS = %d\n",
+           LINES, COLS);
+#endif
+       __startwin(new_screen);
+
+       return new_screen;
+
+  error_exit:
+       free(new_screen);
+       return NULL;
+}
+
+/*
+ * delscreen --
+ *   Free resources used by the given screen and destroy it.
+ *
+ */
+void
+delscreen(SCREEN *screen)
+{
+        struct __winlist *list;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_SCREEN, "delscreen(%p)\n", screen);
+#endif
+         /* free up the terminfo stuff */
+       del_curterm(screen->term);
+
+         /* walk the window list and kill all the parent windows */
+       while ((list = screen->winlistp) != NULL) {
+               delwin(list->winp);
+               if (list == screen->winlistp)
+                       /* sanity - abort if window didn't remove itself */
+                       break;
+       }
+
+         /* free the storage of the keymaps */
+       _cursesi_free_keymap(screen->base_keymap);
+
+       free(screen->stdbuf);
+       screen->stdbuf = NULL;
+       if (_cursesi_screen == screen)
+               _cursesi_screen = NULL;
+       free(screen);
+}
diff --git a/lib/libcurses/scroll.c b/lib/libcurses/scroll.c
new file mode 100644 (file)
index 0000000..b64db04
--- /dev/null
@@ -0,0 +1,158 @@
+/*     $NetBSD: scroll.c,v 1.22 2010/02/03 15:34:40 roy Exp $  */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)scroll.c   8.3 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: scroll.c,v 1.22 2010/02/03 15:34:40 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * scroll --
+ *     Scroll the window up a line.
+ */
+int
+scroll(WINDOW *win)
+{
+       return(wscrl(win, 1));
+}
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * scrl --
+ *     Scroll stdscr n lines - up if n is positive, down if n is negative.
+ */
+int
+scrl(int nlines)
+{
+       return wscrl(stdscr, nlines);
+}
+
+/*
+ * setscrreg --
+ *     Set the top and bottom of the scrolling region for stdscr.
+ */
+int
+setscrreg(int top, int bottom)
+{
+       return wsetscrreg(stdscr, top, bottom);
+}
+
+#endif
+
+/*
+ * wscrl --
+ *     Scroll a window n lines - up if n is positive, down if n is negative.
+ */
+int
+wscrl(WINDOW *win, int nlines)
+{
+       int     oy, ox;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "wscrl: (%p) lines=%d\n", win, nlines);
+#endif
+
+       if (!(win->flags & __SCROLLOK))
+               return (ERR);
+       if (!nlines)
+               return (OK);
+
+       getyx(win, oy, ox);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "wscrl: y=%d\n", oy);
+#endif
+       if (oy < win->scr_t || oy > win->scr_b)
+               /* Outside scrolling region */
+               wmove(win, 0, 0);
+       else
+               /* Inside scrolling region */
+               wmove(win, win->scr_t, 0);
+       winsdelln(win, 0 - nlines);
+       wmove(win, oy, ox);
+
+       if (win == curscr) {
+               __cputchar('\n');
+               if (!__NONL)
+                       win->curx = 0;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_WINDOW, "scroll: win == curscr\n");
+#endif
+       }
+       return (OK);
+}
+
+/*
+ * wsetscrreg --
+ *     Set the top and bottom of the scrolling region for win.
+ */
+int
+wsetscrreg(WINDOW *win, int top, int bottom)
+{
+       if (top < 0 || bottom >= win->maxy || bottom - top < 1)
+               return (ERR);
+       win->scr_t = top;
+       win->scr_b = bottom;
+       return (OK);
+}
+
+/*
+ * has_ic --
+ *     Does the terminal have insert- and delete-character?
+ */
+bool
+has_ic(void)
+{
+       if (insert_character != NULL && delete_character != NULL)
+               return (TRUE);
+       else
+               return (FALSE);
+}
+
+/*
+ * has_ic --
+ *     Does the terminal have insert- and delete-line?
+ */
+bool
+has_il(void)
+{
+       if (insert_line !=NULL && delete_line != NULL)
+               return (TRUE);
+       else
+               return (FALSE);
+}
diff --git a/lib/libcurses/scrollok.c b/lib/libcurses/scrollok.c
new file mode 100644 (file)
index 0000000..59ecb20
--- /dev/null
@@ -0,0 +1,52 @@
+/*     $NetBSD: scrollok.c,v 1.5 2008/04/28 20:23:01 martin Exp $      */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: scrollok.c,v 1.5 2008/04/28 20:23:01 martin Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * scrollok --
+ *     Turn on and off scrolling for the given window.
+ */
+int
+scrollok(WINDOW *win, bool bf)
+{
+       if (bf)
+               win->flags |= __SCROLLOK;
+       else
+               win->flags &= ~__SCROLLOK;
+       return (OK);
+}
diff --git a/lib/libcurses/scrreg.c b/lib/libcurses/scrreg.c
deleted file mode 100644 (file)
index 0b3c944..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/****************************************************************/
-/* Wsetscrreg() routine of the PCcurses package                        */
-/*                                                             */
-/****************************************************************/
-/* This version of curses is based on ncurses, a curses version        */
-/* Originally written by Pavel Curtis at Cornell University.   */
-/* I have made substantial changes to make it run on IBM PC's, */
-/* And therefore consider myself free to make it public domain.        */
-/*             Bjorn Larsson (...mcvax!enea!infovax!bl)        */
-/****************************************************************/
-/* 1.0:        Release:                                        870515  */
-/****************************************************************/
-/* Modified to run under the MINIX operating system by Don Cope */
-/* These changes are also released into the public domain.      */
-/*                                                     900906  */
-/****************************************************************/
-
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Wsetscrreg() set the scrolling region of window 'win' to in-        */
-/* Clude all lines between 'top' and 'bottom'.                 */
-/****************************************************************/
-
-int wsetscrreg(win, top, bottom)
-WINDOW *win;
-int top;
-int bottom;
-{
-  if ((0 <= top) &&
-      (top <= win->_cury)
-      &&
-      (win->_cury <= bottom)
-      &&
-      (bottom <= win->_maxy)
-       ) {
-       win->_regtop = top;
-       win->_regbottom = bottom;
-       return(OK);
-  }
-
-   /* If */ 
-  else
-       return(ERR);
-}                              /* wsetscrreg */
-
-/****************************************************************/
-/* Setscrreg() set the scrolling region of stdscr to include   */
-/* All lines between 'top' and 'bottom'.                       */
-/****************************************************************/
-
-int setscrreg(top, bottom)
-int top;
-int bottom;
-{
-  return(wsetscrreg(stdscr, top, bottom));
-}                              /* setscrreg */
index ac3c30925ba68806f0603c2f4a1bdf324243d20d..832fe67499fe79ab0ad60f73acb3406bd7bbcb28 100644 (file)
-#include <curses.h>
-#include "curspriv.h"
+/*     $NetBSD: setterm.c,v 1.47 2010/02/11 11:45:47 roy Exp $ */
 
-_PROTOTYPE( static void ttysetflags, (void) );
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
 
-static void ttysetflags()
-{
-  _tty.c_iflag |= ICRNL | IXON;
-  _tty.c_oflag |= OPOST | ONLCR;
-  _tty.c_lflag |= ECHO | ICANON | IEXTEN | ISIG;
-
-  if (_cursvar.rawmode) {
-       _tty.c_iflag &= ~(ICRNL | IXON);
-       _tty.c_oflag &= ~(OPOST);
-       _tty.c_lflag &= ~(ICANON | IEXTEN | ISIG);
-  }
-  if (_cursvar.cbrkmode) {
-       _tty.c_lflag &= ~(ICANON);
-  }
-  if (!_cursvar.echoit) {
-       _tty.c_lflag &= ~(ECHO | ECHONL);
-  }
-  if (NONL) {
-       _tty.c_iflag &= ~(ICRNL);
-       _tty.c_oflag &= ~(ONLCR);
-  }
-  tcsetattr(0, TCSANOW, &_tty);
-}                              /* ttysetflags */
-
-void raw()
-{
-  _cursvar.rawmode = TRUE;
-  ttysetflags();
-}                              /* raw */
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)setterm.c  8.8 (Berkeley) 10/25/94";
+#else
+__RCSID("$NetBSD: setterm.c,v 1.47 2010/02/11 11:45:47 roy Exp $");
+#endif
+#endif /* not lint */
 
-void noraw()
-{
-  _cursvar.rawmode = FALSE;
-  ttysetflags();
-}                              /* noraw */
+#include <sys/ioctl.h>         /* TIOCGWINSZ on old systems. */
+
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+static int does_esc_m(const char *cap);
+static int does_ctrl_o(const char *cap);
+
+attr_t  __mask_op, __mask_me, __mask_ue, __mask_se;
 
-void echo()
+int
+setterm(char *type)
 {
-  _cursvar.echoit = TRUE;
-  ttysetflags();
+       return _cursesi_setterm(type, _cursesi_screen);
 }
 
-void noecho()
+int
+_cursesi_setterm(char *type, SCREEN *screen)
 {
-  _cursvar.echoit = FALSE;
-  ttysetflags();
+       int unknown, r;
+       struct winsize win;
+       char *p;
+
+       if (type[0] == '\0')
+               type = "xx";
+       unknown = 0;
+       (void)ti_setupterm(&screen->term, type, fileno(screen->outfd), &r);
+       if (screen->term == NULL) {
+               unknown++;
+               (void)ti_setupterm(&screen->term, "dumb",
+                   fileno(screen->outfd), &r);
+               /* No dumb term? We can't continue */
+               if (screen->term == NULL)
+                       return ERR;
+       }
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INIT, "setterm: tty = %s\n", type);
+#endif
+
+       /* Try TIOCGWINSZ, and, if it fails, the termcap entry. */
+       if (ioctl(fileno(screen->outfd), TIOCGWINSZ, &win) != -1 &&
+           win.ws_row != 0 && win.ws_col != 0) {
+               screen->LINES = win.ws_row;
+               screen->COLS = win.ws_col;
+       }  else {
+               if (unknown) {
+                       screen->LINES = -1;
+                       screen->COLS = -1;
+               } else {
+                       screen->LINES = t_lines(screen->term);
+                       screen->COLS = t_columns(screen->term);
+               }
+               
+       }
+
+       /* POSIX 1003.2 requires that the environment override. */
+       if ((p = getenv("LINES")) != NULL)
+               screen->LINES = (int) strtol(p, NULL, 0);
+       if ((p = getenv("COLUMNS")) != NULL)
+               screen->COLS = (int) strtol(p, NULL, 0);
+       if ((p = getenv("ESCDELAY")) != NULL)
+               ESCDELAY = (int) strtol(p, NULL, 0);
+
+       /*
+        * Want cols > 4, otherwise things will fail.
+        */
+       if (screen->COLS <= 4)
+               return (ERR);
+
+       LINES = screen->LINES;
+       COLS = screen->COLS;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INIT, "setterm: LINES = %d, COLS = %d\n",
+           LINES, COLS);
+#endif
+
+       /*
+        * set the pad char, only take the first char of the pc capability
+        * as this is all we can use.
+        */
+       screen->padchar = t_pad_char(screen->term) ?
+           t_pad_char(screen->term)[0] : 0; 
+
+       /* Get full name of terminal */
+       if (unknown) {
+               strcpy(screen->ttytype, "dumb");
+               return ERR;
+       }
+       if (screen->term->desc == NULL)
+               screen->ttytype[0] = '\0';
+       else
+               strlcpy(screen->ttytype, screen->term->desc,
+                   sizeof(screen->ttytype));
+
+       /* If no scrolling commands, no quick change. */
+       screen->noqch =
+           (t_change_scroll_region(screen->term) == NULL ||
+               t_cursor_home(screen->term) == NULL ||
+               (t_parm_index(screen->term) == NULL &&
+                   t_scroll_forward(screen->term) == NULL) ||
+               (t_parm_rindex(screen->term) == NULL &&
+                   t_scroll_reverse(screen->term) == NULL)) &&
+           ((t_parm_insert_line(screen->term) == NULL &&
+               t_insert_line(screen->term) == NULL) ||
+               (t_parm_delete_line(screen->term) == NULL &&
+                   t_delete_line(screen->term) == NULL));
+
+       /*
+        * Precalculate conflict info for color/attribute end commands.
+        */
+#ifndef HAVE_WCHAR
+       screen->mask_op = __ATTRIBUTES & ~__COLOR;
+#else
+       screen->mask_op = WA_ATTRIBUTES & ~__COLOR;
+#endif /* HAVE_WCHAR */
+       if (t_orig_pair(screen->term) != NULL) {
+               if (does_esc_m(t_orig_pair(screen->term)))
+                       screen->mask_op &=
+                           ~(__STANDOUT | __UNDERSCORE | __TERMATTR);
+               else {
+                       if (t_exit_standout_mode(screen->term) != NULL &&
+                           !strcmp(t_orig_pair(screen->term),
+                               t_exit_standout_mode(screen->term)))
+                               screen->mask_op &= ~__STANDOUT;
+                       if (t_exit_underline_mode(screen->term) != NULL &&
+                           !strcmp(t_orig_pair(screen->term),
+                               t_exit_underline_mode(screen->term)))
+                               screen->mask_op &= ~__UNDERSCORE;
+                       if (t_exit_attribute_mode(screen->term) != NULL &&
+                           !strcmp(t_orig_pair(screen->term),
+                               t_exit_attribute_mode(screen->term)))
+                               screen->mask_op &= ~__TERMATTR;
+               }
+       }
+       /*
+        * Assume that "me" turns off all attributes apart from ACS.
+        * It might turn off ACS, so check for that.
+        */
+       if (t_exit_attribute_mode(screen->term) != NULL &&
+           does_ctrl_o(t_exit_attribute_mode(screen->term)))
+               screen->mask_me = 0;
+       else
+               screen->mask_me = __ALTCHARSET;
+
+       /* Check what turning off the attributes also turns off */
+#ifndef HAVE_WCHAR
+       screen->mask_ue = __ATTRIBUTES & ~__UNDERSCORE;
+#else
+       screen->mask_ue = WA_ATTRIBUTES & ~__UNDERSCORE;
+#endif /* HAVE_WCHAR */
+       if (t_exit_underline_mode(screen->term) != NULL) {
+               if (does_esc_m(t_exit_underline_mode(screen->term)))
+                       screen->mask_ue &=
+                           ~(__STANDOUT | __TERMATTR | __COLOR);
+               else {
+                       if (t_exit_standout_mode(screen->term) != NULL &&
+                           !strcmp(t_exit_underline_mode(screen->term),
+                               t_exit_standout_mode(screen->term)))
+                               screen->mask_ue &= ~__STANDOUT;
+                       if (t_exit_attribute_mode(screen->term) != NULL &&
+                           !strcmp(t_exit_underline_mode(screen->term),
+                               t_exit_attribute_mode(screen->term)))
+                               screen->mask_ue &= ~__TERMATTR;
+                       if (t_orig_pair(screen->term) != NULL &&
+                           !strcmp(t_exit_underline_mode(screen->term),
+                               t_orig_pair(screen->term)))
+                               screen->mask_ue &= ~__COLOR;
+               }
+       }
+#ifndef HAVE_WCHAR
+       screen->mask_se = __ATTRIBUTES & ~__STANDOUT;
+#else
+       screen->mask_se = WA_ATTRIBUTES & ~__STANDOUT;
+#endif /* HAVE_WCHAR */
+       if (t_exit_standout_mode(screen->term) != NULL) {
+               if (does_esc_m(t_exit_standout_mode(screen->term)))
+                       screen->mask_se &=
+                           ~(__UNDERSCORE | __TERMATTR | __COLOR);
+               else {
+                       if (t_exit_underline_mode(screen->term) != NULL &&
+                           !strcmp(t_exit_standout_mode(screen->term),
+                               t_exit_underline_mode(screen->term)))
+                               screen->mask_se &= ~__UNDERSCORE;
+                       if (t_exit_attribute_mode(screen->term) != NULL &&
+                           !strcmp(t_exit_standout_mode(screen->term),
+                               t_exit_attribute_mode(screen->term)))
+                               screen->mask_se &= ~__TERMATTR;
+                       if (t_orig_pair(screen->term) != NULL &&
+                           !strcmp(t_exit_standout_mode(screen->term),
+                               t_orig_pair(screen->term)))
+                               screen->mask_se &= ~__COLOR;
+               }
+       }
+
+       return (unknown ? ERR : OK);
 }
 
-void nl()
+/*
+ * _cursesi_resetterm --
+ *  Copy the terminal instance data for the given screen to the global
+ *  variables.
+ */
+void
+_cursesi_resetterm(SCREEN *screen)
 {
-  NONL = FALSE;
-  ttysetflags();
-}                              /* nl */
 
-void nonl()
-{
-  NONL = TRUE;
-  ttysetflags();
-}                              /* nonl */
+       LINES = screen->LINES;
+       COLS = screen->COLS;
+       __GT = screen->GT;
+
+       __noqch = screen->noqch;
+       __mask_op = screen->mask_op;
+       __mask_me = screen->mask_me;
+       __mask_ue = screen->mask_ue;
+       __mask_se = screen->mask_se;
 
-void cbreak()
+       set_curterm(screen->term);
+}
+
+/*
+ * does_esc_m --
+ * A hack for xterm-like terminals where "\E[m" or "\E[0m" will turn off
+ * other attributes, so we check for this in the capability passed to us.
+ * Note that we can't just do simple string comparison, as the capability
+ * may contain multiple, ';' separated sequence parts.
+ */
+static int
+does_esc_m(const char *cap)
 {
-  _cursvar.cbrkmode = TRUE;
-  ttysetflags();
-}                              /* cbreak */
+#define WAITING 0
+#define PARSING 1
+#define NUMBER 2
+#define FOUND 4
+       const char *capptr;
+       int seq;
 
-void nocbreak()
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INIT, "does_esc_m: Checking %s\n", cap);
+#endif
+       /* Is it just "\E[m" or "\E[0m"? */
+       if (!strcmp(cap, "\x1b[m") || !strcmp(cap, "\x1b[0m"))
+               return 1;
+
+       /* Does it contain a "\E[...m" sequence? */
+       if (strlen(cap) < 4)
+               return 0;
+       capptr = cap;
+       seq = WAITING;
+       while (*capptr != 0) {
+               switch (seq) {
+               /* Start of sequence */
+               case WAITING:
+                       if (!strncmp(capptr, "\x1b[", 2)) {
+                               capptr+=2;
+                               if (*capptr == 'm')
+                                       return 1;
+                               else {
+                                       seq=PARSING;
+                                       continue;
+                               }
+                       }
+                       break;
+               /* Looking for '0' */
+               case PARSING:
+                       if (*capptr == '0')
+                               seq=FOUND;
+                       else if (*capptr > '0' && *capptr <= '9')
+                               seq=NUMBER;
+                       else if (*capptr != ';')
+                               seq=WAITING;
+                       break;
+               /* Some other number */
+               case NUMBER:
+                       if (*capptr == ';')
+                               seq=PARSING;
+                       else if (!(*capptr >= '0' && *capptr <= '9'))
+                               seq=WAITING;
+                       break;
+               /* Found a '0' */
+               case FOUND:
+                       if (*capptr == 'm')
+                               return 1;
+                       else if (!((*capptr >= '0' && *capptr <= '9') ||
+                           *capptr == ';'))
+                               seq=WAITING;
+                       break;
+               default:
+                       break;
+               }
+               capptr++;
+       }
+       return 0;
+}
+
+/*
+ * does_ctrl_o --
+ * A hack for vt100/xterm-like terminals where the "me" capability also
+ * unsets acs (i.e. it contains the character '\017').
+ */
+static int
+does_ctrl_o(const char *cap)
 {
-  _cursvar.cbrkmode = FALSE;
-  ttysetflags();
-}                              /* nocbreak */
+       const char *capptr = cap;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_INIT, "does_ctrl_o: Looping on %s\n", capptr);
+#endif
+       while (*capptr != 0) {
+               if (*capptr == '\x0f')
+                       return 1;
+               capptr++;
+       }
+       return 0;
+}
diff --git a/lib/libcurses/shlib_version b/lib/libcurses/shlib_version
new file mode 100644 (file)
index 0000000..1c7107b
--- /dev/null
@@ -0,0 +1,8 @@
+#      $NetBSD: shlib_version,v 1.40 2009/01/11 03:07:47 christos Exp $
+#      Remember to update distrib/sets/lists/base/shl.* when changing
+#      Remember to run `make fileio.h` when changing
+#      Remember to increment the major numbers of both libform and libmenu
+#      when the libcurses major number increments.
+#
+major=7
+minor=0
diff --git a/lib/libcurses/standout.c b/lib/libcurses/standout.c
new file mode 100644 (file)
index 0000000..fb9531b
--- /dev/null
@@ -0,0 +1,94 @@
+/*     $NetBSD: standout.c,v 1.16 2010/02/03 15:34:40 roy Exp $        */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)standout.c 8.3 (Berkeley) 8/10/94";
+#else
+__RCSID("$NetBSD: standout.c,v 1.16 2010/02/03 15:34:40 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * standout --
+ *     Enter standout mode on stdscr.
+ */
+int
+standout(void)
+{
+       return wstandout(stdscr);
+}
+
+/*
+ * standend --
+ *     Exit standout mode on stdscr.
+ */
+int
+standend(void)
+{
+       return wstandend(stdscr);
+}
+
+#endif
+
+/*
+ * wstandout --
+ *     Enter standout mode in window win.
+ */
+int
+wstandout(WINDOW *win)
+{
+       /*
+        * If standout/standend strings, or can underline, set the
+        * screen standout bit.
+        */
+       if ((enter_standout_mode != NULL && exit_standout_mode != NULL) ||
+           underline_char != NULL)
+               win->wattr |= __STANDOUT;
+       return (1);
+}
+
+/*
+ * wstandend --
+ *     Exit standout mode in window win.
+ */
+int
+wstandend(WINDOW *win)
+{
+       win->wattr &= ~__STANDOUT;
+       return (1);
+}
diff --git a/lib/libcurses/tabsize.c b/lib/libcurses/tabsize.c
deleted file mode 100644 (file)
index 9fd6230..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/****************************************************************/
-/* Tabsize() routines of the PCcurses package                  */
-/*                                                             */
-/****************************************************************/
-/* This version of curses is based on ncurses, a curses version        */
-/* Originally written by Pavel Curtis at Cornell University.   */
-/* I have made substantial changes to make it run on IBM PC's, */
-/* And therefore consider myself free to make it public domain.        */
-/*             Bjorn Larsson (...mcvax!enea!infovax!bl)        */
-/****************************************************************/
-/* 1.0:        Release:                                        870515  */
-/****************************************************************/
-/* Modified to run under the MINIX operating system by Don Cope */
-/* These changes are also released into the public domain.      */
-/*                                                     900906  */
-/****************************************************************/
-
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Wtabsize(win,ts) sets the tabsize of window 'win' to 'ts',  */
-/* And returns the original value.                             */
-/****************************************************************/
-
-int wtabsize(win, ts)
-WINDOW *win;
-int ts;
-{
-  int origval;
-
-  origval = win->_tabsize;
-  win->_tabsize = ts;
-  return(origval);
-}                              /* wtabsize */
-
-/****************************************************************/
-/* Tabsize(ts) sets the tabsize of stdscr to 'ts', and returns */
-/* The original value.                                         */
-/****************************************************************/
-
-int tabsize(ts)
-int ts;
-{
-  int origval;
-
-  origval = stdscr->_tabsize;
-  stdscr->_tabsize = ts;
-  return(origval);
-}                              /* tabsize */
diff --git a/lib/libcurses/termmisc.c b/lib/libcurses/termmisc.c
deleted file mode 100644 (file)
index 267ee4c..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/* Static variables or saving terminal modes */
-
-int fixterm()
-{
-  return(OK);
-}                              /* fixterm */
-
-int resetterm()
-{
-  return(OK);
-}
-
-int saveoldterm()
-{
-  return(OK);
-}                              /* saveoldterm */
-
-int saveterm()
-{
-  return(OK);
-}                              /* saveterm */
-
-int baudrate()
-{
-  return(19200);
-}                              /* baudrate */
-
-/****************************************************************/
-/* Erasechar(), killchar() returns std MSDOS erase chars.      */
-/****************************************************************/
-
-int erasechar()
-{
-  return(_DCCHAR);             /* character delete char */
-}                              /* erasechar */
-
-int killchar()
-{
-  return(_DLCHAR);             /* line delete char */
-}                              /* killchar */
-
-/****************************************************************/
-/* Savetty() and resetty() saves and restores the terminal I/O */
-/* Settings.                                                   */
-/****************************************************************/
-
-int savetty()
-{
-  return(OK);
-}                              /* savetty */
-
-/****************************************************************/
-/* Setupterm() sets up the terminal. On a PC, it is always suc-        */
-/* Cessful, and returns 1.                                     */
-/****************************************************************/
-
-int setupterm()
-{
-  return(1);
-}                              /* setupterm */
diff --git a/lib/libcurses/timeout.c b/lib/libcurses/timeout.c
new file mode 100644 (file)
index 0000000..ab9ef9e
--- /dev/null
@@ -0,0 +1,76 @@
+/*     $NetBSD: timeout.c,v 1.8 2009/11/04 21:24:57 dsl Exp $  */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: timeout.c,v 1.8 2009/11/04 21:24:57 dsl Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * timeout --
+ *     Set the getch() delay for stdscr.
+ */
+void
+timeout(int delay)
+{
+       wtimeout(stdscr, delay);
+}
+
+#endif
+
+/*
+ * wtimeout --
+ *     Set the getch() delay for a window.
+ */
+void
+wtimeout(WINDOW *win, int delay)
+{
+
+       if (delay < 0)
+               win->delay = -1;
+       else if (!delay)
+               win->delay = delay;
+       else {
+               /*
+                * 1. VTIME is a char
+                * 2. timeout granularity is ms but VTIME is 0.1s
+                */
+               if (delay > 25500)
+                       win->delay = 255;
+               else
+                       win->delay = (delay - 1)/ 100 + 1;
+       }
+}
diff --git a/lib/libcurses/toucholap.c b/lib/libcurses/toucholap.c
new file mode 100644 (file)
index 0000000..97b46dd
--- /dev/null
@@ -0,0 +1,79 @@
+/*     $NetBSD: toucholap.c,v 1.15 2007/01/21 13:25:36 jdc Exp $       */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)toucholap.c        8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: toucholap.c,v 1.15 2007/01/21 13:25:36 jdc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * touchoverlap --
+ *     Touch, on win2, the part that overlaps with win1.
+ */
+int
+touchoverlap(WINDOW *win1, WINDOW *win2)
+{
+       int     y, endy, endx, starty, startx;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "touchoverlap: (%p, %p);\n", win1, win2);
+#endif
+       starty = max(win1->begy, win2->begy);
+       startx = max(win1->begx, win2->begx);
+       endy = min(win1->maxy + win1->begy, win2->maxy + win2->begx);
+       endx = min(win1->maxx + win1->begx, win2->maxx + win2->begx);
+#ifdef DEBUG
+       __CTRACE(__CTRACE_WINDOW, "touchoverlap: from (%d,%d) to (%d,%d)\n",
+           starty, startx, endy, endx);
+       __CTRACE(__CTRACE_WINDOW, "touchoverlap: win1 (%d,%d) to (%d,%d)\n",
+           win1->begy, win1->begx, win1->begy + win1->maxy,
+           win1->begx + win1->maxx);
+       __CTRACE(__CTRACE_WINDOW, "touchoverlap: win2 (%d,%d) to (%d,%d)\n",
+           win2->begy, win2->begx, win2->begy + win2->maxy,
+           win2->begx + win2->maxx);
+#endif
+       if (starty >= endy || startx >= endx)
+               return (OK);
+       starty -= win2->begy;
+       startx -= win2->begx;
+       endy -= win2->begy;
+       endx -= win2->begx;
+       for (--endx, y = starty; y < endy; y++)
+               __touchline(win2, y, startx, endx);
+       return (OK);
+}
diff --git a/lib/libcurses/touchwin.c b/lib/libcurses/touchwin.c
new file mode 100644 (file)
index 0000000..f01d524
--- /dev/null
@@ -0,0 +1,237 @@
+/*     $NetBSD: touchwin.c,v 1.26 2010/02/23 19:48:26 drochner Exp $   */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)touchwin.c 8.2 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: touchwin.c,v 1.26 2010/02/23 19:48:26 drochner Exp $");
+#endif
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * is_linetouched --
+ *     Indicate if line has been touched or not.
+ */
+bool
+is_linetouched(WINDOW *win, int line)
+{
+       if (line > win->maxy)
+               return FALSE;
+
+       return ((win->alines[line]->flags & __ISDIRTY) != 0);
+}
+
+/*
+ * touchline --
+ *     Touch count lines starting at start.  This is the SUS v2 compliant
+ *     version.
+ */
+int
+touchline(WINDOW *win, int start, int count)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "touchline: (%p, %d, %d)\n", win, start, count);
+#endif
+       return wtouchln(win, start, count, 1);
+}
+
+/*
+ * wredrawln --
+ *     Mark count lines starting at start as corrupted.  Implemented using
+ *     wtouchln().
+ */
+int wredrawln(WINDOW *win, int start, int count)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "wredrawln: (%p, %d, %d)\n", win, start, count);
+#endif
+       return wtouchln(win, start, count, 1);
+}
+
+/*
+ * is_wintouched --
+ *     Check if the window has been touched.
+ */
+bool
+is_wintouched(WINDOW *win)
+{
+       int y, maxy;
+
+       maxy = win->maxy;
+       for (y = 0; y < maxy; y++) {
+               if (is_linetouched(win, y) == TRUE)
+                       return TRUE;
+       }
+
+       return FALSE;
+}
+
+/*
+ * touchwin --
+ *     Make it look like the whole window has been changed.
+ */
+int
+touchwin(WINDOW *win)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "touchwin: (%p)\n", win);
+#endif
+       return wtouchln(win, 0, win->maxy, 1);
+}
+
+/*
+ * redrawwin --
+ *     Mark entire window as corrupted.  Implemented using wtouchln().
+ */
+int
+redrawwin(WINDOW *win)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "redrawwin: (%p)\n", win);
+#endif
+       return wtouchln(win, 0, win->maxy, 1);
+}
+
+/*
+ * untouchwin --
+ *      Make it look like the window has not been changed.
+ */
+int
+untouchwin(WINDOW *win)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "untouchwin: (%p)\n", win);
+#endif
+       return wtouchln(win, 0, win->maxy, 0);
+}
+
+/*
+ * wtouchln --
+ *     If changed is 1 then touch n lines starting at line.  If changed
+ *     is 0 then mark the lines as unchanged.
+ */
+int
+wtouchln(WINDOW *win, int line, int n, int changed)
+{
+       int     y;
+       __LINE  *wlp;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "wtouchln: (%p) %d, %d, %d\n",
+           win, line, n, changed);
+#endif
+       if (line + n > win->maxy)
+               line = win->maxy - n;
+       for (y = line; y < line + n; y++) {
+               if (changed == 1)
+                       __touchline(win, y, 0, (int) win->maxx - 1);
+               else {
+                       wlp = win->alines[y];
+                       if (*wlp->firstchp >= win->ch_off &&
+                           *wlp->firstchp < win->maxx + win->ch_off)
+                               *wlp->firstchp = win->maxx + win->ch_off;
+                       if (*wlp->lastchp >= win->ch_off &&
+                           *wlp->lastchp < win->maxx + win->ch_off)
+                               *wlp->lastchp = win->ch_off;
+                       wlp->flags &= ~__ISDIRTY;
+               }
+       }
+
+       return OK;
+}
+               
+int
+__touchwin(WINDOW *win)
+{
+       int      y, maxy;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "__touchwin: (%p)\n", win);
+#endif
+       maxy = win->maxy;
+       for (y = 0; y < maxy; y++)
+               __touchline(win, y, 0, (int) win->maxx - 1);
+       return (OK);
+}
+
+int
+__touchline(WINDOW *win, int y, int sx, int ex)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "__touchline: (%p, %d, %d, %d)\n",
+           win, y, sx, ex);
+       __CTRACE(__CTRACE_LINE, "__touchline: first = %d, last = %d\n",
+           *win->alines[y]->firstchp, *win->alines[y]->lastchp);
+#endif
+       sx += win->ch_off;
+       ex += win->ch_off;
+       if (!(win->alines[y]->flags & __ISDIRTY))
+               win->alines[y]->flags |= __ISDIRTY;
+       /* firstchp/lastchp are shared between parent window and sub-window. */
+       if (*win->alines[y]->firstchp > sx)
+               *win->alines[y]->firstchp = sx;
+       if (*win->alines[y]->lastchp < ex)
+               *win->alines[y]->lastchp = ex;
+#ifdef DEBUG
+       __CTRACE(__CTRACE_LINE, "__touchline: first = %d, last = %d\n",
+           *win->alines[y]->firstchp, *win->alines[y]->lastchp);
+#endif
+       return (OK);
+}
+
+void
+wsyncup(WINDOW *win)
+{
+
+       do {
+               touchwin(win);
+               win = win->orig;
+       } while (win);
+}
+
+void
+wsyncdown(WINDOW *win)
+{
+       WINDOW *w = win->orig;
+
+       while (w) {
+               if (is_wintouched(w)) {
+                       touchwin(win);
+                       break;
+               }
+               w = w->orig;
+       }
+}
diff --git a/lib/libcurses/tscroll.c b/lib/libcurses/tscroll.c
new file mode 100644 (file)
index 0000000..fdba8b1
--- /dev/null
@@ -0,0 +1,253 @@
+/*     $NetBSD: tscroll.c,v 1.13 2007/01/21 13:25:36 jdc Exp $ */
+
+/*-
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tscroll.c  8.4 (Berkeley) 7/27/94";
+#else
+__RCSID("$NetBSD: tscroll.c,v 1.13 2007/01/21 13:25:36 jdc Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <string.h>
+#include <stdarg.h>
+#include "curses.h"
+#include "curses_private.h"
+
+#define        MAXRETURNSIZE   64
+
+char   *
+__tscroll(const char *cap, int n1, int n2)
+{
+       return (__parse_cap(cap, n1, n2));
+}
+
+/*
+ * Routines to parse capabilities.  Derived from tgoto.c in termcap(3)
+ * library.  Cap is a string containing printf type escapes to allow
+ * scrolling.  The following escapes are defined for substituting n:
+ *
+ *     %d      as in printf
+ *     %2      like %2d
+ *     %3      like %3d
+ *     %.      gives %c hacking special case characters
+ *     %+x     like %c but adding x first
+ *
+ *     The codes below affect the state but don't use up a value.
+ *
+ *     %>xy    if value > x add y
+ *     %i      increments n
+ *     %%      gives %
+ *     %B      BCD (2 decimal digits encoded in one byte)
+ *     %D      Delta Data (backwards bcd)
+ *
+ * all other characters are ``self-inserting''.
+ *
+ * XXX:
+ *     %r      reverse order of two parameters
+ * is also defined but we don't support it (yet).
+ */
+char   *
+__parse_cap (char const *cap, ...)
+{
+       va_list ap;
+       static char result[MAXRETURNSIZE];
+       int     c, n;
+       char   *dp;
+       int     have_input;
+
+       va_start (ap, cap);
+       n = 0;                  /* XXX gcc -Wuninitialized */
+
+       if (cap == NULL)
+               goto err;
+#ifdef DEBUG
+       {
+               int     i;
+               
+               __CTRACE(__CTRACE_MISC, "__parse_cap: cap = ");
+               for (i = 0; i < strlen(cap); i++)
+                       __CTRACE(__CTRACE_MISC, "%s", unctrl(cap[i]));
+               __CTRACE(__CTRACE_MISC, "\n");
+       }
+#endif
+       have_input = 0;
+       for (dp = result; (c = *cap++) != '\0';) {
+               if (c != '%') {
+                       *dp++ = c;
+                       continue;
+               }
+               switch (c = *cap++) {
+               case 'n':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%n, val = %d\n", n);
+#endif
+                       }
+                       n ^= 0140;
+                       continue;
+               case 'd':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%d, val = %d\n", n);
+#endif
+                       }
+                       if (n < 10)
+                               goto one;
+                       if (n < 100)
+                               goto two;
+                       /* FALLTHROUGH */
+               case '3':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%3, val = %d\n", n);
+#endif
+                       }
+                       *dp++ = (n / 100) | '0';
+                       n %= 100;
+                       /* FALLTHROUGH */
+               case '2':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%2, val = %d\n", n);
+#endif
+                       }
+       two:            *dp++ = n / 10 | '0';
+       one:            *dp++ = n % 10 | '0';
+                       have_input = 0;
+                       continue;
+               case '>':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%>, val = %d\n", n);
+#endif
+                       }
+                       if (n > *cap++)
+                               n += *cap++;
+                       else
+                               cap++;
+                       continue;
+               case '+':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%+, val = %d\n", n);
+#endif
+                       }
+                       n += *cap++;
+                       /* FALLTHROUGH */
+               case '.':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%., val = %d\n", n);
+#endif
+                       }
+                       *dp++ = n;
+                       have_input = 0;
+                       continue;
+               case 'i':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%i, val = %d\n", n);
+#endif
+                       }
+                       n++;
+                       continue;
+               case '%':
+                       *dp++ = c;
+                       continue;
+               case 'B':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%B, val = %d\n", n);
+#endif
+                       }
+                       n = (n / 10 << 4) + n % 10;
+                       continue;
+               case 'D':
+                       if (!have_input) {
+                               n = va_arg (ap, int);
+                               have_input = 1;
+#ifdef DEBUG
+                               __CTRACE(__CTRACE_MISC,
+                                   "__parse_cap: %%D, val = %d\n", n);
+#endif
+                       }
+                       n = n - 2 * (n % 16);
+                       continue;
+                       /*
+                        * XXX
+                        * System V terminfo files have lots of extra gunk.
+                        * The only other one we've seen in capability strings
+                        * is %pN, and it seems to work okay if we ignore it.
+                        */
+               case 'p':
+                       ++cap;
+                       continue;
+               default:
+                       goto err;
+               }
+       }
+       *dp = '\0';
+       va_end (ap);
+       return (result);
+
+err:   va_end (ap);
+       return ((char *) "\0");
+}
diff --git a/lib/libcurses/tstp.c b/lib/libcurses/tstp.c
new file mode 100644 (file)
index 0000000..51d0322
--- /dev/null
@@ -0,0 +1,356 @@
+/*     $NetBSD: tstp.c,v 1.38 2010/02/03 15:34:40 roy Exp $    */
+
+/*
+ * Copyright (c) 1981, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tstp.c     8.3 (Berkeley) 5/4/94";
+#else
+__RCSID("$NetBSD: tstp.c,v 1.38 2010/02/03 15:34:40 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#ifndef TCSASOFT
+#define TCSASOFT 0
+#endif
+
+#include <sys/ioctl.h>
+
+#include <errno.h>
+#include <signal.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+static int tstp_set = 0;
+static int winch_set = 0;
+
+static void (*otstpfn)
+__P((int)) = SIG_DFL;
+
+static struct sigaction        owsa;
+
+/*
+ * stop_signal_handler --
+ *     Handle stop signals.
+ */
+void
+__stop_signal_handler(/*ARGSUSED*/int signo)
+{
+       sigset_t oset, set;
+
+       /*
+        * Block window change and timer signals.  The latter is because
+        * applications use timers to decide when to repaint the screen.
+        */
+       (void) sigemptyset(&set);
+       (void) sigaddset(&set, SIGALRM);
+       (void) sigaddset(&set, SIGWINCH);
+       (void) sigprocmask(SIG_BLOCK, &set, &oset);
+
+       /*
+        * End the window, which also resets the terminal state to the
+        * original modes.
+        */
+       __stopwin();
+
+       /* Unblock SIGTSTP. */
+       (void) sigemptyset(&set);
+       (void) sigaddset(&set, SIGTSTP);
+       (void) sigprocmask(SIG_UNBLOCK, &set, NULL);
+
+       /* Stop ourselves. */
+       (void) kill(0, SIGTSTP);
+
+       /* Time passes ... */
+
+       /* restart things */
+       __restartwin();
+
+       /* Reset the signals. */
+       (void) sigprocmask(SIG_SETMASK, &oset, NULL);
+}
+
+/*
+ * Set the TSTP handler.
+ */
+void
+__set_stophandler(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__set_stophandler: %d\n", tstp_set);
+#endif
+       if (!tstp_set) {
+               otstpfn = signal(SIGTSTP, __stop_signal_handler);
+               tstp_set = 1;
+       }
+}
+
+/*
+ * Restore the TSTP handler.
+ */
+void
+__restore_stophandler(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__restore_stophandler: %d\n", tstp_set);
+#endif
+       if (tstp_set) {
+               (void) signal(SIGTSTP, otstpfn);
+               tstp_set = 0;
+       }
+}
+
+/*
+ * winch_signal_handler --
+ *     Handle winch signals by pushing KEY_RESIZE into the input stream.
+ */
+void
+__winch_signal_handler(/*ARGSUSED*/int signo)
+{
+       struct winsize win;
+
+       if (ioctl(fileno(_cursesi_screen->outfd), TIOCGWINSZ, &win) != -1 &&
+           win.ws_row != 0 && win.ws_col != 0) {
+               LINES = win.ws_row;
+               COLS = win.ws_col;
+       }
+       /*
+        * If there was a previous handler, call that,
+        * otherwise tell getch() to send KEY_RESIZE.
+        */
+       if (owsa.sa_handler !=  NULL)
+               owsa.sa_handler(signo);
+       else
+               _cursesi_screen->resized = 1;
+}
+
+/*
+ * Set the WINCH handler.
+ */
+void
+__set_winchhandler(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__set_winchhandler: %d\n", winch_set);
+#endif
+       if (!winch_set) {
+               struct sigaction sa;
+
+               sa.sa_handler = __winch_signal_handler;
+               sa.sa_flags = 0;
+               sigemptyset(&sa.sa_mask);
+               sigaction(SIGWINCH, &sa, &owsa);
+               winch_set = 1;
+#ifdef DEBUG
+               __CTRACE(__CTRACE_MISC,
+                   "__set_winchhandler: owsa.sa_handler=%p\n",
+                   owsa.sa_handler);
+#endif
+       }
+}
+
+/*
+ * Restore the WINCH handler.
+ */
+void
+__restore_winchhandler(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__restore_winchhandler: %d\n", winch_set);
+#endif
+       if (winch_set > 0) {
+               struct sigaction cwsa;
+
+               sigaction(SIGWINCH, NULL, &cwsa);
+               if (cwsa.sa_handler == owsa.sa_handler) {
+                       sigaction(SIGWINCH, &owsa, NULL);
+                       winch_set = 0;
+               } else {
+                       /*
+                        * We're now using the programs WINCH handler,
+                        * so don't restore the previous one.
+                        */
+                       winch_set = -1;
+#ifdef DEBUG
+                       __CTRACE(__CTRACE_MISC, "cwsa.sa_handler = %p\n",
+                           cwsa.sa_handler);
+#endif
+               }
+       }
+}
+
+/* To allow both SIGTSTP and endwin() to come back nicely, we provide
+   the following routines. */
+
+int
+__stopwin(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__stopwin\n");
+#endif
+       if (_cursesi_screen->endwin)
+               return OK;
+
+       /* Get the current terminal state (which the user may have changed). */
+       (void) tcgetattr(fileno(_cursesi_screen->infd),
+                        &_cursesi_screen->save_termios);
+
+       __restore_stophandler();
+       __restore_winchhandler();
+
+       if (curscr != NULL) {
+               __unsetattr(0);
+               __mvcur((int) curscr->cury, (int) curscr->curx,
+                   (int) curscr->maxy - 1, 0, 0);
+       }
+
+       if (meta_off != NULL)
+               (void) tputs(meta_off, 0, __cputchar);
+
+       if ((curscr != NULL) && (curscr->flags & __KEYPAD))
+               (void) tputs(keypad_local, 0, __cputchar);
+       (void) tputs(cursor_normal, 0, __cputchar);
+       (void) tputs(exit_ca_mode, 0, __cputchar);
+       (void) fflush(_cursesi_screen->outfd);
+       (void) setvbuf(_cursesi_screen->outfd, NULL, _IOLBF, (size_t) 0);
+
+       _cursesi_screen->endwin = 1;
+
+       return (tcsetattr(fileno(_cursesi_screen->infd),
+                         __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN,
+                         &_cursesi_screen->orig_termios) ? ERR : OK);
+}
+
+
+void
+__restartwin(void)
+{
+       struct winsize win;
+       int nlines, ncols;
+
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__restartwin\n");
+#endif
+       if (!_cursesi_screen->endwin)
+               return;
+
+       /* Reset the curses SIGTSTP and SIGWINCH signal handlers. */
+       __set_stophandler();
+       __set_winchhandler();
+
+       /*
+        * Check to see if the window size has changed.
+        * If the application didn't update LINES and COLS,
+        * set the * resized flag to tell getch() to push KEY_RESIZE.
+        * Update curscr (which also updates __virtscr) and stdscr
+        * to match the new size.
+        */
+       if (ioctl(fileno(_cursesi_screen->outfd), TIOCGWINSZ, &win) != -1 &&
+           win.ws_row != 0 && win.ws_col != 0) {
+               if (win.ws_row != LINES) {
+                       LINES = win.ws_row;
+                       _cursesi_screen->resized = 1;
+               }
+               if (win.ws_col != COLS) {
+                       COLS = win.ws_col;
+                       _cursesi_screen->resized = 1;
+               }
+       }
+       /*
+        * We need to make local copies of LINES and COLS, otherwise we
+        * could lose if they are changed between wresize() calls.
+        */
+       nlines = LINES;
+       ncols = COLS;
+       if (curscr->maxy != nlines || curscr->maxx != ncols)
+               wresize(curscr, nlines, ncols);
+       if (stdscr->maxy != nlines || stdscr->maxx != ncols)
+               wresize(stdscr, nlines, ncols);
+
+       /* save the new "default" terminal state */
+       (void) tcgetattr(fileno(_cursesi_screen->infd),
+                        &_cursesi_screen->orig_termios);
+
+       /* Reset the terminal state to the mode just before we stopped. */
+       (void) tcsetattr(fileno(_cursesi_screen->infd),
+                        __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN,
+                        &_cursesi_screen->save_termios);
+
+       /* Restore colours */
+       __restore_colors();
+
+       /* Reset meta */
+       __restore_meta_state();
+
+       /* Restart the screen. */
+       __startwin(_cursesi_screen);
+
+       /* Reset cursor visibility */
+       __restore_cursor_vis();
+
+       /* Repaint the screen. */
+       wrefresh(curscr);
+}
+
+int
+def_prog_mode(void)
+{
+       if (_cursesi_screen->endwin)
+               return ERR;
+
+       return (tcgetattr(fileno(_cursesi_screen->infd),
+                         &_cursesi_screen->save_termios) ? ERR : OK);
+}
+
+int
+reset_prog_mode(void)
+{
+
+       return tcsetattr(fileno(_cursesi_screen->infd),
+                        __tcaction ? TCSASOFT | TCSADRAIN : TCSADRAIN,
+                        &_cursesi_screen->save_termios) ? ERR : OK;
+}
+
+int
+def_shell_mode(void)
+{
+       return (tcgetattr(fileno(_cursesi_screen->infd),
+                         &_cursesi_screen->orig_termios) ? ERR : OK);
+}
+
+int
+reset_shell_mode(void)
+{
+       return (__stopwin());
+}
diff --git a/lib/libcurses/tty.c b/lib/libcurses/tty.c
new file mode 100644 (file)
index 0000000..3f98b98
--- /dev/null
@@ -0,0 +1,682 @@
+/*     $NetBSD: tty.c,v 1.42 2010/02/03 15:34:40 roy Exp $     */
+
+/*-
+ * Copyright (c) 1992, 1993, 1994
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)tty.c      8.6 (Berkeley) 1/10/95";
+#else
+__RCSID("$NetBSD: tty.c,v 1.42 2010/02/03 15:34:40 roy Exp $");
+#endif
+#endif                         /* not lint */
+
+#include <sys/types.h>
+
+#include <stdlib.h>
+#include <termios.h>
+#include <unistd.h>
+#include <sys/fcntl.h>
+#include <sys/ioctl.h>
+
+#include "curses.h"
+#include "curses_private.h"
+
+/*
+ * In general, curses should leave tty hardware settings alone (speed, parity,
+ * word size).  This is most easily done in BSD by using TCSASOFT on all
+ * tcsetattr calls.  On other systems, it would be better to get and restore
+ * those attributes at each change, or at least when stopped and restarted.
+ * See also the comments in getterm().
+ */
+#ifdef TCSASOFT
+int    __tcaction = 1;                 /* Ignore hardware settings. */
+#else
+#define TCSASOFT 0
+int    __tcaction = 0;
+#endif
+
+#ifndef        OXTABS
+#ifdef XTABS                   /* SMI uses XTABS. */
+#define        OXTABS  XTABS
+#else
+#define        OXTABS  0
+#endif
+#endif
+
+/*
+ * baudrate --
+ *     Return the current baudrate
+ */
+int
+baudrate(void)
+{
+       if (_cursesi_screen->notty == TRUE)
+               return 0;
+
+       return cfgetospeed(&_cursesi_screen->baset);
+}
+
+/*
+ * gettmode --
+ *     Do terminal type initialization.
+ */
+int
+gettmode(void)
+{
+       if (_cursesi_gettmode(_cursesi_screen) == ERR)
+               return ERR;
+
+       __GT = _cursesi_screen->GT;
+       __NONL = _cursesi_screen->NONL;
+       return OK;
+}
+
+/*
+ * _cursesi_gettmode --
+ *      Do the terminal type initialisation for the tty attached to the
+ *  given screen.
+ */
+int
+_cursesi_gettmode(SCREEN *screen)
+{
+       screen->useraw = 0;
+
+       if (tcgetattr(fileno(screen->infd), &screen->orig_termios)) {
+               /* if the input fd is not a tty try the output */
+               if (tcgetattr(fileno(screen->infd), &screen->orig_termios)) {
+                       /* not a tty ... we will disable tty related stuff */
+                       screen->notty = TRUE;
+                       __GT = 0;
+                       __NONL = 0;
+                       return (OK);
+               }
+       }
+
+       screen->baset = screen->orig_termios;
+       screen->baset.c_oflag &= ~OXTABS;
+
+       screen->GT = 0; /* historical. was used before we wired OXTABS off */
+       screen->NONL = (screen->baset.c_oflag & ONLCR) == 0;
+
+       /*
+        * XXX
+        * System V and SMI systems overload VMIN and VTIME, such that
+        * VMIN is the same as the VEOF element, and VTIME is the same
+        * as the VEOL element.  This means that, if VEOF was ^D, the
+        * default VMIN is 4.  Majorly stupid.
+        */
+       screen->cbreakt = screen->baset;
+       screen->cbreakt.c_lflag &= ~(ECHO | ECHONL | ICANON);
+       screen->cbreakt.c_cc[VMIN] = 1;
+       screen->cbreakt.c_cc[VTIME] = 0;
+
+       screen->rawt = screen->cbreakt;
+       screen->rawt.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | INLCR | IGNCR |
+                                 ICRNL | IXON);
+       screen->rawt.c_oflag &= ~OPOST;
+       screen->rawt.c_lflag &= ~(ISIG | IEXTEN);
+
+       /*
+        * In general, curses should leave hardware-related settings alone.
+        * This includes parity and word size.  Older versions set the tty
+        * to 8 bits, no parity in raw(), but this is considered to be an
+        * artifact of the old tty interface.  If it's desired to change
+        * parity and word size, the TCSASOFT bit has to be removed from the
+        * calls that switch to/from "raw" mode.
+        */
+       if (!__tcaction) {
+               screen->rawt.c_iflag &= ~ISTRIP;
+               screen->rawt.c_cflag &= ~(CSIZE | PARENB);
+               screen->rawt.c_cflag |= CS8;
+       }
+
+       screen->curt = &screen->baset;
+       return (tcsetattr(fileno(screen->infd), __tcaction ?
+           TCSASOFT | TCSADRAIN : TCSADRAIN, screen->curt) ? ERR : OK);
+}
+
+/*
+ * raw --
+ *     Put the terminal into raw mode
+ */
+int
+raw(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "raw()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       _cursesi_screen->useraw = __pfast = __rawmode = 1;
+       _cursesi_screen->curt = &_cursesi_screen->rawt;
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       return (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+                         TCSASOFT | TCSADRAIN : TCSADRAIN,
+                         _cursesi_screen->curt) ? ERR : OK);
+}
+
+/*
+ * noraw --
+ *     Put the terminal into cooked mode
+ */
+int
+noraw(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "noraw()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       _cursesi_screen->useraw = __pfast = __rawmode = 0;
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       _cursesi_screen->curt = &_cursesi_screen->baset;
+       return (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+                         TCSASOFT | TCSADRAIN : TCSADRAIN,
+                         _cursesi_screen->curt) ? ERR : OK);
+}
+
+/*
+ * cbreak --
+ *     Enable cbreak mode
+ */
+int
+cbreak(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "cbreak()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       __rawmode = 1;
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       _cursesi_screen->curt = _cursesi_screen->useraw ?
+               &_cursesi_screen->rawt : &_cursesi_screen->cbreakt;
+       return (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+                         TCSASOFT | TCSADRAIN : TCSADRAIN,
+                         _cursesi_screen->curt) ? ERR : OK);
+}
+
+/*
+ * nocbreak --
+ *     Disable cbreak mode
+ */
+int
+nocbreak(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "nocbreak()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       __rawmode = 0;
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+         /* if we were in halfdelay mode then nuke the timeout */
+       if ((_cursesi_screen->half_delay == TRUE) &&
+           (__notimeout() == ERR))
+               return ERR;
+
+       _cursesi_screen->half_delay = FALSE;
+       _cursesi_screen->curt = _cursesi_screen->useraw ?
+               &_cursesi_screen->rawt : &_cursesi_screen->baset;
+       return (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+                         TCSASOFT | TCSADRAIN : TCSADRAIN,
+                         _cursesi_screen->curt) ? ERR : OK);
+}
+
+/*
+ * halfdelay --
+ *    Put the terminal into cbreak mode with the specified timeout.
+ *
+ */
+int
+halfdelay(int duration)
+{
+       if ((duration < 1) || (duration > 255))
+               return ERR;
+
+       if (cbreak() == ERR)
+               return ERR;
+
+       if (__timeout(duration) == ERR)
+               return ERR;
+
+       _cursesi_screen->half_delay = TRUE;
+       return OK;
+}
+       
+int
+__delay(void)
+ {
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__delay()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       _cursesi_screen->rawt.c_cc[VMIN] = 1;
+       _cursesi_screen->rawt.c_cc[VTIME] = 0;
+       _cursesi_screen->cbreakt.c_cc[VMIN] = 1;
+       _cursesi_screen->cbreakt.c_cc[VTIME] = 0;
+       _cursesi_screen->baset.c_cc[VMIN] = 1;
+       _cursesi_screen->baset.c_cc[VTIME] = 0;
+
+       if (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+           TCSASOFT : TCSANOW, _cursesi_screen->curt)) {
+               __restore_termios();
+               return ERR;
+       }
+
+       return OK;
+}
+
+int
+__nodelay(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__nodelay()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       _cursesi_screen->rawt.c_cc[VMIN] = 0;
+       _cursesi_screen->rawt.c_cc[VTIME] = 0;
+       _cursesi_screen->cbreakt.c_cc[VMIN] = 0;
+       _cursesi_screen->cbreakt.c_cc[VTIME] = 0;
+       _cursesi_screen->baset.c_cc[VMIN] = 0;
+       _cursesi_screen->baset.c_cc[VTIME] = 0;
+
+       if (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+           TCSASOFT : TCSANOW, _cursesi_screen->curt)) {
+               __restore_termios();
+               return ERR;
+       }
+
+       return OK;
+}
+
+void
+__save_termios(void)
+{
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->notty == TRUE)
+               return;
+       _cursesi_screen->ovmin = _cursesi_screen->cbreakt.c_cc[VMIN];
+       _cursesi_screen->ovtime = _cursesi_screen->cbreakt.c_cc[VTIME];
+}
+
+void
+__restore_termios(void)
+{
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->notty == TRUE)
+               return;
+       _cursesi_screen->rawt.c_cc[VMIN] = _cursesi_screen->ovmin;
+       _cursesi_screen->rawt.c_cc[VTIME] = _cursesi_screen->ovtime;
+       _cursesi_screen->cbreakt.c_cc[VMIN] = _cursesi_screen->ovmin;
+       _cursesi_screen->cbreakt.c_cc[VTIME] = _cursesi_screen->ovtime;
+       _cursesi_screen->baset.c_cc[VMIN] = _cursesi_screen->ovmin;
+       _cursesi_screen->baset.c_cc[VTIME] = _cursesi_screen->ovtime;
+}
+
+int
+__timeout(int delay)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__timeout()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       _cursesi_screen->ovmin = _cursesi_screen->cbreakt.c_cc[VMIN];
+       _cursesi_screen->ovtime = _cursesi_screen->cbreakt.c_cc[VTIME];
+       _cursesi_screen->rawt.c_cc[VMIN] = 0;
+       _cursesi_screen->rawt.c_cc[VTIME] = delay;
+       _cursesi_screen->cbreakt.c_cc[VMIN] = 0;
+       _cursesi_screen->cbreakt.c_cc[VTIME] = delay;
+       _cursesi_screen->baset.c_cc[VMIN] = 0;
+       _cursesi_screen->baset.c_cc[VTIME] = delay;
+
+       if (tcsetattr(fileno(_cursesi_screen->infd),
+                         __tcaction ? TCSASOFT | TCSANOW : TCSANOW,
+                         _cursesi_screen->curt)) {
+               __restore_termios();
+               return ERR;
+       }
+
+       return OK;
+}
+
+int
+__notimeout(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "__notimeout()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       _cursesi_screen->rawt.c_cc[VMIN] = 1;
+       _cursesi_screen->rawt.c_cc[VTIME] = 0;
+       _cursesi_screen->cbreakt.c_cc[VMIN] = 1;
+       _cursesi_screen->cbreakt.c_cc[VTIME] = 0;
+       _cursesi_screen->baset.c_cc[VMIN] = 1;
+       _cursesi_screen->baset.c_cc[VTIME] = 0;
+
+       return (tcsetattr(fileno(_cursesi_screen->infd),
+                         __tcaction ? TCSASOFT | TCSANOW : TCSANOW,
+                         _cursesi_screen->curt) ? ERR : OK);
+}
+
+int
+echo(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "echo()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       __echoit = 1;
+       return (OK);
+}
+
+int
+noecho(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "noecho()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       __echoit = 0;
+       return (OK);
+}
+
+int
+nl(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "nl()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       _cursesi_screen->rawt.c_iflag |= ICRNL;
+       _cursesi_screen->rawt.c_oflag |= ONLCR;
+       _cursesi_screen->cbreakt.c_iflag |= ICRNL;
+       _cursesi_screen->cbreakt.c_oflag |= ONLCR;
+       _cursesi_screen->baset.c_iflag |= ICRNL;
+       _cursesi_screen->baset.c_oflag |= ONLCR;
+
+       _cursesi_screen->nl = 1;
+       _cursesi_screen->pfast = _cursesi_screen->rawmode;
+       return (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+                         TCSASOFT | TCSADRAIN : TCSADRAIN,
+                         _cursesi_screen->curt) ? ERR : OK);
+}
+
+int
+nonl(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "nonl()\n");
+#endif
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       _cursesi_screen->rawt.c_iflag &= ~ICRNL;
+       _cursesi_screen->rawt.c_oflag &= ~ONLCR;
+       _cursesi_screen->cbreakt.c_iflag &= ~ICRNL;
+       _cursesi_screen->cbreakt.c_oflag &= ~ONLCR;
+       _cursesi_screen->baset.c_iflag &= ~ICRNL;
+       _cursesi_screen->baset.c_oflag &= ~ONLCR;
+
+       _cursesi_screen->nl = 0;
+       __pfast = 1;
+       return (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+                         TCSASOFT | TCSADRAIN : TCSADRAIN,
+                         _cursesi_screen->curt) ? ERR : OK);
+}
+
+#ifndef _CURSES_USE_MACROS
+void
+noqiflush(void)
+{
+       (void) intrflush(stdscr, FALSE);
+}
+
+void
+qiflush(void)
+{
+       (void) intrflush(stdscr, TRUE);
+}
+#endif /* _CURSES_USE_MACROS */
+
+int
+intrflush(WINDOW *win, bool bf)        /*ARGSUSED*/
+{
+       /* Check if we need to restart ... */
+       if (_cursesi_screen->endwin)
+               __restartwin();
+
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       if (bf) {
+               _cursesi_screen->rawt.c_lflag &= ~NOFLSH;
+               _cursesi_screen->cbreakt.c_lflag &= ~NOFLSH;
+               _cursesi_screen->baset.c_lflag &= ~NOFLSH;
+       } else {
+               _cursesi_screen->rawt.c_lflag |= NOFLSH;
+               _cursesi_screen->cbreakt.c_lflag |= NOFLSH;
+               _cursesi_screen->baset.c_lflag |= NOFLSH;
+       }
+
+       __pfast = 1;
+       return (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+                         TCSASOFT | TCSADRAIN : TCSADRAIN,
+                         _cursesi_screen->curt) ? ERR : OK);
+}
+
+void
+__startwin(SCREEN *screen)
+{
+
+       (void) fflush(screen->infd);
+
+       /*
+        * Some C libraries default to a 1K buffer when talking to a tty.
+        * With a larger screen, especially across a network, we'd like
+        * to get it to all flush in a single write.  Make it twice as big
+        * as just the characters (so that we have room for cursor motions
+        * and attribute information) but no more than 8K.
+        */
+       if (screen->stdbuf == NULL) {
+               screen->len = LINES * COLS * 2;
+               if (screen->len > 8192)
+                       screen->len = 8192;
+               if ((screen->stdbuf = malloc(screen->len)) == NULL)
+                       screen->len = 0;
+       }
+       (void) setvbuf(screen->outfd, screen->stdbuf, _IOFBF, screen->len);
+
+       ti_puts(screen->term, t_enter_ca_mode(screen->term), 0,
+               __cputchar_args, (void *) screen->outfd);
+       ti_puts(screen->term, t_cursor_normal(screen->term), 0,
+           __cputchar_args, (void *) screen->outfd);
+       if (screen->curscr->flags & __KEYPAD)
+               ti_puts(screen->term, t_keypad_xmit(screen->term), 0,
+                   __cputchar_args, (void *) screen->outfd);
+       screen->endwin = 0;
+}
+
+int
+endwin(void)
+{
+#ifdef DEBUG
+       __CTRACE(__CTRACE_MISC, "endwin\n");
+#endif
+       return __stopwin();
+}
+
+bool
+isendwin(void)
+{
+       return (_cursesi_screen->endwin ? TRUE : FALSE);
+}
+
+int
+flushinp(void)
+{
+       (void) fpurge(_cursesi_screen->infd);
+       return (OK);
+}
+
+/*
+ * The following routines, savetty and resetty are completely useless and
+ * are left in only as stubs.  If people actually use them they will almost
+ * certainly screw up the state of the world.
+ */
+/*static struct termios savedtty;*/
+int
+savetty(void)
+{
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       return (tcgetattr(fileno(_cursesi_screen->infd),
+                         &_cursesi_screen->savedtty) ? ERR : OK);
+}
+
+int
+resetty(void)
+{
+       if (_cursesi_screen->notty == TRUE)
+               return OK;
+       return (tcsetattr(fileno(_cursesi_screen->infd), __tcaction ?
+                         TCSASOFT | TCSADRAIN : TCSADRAIN,
+                         &_cursesi_screen->savedtty) ? ERR : OK);
+}
+
+/*
+ * erasechar --
+ *     Return the character of the erase key.
+ */
+char
+erasechar(void)
+{
+       if (_cursesi_screen->notty == TRUE)
+               return 0;
+       return _cursesi_screen->baset.c_cc[VERASE];
+}
+
+/*
+ * killchar --
+ *     Return the character of the kill key.
+ */
+char
+killchar(void)
+{
+       if (_cursesi_screen->notty == TRUE)
+               return 0;
+       return _cursesi_screen->baset.c_cc[VKILL];
+}
+
+/*
+ * erasewchar --
+ *     Return the wide character of the erase key.
+ */
+int
+erasewchar( wchar_t *ch )
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (_cursesi_screen->notty == TRUE)
+               return ERR;
+       *ch = _cursesi_screen->baset.c_cc[VERASE];
+       return OK;
+#endif /* HAVE_WCHAR */
+}
+
+/*
+ * killwchar --
+ *     Return the wide character of the kill key.
+ */
+int
+killwchar( wchar_t *ch )
+{
+#ifndef HAVE_WCHAR
+       return ERR;
+#else
+       if (_cursesi_screen->notty == TRUE)
+               return 0;
+       *ch = _cursesi_screen->baset.c_cc[VKILL];
+       return OK;
+#endif /* HAVE_WCHAR */
+}
index 93c740657c136210917a760772d1b769e4f21f34..ffb6aeb4d3a9e6bf52f977c5660a402bec211fdd 100644 (file)
-/****************************************************************/
-/* Unctrl() routines of the PCcurses package                   */
-/*                                                             */
-/****************************************************************/
-/* This version of curses is based on ncurses, a curses version        */
-/* Originally written by Pavel Curtis at Cornell University.   */
-/* I have made substantial changes to make it run on IBM PC's, */
-/* And therefore consider myself free to make it public domain.        */
-/*             Bjorn Larsson (...mcvax!enea!infovax!bl)        */
-/****************************************************************/
-/* 1.0:        Release:                                        870515  */
-/****************************************************************/
-/* Modified to run under the MINIX operating system by Don Cope */
-/* These changes are also released into the public domain.      */
-/*                                                     900906  */
-/****************************************************************/
-
-#include <curses.h>
-#include "curspriv.h"
-
-static char strbuf[3] = {0, 0, 0};
-
-/****************************************************************/
-/* Unctrl() returns a char pointer to a string corresponding to        */
-/* Argument character 'c'.                                     */
-/****************************************************************/
-
-char *unctrl(c)
-char c;
-{
-  int ic = c;
-  ic &= 0xff;
-
-  if ((ic >= ' ') && (ic != 0x7f)) {   /* normal characters */
-       strbuf[0] = ic;
-       strbuf[1] = '\0';
-       return(strbuf);
-  }                            /* if */
-  strbuf[0] = '^';             /* '^' prefix */
-  if (c == 0x7f)               /* DEL */
-       strbuf[1] = '?';
-  else                         /* other control */
-       strbuf[1] = ic + '@';
-  return(strbuf);
-}                              /* unctrl */
+/*     $NetBSD: unctrl.c,v 1.11 2007/05/28 15:01:58 blymn Exp $        */
+
+/*
+ * Copyright (c) 1981, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)unctrl.c   8.1 (Berkeley) 6/4/93";
+#else
+__RCSID("$NetBSD: unctrl.c,v 1.11 2007/05/28 15:01:58 blymn Exp $");
+#endif
+#endif /* not lint */
+
+#include <unctrl.h>
+
+const char   * const __unctrl[256] = {
+       "^@", "^A", "^B", "^C", "^D", "^E", "^F", "^G",
+       "^H", "^I", "^J", "^K", "^L", "^M", "^N", "^O",
+       "^P", "^Q", "^R", "^S", "^T", "^U", "^V", "^W",
+       "^X", "^Y", "^Z", "^[", "^\\", "^]", "^~", "^_",
+       " ", "!", "\"", "#", "$", "%", "&", "'",
+       "(", ")", "*", "+", ",", "-", ".", "/",
+       "0", "1", "2", "3", "4", "5", "6", "7",
+       "8", "9", ":", ";", "<", "=", ">", "?",
+       "@", "A", "B", "C", "D", "E", "F", "G",
+       "H", "I", "J", "K", "L", "M", "N", "O",
+       "P", "Q", "R", "S", "T", "U", "V", "W",
+       "X", "Y", "Z", "[", "\\", "]", "^", "_",
+       "`", "a", "b", "c", "d", "e", "f", "g",
+       "h", "i", "j", "k", "l", "m", "n", "o",
+       "p", "q", "r", "s", "t", "u", "v", "w",
+       "x", "y", "z", "{", "|", "}", "~", "^?",
+
+       "0x80", "0x81", "0x82", "0x83", "0x84", "0x85", "0x86", "0x87",
+       "0x88", "0x89", "0x8a", "0x8b", "0x8c", "0x8d", "0x8e", "0x8f",
+       "0x90", "0x91", "0x92", "0x93", "0x94", "0x95", "0x96", "0x97",
+       "0x98", "0x99", "0x9a", "0x9b", "0x9c", "0x9d", "0x9e", "0x9f",
+       "0xa0", "0xa1", "0xa2", "0xa3", "0xa4", "0xa5", "0xa6", "0xa7",
+       "0xa8", "0xa9", "0xaa", "0xab", "0xac", "0xad", "0xae", "0xaf",
+       "0xb0", "0xb1", "0xb2", "0xb3", "0xb4", "0xb5", "0xb6", "0xb7",
+       "0xb8", "0xb9", "0xba", "0xbb", "0xbc", "0xbd", "0xbe", "0xbf",
+       "0xc0", "0xc1", "0xc2", "0xc3", "0xc4", "0xc5", "0xc6", "0xc7",
+       "0xc8", "0xc9", "0xca", "0xcb", "0xcc", "0xcd", "0xce", "0xcf",
+       "0xd0", "0xd1", "0xd2", "0xd3", "0xd4", "0xd5", "0xd6", "0xd7",
+       "0xd8", "0xd9", "0xda", "0xdb", "0xdc", "0xdd", "0xde", "0xdf",
+       "0xe0", "0xe1", "0xe2", "0xe3", "0xe4", "0xe5", "0xe6", "0xe7",
+       "0xe8", "0xe9", "0xea", "0xeb", "0xec", "0xed", "0xee", "0xef",
+       "0xf0", "0xf1", "0xf2", "0xf3", "0xf4", "0xf5", "0xf6", "0xf7",
+       "0xf8", "0xf9", "0xfa", "0xfb", "0xfc", "0xfd", "0xfe", "0xff",
+};
+
+const unsigned char    __unctrllen[256] = {
+       2, 2, 2, 2, 2, 2, 2, 2,
+       2, 2, 2, 2, 2, 2, 2, 2,
+       2, 2, 2, 2, 2, 2, 2, 2,
+       2, 2, 2, 2, 2, 2, 2, 2,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 1,
+       1, 1, 1, 1, 1, 1, 1, 2,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+       4, 4, 4, 4, 4, 4, 4, 4,
+};
+
+#ifdef HAVE_WCHAR
+const wchar_t   * const __wunctrl[256] = {
+       L"^@", L"^A", L"^B", L"^C", L"^D", L"^E", L"^F", L"^G",
+       L"^H", L"^I", L"^J", L"^K", L"^L", L"^M", L"^N", L"^O",
+       L"^P", L"^Q", L"^R", L"^S", L"^T", L"^U", L"^V", L"^W",
+       L"^X", L"^Y", L"^Z", L"^[", L"^\\", L"^]", L"^~", L"^_",
+       L" ", L"!", L"\"", L"#", L"$", L"%", L"&", L"'",
+       L"(", L")", L"*", L"+", L",", L"-", L".", L"/",
+       L"0", L"1", L"2", L"3", L"4", L"5", L"6", L"7",
+       L"8", L"9", L":", L";", L"<", L"=", L">", L"?",
+       L"@", L"A", L"B", L"C", L"D", L"E", L"F", L"G",
+       L"H", L"I", L"J", L"K", L"L", L"M", L"N", L"O",
+       L"P", L"Q", L"R", L"S", L"T", L"U", L"V", L"W",
+       L"X", L"Y", L"Z", L"[", L"\\", L"]", L"^", L"_",
+       L"`", L"a", L"b", L"c", L"d", L"e", L"f", L"g",
+       L"h", L"i", L"j", L"k", L"l", L"m", L"n", L"o",
+       L"p", L"q", L"r", L"s", L"t", L"u", L"v", L"w",
+       L"x", L"y", L"z", L"{", L"|", L"}", L"~", L"^?",
+
+       L"0x80", L"0x81", L"0x82", L"0x83", L"0x84", L"0x85", L"0x86", L"0x87",
+       L"0x88", L"0x89", L"0x8a", L"0x8b", L"0x8c", L"0x8d", L"0x8e", L"0x8f",
+       L"0x90", L"0x91", L"0x92", L"0x93", L"0x94", L"0x95", L"0x96", L"0x97",
+       L"0x98", L"0x99", L"0x9a", L"0x9b", L"0x9c", L"0x9d", L"0x9e", L"0x9f",
+       L"0xa0", L"0xa1", L"0xa2", L"0xa3", L"0xa4", L"0xa5", L"0xa6", L"0xa7",
+       L"0xa8", L"0xa9", L"0xaa", L"0xab", L"0xac", L"0xad", L"0xae", L"0xaf",
+       L"0xb0", L"0xb1", L"0xb2", L"0xb3", L"0xb4", L"0xb5", L"0xb6", L"0xb7",
+       L"0xb8", L"0xb9", L"0xba", L"0xbb", L"0xbc", L"0xbd", L"0xbe", L"0xbf",
+       L"0xc0", L"0xc1", L"0xc2", L"0xc3", L"0xc4", L"0xc5", L"0xc6", L"0xc7",
+       L"0xc8", L"0xc9", L"0xca", L"0xcb", L"0xcc", L"0xcd", L"0xce", L"0xcf",
+       L"0xd0", L"0xd1", L"0xd2", L"0xd3", L"0xd4", L"0xd5", L"0xd6", L"0xd7",
+       L"0xd8", L"0xd9", L"0xda", L"0xdb", L"0xdc", L"0xdd", L"0xde", L"0xdf",
+       L"0xe0", L"0xe1", L"0xe2", L"0xe3", L"0xe4", L"0xe5", L"0xe6", L"0xe7",
+       L"0xe8", L"0xe9", L"0xea", L"0xeb", L"0xec", L"0xed", L"0xee", L"0xef",
+       L"0xf0", L"0xf1", L"0xf2", L"0xf3", L"0xf4", L"0xf5", L"0xf6", L"0xf7",
+       L"0xf8", L"0xf9", L"0xfa", L"0xfb", L"0xfc", L"0xfd", L"0xfe", L"0xff",
+};
+#endif /* HAVE_WCHAR */
diff --git a/lib/libcurses/unctrl.h b/lib/libcurses/unctrl.h
new file mode 100644 (file)
index 0000000..f8a04cf
--- /dev/null
@@ -0,0 +1,58 @@
+/*     $NetBSD: unctrl.h,v 1.4 2007/05/28 15:01:58 blymn Exp $ */
+
+/*
+ * Copyright (c) 1982, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     @(#)unctrl.h    8.1 (Berkeley) 5/31/93
+ */
+
+#ifndef _UNCTRL_H_
+#define _UNCTRL_H_
+
+#include <sys/cdefs.h>
+#ifdef HAVE_WCHAR
+#include <wchar.h>
+#include <curses.h>
+#endif /* HAVE_WCHAR */
+
+__BEGIN_DECLS
+extern const char * const  __unctrl[];         /* Control strings. */
+extern const unsigned char __unctrllen[];      /* Control strings length. */
+#ifdef HAVE_WCHAR
+extern const wchar_t * const  __wunctrl[];     /* Wide char control strings. */
+#endif /* HAVE_WCHAR */
+__END_DECLS
+
+/* 8-bit ASCII characters. */
+#define        unctrl(c)               __unctrl[((unsigned char)c) & 0xff]
+#define        unctrllen(c)    __unctrllen[((unsigned char)c) & 0xff]
+
+#ifdef HAVE_WCHAR
+#define        wunctrl(wc)             __wunctrl[( int )(wc->vals[ 0 ]) & 0xff]
+#endif /* HAVE_WCHAR */
+#endif /* _UNCTRL_H_ */
diff --git a/lib/libcurses/underscore.c b/lib/libcurses/underscore.c
new file mode 100644 (file)
index 0000000..c790c21
--- /dev/null
@@ -0,0 +1,98 @@
+/*     $NetBSD: underscore.c,v 1.11 2010/02/03 15:34:40 roy Exp $      */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Julian Coleman.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+#ifndef lint
+__RCSID("$NetBSD: underscore.c,v 1.11 2010/02/03 15:34:40 roy Exp $");
+#endif                         /* not lint */
+
+#include "curses.h"
+#include "curses_private.h"
+
+#ifndef _CURSES_USE_MACROS
+
+/*
+ * underscore --
+ *     Enter underscore mode on stdscr.
+ */
+int
+underscore(void)
+{
+       return wunderscore(stdscr);
+}
+
+
+/*
+ * underend --
+ *     Exit underscore mode on stdscr.
+ */
+int
+underend(void)
+{
+       return wunderend(stdscr);
+}
+
+#endif
+
+/*
+ * wunderscore --
+ *     Enter underscore mode.
+ */
+int
+wunderscore(WINDOW *win)
+{
+       /* If can underscore, set the screen underscore bit. */
+       if ((enter_underline_mode != NULL && exit_underline_mode != NULL) ||
+           underline_char != NULL)
+       {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_ATTR, "wunderscore\n");
+#endif
+               win->wattr |= __UNDERSCORE;
+       }
+       return (1);
+}
+
+/*
+ * wunderend --
+ *     Exit underscore mode.
+ */
+int
+wunderend(WINDOW *win)
+{
+       if (exit_underline_mode != NULL) {
+#ifdef DEBUG
+               __CTRACE(__CTRACE_ATTR, "wunderend\n");
+#endif
+               win->wattr &= ~__UNDERSCORE;
+       }
+        return 1;
+}
diff --git a/lib/libcurses/update.c b/lib/libcurses/update.c
deleted file mode 100644 (file)
index 7c027d3..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-#include <termcap.h>
-
-static WINDOW *twin;           /* used by many routines */
-
-/****************************************************************/
-/* Gotoxy() moves the physical cursor to the desired address on */
-/* The screen. We don't optimize here - on a PC, it takes more  */
-/* Time to optimize than to do things directly.                 */
-/****************************************************************/
-
-_PROTOTYPE(static void gotoxy, (int row, int col ));
-_PROTOTYPE(static void newattr, (int ch ));
-_PROTOTYPE(static void Putchar, (int ch ));
-_PROTOTYPE(static void clrupdate, (WINDOW *scr ));
-_PROTOTYPE(static void transformline, (int lineno ));
-
-static void gotoxy(row, col)
-int row, col;
-{
-  poscur(row, col);
-  _cursvar.cursrow = row;
-  _cursvar.curscol = col;
-}
-
-/* Update attributes */
-static void newattr(ch)
-int ch;
-{
-  extern char *me, *as, *ae, *mb, *md, *mr, *so, *us;
-  static int lastattr = 0;
-
-  if (lastattr != (ch &= ATR_MSK)) {
-       lastattr = ch;
-
-       tputs(me, 1, outc);
-       if (ae) tputs(ae, 1, outc);
-
-       if (ch & A_ALTCHARSET)
-               if (as) tputs(as, 1, outc);
-       if (ch & A_BLINK) tputs(mb, 1, outc);
-       if (ch & A_BOLD) tputs(md, 1, outc);
-       if (ch & A_REVERSE) tputs(mr, 1, outc);
-       if (ch & A_STANDOUT) tputs(so, 1, outc);
-       if (ch & A_UNDERLINE) tputs(us, 1, outc);
-  }
-}
-
-/* Putchar() writes a character, with attributes, to the physical
-   screen, but avoids writing to the lower right screen position.
-   Should it care about am?
-*/
-
-/* Output char with attribute */
-static void Putchar(ch)
-int ch;
-{
-  if ((_cursvar.cursrow < LINES) || (_cursvar.curscol < COLS)) {
-       newattr(ch);
-       (void) putchar(ch);
-  }
-}
-
-/****************************************************************/
-/* Clrupdate(scr) updates the screen by clearing it and then    */
-/* Redraw it in it's entirety.                                 */
-/****************************************************************/
-
-static void clrupdate(scr)
-WINDOW *scr;
-{
-  register int *src;
-  register int *dst;
-  register int i;
-  register int j;
-  WINDOW *w;
-
-  w = curscr;
-
-  if (scr != w) {              /* copy scr to curscr */
-       for (i = 0; i < LINES; i++) {
-               src = scr->_line[i];
-               dst = w->_line[i];
-               for (j = 0; j < COLS; j++) *dst++ = *src++;
-       }                       /* for */
-  }                            /* if */
-  newattr(scr->_attrs);
-  clrscr();
-  scr->_clear = FALSE;
-  for (i = 0; i < LINES; i++) {        /* update physical screen */
-       src = w->_line[i];
-       j = 0;
-       while (j < COLS) {
-               if (*src != (' ' | ATR_NRM)) {
-                       gotoxy(i, j);
-                       while (j < COLS && (*src != (' ' | ATR_NRM))) {
-                               Putchar(*src++);
-                               j++;
-                       }
-               } else {
-                       src++;
-                       j++;
-               }
-       }                       /* for */
-  }                            /* for */
-  fflush(stdout);
-}                              /* clrupdate */
-
-/****************************************************************/
-/* Transformline() updates the given physical line to look      */
-/* Like the corresponding line in _cursvar.tmpwin.             */
-/****************************************************************/
-
-static void transformline(register int lineno)
-{
-  register int *dstp;
-  register int *srcp;
-  int x;
-  int endx;
-
-  x = twin->_minchng[lineno];
-  endx = twin->_maxchng[lineno];
-  dstp = curscr->_line[lineno] + x;
-  srcp = twin->_line[lineno] + x;
-
-  while (x <= endx) {
-       if (*dstp != *srcp) {
-               gotoxy(lineno, x);
-               while (x <= endx && (*dstp != *srcp)) {
-                       Putchar(*srcp);
-                       *dstp++ = *srcp++;
-                       x++;
-               }
-       } else {
-               *dstp++ = *srcp++;
-               x++;
-       }
-  }                            /* for */
-  twin->_minchng[lineno] = _NO_CHANGE;
-  twin->_maxchng[lineno] = _NO_CHANGE;
-}                              /* transformline */
-
-/****************************************************************/
-/* Doupdate() updates the physical screen to look like _curs-   */
-/* Var.tmpwin if curscr is not 'Clear-marked'. Otherwise it     */
-/* Updates the screen to look like curscr.                      */
-/****************************************************************/
-
-void doupdate()
-{
-  int i;
-
-  twin = _cursvar.tmpwin;
-  if (curscr->_clear)
-       clrupdate(curscr);
-  else {
-       if (twin->_clear)
-               clrupdate(twin);
-       else {
-               for (i = 0; i < LINES; i++)
-                       if (twin->_minchng[i] != _NO_CHANGE)
-                               transformline(i);
-       }
-  }
-  curscr->_curx = twin->_curx;
-  curscr->_cury = twin->_cury;
-  gotoxy(curscr->_cury, curscr->_curx);
-  fflush(stdout);
-}                              /* doupdate */
diff --git a/lib/libcurses/waddch.c b/lib/libcurses/waddch.c
deleted file mode 100644 (file)
index 780b26b..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Newline() does line advance and returns the new cursor line.        */
-/* If error, return -1.                                                */
-/****************************************************************/
-
-_PROTOTYPE( static short newline, (WINDOW *win, int lin));
-
-static short newline(win, lin)
-WINDOW *win;
-int lin;
-{
-  if (++lin > win->_regbottom) {
-       lin--;
-       if (win->_scroll)
-               scroll(win);
-       else
-               return(-1);
-  }                            /* if */
-  return(lin);
-}                              /* newline */
-
-/****************************************************************/
-/* Waddch() inserts character 'c' at the current cursor posi-  */
-/* Tion in window 'win', and takes any actions as dictated by  */
-/* The character.                                              */
-/****************************************************************/
-
-int waddch(win, c)
-WINDOW *win;
-int c;
-{
-  int x = win->_curx;
-  int y = win->_cury;
-  int newx;
-  int ch = c;
-  int ts = win->_tabsize;
-
-  ch &= (A_ALTCHARSET | 0xff);
-  if (y > win->_maxy || x > win->_maxx || y < 0 || x < 0) return(ERR);
-  switch (ch) {
-      case '\t':
-       for (newx = ((x / ts) + 1) * ts; x < newx; x++) {
-               if (waddch(win, ' ') == ERR) return(ERR);
-               if (win->_curx == 0)    /* if tab to next line */
-                       return(OK);     /* exit the loop */
-       }
-       return(OK);
-
-      case '\n':
-       if (NONL) x = 0;
-       if ((y = newline(win, y)) < 0) return (ERR);
-       break;
-
-      case '\r':       x = 0;  break;
-
-      case '\b':
-       if (--x < 0)            /* no back over left margin */
-               x = 0;
-       break;
-
-      case 0x7f:
-       {
-               if (waddch(win, '^') == ERR) return(ERR);
-               return(waddch(win, '?'));
-       }
-
-      default:
-       if (ch < ' ') {         /* handle control chars */
-               if (waddch(win, '^') == ERR) return(ERR);
-               return(waddch(win, c + '@'));
-       }
-       ch |= (win->_attrs & ATR_MSK);
-       if (win->_line[y][x] != ch) {   /* only if data change */
-               if (win->_minchng[y] == _NO_CHANGE)
-                       win->_minchng[y] = win->_maxchng[y] = x;
-               else if (x < win->_minchng[y])
-                       win->_minchng[y] = x;
-               else if (x > win->_maxchng[y])
-                       win->_maxchng[y] = x;
-       }                       /* if */
-       win->_line[y][x++] = ch;
-       if (x > win->_maxx) {   /* wrap around test */
-               x = 0;
-               if ((y = newline(win, y)) < 0) return(ERR);
-       }
-       break;
-
-  }                            /* switch */
-  win->_curx = x;
-  win->_cury = y;
-  return(OK);
-}
diff --git a/lib/libcurses/waddstr.c b/lib/libcurses/waddstr.c
deleted file mode 100644 (file)
index b32bbb3..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Waddstr() inserts string 'str' at the current cursor posi-  */
-/* Tion in window 'win', and takes any actions as dictated by  */
-/* The characters.                                             */
-/****************************************************************/
-
-int waddstr(win, str)
-WINDOW *win;
-char *str;
-{
-  while (*str) {
-       if (waddch(win, *str++) == ERR) return(ERR);
-  }
-  return(OK);
-}
diff --git a/lib/libcurses/wbox.c b/lib/libcurses/wbox.c
deleted file mode 100644 (file)
index 1ae4fe8..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Wbox(win,ymin,xmin,ymax,xmax,v,h) draws a box in window     */
-/* 'win', enclosing the area xmin-xmax and ymin-xmax. If       */
-/* Xmax and/or ymax is 0, the window max value is used. 'v' and        */
-/* 'h' are the vertical and horizontal characters to use. If   */
-/* 'v' and 'h' are 0, wbox will use the alternate character set */
-/* In a pretty way.                                            */
-/****************************************************************/
-
-int wbox(win, ymin, xmin, ymax, xmax, v, h)
-WINDOW *win;
-int ymin, xmin, ymax, xmax;
-unsigned int v;
-unsigned int h;
-{
-  unsigned int vc, hc, ulc, urc, llc, lrc;     /* corner chars */
-  int i;
-
-  if (ymax == 0) ymax = win->_maxy;
-  if (xmax == 0) xmax = win->_maxx;
-
-  if (ymin >= win->_maxy || ymax > win->_maxy ||
-      xmin >= win->_maxx || xmax > win->_maxx ||
-      ymin >= ymax || xmin >= xmax)
-       return(ERR);
-
-  vc = v;
-  hc = h;
-  ulc = urc = llc = lrc = vc;  /* default same as vertical */
-
-  if (v == 0 && h == 0) {
-       ulc = ACS_ULCORNER;
-       urc = ACS_URCORNER;
-       llc = ACS_LLCORNER;
-       lrc = ACS_LRCORNER;
-       hc = ACS_HLINE;
-       vc = ACS_VLINE;
-  }
-  for (i = xmin + 1; i <= xmax - 1; i++) {
-       win->_line[ymin][i] = hc | win->_attrs;
-       win->_line[ymax][i] = hc | win->_attrs;
-  }
-  for (i = ymin + 1; i <= ymax - 1; i++) {
-       win->_line[i][xmin] = vc | win->_attrs;
-       win->_line[i][xmax] = vc | win->_attrs;
-  }
-  win->_line[ymin][xmin] = ulc | win->_attrs;
-  win->_line[ymin][xmax] = urc | win->_attrs;
-  win->_line[ymax][xmin] = llc | win->_attrs;
-  win->_line[ymax][xmax] = lrc | win->_attrs;
-
-  for (i = ymin; i <= ymax; i++) {
-       if (win->_minchng[i] == _NO_CHANGE) {
-               win->_minchng[i] = xmin;
-               win->_maxchng[i] = xmax;
-       } else {
-               win->_minchng[i] = min(win->_minchng[i], xmin);
-               win->_maxchng[i] = max(win->_maxchng[i], xmax);
-       }
-  }
-  return(OK);
-}
diff --git a/lib/libcurses/wclear.c b/lib/libcurses/wclear.c
deleted file mode 100644 (file)
index ba4f08f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Wclear() fills all lines of window 'win' with blanks, and   */
-/* Marks the window to be cleared at next refresh operation.   */
-/****************************************************************/
-
-void wclear(win)
-WINDOW *win;
-{
-  werase(win);
-  win->_clear = TRUE;
-}                              /* wclear */
diff --git a/lib/libcurses/wclrtobot.c b/lib/libcurses/wclrtobot.c
deleted file mode 100644 (file)
index 379ace4..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Wclrtobot() fills the right half of the cursor line of      */
-/* Window 'win', and all lines below it with blanks.           */
-/****************************************************************/
-
-int wclrtobot(win)
-WINDOW *win;
-{
-  int y, minx, startx, *ptr, *end, *maxx, blank;
-
-  blank = ' ' | (win->_attrs & ATR_MSK);
-  startx = win->_curx;
-  for (y = win->_cury; y <= win->_regbottom; y++) {
-       minx = _NO_CHANGE;
-       end = &win->_line[y][win->_maxx];
-       for (ptr = &win->_line[y][startx]; ptr <= end; ptr++) {
-               if (*ptr != blank) {
-                       maxx = ptr;
-                       if (minx == _NO_CHANGE) minx = ptr - win->_line[y];
-                       *ptr = blank;
-               }               /* if */
-       }                       /* for */
-       if (minx != _NO_CHANGE) {
-               if ((win->_minchng[y] > minx) || (win->_minchng[y] == _NO_CHANGE))
-                       win->_minchng[y] = minx;
-               if (win->_maxchng[y] < maxx - win->_line[y])
-                       win->_maxchng[y] = maxx - win->_line[y];
-       }                       /* if */
-       startx = 0;
-  }
-  return(OK);
-}
diff --git a/lib/libcurses/wclrtoeol.c b/lib/libcurses/wclrtoeol.c
deleted file mode 100644 (file)
index ea72976..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Wclrtoeol() fills the half of the cursor line to the right  */
-/* Of the cursor in window 'win' with blanks.                  */
-/****************************************************************/
-
-int wclrtoeol(win)
-WINDOW *win;
-{
-  int *maxx, *ptr, *end, y, x, minx, blank;
-
-  y = win->_cury;
-  x = win->_curx;
-  blank = ' ' | (win->_attrs & ATR_MSK);
-
-  end = &win->_line[y][win->_maxx];
-  minx = _NO_CHANGE;
-  maxx = &win->_line[y][x];
-  for (ptr = maxx; ptr <= end; ptr++) {
-       if (*ptr != blank) {
-               maxx = ptr;
-               if (minx == _NO_CHANGE) minx = ptr - win->_line[y];
-               *ptr = blank;
-       }                       /* if */
-  }                            /* for */
-
-  if (minx != _NO_CHANGE) {
-       if (win->_minchng[y] > minx || win->_minchng[y] == _NO_CHANGE)
-               win->_minchng[y] = minx;
-       if (win->_maxchng[y] < maxx - win->_line[y])
-               win->_maxchng[y] = maxx - win->_line[y];
-  }
-  return(OK);
-}
diff --git a/lib/libcurses/wdelch.c b/lib/libcurses/wdelch.c
deleted file mode 100644 (file)
index 0fe8c2c..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/* Wdelch() deletes the character at the window cursor, and the
-   characters to the right of it are shifted left, inserting a
-   space at the last position of the line.
-*/
-
-int wdelch(win)
-WINDOW *win;
-{
-  int *temp1;
-  int *temp2;
-  int *end;
-  int y = win->_cury;
-  int x = win->_curx;
-  int maxx = win->_maxx;
-
-  end = &win->_line[y][maxx];
-  temp1 = &win->_line[y][x];
-  temp2 = temp1 + 1;
-  while (temp1 < end) *temp1++ = *temp2++;
-  *temp1 = ' ' | (win->_attrs & ATR_MSK);
-  win->_maxchng[y] = maxx;
-  if (win->_minchng[y] == _NO_CHANGE || win->_minchng[y] > x)
-       win->_minchng[y] = x;
-  return(OK);
-}
diff --git a/lib/libcurses/wdeleteln.c b/lib/libcurses/wdeleteln.c
deleted file mode 100644 (file)
index 50faa44..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Wdeleteln() deletes the line at the window cursor, and the  */
-/* Lines below it are shifted up, inserting a blank line at    */
-/* The bottom of the window.                                   */
-/****************************************************************/
-
-int wdeleteln(win)
-WINDOW *win;
-{
-  int *end, *temp, y, blank;
-
-  blank = ' ' | (win->_attrs & ATR_MSK);
-
-  temp = win->_line[win->_cury];
-  for (y = win->_cury; y < win->_regbottom; y++) {
-       win->_line[y] = win->_line[y + 1];
-       win->_minchng[y] = 0;
-       win->_maxchng[y] = win->_maxx;
-  }
-  win->_minchng[y] = 0;
-  win->_maxchng[y] = win->_maxx;
-  win->_line[win->_regbottom] = temp;
-  for (end = &(temp[win->_maxx]); temp <= end;) *temp++ = blank;
-  return(OK);
-}
diff --git a/lib/libcurses/werase.c b/lib/libcurses/werase.c
deleted file mode 100644 (file)
index 46872b8..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Werase() fills all lines of window 'win' with blanks and po-        */
-/* Sitions the cursor at home in the scroll region.            */
-/****************************************************************/
-
-void werase(win)
-WINDOW *win;
-{
-  int *end, *start, y, blank;
-
-  blank = ' ' | (win->_attrs & ATR_MSK);
-
-  for (y = win->_regtop; y <= win->_regbottom; y++) {  /* clear all lines */
-       start = win->_line[y];
-       end = &start[win->_maxx];
-       while (start <= end)    /* clear all line */
-               *start++ = blank;
-       win->_minchng[y] = 0;
-       win->_maxchng[y] = win->_maxx;
-  }
-  win->_cury = win->_regtop;   /* cursor home */
-  win->_curx = 0;
-}
diff --git a/lib/libcurses/wgetch.c b/lib/libcurses/wgetch.c
deleted file mode 100644 (file)
index 8876855..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <curses.h>
-#include <stdio.h>
-#include "curspriv.h"
-
-int wgetch(win)
-WINDOW *win;
-{
-  bool weset = FALSE;
-  char inp;
-
-  if (!win->_scroll && (win->_flags & _FULLWIN)
-      && win->_curx == win->_maxx - 1 && win->_cury == win->_maxy - 1)
-       return ERR;
-  if (_cursvar.echoit && !_cursvar.rawmode) {
-       cbreak();
-       weset++;
-  }
-  inp = getchar();
-  if (_cursvar.echoit) {
-       (void) mvwaddch(curscr, win->_cury + win->_begy,
-                win->_curx + win->_begx, inp);
-       waddch(win, inp);
-  }
-  if (weset) nocbreak();
-  return inp;
-}
diff --git a/lib/libcurses/wgetstr.c b/lib/libcurses/wgetstr.c
deleted file mode 100644 (file)
index 2458e4b..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Wgetstr(win,str) reads in a string (terminated by \n or \r) */
-/* To the buffer pointed to by 'str', and displays the input   */
-/* In window 'win'. The user's erase and kill characters are   */
-/* Active.                                                     */
-/****************************************************************/
-
-int wgetstr(win, str)
-WINDOW *win;
-char *str;
-{
-  while ((*str = wgetch(win)) != ERR && *str != '\n') str++;
-  if (*str == ERR) {
-       *str = '\0';
-       return ERR;
-  }
-  *str = '\0';
-  return OK;
-}
diff --git a/lib/libcurses/windel.c b/lib/libcurses/windel.c
deleted file mode 100644 (file)
index ad67bd8..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/****************************************************************/
-/* Delwin() routine of the PCcurses package.                   */
-/*                                                             */
-/****************************************************************/
-/* This version of curses is based on ncurses, a curses version        */
-/* Originally written by Pavel Curtis at Cornell University.   */
-/* I have made substantial changes to make it run on IBM PC's, */
-/* And therefore consider myself free to make it public domain.        */
-/*             Bjorn Larsson (...mcvax!enea!infovax!bl)        */
-/****************************************************************/
-/* 1.0:        Release:                                        870515  */
-/****************************************************************/
-/* Modified to run under the MINIX operating system by Don Cope */
-/* These changes are also released into the public domain.      */
-/*                                                     900906  */
-/****************************************************************/
-
-#include <stdlib.h>
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Delwin() deallocates all data allocated by 'win'. If 'win'  */
-/* Is a subwindow, it uses the original window's lines for sto-        */
-/* Rage, and thus the line arrays are not deallocated.         */
-/****************************************************************/
-
-void delwin(win)
-WINDOW *win;
-{
-  int i;
-
-  if (!(win->_flags & _SUBWIN)) {      /* subwindow uses 'parent's' lines */
-       for (i = 0; i <= win->_maxy && win->_line[i]; i++)
-               free(win->_line[i]);
-  }
-  free(win->_minchng);
-  free(win->_maxchng);
-  free(win->_line);
-  free(win);
-}                              /* delwin */
diff --git a/lib/libcurses/winmove.c b/lib/libcurses/winmove.c
deleted file mode 100644 (file)
index ac8c133..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/****************************************************************/
-/* Mvwin() routine of the PCcurses package                     */
-/*                                                             */
-/****************************************************************/
-/* This version of curses is based on ncurses, a curses version        */
-/* Originally written by Pavel Curtis at Cornell University.   */
-/* I have made substantial changes to make it run on IBM PC's, */
-/* And therefore consider myself free to make it public domain.        */
-/*             Bjorn Larsson (...mcvax!enea!infovax!bl)        */
-/****************************************************************/
-/* 1.0:        Release:                                        870515  */
-/****************************************************************/
-/* Modified to run under the MINIX operating system by Don Cope */
-/* These changes are also released into the public domain.      */
-/*                                                     900906  */
-/****************************************************************/
-
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Mvwin() moves window 'win' to position (begx, begy) on the  */
-/* Screen.                                                     */
-/****************************************************************/
-
-int mvwin(win, begy, begx)
-WINDOW *win;
-int begy, begx;
-{
-  if ((begy + win->_maxy) > (LINES - 1) || (begx + win->_maxx) > (COLS - 1))
-       return(ERR);
-  win->_begy = begy;
-  win->_begx = begx;
-  touchwin(win);
-  return(OK);
-}                              /* mvwin */
diff --git a/lib/libcurses/winsch.c b/lib/libcurses/winsch.c
deleted file mode 100644 (file)
index b7c9430..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/* Winsch() inserts character 'c' at the cursor position in
-   window 'win'. The cursor is advanced.
-*/
-
-int winsch(win, c)
-WINDOW *win;
-char c;
-{
-  int *temp1;
-  int *temp2;
-  int *end;
-  int x = win->_curx;
-  int y = win->_cury;
-  int maxx = win->_maxx;
-
-  if ((c < ' ') && (c == '\n' || c == '\r' || c == '\t' || c == '\b'))
-       return(waddch(win, c));
-  end = &win->_line[y][x];
-  temp1 = &win->_line[y][maxx];
-  temp2 = temp1 - 1;
-  if (c < ' ')                 /* if CTRL-char make space for 2 */
-       temp2--;
-  while (temp1 > end) *temp1-- = *temp2--;
-  win->_maxchng[y] = maxx;
-  if ((win->_minchng[y] == _NO_CHANGE) || (win->_minchng[y] > x))
-       win->_minchng[y] = x;
-  return(waddch(win, c));      /* fixes CTRL-chars too */
-}                              /* winsch */
diff --git a/lib/libcurses/winscrol.c b/lib/libcurses/winscrol.c
deleted file mode 100644 (file)
index 7fd9dd3..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/****************************************************************/
-/* Scroll() routine of the PCcurses package                    */
-/*                                                             */
-/****************************************************************/
-/* This version of curses is based on ncurses, a curses version        */
-/* Originally written by Pavel Curtis at Cornell University.   */
-/* I have made substantial changes to make it run on IBM PC's, */
-/* And therefore consider myself free to make it public domain.        */
-/*             Bjorn Larsson (...mcvax!enea!infovax!bl)        */
-/****************************************************************/
-/* 1.0:        Release:                                        870515  */
-/****************************************************************/
-/* Modified to run under the MINIX operating system by Don Cope */
-/* These changes are also released into the public domain.      */
-/*                                                     900906  */
-/****************************************************************/
-
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Scroll() scrolls the scrolling region of 'win', but only if */
-/* Scrolling is allowed and if the cursor is inside the scrol- */
-/* Ling region.                                                        */
-/****************************************************************/
-
-void scroll(win)
-WINDOW *win;
-{
-  int i;
-  int *ptr;
-  int *temp;
-  static int blank;
-
-  blank = ' ' | (win->_attrs & ATR_MSK);
-  if ((!win->_scroll)          /* check if window scrolls */
-      ||(win->_cury < win->_regtop)    /* and cursor in region */
-      ||(win->_cury > win->_regbottom)
-       )
-       return;
-
-  temp = win->_line[win->_regtop];
-  for (i = win->_regtop; i < win->_regbottom; i++) {
-       win->_line[i] = win->_line[i + 1];      /* re-arrange line pointers */
-       win->_minchng[i] = 0;
-       win->_maxchng[i] = win->_maxx;
-  }
-  for (ptr = temp; ptr - temp <= win->_maxx; ptr++)
-       *ptr = blank;           /* make a blank line */
-  win->_line[win->_regbottom] = temp;
-  if (win->_cury > win->_regtop)/* if not on top line */
-       win->_cury--;           /* cursor scrolls too */
-  win->_minchng[win->_regbottom] = 0;
-  win->_maxchng[win->_regbottom] = win->_maxx;
-}                              /* scroll */
diff --git a/lib/libcurses/winsertln.c b/lib/libcurses/winsertln.c
deleted file mode 100644 (file)
index fa6b83f..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Winsertln() inserts a blank line instead of the cursor line */
-/* In window 'win' and pushes other lines down.                        */
-/****************************************************************/
-
-int winsertln(win)
-WINDOW *win;
-{
-  int *temp, *end, y, blank;
-
-  blank = ' ' | (win->_attrs & ATR_MSK);
-  temp = win->_line[win->_regbottom];
-  for (y = win->_regbottom; y > win->_cury; y--) {
-       win->_line[y] = win->_line[y - 1];
-       win->_minchng[y] = 0;
-       win->_maxchng[y] = win->_maxx;
-  }
-  win->_line[win->_cury] = temp;
-  for (end = &temp[win->_maxx]; temp <= end; temp++) *temp = blank;
-  win->_minchng[win->_cury] = 0;
-  win->_maxchng[win->_cury] = win->_maxx;
-  return(OK);
-}
diff --git a/lib/libcurses/wintouch.c b/lib/libcurses/wintouch.c
deleted file mode 100644 (file)
index 05f5d78..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/****************************************************************/
-/* Touchwin() routine of the PCcurses package                  */
-/*                                                             */
-/****************************************************************/
-/* This version of curses is based on ncurses, a curses version        */
-/* Originally written by Pavel Curtis at Cornell University.   */
-/* I have made substantial changes to make it run on IBM PC's, */
-/* And therefore consider myself free to make it public domain.        */
-/*             Bjorn Larsson (...mcvax!enea!infovax!bl)        */
-/****************************************************************/
-/* 1.0:        Release:                                        870515  */
-/****************************************************************/
-/* Modified to run under the MINIX operating system by Don Cope */
-/* These changes are also released into the public domain.      */
-/*                                                     900906  */
-/****************************************************************/
-
-#include <curses.h>
-#include "curspriv.h"
-
-/****************************************************************/
-/* Touchwin() marks all lines of window 'win' as changed, from */
-/* The first to the last character on the line.                        */
-/****************************************************************/
-
-void touchwin(win)
-WINDOW *win;
-{
-  int y;
-  int maxy;
-  int maxx;
-
-  maxy = win->_maxy;
-  maxx = win->_maxx;
-
-  for (y = 0; y <= maxy; y++) {
-       win->_minchng[y] = 0;
-       win->_maxchng[y] = maxx;
-  }                            /* for */
-}                              /* touchwin */
index a054b52fbce0771ce3e077e94f1a667e7d5aebb0..be965cd4fb6003cf2a4937096994b96fcd61c2ab 100644 (file)
@@ -20,7 +20,7 @@ MAN=  acd.1 anm.1 ar.1 ash.1 asize.1 at.1 banner.1 basename.1 \
        shar.1 acksize.1 sleep.1 sort.1 soundoff.1 soundon.1 spell.1 \
        split.1 strip.1 stty.1 su.1 sum.1 svc.1 \
        synctree.1 sysenv.1 sz.1 tail.1 tee.1 telnet.1 template.1 \
-       term.1 termcap.1 tget.1 time.1 top.1 tr.1 true.1 \
+       term.1 termcap.1 tget.1 time.1 tr.1 true.1 \
        truncate.1 tsort.1 tty.1 umount.1 uname.1 unexpand.1 \
        uud.1 uue.1 vol.1 wc.1 whereis.1 which.1 \
        who.1 write.1 xargs.1 yap.1 yes.1 linkfarm.1 pkg_view.1
diff --git a/man/man1/top.1 b/man/man1/top.1
deleted file mode 100644 (file)
index 750de7b..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH TOP 1
-.SH NAME
-top \- show processes sorted by CPU usage
-.SH SYNOPSIS
-\fBtop\fP [\fB\-s\fIdelay\fP] [\fB\-B\fP]
-.SH DESCRIPTION
-Top displays a list of all running processes, once every update interval
-(currently 5 seconds). It is sorted by the CPU usage of the processes in
-the last interval. The first display is the CPU usage of processes since
-the boot time.
-
-.SH OPTIONS
-.PP
-  \fB\-s\fP\fIdelay\fP The number of seconds between screen updates.
-
-  \fB\-B\fP Blocked-verbose mode.
-  For every process that is blocked,
-  display the chain of block-dependencies up until the process
-  that is either not blocked or blocked on ANY.
-
-At the top of the screen, top shows the current system load averages in
-the last 1-minute, 5-minute and 15-minute intervals. Then, over the
-last top interval it displays: the number of alive, active, and sleeping
-processes; memory free; and CPU usage. CPU usage is split into
-user, kernel, system and idle time. Kernel time is time spent in
-the kernel. System time are system user processes, such as drivers and
-servers. User time is all other CPU time.
-
-Then it displays all the alive processes sorted by CPU usage in the last
-interval, with a number of fields for every process. Currently the
-following fields are displayed:
-.PP
-  PID
-    The process id of the process. Some processes (so-called kernel
-    tasks) don't have a real process id, as they are not processes
-    that are managed by the process manager, and aren't visible to
-    other user processes by pid. They are shown by having their process
-    slot number in square brackets.
-  USERNAME
-    The username of the effective uid at which the process runs,
-    or a number if the username could not be looked up.
-  PRI
-    The system scheduling priority the process is currently running as.
-    A lower priority number gives a higher scheduling priority. The
-    lowest is 0. The scale is internal to the kernel.
-  NICE
-    The base scheduling priority the process has been given at startup.
-    0 is normal for a regular user process; the range is -20 to 20
-    (PRIO_MIN and PRIO_MAX in <sys/resource.h>. Most system processes
-    are given higher base priorities.
-  SIZE
-    Text + data size in kilobytes.
-  STATE
-    RUN if the process is runnable, empty if blocking. 
-  TIME
-    Total number of CPU time spent in the process itself. So-called
-    system time (CPU time spent on behalf of this process by another
-    process, generally a system process) is not seen here.
-  CPU
-    Percentage of time that the process was running in the last interval.
-  COMMAND
-    Name of the command that belongs to this process.
-
-.SH "SEE ALSO"
-.BR ps (1)
-.SH BUGS
-This is a from-scratch reimplementation of top for MINIX 3.
-Many features (such as interactive commands) are not implemented.
-Sorting is only done by CPU usage currently. Displayed state is
-only RUN or empty.
-.SH AUTHOR
-Ben Gras (beng@few.vu.nl)
index e13ef92db7287d93da7d3494ccf91db4a5c17f71..f72e864f294294ea7eed04b394aa7139fc6d04bc 100644 (file)
@@ -1,5 +1,5 @@
 MAN=   abort.3 abs.3 assert.3 atof.3 bstring.3 configfile.3 \
-       crypt.3 ctime.3 ctype.3 curses.3 directory.3 dirname.3 \
+       crypt.3 ctime.3 ctype.3 directory.3 dirname.3 \
        editline.3 end.3 execl.3 exit.3 fabs.3 fclose.3 \
        feholdexcept.3 ferror.3 fesetround.3 fnmatch.3 fopen.3 \
        fpclassify.3 fread.3 fseek.3 getaddrinfo.3 getc.3 getcontext.3 \
diff --git a/man/man3/curses.3 b/man/man3/curses.3
deleted file mode 100644 (file)
index e9eaa3e..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-.TH CURSES 3
-.SH NAME
-curses \- screen/window management library
-.SH SYNOPSIS
-cc demo.c -lcurses
-.SH DESCRIPTION
-Curses is a library of screen and window management routines.  It is modeled
-after the UNIX curses and ncurses libraries. Normally, programs written for
-curses should be easily ported to UNIX, and vice versa.
-.PP
-To use the routines, the function initscr() must first be called.
-This creates two 'windows' for the user: stdscr and curscr.  Stdscr is the
-default
-window for the user to make changes on, and curscr reflects the current
-contents of the physical display screen.  The user writes or edits the stdscr
-window to his liking, then calls the refresh() function to make curscr
-and the physical screen look like stdscr.  When the user program terminates,
-it should call the endwin() function to restore things to normal.
-.PP
-There are all sorts of window manipulation routines available to the
-programmer: auxiliary windows may be created, edited, moved and deleted.  The
-terminal may be set in many different modes, output text may be attributed
-with blink, blank, bold and reverse attributes.  Screen colors may also be 
-set, foreground and background.  There are window-specific
-printf- and scanf-like routines, routines for scrolling, box-drawing,
-window overlaying, clearing routines etc.
-.PP
-For more and detailed information, see the library source codes.  All curses
-functions are preceded by a complete description.
-.SH FUNCTIONS
-Below is a list over the available functions, together with a brief
-description of what they do.  In general, functions whose names start with 'w'
-differ from the one without 'w' (like wmove vs. move) signify that
-a specific window is used. Without a 'w', sdtscr is implied.  The functions
-that start with 'mv' before the 'genereic' function name signify that a
-cursor motion should be made before the actual work.  'mv' and 'w' combine
-as expected.
-.PP
-Most routines that return an int will return the manifest constant ERR if
-there is a failure during execution.  Routines that return a char actually
-return an int, so that ERR does not conflict with the character code 0xff.
-All characters from 0 to 0xff are allowed for usage with curses.
-.PP
-Some routines, like {mv}{w} printw() and {mv}{w}scanw() return a meaningful
-positive value if the operation is successful.
-.PP
-The curses package uses some predefined types, variables and manifest
-constants that are also available to the programmer.  There are also a few
-globally accessible variables that should not be touched by the application
-program.  Those untouchable variables have names starting with an
-underscore (_) to avoid conflicts.  The user-accessible types, variables
-and constants are (there are a number of other constants defining character
-attribute names and function key names - consult <curses.h> for details):
-.sp
-.nf
-.ta 3i
-(manifest constants)
-.RS
-TRUE   boolean true
-FALSE  boolean false
-ERR    unsuccessfull operation
-OK     successfull operation
-.RE
-.sp
-(types)
-.RS
-WINDOW a window structure type
-bool   boolean flag type
-.RE
-.sp
-(variables)
-.RS
-WINDOW curscr  physical display image
-WINDOW stdscr  default user drawing board
-int LINES      terminal height
-int COLS       terminal width
-int NONL       \\n causes CR and LF when TRUE
-.RE
-.sp
-.fi
-The following is an alphabetical list of the curses functions, together
-with their types, parameters and a short comment for each (win is a window,
-ch, vc, hc are characters, buf is a character buffer, attrs is an
-attribute bit map, bf is a boolean flag.  Note that `characters' in this
-context usually can have 16 bits):
-.nf
-.sp
-int waddch(win,ch)     put char in stdscr
-int addch(ch)
-int mvaddch(y,x,ch)
-int mvwaddch(win,y,x,ch)
-
-int waddstr(win,str)   put string in stdscr
-int addstr(str)
-int mvaddstr(y,x,str)
-int mvwaddstr(win,y,x,str)
-
-void wattroff(win,attrs)       clear attribute(s) in window
-void attroff(attrs)
-
-void wattron(win,attrs)        add attribute(s) in window
-void attron(attrs)
-
-void wattrset(win,attrs)       set window char attributes
-void attrset(attrs)
-
-int baudrate() dummy for compatibility
-
-void beep()    ring the bell or visible bell if no bell available
-
-void flash()   flash terminal screen or rings bell if no visible bell available
-
-void wbox(win,miny,minx,maxy,maxx,vc,hc)       box in a window, with given characters
-void box(win,vc,hc)
-
-void cbreak()  set terminal cbreak mode
-
-void wclear(win)       clear stdscr
-void clear()
-
-void clearok(win,bf)   marks window for screen clear
-
-int wclrtobot(win)     clear from cursor to end of line and all lines down this line
-int clrtobot()
-int mvclrtoeol(y,x)
-int mvwclrtobot(win,y,x)
-
-int wclrtoeol(win)     clear from cursor to end of line
-int clrtoeol()
-int mvclrtoeol(y,x)
-int mvwclrtoeol(win,y,x)
-
-int wdelch(win)        delete a char in a window
-int delch()
-int mvdelch(y,x)
-int mvwdelch(win,y,x)
-
-int wdeleteln(win)     delete a line in a window
-int deleteln()
-int mvdeleteln(y,x)
-int mvwdeleteln(win,y,x)
-
-void delwin(win)       delete a window or a subwindow
-void doupdate()        update physical screen
-void echo()    set terminal echo mode
-int endwin()   cleanup and curses finitialization
-
-void werase(win)       erase a window
-void erase()
-
-int erasechar()        return char delete character
-int fixterm()  dummy for compatibility
-void flushinp()        kill pending keyboard input
-
-int wgetch(win)        get char via a window
-int getch()
-int mvgetch(y,x)
-int mvwgetch(win,y,x)
-
-int wgetstr(win,str)   get string via window to a buffer
-int getstr(str)
-int mvgetstr(y,x,str)
-int mvwgetstr(win,y,x,str)
-
-void getyx(win,y,x)    get a window's cursor position
-
-int gettmode() dummy for compatibility
-void idlok(win,bf)     dummy for compatibility
-WINDOW *initscr()      curses initialization (ret stdscr or NULL)
-
-int winch(win) get char at window cursor
-int inch()
-int mvinch(y,x)
-int mvwinch(win,y,x)
-
-int winsch(win,ch)     insert character in a window
-int insch(ch)
-int mvinsch(y,x,ch)
-int mvwinsch(win,y,x,ch)
-
-int winsertln(win)     insert new line in a window
-int insertln()
-int mvinsertln(y,x)
-int mvwinsertln(win,y,x)
-
-void keypad(win,bf)    marks a window for keypad usage
-int killchar() return line delete character
-char *longname()       returns terminal description string
-void leaveok(win,bf)   marks window for cursor 'update leave'
-void meta(win,bf)      marks window for meta
-int move(y,x)  move cursor in stdscr
-int mvcur(oldy,oldx,y,x)       move terminal cursor to <y,x>
-
-int mvprintw(y,x,fmt,args)     move & print string in stdscr
-
-int mvscanw(y,x,fmt,args)      move & get values via stdscr
-int mvwin(win,y,x)     move window on physical screen
-int mvwprintw(win,x,y,fmt,args)        move & print string in a window
-int mvwscanw(win,y,x,fmt,args) move & get values via a window
-WINDOW *newwin(lines,cols,begy,begx)   create a new window
-void nl()      set terminal cr-crlf mapping mode
-void nocbreak()        unset terminal cbreak mod
-void nodelay(win,bf)   marks window for no input wait
-void noecho()  unset terminal echo mode
-void nonl()    unset terminal cr-crlf mapping mode
-void noraw()   unset raw terminal mode
-void overlay(win1,win2)        overlay one window on another
-void overwrite(win1,win2)      overwrite one window on another
-int printw(fmt,args)   print string in stdscr
-void raw()     set raw terminal mode
-void refrbrk(bf)       set screen update break mode
-void refresh() refresh stdscr
-int resetterm()        dummy for compatibility
-int resetty()  restore terminal I/O modes
-int saveoldterm()      dummy for compatibility
-int saveterm() dummy for compatibility
-int savetty()  save terminal I/O modes
-int scanw(fmt,args)    get values via stdscr
-void scroll(win)       scroll scrolling region of a window
-void scrollok(win,bf)  marks a window to allow scroll
-void setcolors(A_COLOR(for,back))      sets the forground and background
-       colors of stdscr
-void set_curs(visibility)      0 for invisible, 1 for visible, 2 for good
-       visible
-int setsrcreg(miny,maxy)       define stdscr's scroll region
-int setterm()  dummy for compatibility
-int setupterm(term,fd,errret)  set up terminal
-void standend()        start normal chars in stdscr
-void standout()        start standout chars in stdscr
-WINDOW *subwin(win,lines,cols,begy,begx)
-       create a sub-window in window win
-int tabsize(ts)        set/get tabsize of stdscr
-void touchwin(win)     mark a window as totally modified
-char *unctrl(ch)       char-to-string converter
-int wmove(win,y,x)     move cursor in a window
-void wnoutrefresh(win) create internal screen image
-int wprintw(win,fmt,args)      print string in a window
-void wrefresh(win)     refresh window
-int wscanw(win,fmt,args)       get values via a window
-void wsetcolors(win,A_COLOR(for,back)) sets the forground and
-       background colors of the specified window
-int wsetsrcreg(win,miny,maxy)  define a window's scrolling region
-void wstandend(win)    start normal chars in window
-void wstandout(win)    start standout chars in window
-int wtabsize(win,ts)   set/get tabsize of a window
-.SH BUGS
-Function keys are not available under the MINIX version.
-.\" $PchId: curses.3,v 1.3 1996/02/22 21:26:28 philip Exp $
index f2bcc1cb058f668a14d27cd1d4a63619d320916c..a670a384526eef8fc88dd44b342608da3aeef51f 100644 (file)
@@ -7,7 +7,7 @@ FILES=  bsd.dep.mk bsd.files.mk \
        bsd.inc.mk \
        bsd.init.mk bsd.kinc.mk bsd.klinks.mk bsd.lib.mk \
        bsd.links.mk bsd.man.mk bsd.obj.mk bsd.own.mk \
-       bsd.prog.mk bsd.subdir.mk bsd.sys.mk \
+       bsd.prog.mk bsd.subdir.mk bsd.sys.mk bsd.doc.mk \
        sys.mk
 
 # MINIX-specific files
diff --git a/share/mk/bsd.doc.mk b/share/mk/bsd.doc.mk
new file mode 100644 (file)
index 0000000..d6fd9de
--- /dev/null
@@ -0,0 +1,73 @@
+#      $NetBSD: bsd.doc.mk,v 1.64 2006/03/16 18:43:34 jwise Exp $
+#      @(#)bsd.doc.mk  8.1 (Berkeley) 8/14/93
+
+.include <bsd.init.mk>
+
+##### Basic targets
+clean:         cleandoc
+realinstall:   docinstall
+
+##### Build rules
+.if !target(paper.ps)
+paper.ps: ${SRCS}
+       ${_MKTARGET_FORMAT}
+       ${TOOL_ROFF_PS} ${MACROS} ${PAGES} ${.ALLSRC} > ${.TARGET}
+.endif
+
+.if ${MKSHARE} != "no"
+realall:       paper.ps
+.endif
+
+##### Install rules
+docinstall::   # ensure existence
+.PHONY:                docinstall
+
+.if ${MKDOC} != "no"
+
+__docinstall: .USE
+       ${_MKTARGET_INSTALL}
+       ${INSTALL_FILE} -o ${DOCOWN} -g ${DOCGRP} -m ${DOCMODE} \
+               ${.ALLSRC} ${.TARGET}
+
+FILES?=                ${SRCS}
+
+.for F in Makefile ${FILES:O:u} ${EXTRA}
+_F:=           ${DESTDIR}${DOCDIR}/${DIR}/${F}         # installed path
+
+.if ${MKUPDATE} == "no"
+${_F}!         ${F} __docinstall                       # install rule
+.if !defined(BUILD) && !make(all) && !make(${F})
+${_F}!         .MADE                                   # no build at install
+.endif
+.else
+${_F}:         ${F} __docinstall                       # install rule
+.if !defined(BUILD) && !make(all) && !make(${F})
+${_F}:         .MADE                                   # no build at install
+.endif
+.endif
+
+docinstall::   ${_F}
+.PRECIOUS:     ${_F}                                   # keep if install fails
+.endfor
+
+.undef _F
+.endif # ${MKDOC} != "no"
+
+##### Clean rules
+cleandoc: .PHONY
+       rm -f paper.* [eE]rrs mklog ${CLEANFILES}
+
+##### Custom rules
+.if !target(print)
+print: .PHONY paper.ps
+       lpr -P${PRINTER} ${.ALLSRC}
+.endif
+
+spell: .PHONY ${SRCS}
+       spell ${.ALLSRC} | sort | comm -23 - spell.ok > paper.spell
+
+##### Pull in related .mk logic
+.include <bsd.obj.mk>
+.include <bsd.sys.mk>
+
+${TARGETS}:    # ensure existence
index c7b04ba795c63b2a5a715c1e731ca9c5c67591d1..e89461449fe500ca41b47de28a2443ce38cac8d0 100644 (file)
@@ -3,6 +3,7 @@ lib/nbsd_libc           src/lib/libc
 lib/nbsd_libm          src/lib/libm
 lib/libcrypt           src/lib/libcrypt
 lib/libterminfo                src/lib/libterminfo
+lib/libcurses          src/lib/libcurses
 nbsd_include           src/include
 usr.bin/m4             src/usr.bin/m4
 usr.bin/indent         src/usr.bin/indent
index d64f61319164bede41eb618cf1b0817b4fe5eda5..79e5a6b96cd7c9211e0fd63ebed04dbba5a295cb 100644 (file)
@@ -8,4 +8,7 @@ SUBDIR= indent m4 stat tic sed mkdep uniq
 # Non-NetBSD imports
 SUBDIR+= ministat mkimage
 
+# Minix commands
+SUBDIR+= top
+
 .include <bsd.subdir.mk>
index fb17b6ac9b2a85fb12fa7a604984c9ccb9cd94a5..7c252331e9126d1d1f7a7a2c18e034a505f78aa4 100644 (file)
@@ -2,7 +2,7 @@
 CC:=${CC:C/^cc/clang/}
 COMPILER_TYPE:= gnu
 
-CPPFLAGS+= -D_NETBSD_SOURCE
+CPPFLAGS+= -D_NETBSD_SOURCE -D__NBSD_LIBC=1
 
 BINDIR?=/usr/bin
 
diff --git a/usr.bin/top/Makefile b/usr.bin/top/Makefile
new file mode 100644 (file)
index 0000000..52efde9
--- /dev/null
@@ -0,0 +1,7 @@
+PROG=  top
+MAN=
+
+DPADD+= ${LIBCURSES} ${LIBTERMINFO}
+LDADD+= -lcurses -lterminfo
+
+.include <bsd.prog.mk>
similarity index 98%
rename from commands/top/top.c
rename to usr.bin/top/top.c
index 1669f7412708b7a15e12a0468be1f0dafe390039..950b245a25081ebb82148f2d3b3ebb4430480b94 100644 (file)
@@ -6,10 +6,10 @@
 #define _POSIX_SOURCE 1
 
 #include <stdio.h>
+#include <unistd.h>
 #include <pwd.h>
 #include <curses.h>
 #include <timers.h>
-#include <unistd.h>
 #include <stdlib.h>
 #include <limits.h>
 #include <termcap.h>
@@ -234,8 +234,8 @@ int print_memory(void)
 
        fclose(fp);
 
-       printf("main memory: %uK total, %uK free, %uK contig free, "
-               "%uK cached\n",
+       printf("main memory: %ldK total, %ldK free, %ldK contig free, "
+               "%ldK cached\n",
                (pagesize * total)/1024, (pagesize * free)/1024,
                (pagesize * largest)/1024, (pagesize * cached)/1024);
 
@@ -364,7 +364,7 @@ void print_proc(struct tp *tp, u32_t tcyc)
        printf("%6ldK", (pr->p_memory + 512) / 1024);
        printf("%6s", (pr->p_flags & BLOCKED) ? "" : "RUN");
        ticks = pr->p_user_time;
-       printf(" %3ld:%02ld ", (ticks/system_hz/60), (ticks/system_hz)%60);
+       printf(" %3u:%02u ", (ticks/system_hz/60), (ticks/system_hz)%60);
 
        pcyc = div64u(tp->ticks, SCALE);
 
@@ -598,12 +598,6 @@ void init(int *rows)
        if((v = tgetstr ("li", &s)) != NULL)
                sscanf(v, "%d", rows);
        if(*rows < 1) *rows = 24;
-       if(!initscr()) {
-               fprintf(stderr, "initscr() failed\n");
-               exit(1);
-       }
-       cbreak();
-       nl();
 }
 
 void sigwinch(int sig) { }
@@ -677,6 +671,7 @@ int main(int argc, char *argv[])
 
                FD_ZERO(&fds);
                FD_SET(STDIN_FILENO, &fds);
+
                if((ns=select(STDIN_FILENO+1, &fds, NULL, NULL, &tv)) < 0
                        && errno != EINTR) {
                        perror("select");