/******************************************************************************
* This file is part of a software distribution, which is furnished under the *
* terms of a license. Use of this software by any means is subject to this *
* license and signifies the acceptance of the licensing terms stated *
* therein. Please see the file LICENSE in the top-level directory of this *
* software distribution for detailed copyright disclaimers and licensing *
* terms. *
******************************************************************************
* Copryight (c) by Andreas S. Wetzel - All rights reserved. *
******************************************************************************/
/* $Id: tcap.c,v 1.2 2001/03/19 14:54:02 mickey Exp $ */
#include <vchat.h>
#include <proto_common.h>
#if USE_TERMCAP
#define BUFADDR &termptr
#endif
/*** Globals ***/
VTCAP vtcap;
/*** Externals ***/
extern VP vp;
extern char nlstr[];
extern char *prog_name;
extern SIZE *getsize(void);
#if HAVE_TERMCAP_H
extern char PC;
extern char *BC;
extern char *UP;
#endif
/*
* int init_vtcap(void);
*
* Load the required terminal capabilities for the terminal type given
* in <vp.emulation> from the termcap / terminfo database into the global
* VTCAP structure. Check that the terminal capabilities satisfy the
* minimum requirements and that the window size is at least 40x4 chars.
* Returns 0 if successfull or -1 in case of failure.
*/
int init_vtcap(void)
{
SIZE *sz;
#if USE_TERMCAP
char *tmp;
char *termptr = vtcap.tbuf;
#else
int errret;
#endif
/*
* Start with a clean VTCAP structure
*/
BZERO(&vtcap, sizeof(VTCAP));
/*
* Get an idea of the screensize.
*/
sz = getsize();
#if USE_TERMCAP
/*
* Let's have a look at the termcap database files.
*/
switch(tgetent(vtcap.capbuf, vp.emulation))
{
case -1: printf("%s: Unable to open termcap database - please inform operator%s", prog_name, nlstr);
return(-1);
case 0: printf("%s: No termcap database entry for terminal type '%s'%s", prog_name, vp.emulation, nlstr);
return(-1);
default: printf("Loading termcap entry '%s'%s", vp.emulation, nlstr);
break;
}
/*
* Extract required terminal capabilities from termcap database
*/
vtcap.home = (char *) tgetstr("ho", BUFADDR);
vtcap.cls = (char *) tgetstr("cl", BUFADDR);
vtcap.pos = (char *) tgetstr("cm", BUFADDR);
vtcap.scr_reg = (char *) tgetstr("cs", BUFADDR);
vtcap.ck_app = (char *) tgetstr("ks", BUFADDR);
vtcap.ck_pos = (char *) tgetstr("ke", BUFADDR);
vtcap.csave = (char *) tgetstr("sc", BUFADDR);
vtcap.crestore = (char *) tgetstr("rc", BUFADDR);
vtcap.scrollf = (char *) tgetstr("sf", BUFADDR);
vtcap.scrollr = (char *) tgetstr("sr", BUFADDR);
vtcap.clear2eol = (char *) tgetstr("ce", BUFADDR);
vtcap.clear2eod = (char *) tgetstr("cd", BUFADDR);
vtcap.metamode_on = (char *) tgetstr("mm", BUFADDR);
vtcap.metamode_off = (char *) tgetstr("mo", BUFADDR);
vtcap.insert_on = (char *) tgetstr("im", BUFADDR);
vtcap.insert_off = (char *) tgetstr("ei", BUFADDR);
vtcap.delete_on = (char *) tgetstr("dm", BUFADDR);
vtcap.delete_off = (char *) tgetstr("ed", BUFADDR);
vtcap.insertchar = (char *) tgetstr("ic", BUFADDR);
vtcap.deletechar = (char *) tgetstr("dc", BUFADDR);
vtcap.term_init = (char *) tgetstr("is", BUFADDR);
vtcap.term_reset = (char *) tgetstr("rs", BUFADDR);
vtcap.numcolors = tgetnum("Co");
vtcap.set_fg_color = (char *) tgetstr("Sf", BUFADDR);
vtcap.set_bg_color = (char *) tgetstr("Sb", BUFADDR);
vtcap.reset_color = (char *) tgetstr("op", BUFADDR);
vtcap.reverse = (char *) tgetstr("mr", BUFADDR);
vtcap.underline = (char *) tgetstr("us", BUFADDR);
vtcap.bold = (char *) tgetstr("md", BUFADDR);
vtcap.blink = (char *) tgetstr("mb", BUFADDR);
vtcap.dim = (char *) tgetstr("mh", BUFADDR);
vtcap.protected = (char *) tgetstr("mp", BUFADDR);
vtcap.off = (char *) tgetstr("me", BUFADDR);
/*
* Key sequences for input processing
*/
vtcap.key_cursup = (char *) tgetstr("ku", BUFADDR);
vtcap.key_cursdown = (char *) tgetstr("kd", BUFADDR);
vtcap.key_cursleft = (char *) tgetstr("kl", BUFADDR);
vtcap.key_cursright = (char *) tgetstr("kr", BUFADDR);
vtcap.key_bs = (char *) tgetstr("kb", BUFADDR);
vtcap.key_delete = (char *) tgetstr("kD", BUFADDR);
vtcap.key_insert = (char *) tgetstr("kI", BUFADDR);
vtcap.key_cleareol = (char *) tgetstr("kE", BUFADDR);
vtcap.key_cleareos = (char *) tgetstr("kS", BUFADDR);
vtcap.key_scrollf = (char *) tgetstr("kF", BUFADDR);
vtcap.key_scrollr = (char *) tgetstr("kR", BUFADDR);
vtcap.key_delln = (char *) tgetstr("kL", BUFADDR);
vtcap.key_cls = (char *) tgetstr("kC", BUFADDR);
vtcap.key_prevpage = (char *) tgetstr("kP", BUFADDR);
vtcap.key_nextpage = (char *) tgetstr("kN", BUFADDR);
vtcap.cols = (sz->x > 0) ? sz->x : tgetnum("co");
vtcap.rows = (sz->y > 0) ? sz->y : tgetnum("li");
tmp = (char *) tgetstr("pc", BUFADDR);
PC = tmp ? *tmp : 0;
BC = (char *) tgetstr("le", BUFADDR);
UP = (char *) tgetstr("up", BUFADDR);
#else /*** TERMINFO ***/
/*
* Have a look at the terminfo database
*/
setupterm(vp.emulation, 0, &errret);
switch(errret)
{
case -1: printf("%s: Unable to open terminfo database - please inform operator%s", prog_name, nlstr);
return(-1);
case 0: printf("%s: No terminfo database entry for terminal type '%s'%s", prog_name, vp.emulation, nlstr);
return(-1);
case 1: printf("Loading terminfo entry '%s'%s", vp.emulation, nlstr);
break;
}
/*
* Extract required terminal capabilities from terminfo database
*/
vtcap.home = getcap("home"); /* cursor_home */
vtcap.cls = getcap("clear"); /* clear_screen */
vtcap.pos = getcap("cup"); /* cursor_address */
vtcap.scr_reg = getcap("csr"); /* change_scroll_region */
vtcap.ck_app = getcap("smkx"); /* keypad_xmit */
vtcap.ck_pos = getcap("rmkx"); /* keypad_local */
vtcap.csave = getcap("sc"); /* save_cursor */
vtcap.crestore = getcap("rc"); /* restore_cursor */
vtcap.scrollf = getcap("ind"); /* scroll_forward */
vtcap.scrollr = getcap("ri"); /* scroll_reverse */
vtcap.clear2eol = getcap("el"); /* clr_eol */
vtcap.clear2eod = getcap("ed"); /* clr_eos */
vtcap.metamode_on = getcap("smm"); /* meta_on */
vtcap.metamode_off = getcap("rmm"); /* meta_off */
vtcap.insert_on = getcap("smir"); /* enter_insert_mode */
vtcap.insert_off = getcap("rmir"); /* exit_insert_mode */
vtcap.delete_on = getcap("smdc"); /* enter_delete_mode */
vtcap.delete_off = getcap("rmdc"); /* exit_delete_mode */
vtcap.insertchar = getcap("ich1"); /* insert_character */
vtcap.deletechar = getcap("dch1"); /* delete_character */
vtcap.term_init = getcap("is1"); /* init_1string */
vtcap.term_reset = getcap("rs1"); /* reset_1string */
vtcap.numcolors = tigetnum("colors"); /* max_colors */
vtcap.set_fg_color = getcap("setf"); /* set_foreground */
vtcap.set_bg_color = getcap("setb"); /* set_background */
vtcap.reset_color = getcap("op"); /* orig_pair */
vtcap.reverse = getcap("rev"); /* enter_reverse_mode */
vtcap.underline = getcap("smul"); /* enter_underline_mode */
vtcap.bold = getcap("bold"); /* enter_bold_mode */
vtcap.blink = getcap("blink"); /* enter_blink_mode */
vtcap.dim = getcap("dim"); /* enter_dim_mode */
vtcap.protected = getcap("prot"); /* enter_protected_mode */
vtcap.off = getcap("sgr0"); /* exit_attribute_mode */
/*
* Key sequences for input processing
*/
vtcap.key_cursup = getcap("kcuu1"); /* key_up */
vtcap.key_cursdown = getcap("kcud1"); /* key_down */
vtcap.key_cursleft = getcap("kcub1"); /* key_left */
vtcap.key_cursright = getcap("kcuf1"); /* key_right */
vtcap.key_bs = getcap("kbs"); /* key_backspace */
vtcap.key_delete = getcap("kdch1"); /* key_dc */
vtcap.key_insert = getcap("kich1"); /* key_ic */
vtcap.key_cleareol = getcap("kel"); /* key_eol */
vtcap.key_cleareos = getcap("ked"); /* key_eos */
vtcap.key_scrollf = getcap("kind"); /* key_sf */
vtcap.key_scrollr = getcap("kri"); /* key_sr */
vtcap.key_delln = getcap("kdl1"); /* key_dl */
vtcap.key_cls = getcap("kclr"); /* key_clear */
vtcap.key_prevpage = getcap("kpp"); /* key_ppage */
vtcap.key_nextpage = getcap("knp"); /* key_npage */
vtcap.cols = (sz->x > 0) ? sz->x : tigetnum("cols");
vtcap.rows = (sz->y > 0) ? sz->y : tigetnum("lines");
#endif
/*
* Check if all mandatory terminal capabilities are defined
*/
if(!vtcap.cls)
{
printf("%s: Terminal type '%s' can not clear screen - aborted\n\n",
prog_name, vp.emulation);
return(-1);
}
else if(!vtcap.scr_reg)
{
printf("%s: Terminal type '%s' can not set scroll region - aborted\n\n",
prog_name, vp.emulation);
return(-1);
}
else if(!vtcap.pos)
{
printf("%s: Terminal type '%s' can not position cursor - aborted\n\n",
prog_name, vp.emulation);
return(-1);
}
else if(!vtcap.clear2eol && !vtcap.clear2eod)
{
printf("%s: Terminal type '%s' can neither clear to EOL nor to EOD - aborted\n\n",
prog_name, vp.emulation);
return(-1);
}
/*
* Check that the window size is at least 40x4 characters
*/
if(vtcap.cols < 40 || vtcap.rows < 4)
{
printf("Your screen is too small - use at least 40 x 4%s", nlstr);
return(-1);
}
/*
* All well...
*/
return(0);
}
#if USE_TERMINFO
char *getcap(char *capname)
{
char *tmp = tigetstr(capname);
return((tmp == (char *)-1) ? NULL : tmp);
}
#endif
syntax highlighted by Code2HTML, v. 0.9.1