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 \
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 \
.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
+++ /dev/null
-PROG= gomoku
-MAN=
-
-DPADD+= ${LIBCURSES}
-LDADD+= -lcurses
-
-.include <bsd.prog.mk>
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-PROG= life
-MAN=
-
-DPADD+= ${LIBCURSES}
-LDADD+= -lcurses
-
-.include <bsd.prog.mk>
+++ /dev/null
-/* 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();
- }
-}
+++ /dev/null
-PROG= mixer
-MAN=
-
-DPADD+= ${LIBCURSES}
-LDADD+= -lcurses
-
-.include <bsd.prog.mk>
+++ /dev/null
-/*
- * 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);
-}
+++ /dev/null
-# 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>
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-/* 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));
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-/* proto.h Copyright Michael Temari 08/01/1996 All Rights Reserved */
-
-_PROTOTYPE(int TalkInit, (void));
+++ /dev/null
-/* 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();
-}
+++ /dev/null
-/* 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
+++ /dev/null
-/* 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;
-}
+++ /dev/null
-/* 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 */
+++ /dev/null
-# 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>
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-/* finduser.h Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-_PROTOTYPE(int find_user, (char *name, char *tty));
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-/* 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));
+++ /dev/null
-/* 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));
-}
+++ /dev/null
-/* process.h Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-_PROTOTYPE(int processrequest, (struct talk_request *request, struct talk_reply *reply));
+++ /dev/null
-/* 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 */
+++ /dev/null
-/* 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);
-}
+++ /dev/null
-/* talkd.h Copyright Michael Temari 07/22/1996 All Rights Reserved */
-
-extern int opt_d; /* debug option */
-extern char myhostname[];
+++ /dev/null
-PROG= top
-MAN=
-
-DPADD+= ${LIBCURSES}
-LDADD+= -lcurses
-
-.include <bsd.prog.mk>
.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 \
+++ /dev/null
-/* 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 */
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
# 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 \
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"
--- /dev/null
+#$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..
--- /dev/null
+/* $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 );
+}
+
--- /dev/null
+/*
+ * 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();
+}
-# 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>
--- /dev/null
+# $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>
--- /dev/null
+.\" $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
--- /dev/null
+.\" $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
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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
--- /dev/null
+.\" $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
--- /dev/null
+.\" $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).
--- /dev/null
+.\" $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
--- /dev/null
+.\" $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.
--- /dev/null
+.\" $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.
--- /dev/null
+.\" $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);
+}
+
+
+
+
--- /dev/null
+.\" $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);
+}
--- /dev/null
+.\" 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
--- /dev/null
+.\" $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"
+
+
+
+
--- /dev/null
+.\" $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.
--- /dev/null
+.\" $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
--- /dev/null
+.\" $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.
--- /dev/null
+.\" $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
--- /dev/null
+.\" $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.
--- /dev/null
+.\" $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
--- /dev/null
+.\" $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();
+}
--- /dev/null
+.\" $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
+..
--- /dev/null
+/* $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();
+ }
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+.\" $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
--- /dev/null
+/* $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 */
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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
+}
--- /dev/null
+/* $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));
+}
--- /dev/null
+/* $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;
+}
--- /dev/null
+/* $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));
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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;
+}
--- /dev/null
+/* $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 */
+}
+++ /dev/null
-#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);
-}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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;
+}
+++ /dev/null
-#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);
-}
--- /dev/null
+/* $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;
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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));
+}
--- /dev/null
+/* $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
+ }
+ }
+ }
+}
--- /dev/null
+/* $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;
+}
+
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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
--- /dev/null
+/* $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;
+}
-#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);
+}
+
--- /dev/null
+.\" $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
--- /dev/null
+/* $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
--- /dev/null
+/* $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_ */
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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.
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 \ Ta KEY_SHELP Ta Shift Help
+.It \ Ta KEY_SHOME Ta Shift Home
+.It \ Ta KEY_SIC Ta Shift Insert Character
+.It \ 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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+/* $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;
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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.
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
--- /dev/null
+.\" $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 .
+++ /dev/null
-#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;
-}
+++ /dev/null
-/* 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 */
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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));
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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;
+}
+++ /dev/null
-#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);
-}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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;
+}
--- /dev/null
+/*
+ * 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
+++ /dev/null
-#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);
-}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+#!/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);
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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 */
--- /dev/null
+/* $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;
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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];
+ }
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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;
+}
-/* 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);
}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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));
+}
--- /dev/null
+/* $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;
+}
--- /dev/null
+/* $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;
+}
--- /dev/null
+/* $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 */
+}
--- /dev/null
+/* $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_ */
--- /dev/null
+/* $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 */
+}
+
--- /dev/null
+/* $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;
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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 */
+}
-#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);
}
--- /dev/null
+/* $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);
+}
+
-#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;
+ }
}
+++ /dev/null
-#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);
-}
--- /dev/null
+/* $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);
+}
+/* $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;
+ }
}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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;
+}
+++ /dev/null
-#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;
-{
-}
-/****************************************************************/
-/* 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);
}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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)
+++ /dev/null
-#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 */
--- /dev/null
+/* $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 */
-/* 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 = ␣
+#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 */
--- /dev/null
+/* $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;
+}
--- /dev/null
+/* $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)
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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);
+}
+++ /dev/null
-/****************************************************************/
-/* 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 */
-#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;
+}
--- /dev/null
+# $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
--- /dev/null
+/* $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);
+}
+++ /dev/null
-/****************************************************************/
-/* 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 */
+++ /dev/null
-#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 */
--- /dev/null
+/* $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;
+ }
+}
--- /dev/null
+/* $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);
+}
--- /dev/null
+/* $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;
+ }
+}
--- /dev/null
+/* $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");
+}
--- /dev/null
+/* $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());
+}
--- /dev/null
+/* $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 */
+}
-/****************************************************************/
-/* 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 */
--- /dev/null
+/* $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_ */
--- /dev/null
+/* $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;
+}
+++ /dev/null
-#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 */
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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 */
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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);
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-#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;
-}
+++ /dev/null
-/****************************************************************/
-/* 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 */
+++ /dev/null
-/****************************************************************/
-/* 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 */
+++ /dev/null
-#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 */
+++ /dev/null
-/****************************************************************/
-/* 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 */
+++ /dev/null
-#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);
-}
+++ /dev/null
-/****************************************************************/
-/* 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 */
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
+++ /dev/null
-.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)
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 \
+++ /dev/null
-.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 $
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
--- /dev/null
+# $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
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
# Non-NetBSD imports
SUBDIR+= ministat mkimage
+# Minix commands
+SUBDIR+= top
+
.include <bsd.subdir.mk>
CC:=${CC:C/^cc/clang/}
COMPILER_TYPE:= gnu
-CPPFLAGS+= -D_NETBSD_SOURCE
+CPPFLAGS+= -D_NETBSD_SOURCE -D__NBSD_LIBC=1
BINDIR?=/usr/bin
--- /dev/null
+PROG= top
+MAN=
+
+DPADD+= ${LIBCURSES} ${LIBTERMINFO}
+LDADD+= -lcurses -lterminfo
+
+.include <bsd.prog.mk>
#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>
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);
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);
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) { }
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
+
if((ns=select(STDIN_FILENO+1, &fds, NULL, NULL, &tv)) < 0
&& errno != EINTR) {
perror("select");