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