V10/ncurses/screen/nttychktrm.c
#include "curses.ext"
/* @(#) nttychktrm.c: 1.1 10/15/83 1/5/83 */
char *_c_why_not = NULL;
static char *
_stupid = "Sorry, I don't know how to deal with your '%s' terminal.\r\n";
static char *
_unknown = "Sorry, I need to know a more specific terminal type than '%s'.\r\n";
struct screen *
_new_tty(type, fd)
char *type;
FILE *fd;
{
int retcode;
struct map *_init_keypad();
char *calloc();
#ifdef DEBUG
if(outf) fprintf(outf, "__new_tty: type %s, fd %x\n", type, fd);
#endif
/*
* Allocate an SP structure if there is none, or if SP is
* still pointing to an old structure from a previous call
* to this routine. But don't allocate one if we are being
* called from a higher level curses routine. Since it's our
* job to initialize the phys_scr field and higher level routines
* aren't supposed to, we check that field to figure which to do.
*/
if (SP == NULL || SP->cur_body!=0)
SP = (struct screen *) calloc(1, sizeof (struct screen));
SP->term_file = fd;
if (type == 0)
type = "unknown";
_setbuffered(fd);
setupterm(type, fileno(fd), &retcode);
if (retcode < 0) {
/*
* This happens if /usr/lib/terminfo doesn't exist, there is
* no such terminal type, or the file is corrupted.
* This would be a good place to print an error message.
*/
return NULL;
}
savetty(); /* as a "useful default" - hanging up is nasty. */
if (chk_trm() == ERR)
return NULL;
SP->tcap = cur_term;
SP->doclear = 1;
SP->cur_body = (struct line **) calloc(lines+2, sizeof (struct line *));
SP->std_body = (struct line **) calloc(lines+2, sizeof (struct line *));
#ifdef KEYPAD
SP->kp = _init_keypad();
#endif
SP->input_queue = (short *) calloc(20, sizeof (short));
SP->input_queue[0] = -1;
SP->virt_x = 0; /* X and Y coordinates of the SP->curptr */
SP->virt_y = 0; /* between updates. */
_init_costs();
return SP;
}
static int
chk_trm()
{
#ifdef DEBUG
if(outf) fprintf(outf, "chk_trm().\n");
#endif
if (generic_type) {
_c_why_not = _unknown;
return ERR;
}
if (clear_screen == 0 || hard_copy || over_strike) {
_c_why_not = _stupid;
return ERR;
}
if (cursor_address) {
/* we can handle it */
} else
if ( (cursor_up || cursor_home) /* some way to move up */
&& cursor_down /* some way to move down */
&& (cursor_left || carriage_return) /* ... move left */
/* printing chars moves right */
) {
/* we can handle it */
} else {
_c_why_not = _stupid;
return ERR;
}
return OK;
}