#include <sys/cdefs.h>
#ifndef __APPLE__
__FBSDID("$FreeBSD: src/usr.bin/talk/display.c,v 1.11 2003/07/04 20:44:25 luigi Exp $");
#ifndef lint
static const char sccsid[] = "@(#)display.c 8.1 (Berkeley) 6/6/93";
#endif
#endif
#include <ctype.h>
#include "talk.h"
xwin_t my_win;
xwin_t his_win;
WINDOW *line_win;
int curses_initialized = 0;
int
max(a,b)
int a, b;
{
return (a > b ? a : b);
}
void
display(win, text, size)
xwin_t *win;
char *text;
int size;
{
int i;
char cch;
for (i = 0; i < size; i++) {
if (*text == '\n' || *text == '\r') {
waddch(win->x_win, '\n');
getyx(win->x_win, win->x_line, win->x_col);
text++;
continue;
}
if (*text == 004 && win == &my_win) {
werase(my_win.x_win);
getyx(my_win.x_win, my_win.x_line, my_win.x_col);
wrefresh(my_win.x_win);
werase(his_win.x_win);
getyx(his_win.x_win, his_win.x_line, his_win.x_col);
wrefresh(his_win.x_win);
text++;
continue;
}
if ( *text == win->cerase
|| *text == 010
|| *text == 0177
) {
wmove(win->x_win, win->x_line, max(--win->x_col, 0));
getyx(win->x_win, win->x_line, win->x_col);
waddch(win->x_win, ' ');
wmove(win->x_win, win->x_line, win->x_col);
getyx(win->x_win, win->x_line, win->x_col);
text++;
continue;
}
if ( *text == win->werase
|| *text == 027
) {
int endcol, xcol, ii, c;
endcol = win->x_col;
xcol = endcol - 1;
while (xcol >= 0) {
c = readwin(win->x_win, win->x_line, xcol);
if (c != ' ')
break;
xcol--;
}
while (xcol >= 0) {
c = readwin(win->x_win, win->x_line, xcol);
if (c == ' ')
break;
xcol--;
}
wmove(win->x_win, win->x_line, xcol + 1);
for (ii = xcol + 1; ii < endcol; ii++)
waddch(win->x_win, ' ');
wmove(win->x_win, win->x_line, xcol + 1);
getyx(win->x_win, win->x_line, win->x_col);
text++;
continue;
}
if ( *text == win->kill
|| *text == 025
) {
wmove(win->x_win, win->x_line, 0);
wclrtoeol(win->x_win);
getyx(win->x_win, win->x_line, win->x_col);
text++;
continue;
}
if (*text == '\f') {
if (win == &my_win)
wrefresh(curscr);
text++;
continue;
}
if (*text == '\7') {
write(STDOUT_FILENO, text, 1);
text++;
continue;
}
if (!isprint((unsigned char)*text) && *text != '\t') {
waddch(win->x_win, '^');
getyx(win->x_win, win->x_line, win->x_col);
cch = (*text & 63) + 64;
waddch(win->x_win, cch);
} else
waddch(win->x_win, (unsigned char)*text);
getyx(win->x_win, win->x_line, win->x_col);
text++;
}
wrefresh(win->x_win);
}
int
readwin(win, line, col)
WINDOW *win;
int line;
int col;
{
int oldline, oldcol;
int c;
getyx(win, oldline, oldcol);
wmove(win, line, col);
c = winch(win);
wmove(win, oldline, oldcol);
return (c);
}