10e3d5408SPeter Wemm /**************************************************************************** 2*e1865124SBaptiste Daroussin * Copyright 2018,2020 Thomas E. Dickey * 3*e1865124SBaptiste Daroussin * Copyright 1998-2016,2017 Free Software Foundation, Inc. * 40e3d5408SPeter Wemm * * 50e3d5408SPeter Wemm * Permission is hereby granted, free of charge, to any person obtaining a * 60e3d5408SPeter Wemm * copy of this software and associated documentation files (the * 70e3d5408SPeter Wemm * "Software"), to deal in the Software without restriction, including * 80e3d5408SPeter Wemm * without limitation the rights to use, copy, modify, merge, publish, * 90e3d5408SPeter Wemm * distribute, distribute with modifications, sublicense, and/or sell * 100e3d5408SPeter Wemm * copies of the Software, and to permit persons to whom the Software is * 110e3d5408SPeter Wemm * furnished to do so, subject to the following conditions: * 120e3d5408SPeter Wemm * * 130e3d5408SPeter Wemm * The above copyright notice and this permission notice shall be included * 140e3d5408SPeter Wemm * in all copies or substantial portions of the Software. * 150e3d5408SPeter Wemm * * 160e3d5408SPeter Wemm * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * 170e3d5408SPeter Wemm * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * 180e3d5408SPeter Wemm * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * 190e3d5408SPeter Wemm * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 200e3d5408SPeter Wemm * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 210e3d5408SPeter Wemm * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * 220e3d5408SPeter Wemm * THE USE OR OTHER DEALINGS IN THE SOFTWARE. * 230e3d5408SPeter Wemm * * 240e3d5408SPeter Wemm * Except as contained in this notice, the name(s) of the above copyright * 250e3d5408SPeter Wemm * holders shall not be used in advertising or otherwise to promote the * 260e3d5408SPeter Wemm * sale, use or other dealings in this Software without prior written * 270e3d5408SPeter Wemm * authorization. * 280e3d5408SPeter Wemm ****************************************************************************/ 290e3d5408SPeter Wemm 300e3d5408SPeter Wemm /**************************************************************************** 310e3d5408SPeter Wemm * Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 * 320e3d5408SPeter Wemm * and: Eric S. Raymond <esr@snark.thyrsus.com> * 337d0e8efaSRong-En Fan * and: Thomas E. Dickey 1996-on * 3406bfebdeSXin LI * and: Juergen Pfeifer * 35a17d2cb2SPeter Wemm * * 36a17d2cb2SPeter Wemm * some of the code in here was contributed by: * 37a17d2cb2SPeter Wemm * Magnus Bengtsson, d6mbeng@dtek.chalmers.se (Nov'93) * 387d0e8efaSRong-En Fan * (but it has changed a lot) * 390e3d5408SPeter Wemm ****************************************************************************/ 400e3d5408SPeter Wemm 415bd21f8aSPeter Wemm /* $FreeBSD$ */ 425bd21f8aSPeter Wemm 43d91c14deSPeter Wemm #define __INTERNAL_CAPS_VISIBLE 440e3d5408SPeter Wemm #include <curses.priv.h> 450e3d5408SPeter Wemm 460e3d5408SPeter Wemm #include <termcap.h> 470e3d5408SPeter Wemm #include <tic.h> 48a17d2cb2SPeter Wemm #include <ctype.h> 490e3d5408SPeter Wemm 5006bfebdeSXin LI #ifndef CUR 5106bfebdeSXin LI #define CUR SP_TERMTYPE 5206bfebdeSXin LI #endif 530e3d5408SPeter Wemm 54*e1865124SBaptiste Daroussin MODULE_ID("$Id: lib_termcap.c,v 1.88 2020/02/02 23:34:34 tom Exp $") 550e3d5408SPeter Wemm 56a17d2cb2SPeter Wemm NCURSES_EXPORT_VAR(char *) UP = 0; 57a17d2cb2SPeter Wemm NCURSES_EXPORT_VAR(char *) BC = 0; 580e3d5408SPeter Wemm 59c8b9c85eSPeter Wemm #ifdef FREEBSD_NATIVE 60c8b9c85eSPeter Wemm extern char _nc_termcap[]; /* buffer to copy out */ 61c8b9c85eSPeter Wemm #endif 62c8b9c85eSPeter Wemm 634454585cSRong-En Fan #define MyCache _nc_globals.tgetent_cache 644454585cSRong-En Fan #define CacheInx _nc_globals.tgetent_index 654454585cSRong-En Fan #define CacheSeq _nc_globals.tgetent_sequence 66a17d2cb2SPeter Wemm 674454585cSRong-En Fan #define FIX_SGR0 MyCache[CacheInx].fix_sgr0 684454585cSRong-En Fan #define LAST_TRM MyCache[CacheInx].last_term 694454585cSRong-En Fan #define LAST_BUF MyCache[CacheInx].last_bufp 704454585cSRong-En Fan #define LAST_USE MyCache[CacheInx].last_used 714454585cSRong-En Fan #define LAST_SEQ MyCache[CacheInx].sequence 72a17d2cb2SPeter Wemm 7373f0a83dSXin LI /* 7473f0a83dSXin LI * Termcap names are matched only using the first two bytes. 7573f0a83dSXin LI * Ignore any extended names longer than two bytes, to avoid problems 7673f0a83dSXin LI * with legacy code which passes in parameters whose use is long forgotten. 7773f0a83dSXin LI */ 7873f0a83dSXin LI #define ValidCap(cap) (((cap)[0] != '\0') && ((cap)[1] != '\0')) 7973f0a83dSXin LI #define SameCap(a,b) (((a)[0] == (b)[0]) && ((a)[1] == (b)[1])) 8073f0a83dSXin LI #define ValidExt(ext) (ValidCap(ext) && (ext)[2] == '\0') 8173f0a83dSXin LI 820e3d5408SPeter Wemm /*************************************************************************** 830e3d5408SPeter Wemm * 840e3d5408SPeter Wemm * tgetent(bufp, term) 850e3d5408SPeter Wemm * 860e3d5408SPeter Wemm * In termcap, this function reads in the entry for terminal `term' into the 870e3d5408SPeter Wemm * buffer pointed to by bufp. It must be called before any of the functions 880e3d5408SPeter Wemm * below are called. 890e3d5408SPeter Wemm * In this terminfo emulation, tgetent() simply calls setupterm() (which 900e3d5408SPeter Wemm * does a bit more than tgetent() in termcap does), and returns its return 910e3d5408SPeter Wemm * value (1 if successful, 0 if no terminal with the given name could be 920e3d5408SPeter Wemm * found, or -1 if no terminal descriptions have been installed on the 930e3d5408SPeter Wemm * system). The bufp argument is ignored. 940e3d5408SPeter Wemm * 950e3d5408SPeter Wemm ***************************************************************************/ 960e3d5408SPeter Wemm 97952abd2aSPeter Wemm NCURSES_EXPORT(int) 9806bfebdeSXin LI NCURSES_SP_NAME(tgetent) (NCURSES_SP_DCLx char *bufp, const char *name) 990e3d5408SPeter Wemm { 10006bfebdeSXin LI int rc = ERR; 1017d0e8efaSRong-En Fan int n; 1027d0e8efaSRong-En Fan bool found_cache = FALSE; 10306bfebdeSXin LI #ifdef USE_TERM_DRIVER 10406bfebdeSXin LI TERMINAL *termp = 0; 10506bfebdeSXin LI #endif 1067d0e8efaSRong-En Fan 1077d0e8efaSRong-En Fan START_TRACE(); 1080e3d5408SPeter Wemm T((T_CALLED("tgetent()"))); 1090e3d5408SPeter Wemm 110aae38d10SBaptiste Daroussin TINFO_SETUP_TERM(&termp, name, STDOUT_FILENO, &rc, TRUE); 11106bfebdeSXin LI 11206bfebdeSXin LI #ifdef USE_TERM_DRIVER 11306bfebdeSXin LI if (termp == 0 || 11406bfebdeSXin LI !((TERMINAL_CONTROL_BLOCK *) termp)->drv->isTerminfo) 11573f0a83dSXin LI returnCode(rc); 11606bfebdeSXin LI #endif 1177d0e8efaSRong-En Fan 1187d0e8efaSRong-En Fan /* 1197d0e8efaSRong-En Fan * In general we cannot tell if the fixed sgr0 is still used by the 1207d0e8efaSRong-En Fan * caller, but if tgetent() is called with the same buffer, that is 1217d0e8efaSRong-En Fan * good enough, since the previous data would be invalidated by the 1227d0e8efaSRong-En Fan * current call. 1234454585cSRong-En Fan * 1244454585cSRong-En Fan * bufp may be a null pointer, e.g., GNU termcap. That allocates data, 1254454585cSRong-En Fan * which is good until the next tgetent() call. The conventional termcap 1264454585cSRong-En Fan * is inconvenient because of the fixed buffer size, but because it uses 1274454585cSRong-En Fan * caller-supplied buffers, can have multiple terminal descriptions in 1284454585cSRong-En Fan * use at a given time. 1297d0e8efaSRong-En Fan */ 1304454585cSRong-En Fan for (n = 0; n < TGETENT_MAX; ++n) { 1314454585cSRong-En Fan bool same_result = (MyCache[n].last_used && MyCache[n].last_bufp == bufp); 1327d0e8efaSRong-En Fan if (same_result) { 1334454585cSRong-En Fan CacheInx = n; 1347d0e8efaSRong-En Fan if (FIX_SGR0 != 0) { 1357d0e8efaSRong-En Fan FreeAndNull(FIX_SGR0); 1367d0e8efaSRong-En Fan } 1377d0e8efaSRong-En Fan /* 1387d0e8efaSRong-En Fan * Also free the terminfo data that we loaded (much bigger leak). 1397d0e8efaSRong-En Fan */ 14006bfebdeSXin LI if (LAST_TRM != 0 && LAST_TRM != TerminalOf(SP_PARM)) { 1417d0e8efaSRong-En Fan TERMINAL *trm = LAST_TRM; 14206bfebdeSXin LI NCURSES_SP_NAME(del_curterm) (NCURSES_SP_ARGx LAST_TRM); 1434454585cSRong-En Fan for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) 1447d0e8efaSRong-En Fan if (LAST_TRM == trm) 1457d0e8efaSRong-En Fan LAST_TRM = 0; 1464454585cSRong-En Fan CacheInx = n; 1477d0e8efaSRong-En Fan } 1487d0e8efaSRong-En Fan found_cache = TRUE; 1497d0e8efaSRong-En Fan break; 1507d0e8efaSRong-En Fan } 1517d0e8efaSRong-En Fan } 1527d0e8efaSRong-En Fan if (!found_cache) { 1537d0e8efaSRong-En Fan int best = 0; 1547d0e8efaSRong-En Fan 1554454585cSRong-En Fan for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) { 1564454585cSRong-En Fan if (LAST_SEQ < MyCache[best].sequence) { 1574454585cSRong-En Fan best = CacheInx; 1587d0e8efaSRong-En Fan } 1597d0e8efaSRong-En Fan } 1604454585cSRong-En Fan CacheInx = best; 1617d0e8efaSRong-En Fan } 162aae38d10SBaptiste Daroussin if (rc == 1) { 16306bfebdeSXin LI LAST_TRM = TerminalOf(SP_PARM); 1644454585cSRong-En Fan LAST_SEQ = ++CacheSeq; 165aae38d10SBaptiste Daroussin } else { 166aae38d10SBaptiste Daroussin LAST_TRM = 0; 167aae38d10SBaptiste Daroussin } 1680e3d5408SPeter Wemm 169a17d2cb2SPeter Wemm PC = 0; 170a17d2cb2SPeter Wemm UP = 0; 171a17d2cb2SPeter Wemm BC = 0; 1727d0e8efaSRong-En Fan FIX_SGR0 = 0; /* don't free it - application may still use */ 173a17d2cb2SPeter Wemm 17406bfebdeSXin LI if (rc == 1) { 1750e3d5408SPeter Wemm 1760e3d5408SPeter Wemm if (cursor_left) 1775d08fb1fSRong-En Fan if ((backspaces_with_bs = (char) !strcmp(cursor_left, "\b")) == 0) 1780e3d5408SPeter Wemm backspace_if_not_bs = cursor_left; 1790e3d5408SPeter Wemm 1800e3d5408SPeter Wemm /* we're required to export these */ 1810e3d5408SPeter Wemm if (pad_char != NULL) 1820e3d5408SPeter Wemm PC = pad_char[0]; 1830e3d5408SPeter Wemm if (cursor_up != NULL) 1840e3d5408SPeter Wemm UP = cursor_up; 1850e3d5408SPeter Wemm if (backspace_if_not_bs != NULL) 1860e3d5408SPeter Wemm BC = backspace_if_not_bs; 1870e3d5408SPeter Wemm 188aae38d10SBaptiste Daroussin if ((FIX_SGR0 = _nc_trim_sgr0(&TerminalType(TerminalOf(SP_PARM)))) 189aae38d10SBaptiste Daroussin != 0) { 1907d0e8efaSRong-En Fan if (!strcmp(FIX_SGR0, exit_attribute_mode)) { 1917d0e8efaSRong-En Fan if (FIX_SGR0 != exit_attribute_mode) { 1927d0e8efaSRong-En Fan free(FIX_SGR0); 193a17d2cb2SPeter Wemm } 1947d0e8efaSRong-En Fan FIX_SGR0 = 0; 195a17d2cb2SPeter Wemm } 196a17d2cb2SPeter Wemm } 1977d0e8efaSRong-En Fan LAST_BUF = bufp; 1984454585cSRong-En Fan LAST_USE = TRUE; 199a17d2cb2SPeter Wemm 20006bfebdeSXin LI SetNoPadding(SP_PARM); 20106bfebdeSXin LI (void) NCURSES_SP_NAME(baudrate) (NCURSES_SP_ARG); /* sets ospeed as a side-effect */ 2020e3d5408SPeter Wemm 2030e3d5408SPeter Wemm /* LINT_PREPRO 2040e3d5408SPeter Wemm #if 0*/ 2050e3d5408SPeter Wemm #include <capdefaults.c> 2060e3d5408SPeter Wemm /* LINT_PREPRO 2070e3d5408SPeter Wemm #endif*/ 2080e3d5408SPeter Wemm 209b589b6f2SPeter Wemm } 210b589b6f2SPeter Wemm 211c8b9c85eSPeter Wemm #ifdef FREEBSD_NATIVE 212c8b9c85eSPeter Wemm /* 213c8b9c85eSPeter Wemm * This is a REALLY UGLY hack. Basically, if we originate with 214c8b9c85eSPeter Wemm * a termcap source, try and copy it out. 215c8b9c85eSPeter Wemm */ 216c8b9c85eSPeter Wemm if (bufp && _nc_termcap[0]) 217c8b9c85eSPeter Wemm strncpy(bufp, _nc_termcap, 1024); 218c8b9c85eSPeter Wemm #endif 219c8b9c85eSPeter Wemm 22006bfebdeSXin LI returnCode(rc); 2210e3d5408SPeter Wemm } 2220e3d5408SPeter Wemm 22306bfebdeSXin LI #if NCURSES_SP_FUNCS 22406bfebdeSXin LI NCURSES_EXPORT(int) 22506bfebdeSXin LI tgetent(char *bufp, const char *name) 22606bfebdeSXin LI { 22706bfebdeSXin LI return NCURSES_SP_NAME(tgetent) (CURRENT_SCREEN, bufp, name); 22806bfebdeSXin LI } 22906bfebdeSXin LI #endif 23006bfebdeSXin LI 23106bfebdeSXin LI #if 0 23206bfebdeSXin LI static bool 23306bfebdeSXin LI same_tcname(const char *a, const char *b) 23406bfebdeSXin LI { 23573f0a83dSXin LI bool code = SameCap(a, b); 23673f0a83dSXin LI fprintf(stderr, "compare(%s,%s) %s\n", a, b, code ? "same" : "diff"); 23773f0a83dSXin LI return code; 23806bfebdeSXin LI } 23973f0a83dSXin LI 24006bfebdeSXin LI #else 24173f0a83dSXin LI #define same_tcname(a,b) SameCap(a,b) 24206bfebdeSXin LI #endif 24306bfebdeSXin LI 2440e3d5408SPeter Wemm /*************************************************************************** 2450e3d5408SPeter Wemm * 2460e3d5408SPeter Wemm * tgetflag(str) 2470e3d5408SPeter Wemm * 2480e3d5408SPeter Wemm * Look up boolean termcap capability str and return its value (TRUE=1 if 2490e3d5408SPeter Wemm * present, FALSE=0 if not). 2500e3d5408SPeter Wemm * 2510e3d5408SPeter Wemm ***************************************************************************/ 2520e3d5408SPeter Wemm 253952abd2aSPeter Wemm NCURSES_EXPORT(int) 254aae38d10SBaptiste Daroussin NCURSES_SP_NAME(tgetflag) (NCURSES_SP_DCLx const char *id) 25506bfebdeSXin LI { 25606bfebdeSXin LI int result = 0; /* Solaris returns zero for missing flag */ 25706bfebdeSXin LI 25806bfebdeSXin LI T((T_CALLED("tgetflag(%p, %s)"), (void *) SP_PARM, id)); 25973f0a83dSXin LI if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) { 260aae38d10SBaptiste Daroussin TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM)); 26106bfebdeSXin LI struct name_table_entry const *entry_ptr; 262aae38d10SBaptiste Daroussin int j = -1; 26306bfebdeSXin LI 26406bfebdeSXin LI entry_ptr = _nc_find_type_entry(id, BOOLEAN, TRUE); 26506bfebdeSXin LI if (entry_ptr != 0) { 26606bfebdeSXin LI j = entry_ptr->nte_index; 26706bfebdeSXin LI } 26806bfebdeSXin LI #if NCURSES_XNAMES 26906bfebdeSXin LI else { 27073f0a83dSXin LI int i; 27106bfebdeSXin LI for_each_ext_boolean(i, tp) { 27206bfebdeSXin LI const char *capname = ExtBoolname(tp, i, boolcodes); 27373f0a83dSXin LI if (same_tcname(id, capname) && ValidExt(capname)) { 27406bfebdeSXin LI j = i; 27506bfebdeSXin LI break; 27606bfebdeSXin LI } 27706bfebdeSXin LI } 27806bfebdeSXin LI } 27906bfebdeSXin LI #endif 28006bfebdeSXin LI if (j >= 0) { 28106bfebdeSXin LI /* note: setupterm forces invalid booleans to false */ 28206bfebdeSXin LI result = tp->Booleans[j]; 28306bfebdeSXin LI } 28406bfebdeSXin LI } 28506bfebdeSXin LI returnCode(result); 28606bfebdeSXin LI } 28706bfebdeSXin LI 28806bfebdeSXin LI #if NCURSES_SP_FUNCS 28906bfebdeSXin LI NCURSES_EXPORT(int) 290aae38d10SBaptiste Daroussin tgetflag(const char *id) 2910e3d5408SPeter Wemm { 29206bfebdeSXin LI return NCURSES_SP_NAME(tgetflag) (CURRENT_SCREEN, id); 2930e3d5408SPeter Wemm } 29406bfebdeSXin LI #endif 2950e3d5408SPeter Wemm 2960e3d5408SPeter Wemm /*************************************************************************** 2970e3d5408SPeter Wemm * 2980e3d5408SPeter Wemm * tgetnum(str) 2990e3d5408SPeter Wemm * 3000e3d5408SPeter Wemm * Look up numeric termcap capability str and return its value, or -1 if 3010e3d5408SPeter Wemm * not given. 3020e3d5408SPeter Wemm * 3030e3d5408SPeter Wemm ***************************************************************************/ 3040e3d5408SPeter Wemm 305952abd2aSPeter Wemm NCURSES_EXPORT(int) 306aae38d10SBaptiste Daroussin NCURSES_SP_NAME(tgetnum) (NCURSES_SP_DCLx const char *id) 30706bfebdeSXin LI { 30806bfebdeSXin LI int result = ABSENT_NUMERIC; 30906bfebdeSXin LI 31006bfebdeSXin LI T((T_CALLED("tgetnum(%p, %s)"), (void *) SP_PARM, id)); 31173f0a83dSXin LI if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) { 312aae38d10SBaptiste Daroussin TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM)); 31306bfebdeSXin LI struct name_table_entry const *entry_ptr; 314aae38d10SBaptiste Daroussin int j = -1; 31506bfebdeSXin LI 31606bfebdeSXin LI entry_ptr = _nc_find_type_entry(id, NUMBER, TRUE); 31706bfebdeSXin LI if (entry_ptr != 0) { 31806bfebdeSXin LI j = entry_ptr->nte_index; 31906bfebdeSXin LI } 32006bfebdeSXin LI #if NCURSES_XNAMES 32106bfebdeSXin LI else { 32273f0a83dSXin LI int i; 32306bfebdeSXin LI for_each_ext_number(i, tp) { 32406bfebdeSXin LI const char *capname = ExtNumname(tp, i, numcodes); 32573f0a83dSXin LI if (same_tcname(id, capname) && ValidExt(capname)) { 32606bfebdeSXin LI j = i; 32706bfebdeSXin LI break; 32806bfebdeSXin LI } 32906bfebdeSXin LI } 33006bfebdeSXin LI } 33106bfebdeSXin LI #endif 33206bfebdeSXin LI if (j >= 0) { 33306bfebdeSXin LI if (VALID_NUMERIC(tp->Numbers[j])) 33406bfebdeSXin LI result = tp->Numbers[j]; 33506bfebdeSXin LI } 33606bfebdeSXin LI } 33706bfebdeSXin LI returnCode(result); 33806bfebdeSXin LI } 33906bfebdeSXin LI 34006bfebdeSXin LI #if NCURSES_SP_FUNCS 34106bfebdeSXin LI NCURSES_EXPORT(int) 342aae38d10SBaptiste Daroussin tgetnum(const char *id) 3430e3d5408SPeter Wemm { 34406bfebdeSXin LI return NCURSES_SP_NAME(tgetnum) (CURRENT_SCREEN, id); 3450e3d5408SPeter Wemm } 34606bfebdeSXin LI #endif 3470e3d5408SPeter Wemm 3480e3d5408SPeter Wemm /*************************************************************************** 3490e3d5408SPeter Wemm * 3500e3d5408SPeter Wemm * tgetstr(str, area) 3510e3d5408SPeter Wemm * 3520e3d5408SPeter Wemm * Look up string termcap capability str and return a pointer to its value, 3530e3d5408SPeter Wemm * or NULL if not given. 3540e3d5408SPeter Wemm * 3550e3d5408SPeter Wemm ***************************************************************************/ 3560e3d5408SPeter Wemm 357952abd2aSPeter Wemm NCURSES_EXPORT(char *) 358aae38d10SBaptiste Daroussin NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx const char *id, char **area) 3590e3d5408SPeter Wemm { 360a17d2cb2SPeter Wemm char *result = NULL; 3610e3d5408SPeter Wemm 36206bfebdeSXin LI T((T_CALLED("tgetstr(%s,%p)"), id, (void *) area)); 36373f0a83dSXin LI if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) { 364aae38d10SBaptiste Daroussin TERMTYPE2 *tp = &TerminalType(TerminalOf(SP_PARM)); 36506bfebdeSXin LI struct name_table_entry const *entry_ptr; 366aae38d10SBaptiste Daroussin int j = -1; 36706bfebdeSXin LI 36806bfebdeSXin LI entry_ptr = _nc_find_type_entry(id, STRING, TRUE); 36906bfebdeSXin LI if (entry_ptr != 0) { 37006bfebdeSXin LI j = entry_ptr->nte_index; 37106bfebdeSXin LI } 37206bfebdeSXin LI #if NCURSES_XNAMES 37306bfebdeSXin LI else { 37473f0a83dSXin LI int i; 37506bfebdeSXin LI for_each_ext_string(i, tp) { 3760e3d5408SPeter Wemm const char *capname = ExtStrname(tp, i, strcodes); 37773f0a83dSXin LI if (same_tcname(id, capname) && ValidExt(capname)) { 37806bfebdeSXin LI j = i; 37906bfebdeSXin LI break; 38006bfebdeSXin LI } 38106bfebdeSXin LI } 38206bfebdeSXin LI } 38306bfebdeSXin LI #endif 38406bfebdeSXin LI if (j >= 0) { 38506bfebdeSXin LI result = tp->Strings[j]; 38673f0a83dSXin LI TR(TRACE_DATABASE, ("found match %d: %s", j, _nc_visbuf(result))); 387bd2a8869SPeter Wemm /* setupterm forces canceled strings to null */ 388a17d2cb2SPeter Wemm if (VALID_STRING(result)) { 389a17d2cb2SPeter Wemm if (result == exit_attribute_mode 3907d0e8efaSRong-En Fan && FIX_SGR0 != 0) { 3917d0e8efaSRong-En Fan result = FIX_SGR0; 392a17d2cb2SPeter Wemm TR(TRACE_DATABASE, ("altered to : %s", _nc_visbuf(result))); 393a17d2cb2SPeter Wemm } 3945bd21f8aSPeter Wemm if (area != 0 395a17d2cb2SPeter Wemm && *area != 0) { 39673f0a83dSXin LI _nc_STRCPY(*area, result, 1024); 3977d0e8efaSRong-En Fan result = *area; 3985bd21f8aSPeter Wemm *area += strlen(*area) + 1; 3992a043471SLuoqi Chen } 400a17d2cb2SPeter Wemm } 4010e3d5408SPeter Wemm } 4020e3d5408SPeter Wemm } 403a17d2cb2SPeter Wemm returnPtr(result); 4040e3d5408SPeter Wemm } 4057d0e8efaSRong-En Fan 40606bfebdeSXin LI #if NCURSES_SP_FUNCS 40706bfebdeSXin LI NCURSES_EXPORT(char *) 408aae38d10SBaptiste Daroussin tgetstr(const char *id, char **area) 40906bfebdeSXin LI { 41006bfebdeSXin LI return NCURSES_SP_NAME(tgetstr) (CURRENT_SCREEN, id, area); 41106bfebdeSXin LI } 41206bfebdeSXin LI #endif 41306bfebdeSXin LI 4147d0e8efaSRong-En Fan #if NO_LEAKS 415aae38d10SBaptiste Daroussin #undef CacheInx 416aae38d10SBaptiste Daroussin #define CacheInx num 417aae38d10SBaptiste Daroussin NCURSES_EXPORT(void) 418aae38d10SBaptiste Daroussin _nc_tgetent_leak(TERMINAL *termp) 419aae38d10SBaptiste Daroussin { 420aae38d10SBaptiste Daroussin if (termp != 0) { 421aae38d10SBaptiste Daroussin int num; 422aae38d10SBaptiste Daroussin for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) { 423aae38d10SBaptiste Daroussin if (LAST_TRM == termp) { 424aae38d10SBaptiste Daroussin FreeAndNull(FIX_SGR0); 425aae38d10SBaptiste Daroussin if (LAST_TRM != 0) { 426aae38d10SBaptiste Daroussin LAST_TRM = 0; 427aae38d10SBaptiste Daroussin } 428aae38d10SBaptiste Daroussin break; 429aae38d10SBaptiste Daroussin } 430aae38d10SBaptiste Daroussin } 431aae38d10SBaptiste Daroussin } 432aae38d10SBaptiste Daroussin } 433aae38d10SBaptiste Daroussin 4347d0e8efaSRong-En Fan NCURSES_EXPORT(void) 4357d0e8efaSRong-En Fan _nc_tgetent_leaks(void) 4367d0e8efaSRong-En Fan { 437aae38d10SBaptiste Daroussin int num; 4384454585cSRong-En Fan for (CacheInx = 0; CacheInx < TGETENT_MAX; ++CacheInx) { 439aae38d10SBaptiste Daroussin if (LAST_TRM != 0) { 4407d0e8efaSRong-En Fan del_curterm(LAST_TRM); 441aae38d10SBaptiste Daroussin _nc_tgetent_leak(LAST_TRM); 442aae38d10SBaptiste Daroussin } 4437d0e8efaSRong-En Fan } 4447d0e8efaSRong-En Fan } 4457d0e8efaSRong-En Fan #endif 446