/******************************************************************************
 * 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