/****************************************************************************
 * Copyright (c) 1998-2005,2006 Free Software Foundation, Inc.              *
 *                                                                          *
 * Permission is hereby granted, free of charge, to any person obtaining a  *
 * copy of this software and associated documentation files (the            *
 * "Software"), to deal in the Software without restriction, including      *
 * without limitation the rights to use, copy, modify, merge, publish,      *
 * distribute, distribute with modifications, sublicense, and/or sell       *
 * copies of the Software, and to permit persons to whom the Software is    *
 * furnished to do so, subject to the following conditions:                 *
 *                                                                          *
 * The above copyright notice and this permission notice shall be included  *
 * in all copies or substantial portions of the Software.                   *
 *                                                                          *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
 *                                                                          *
 * Except as contained in this notice, the name(s) of the above copyright   *
 * holders shall not be used in advertising or otherwise to promote the     *
 * sale, use or other dealings in this Software without prior written       *
 * authorization.                                                           *
 ****************************************************************************/

/****************************************************************************
 *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
 *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
 *     and: Thomas E. Dickey                        1996-on                 *
 ****************************************************************************/

/*
 * Termcap compatibility support
 *
 * If your OS integrator didn't install a terminfo database, you can call
 * _nc_read_termcap_entry() to support reading and translating capabilities
 * from the system termcap file.  This is a kludge; it will bulk up and slow
 * down every program that uses ncurses, and translated termcap entries cannot
 * use full terminfo capabilities.  Don't use it unless you absolutely have to;
 * instead, get your system people to run tic(1) from root on the terminfo
 * master included with ncurses to translate it into a terminfo database.
 *
 * If USE_GETCAP is enabled, we use what is effectively a copy of the 4.4BSD
 * getcap code to fetch entries.  There are disadvantages to this; mainly that
 * getcap(3) does its own resolution, meaning that entries read in in this way
 * can't reference the terminfo tree.  The only thing it buys is faster startup
 * time, getcap(3) is much faster than our tic parser.
 */

#include <curses.priv.h>

#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <tic.h>
#include <term_entry.h>

MODULE_ID("$Id: read_termcap.c,v 1.71 2006/07/29 12:06:51 tom Exp $")

#if !PURE_TERMINFO

#define TC_SUCCESS     0
#define TC_NOT_FOUND  -1
#define TC_SYS_ERR    -2
#define TC_REF_LOOP   -3
#define TC_UNRESOLVED -4	/* this is not returned by BSD cgetent */

static NCURSES_CONST char *
get_termpath(void)
{
    NCURSES_CONST char *result;

    if (!use_terminfo_vars() || (result = getenv("TERMPATH")) == 0)
	result = TERMPATH;
    T(("TERMPATH is %s", result));
    return result;
}

#if USE_GETCAP

#if HAVE_BSD_CGETENT
#define _nc_cgetcap   cgetcap
#define _nc_cgetent(buf, oline, db_array, name) cgetent(buf, db_array, name)
#define _nc_cgetmatch cgetmatch
#define _nc_cgetset   cgetset
#else
static int _nc_cgetmatch(char *, const char *);
static int _nc_getent(char **, unsigned *, int *, int, char **, int, const char
		      *, int, char *);
static int _nc_nfcmp(const char *, char *);

/*-
 * Copyright (c) 1992, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * Casey Leedom of Lawrence Livermore National Laboratory.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgment:
 *	This product includes software developed by the University of
 *	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/* static char sccsid[] = "@(#)getcap.c	8.3 (Berkeley) 3/25/94"; */

#define	BFRAG		1024
#define	BSIZE		1024
#define	MAX_RECURSION	32	/* maximum getent recursion */

static size_t topreclen;	/* toprec length */
static char *toprec;		/* Additional record specified by cgetset() */
static int gottoprec;		/* Flag indicating retrieval of toprecord */

/*
 * Cgetset() allows the addition of a user specified buffer to be added to the
 * database array, in effect "pushing" the buffer on top of the virtual
 * database.  0 is returned on success, -1 on failure.
 */
static int
_nc_cgetset(const char *ent)
{
    if (ent == 0) {
	FreeIfNeeded(toprec);
	toprec = 0;
	topreclen = 0;
	return (0);
    }
    topreclen = strlen(ent);
    if ((toprec = typeMalloc(char, topreclen + 1)) == 0) {
	errno = ENOMEM;
	return (-1);
    }
    gottoprec = 0;
    (void) strcpy(toprec, ent);
    return (0);
}

/*
 * Cgetcap searches the capability record buf for the capability cap with type
 * `type'.  A pointer to the value of cap is returned on success, 0 if the
 * requested capability couldn't be found.
 *
 * Specifying a type of ':' means that nothing should follow cap (:cap:).  In
 * this case a pointer to the terminating ':' or NUL will be returned if cap is
 * found.
 *
 * If (cap, '@') or (cap, terminator, '@') is found before (cap, terminator)
 * return 0.
 */
static char *
_nc_cgetcap(char *buf, const char *cap, int type)
{
    register const char *cp;
    register char *bp;

    bp = buf;
    for (;;) {
	/*
	 * Skip past the current capability field - it's either the
	 * name field if this is the first time through the loop, or
	 * the remainder of a field whose name failed to match cap.
	 */
	for (;;) {
	    if (*bp == '\0')
		return (0);
	    else if (*bp++ == ':')
		break;
	}

	/*
	 * Try to match (cap, type) in buf.
	 */
	for (cp = cap; *cp == *bp && *bp != '\0'; cp++, bp++)
	    continue;
	if (*cp != '\0')
	    continue;
	if (*bp == '@')
	    return (0);
	if (type == ':') {
	    if (*bp != '\0' && *bp != ':')
		continue;
	    return (bp);
	}
	if (*bp != type)
	    continue;
	bp++;
	return (*bp == '@' ? 0 : bp);
    }
    /* NOTREACHED */
}

/*
 * Cgetent extracts the capability record name from the NULL terminated file
 * array db_array and returns a pointer to a malloc'd copy of it in buf.  Buf
 * must be retained through all subsequent calls to cgetcap, cgetnum, cgetflag,
 * and cgetstr, but may then be freed.
 *
 * Returns:
 *
 * positive #    on success (i.e., the index in db_array)
 * TC_NOT_FOUND  if the requested record couldn't be found
 * TC_SYS_ERR    if a system error was encountered (e.g.,couldn't open a file)
 * TC_REF_LOOP   if a potential reference loop is detected
 * TC_UNRESOLVED if we had too many recurrences to resolve
 */
static int
_nc_cgetent(char **buf, int *oline, char **db_array, const char *name)
{
    unsigned dummy;

    return (_nc_getent(buf, &dummy, oline, 0, db_array, -1, name, 0, 0));
}

/*
 * Getent implements the functions of cgetent.  If fd is non-negative,
 * *db_array has already been opened and fd is the open file descriptor.  We
 * do this to save time and avoid using up file descriptors for tc=
 * recursions.
 *
 * Getent returns the same success/failure codes as cgetent.  On success, a
 * pointer to a malloc'd capability record with all tc= capabilities fully
 * expanded and its length (not including trailing ASCII NUL) are left in
 * *cap and *len.
 *
 * Basic algorithm:
 *	+ Allocate memory incrementally as needed in chunks of size BFRAG
 *	  for capability buffer.
 *	+ Recurse for each tc=name and interpolate result.  Stop when all
 *	  names interpolated, a name can't be found, or depth exceeds
 *	  MAX_RECURSION.
 */
#define DOALLOC(size) typeRealloc(char, size, record)
static int
_nc_getent(
	      char **cap,	/* termcap-content */
	      unsigned *len,	/* length, needed for recursion */
	      int *beginning,	/* line-number at match */
	      int in_array,	/* index in 'db_array[] */
	      char **db_array,	/* list of files to search */
	      int fd,
	      const char *name,
	      int depth,
	      char *nfield)
{
    register char *r_end, *rp;
    int myfd = FALSE;
    char *record = 0;
    int tc_not_resolved;
    int current;
    int lineno;

    /*
     * Return with ``loop detected'' error if we've recurred more than
     * MAX_RECURSION times.
     */
    if (depth > MAX_RECURSION)
	return (TC_REF_LOOP);

    /*
     * Check if we have a top record from cgetset().
     */
    if (depth == 0 && toprec != 0 && _nc_cgetmatch(toprec, name) == 0) {
	if ((record = DOALLOC(topreclen + BFRAG)) == 0) {
	    errno = ENOMEM;
	    return (TC_SYS_ERR);
	}
	(void) strcpy(record, toprec);
	rp = record + topreclen + 1;
	r_end = rp + BFRAG;
	current = in_array;
    } else {
	int foundit;

	/*
	 * Allocate first chunk of memory.
	 */
	if ((record = DOALLOC(BFRAG)) == 0) {
	    errno = ENOMEM;
	    return (TC_SYS_ERR);
	}
	rp = r_end = record + BFRAG;
	foundit = FALSE;

	/*
	 * Loop through database array until finding the record.
	 */
	for (current = in_array; db_array[current] != 0; current++) {
	    int eof = FALSE;

	    /*
	     * Open database if not already open.
	     */
	    if (fd >= 0) {
		(void) lseek(fd, (off_t) 0, SEEK_SET);
	    } else if ((_nc_access(db_array[current], R_OK) < 0)
		       || (fd = open(db_array[current], O_RDONLY, 0)) < 0) {
		/* No error on unfound file. */
		if (errno == ENOENT)
		    continue;
		free(record);
		return (TC_SYS_ERR);
	    } else {
		myfd = TRUE;
	    }
	    lineno = 0;

	    /*
	     * Find the requested capability record ...
	     */
	    {
		char buf[2048];
		register char *b_end = buf;
		register char *bp = buf;
		register int c;

		/*
		 * Loop invariants:
		 *      There is always room for one more character in record.
		 *      R_end always points just past end of record.
		 *      Rp always points just past last character in record.
		 *      B_end always points just past last character in buf.
		 *      Bp always points at next character in buf.
		 */

		for (;;) {
		    int first = lineno + 1;

		    /*
		     * Read in a line implementing (\, newline)
		     * line continuation.
		     */
		    rp = record;
		    for (;;) {
			if (bp >= b_end) {
			    int n;

			    n = read(fd, buf, sizeof(buf));
			    if (n <= 0) {
				if (myfd)
				    (void) close(fd);
				if (n < 0) {
				    free(record);
				    return (TC_SYS_ERR);
				}
				fd = -1;
				eof = TRUE;
				break;
			    }
			    b_end = buf + n;
			    bp = buf;
			}

			c = *bp++;
			if (c == '\n') {
			    lineno++;
			    if (rp == record || *(rp - 1) != '\\')
				break;
			}
			*rp++ = c;

			/*
			 * Enforce loop invariant: if no room
			 * left in record buffer, try to get
			 * some more.
			 */
			if (rp >= r_end) {
			    unsigned pos;
			    size_t newsize;

			    pos = rp - record;
			    newsize = r_end - record + BFRAG;
			    record = DOALLOC(newsize);
			    if (record == 0) {
				if (myfd)
				    (void) close(fd);
				errno = ENOMEM;
				return (TC_SYS_ERR);
			    }
			    r_end = record + newsize;
			    rp = record + pos;
			}
		    }
		    /* loop invariant lets us do this */
		    *rp++ = '\0';

		    /*
		     * If encountered eof check next file.
		     */
		    if (eof)
			break;

		    /*
		     * Toss blank lines and comments.
		     */
		    if (*record == '\0' || *record == '#')
			continue;

		    /*
		     * See if this is the record we want ...
		     */
		    if (_nc_cgetmatch(record, name) == 0
			&& (nfield == 0
			    || !_nc_nfcmp(nfield, record))) {
			foundit = TRUE;
			*beginning = first;
			break;	/* found it! */
		    }
		}
	    }
	    if (foundit)
		break;
	}

	if (!foundit)
	    return (TC_NOT_FOUND);
    }

    /*
     * Got the capability record, but now we have to expand all tc=name
     * references in it ...
     */
    {
	register char *newicap, *s;
	register int newilen;
	unsigned ilen;
	int diff, iret, tclen, oline;
	char *icap, *scan, *tc, *tcstart, *tcend;

	/*
	 * Loop invariants:
	 *      There is room for one more character in record.
	 *      R_end points just past end of record.
	 *      Rp points just past last character in record.
	 *      Scan points at remainder of record that needs to be
	 *      scanned for tc=name constructs.
	 */
	scan = record;
	tc_not_resolved = FALSE;
	for (;;) {
	    if ((tc = _nc_cgetcap(scan, "tc", '=')) == 0)
		break;

	    /*
	     * Find end of tc=name and stomp on the trailing `:'
	     * (if present) so we can use it to call ourselves.
	     */
	    s = tc;
	    while (*s != '\0') {
		if (*s++ == ':') {
		    *(s - 1) = '\0';
		    break;
		}
	    }
	    tcstart = tc - 3;
	    tclen = s - tcstart;
	    tcend = s;

	    iret = _nc_getent(&icap, &ilen, &oline, current, db_array, fd,
			      tc, depth + 1, 0);
	    newicap = icap;	/* Put into a register. */
	    newilen = ilen;
	    if (iret != TC_SUCCESS) {
		/* an error */
		if (iret < TC_NOT_FOUND) {
		    if (myfd)
			(void) close(fd);
		    free(record);
		    return (iret);
		}
		if (iret == TC_UNRESOLVED)
		    tc_not_resolved = TRUE;
		/* couldn't resolve tc */
		if (iret == TC_NOT_FOUND) {
		    *(s - 1) = ':';
		    scan = s - 1;
		    tc_not_resolved = TRUE;
		    continue;
		}
	    }

	    /* not interested in name field of tc'ed record */
	    s = newicap;
	    while (*s != '\0' && *s++ != ':') ;
	    newilen -= s - newicap;
	    newicap = s;

	    /* make sure interpolated record is `:'-terminated */
	    s += newilen;
	    if (*(s - 1) != ':') {
		*s = ':';	/* overwrite NUL with : */
		newilen++;
	    }

	    /*
	     * Make sure there's enough room to insert the
	     * new record.
	     */
	    diff = newilen - tclen;
	    if (diff >= r_end - rp) {
		unsigned pos, tcpos, tcposend;
		size_t newsize;

		pos = rp - record;
		newsize = r_end - record + diff + BFRAG;
		tcpos = tcstart - record;
		tcposend = tcend - record;
		record = DOALLOC(newsize);
		if (record == 0) {
		    if (myfd)
			(void) close(fd);
		    free(icap);
		    errno = ENOMEM;
		    return (TC_SYS_ERR);
		}
		r_end = record + newsize;
		rp = record + pos;
		tcstart = record + tcpos;
		tcend = record + tcposend;
	    }

	    /*
	     * Insert tc'ed record into our record.
	     */
	    s = tcstart + newilen;
	    memmove(s, tcend, (size_t) (rp - tcend));
	    memmove(tcstart, newicap, (size_t) newilen);
	    rp += diff;
	    free(icap);

	    /*
	     * Start scan on `:' so next cgetcap works properly
	     * (cgetcap always skips first field).
	     */
	    scan = s - 1;
	}
    }

    /*
     * Close file (if we opened it), give back any extra memory, and
     * return capability, length and success.
     */
    if (myfd)
	(void) close(fd);
    *len = rp - record - 1;	/* don't count NUL */
    if (r_end > rp) {
	if ((record = DOALLOC((size_t) (rp - record))) == 0) {
	    errno = ENOMEM;
	    return (TC_SYS_ERR);
	}
    }

    *cap = record;
    if (tc_not_resolved)
	return (TC_UNRESOLVED);
    return (current);
}

/*
 * Cgetmatch will return 0 if name is one of the names of the capability
 * record buf, -1 if not.
 */
static int
_nc_cgetmatch(char *buf, const char *name)
{
    register const char *np;
    register char *bp;

    /*
     * Start search at beginning of record.
     */
    bp = buf;
    for (;;) {
	/*
	 * Try to match a record name.
	 */
	np = name;
	for (;;) {
	    if (*np == '\0') {
		if (*bp == '|' || *bp == ':' || *bp == '\0')
		    return (0);
		else
		    break;
	    } else if (*bp++ != *np++) {
		break;
	    }
	}

	/*
	 * Match failed, skip to next name in record.
	 */
	bp--;			/* a '|' or ':' may have stopped the match */
	for (;;) {
	    if (*bp == '\0' || *bp == ':')
		return (-1);	/* match failed totally */
	    else if (*bp++ == '|')
		break;		/* found next name */
	}
    }
}

/*
 * Compare name field of record.
 */
static int
_nc_nfcmp(const char *nf, char *rec)
{
    char *cp, tmp;
    int ret;

    for (cp = rec; *cp != ':'; cp++) ;

    tmp = *(cp + 1);
    *(cp + 1) = '\0';
    ret = strcmp(nf, rec);
    *(cp + 1) = tmp;

    return (ret);
}
#endif /* HAVE_BSD_CGETENT */

/*
 * Since ncurses provides its own 'tgetent()', we cannot use the native one.
 * So we reproduce the logic to get down to cgetent() -- or our cut-down
 * version of that -- to circumvent the problem of configuring against the
 * termcap library.
 */
#define USE_BSD_TGETENT 1

#if USE_BSD_TGETENT
/*
 * Copyright (c) 1980, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgment:
 *	This product includes software developed by the University of
 *	California, Berkeley and its contributors.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/* static char sccsid[] = "@(#)termcap.c	8.1 (Berkeley) 6/4/93" */

#define	PBUFSIZ		512	/* max length of filename path */
#define	PVECSIZ		32	/* max number of names in path */
#define TBUFSIZ (2048*2)

static char *tbuf;

/*
 * On entry, srcp points to a non ':' character which is the beginning of the
 * token, if any.  We'll try to return a string that doesn't end with a ':'.
 */
static char *
get_tc_token(char **srcp, int *endp)
{
    int ch;
    bool found = FALSE;
    char *s, *base;
    char *tok = 0;

    *endp = TRUE;
    for (s = base = *srcp; *s != '\0';) {
	ch = *s++;
	if (ch == '\\') {
	    if (*s == '\0') {
		break;
	    } else if (*s++ == '\n') {
		while (isspace(UChar(*s)))
		    s++;
	    } else {
		found = TRUE;
	    }
	} else if (ch == ':') {
	    if (found) {
		tok = base;
		s[-1] = '\0';
		*srcp = s;
		*endp = FALSE;
		break;
	    }
	    base = s;
	} else if (isgraph(UChar(ch))) {
	    found = TRUE;
	}
    }

    /* malformed entry may end without a ':' */
    if (tok == 0 && found) {
	tok = base;
    }

    return tok;
}

static char *
copy_tc_token(char *dst, const char *src, size_t len)
{
    int ch;

    while ((ch = *src++) != '\0') {
	if (ch == '\\' && *src == '\n') {
	    while (isspace(UChar(*src)))
		src++;
	    continue;
	}
	if (--len == 0) {
	    dst = 0;
	    break;
	}
	*dst++ = ch;
    }
    return dst;
}

/*
 * Get an entry for terminal name in buffer bp from the termcap file.
 */
static int
_nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name)
{
    static char *the_source;

    register char *p;
    register char *cp;
    char *dummy = NULL;
    char **fname;
    char *home;
    int i;
    char pathbuf[PBUFSIZ];	/* holds raw path of filenames */
    char *pathvec[PVECSIZ];	/* to point to names in pathbuf */
    char **pvec;		/* holds usable tail of path vector */
    NCURSES_CONST char *termpath;
    string_desc desc;

    fname = pathvec;
    pvec = pathvec;
    tbuf = bp;
    p = pathbuf;
    cp = use_terminfo_vars()? getenv("TERMCAP") : NULL;

    /*
     * TERMCAP can have one of two things in it.  It can be the name of a file
     * to use instead of /etc/termcap.  In this case it better start with a
     * "/".  Or it can be an entry to use so we don't have to read the file. 
     * In this case it has to already have the newlines crunched out.  If
     * TERMCAP does not hold a file name then a path of names is searched
     * instead.  The path is found in the TERMPATH variable, or becomes
     * "$HOME/.termcap /etc/termcap" if no TERMPATH exists.
     */
    _nc_str_init(&desc, pathbuf, sizeof(pathbuf));
    if (cp == NULL) {
	_nc_safe_strcpy(&desc, get_termpath());
    } else if (!_nc_is_abs_path(cp)) {	/* TERMCAP holds an entry */
	if ((termpath = get_termpath()) != 0) {
	    _nc_safe_strcat(&desc, termpath);
	} else {
	    char temp[PBUFSIZ];
	    temp[0] = 0;
	    if ((home = getenv("HOME")) != 0 && *home != '\0'
		&& strchr(home, ' ') == 0
		&& strlen(home) < sizeof(temp) - 10) {	/* setup path */
		sprintf(temp, "%s/", home);	/* $HOME first */
	    }
	    /* if no $HOME look in current directory */
	    strcat(temp, ".termcap");
	    _nc_safe_strcat(&desc, temp);
	    _nc_safe_strcat(&desc, " ");
	    _nc_safe_strcat(&desc, get_termpath());
	}
    } else {			/* user-defined name in TERMCAP */
	_nc_safe_strcat(&desc, cp);	/* still can be tokenized */
    }

    *fname++ = pathbuf;		/* tokenize path into vector of names */
    while (*++p) {
	if (*p == ' ' || *p == NCURSES_PATHSEP) {
	    *p = '\0';
	    while (*++p)
		if (*p != ' ' && *p != NCURSES_PATHSEP)
		    break;
	    if (*p == '\0')
		break;
	    *fname++ = p;
	    if (fname >= pathvec + PVECSIZ) {
		fname--;
		break;
	    }
	}
    }
    *fname = 0;			/* mark end of vector */
    if (_nc_is_abs_path(cp)) {
	if (_nc_cgetset(cp) < 0) {
	    return (TC_SYS_ERR);
	}
    }

    i = _nc_cgetent(&dummy, lineno, pathvec, name);

    /* ncurses' termcap-parsing routines cannot handle multiple adjacent
     * empty fields, and mistakenly use the last valid cap entry instead of
     * the first (breaks tc= includes)
     */
    if (i >= 0) {
	char *pd, *ps, *tok;
	int endflag = FALSE;
	char *list[1023];
	size_t n, count = 0;

	pd = bp;
	ps = dummy;
	while (!endflag && (tok = get_tc_token(&ps, &endflag)) != 0) {
	    bool ignore = FALSE;

	    for (n = 1; n < count; n++) {
		char *s = list[n];
		if (s[0] == tok[0]
		    && s[1] == tok[1]) {
		    ignore = TRUE;
		    break;
		}
	    }
	    if (ignore != TRUE) {
		list[count++] = tok;
		pd = copy_tc_token(pd, tok, TBUFSIZ - (2 + pd - bp));
		if (pd == 0) {
		    i = -1;
		    break;
		}
		*pd++ = ':';
		*pd = '\0';
	    }
	}
    }

    FreeIfNeeded(dummy);
    FreeIfNeeded(the_source);
    the_source = 0;

    /* This is not related to the BSD cgetent(), but to fake up a suitable
     * filename for ncurses' error reporting.  (If we are not using BSD
     * cgetent, then it is the actual filename).
     */
    if (i >= 0) {
#if HAVE_BSD_CGETENT
	char temp[PATH_MAX];

	_nc_str_init(&desc, temp, sizeof(temp));
	_nc_safe_strcpy(&desc, pathvec[i]);
	_nc_safe_strcat(&desc, ".db");
	if (_nc_access(temp, R_OK) == 0) {
	    _nc_safe_strcpy(&desc, pathvec[i]);
	}
	if ((the_source = strdup(temp)) != 0)
	    *sourcename = the_source;
#else
	if ((the_source = strdup(pathvec[i])) != 0)
	    *sourcename = the_source;
#endif
    }

    return (i);
}
#endif /* USE_BSD_TGETENT */
#endif /* USE_GETCAP */

#define MAXPATHS	32

/*
 * Add a filename to the list in 'termpaths[]', checking that we really have
 * a right to open the file.
 */
#if !USE_GETCAP
static int
add_tc(char *termpaths[], char *path, int count)
{
    char *save = strchr(path, NCURSES_PATHSEP);
    if (save != 0)
	*save = '\0';
    if (count < MAXPATHS
	&& _nc_access(path, R_OK) == 0) {
	termpaths[count++] = path;
	T(("Adding termpath %s", path));
    }
    termpaths[count] = 0;
    if (save != 0)
	*save = NCURSES_PATHSEP;
    return count;
}
#define ADD_TC(path, count) filecount = add_tc(termpaths, path, count)
#endif /* !USE_GETCAP */

NCURSES_EXPORT(int)
_nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
{
    int found = TGETENT_NO;
    ENTRY *ep;
#if USE_GETCAP_CACHE
    char cwd_buf[PATH_MAX];
#endif
#if USE_GETCAP
    char *p, tc[TBUFSIZ];
    int status;
    static char *source;
    static int lineno;

    T(("read termcap entry for %s", tn));

    if (strlen(tn) == 0
	|| strcmp(tn, ".") == 0
	|| strcmp(tn, "..") == 0
	|| _nc_pathlast(tn) != 0) {
	T(("illegal or missing entry name '%s'", tn));
	return TGETENT_NO;
    }

    if (use_terminfo_vars() && (p = getenv("TERMCAP")) != 0
	&& !_nc_is_abs_path(p) && _nc_name_match(p, tn, "|:")) {
	/* TERMCAP holds a termcap entry */
	strncpy(tc, p, sizeof(tc) - 1);
	tc[sizeof(tc) - 1] = '\0';
	_nc_set_source("TERMCAP");
    } else {
	/* we're using getcap(3) */
	if ((status = _nc_tgetent(tc, &source, &lineno, tn)) < 0)
	    return (status == TC_NOT_FOUND ? TGETENT_NO : TGETENT_ERR);

	_nc_curr_line = lineno;
	_nc_set_source(source);
    }
    _nc_read_entry_source((FILE *) 0, tc, FALSE, FALSE, NULLHOOK);
#else
    /*
     * Here is what the 4.4BSD termcap(3) page prescribes:
     *
     * It will look in the environment for a TERMCAP variable.  If found, and
     * the value does not begin with a slash, and the terminal type name is the
     * same as the environment string TERM, the TERMCAP string is used instead
     * of reading a termcap file.  If it does begin with a slash, the string is
     * used as a path name of the termcap file to search.  If TERMCAP does not
     * begin with a slash and name is different from TERM, tgetent() searches
     * the files $HOME/.termcap and /usr/share/misc/termcap, in that order,
     * unless the environment variable TERMPATH exists, in which case it
     * specifies a list of file pathnames (separated by spaces or colons) to be
     * searched instead.
     *
     * It goes on to state:
     *
     * Whenever multiple files are searched and a tc field occurs in the
     * requested entry, the entry it names must be found in the same file or
     * one of the succeeding files.
     *
     * However, this restriction is relaxed in ncurses; tc references to
     * previous files are permitted.
     *
     * This routine returns 1 if an entry is found, 0 if not found, and -1 if
     * the database is not accessible.
     */
    FILE *fp;
    char *tc, *termpaths[MAXPATHS];
    int filecount = 0;
    int j, k;
    bool use_buffer = FALSE;
    bool normal = TRUE;
    char tc_buf[1024];
    char pathbuf[PATH_MAX];
    char *copied = 0;
    char *cp;
    struct stat test_stat[MAXPATHS];

    termpaths[filecount] = 0;
    if (use_terminfo_vars() && (tc = getenv("TERMCAP")) != 0) {
	if (_nc_is_abs_path(tc)) {	/* interpret as a filename */
	    ADD_TC(tc, 0);
	    normal = FALSE;
	} else if (_nc_name_match(tc, tn, "|:")) {	/* treat as a capability file */
	    use_buffer = TRUE;
	    (void) sprintf(tc_buf, "%.*s\n", (int) sizeof(tc_buf) - 2, tc);
	    normal = FALSE;
	}
    }

    if (normal) {		/* normal case */
	char envhome[PATH_MAX], *h;

	copied = strdup(get_termpath());
	for (cp = copied; *cp; cp++) {
	    if (*cp == NCURSES_PATHSEP)
		*cp = '\0';
	    else if (cp == copied || cp[-1] == '\0') {
		ADD_TC(cp, filecount);
	    }
	}

#define PRIVATE_CAP "%s/.termcap"

	if (use_terminfo_vars() && (h = getenv("HOME")) != NULL && *h != '\0'
	    && (strlen(h) + sizeof(PRIVATE_CAP)) < PATH_MAX) {
	    /* user's .termcap, if any, should override it */
	    (void) strcpy(envhome, h);
	    (void) sprintf(pathbuf, PRIVATE_CAP, envhome);
	    ADD_TC(pathbuf, filecount);
	}
    }

    /*
     * Probably /etc/termcap is a symlink to /usr/share/misc/termcap.
     * Avoid reading the same file twice.
     */
#if HAVE_LINK
    for (j = 0; j < filecount; j++) {
	bool omit = FALSE;
	if (stat(termpaths[j], &test_stat[j]) != 0
	    || (test_stat[j].st_mode & S_IFMT) != S_IFREG) {
	    omit = TRUE;
	} else {
	    for (k = 0; k < j; k++) {
		if (test_stat[k].st_dev == test_stat[j].st_dev
		    && test_stat[k].st_ino == test_stat[j].st_ino) {
		    omit = TRUE;
		    break;
		}
	    }
	}
	if (omit) {
	    T(("Path %s is a duplicate", termpaths[j]));
	    for (k = j + 1; k < filecount; k++) {
		termpaths[k - 1] = termpaths[k];
		test_stat[k - 1] = test_stat[k];
	    }
	    --filecount;
	    --j;
	}
    }
#endif

    /* parse the sources */
    if (use_buffer) {
	_nc_set_source("TERMCAP");

	/*
	 * We don't suppress warning messages here.  The presumption is
	 * that since it's just a single entry, they won't be a pain.
	 */
	_nc_read_entry_source((FILE *) 0, tc_buf, FALSE, FALSE, NULLHOOK);
    } else {
	int i;

	for (i = 0; i < filecount; i++) {

	    T(("Looking for %s in %s", tn, termpaths[i]));
	    if (_nc_access(termpaths[i], R_OK) == 0
		&& (fp = fopen(termpaths[i], "r")) != (FILE *) 0) {
		_nc_set_source(termpaths[i]);

		/*
		 * Suppress warning messages.  Otherwise you get 400 lines of
		 * crap from archaic termcap files as ncurses complains about
		 * all the obsolete capabilities.
		 */
		_nc_read_entry_source(fp, (char *) 0, FALSE, TRUE, NULLHOOK);

		(void) fclose(fp);
	    }
	}
    }
    if (copied != 0)
	free(copied);
#endif /* USE_GETCAP */

    if (_nc_head == 0)
	return (TGETENT_ERR);

    /* resolve all use references */
    _nc_resolve_uses2(TRUE, FALSE);

    /* find a terminal matching tn, if we can */
#if USE_GETCAP_CACHE
    if (getcwd(cwd_buf, sizeof(cwd_buf)) != 0) {
	_nc_set_writedir((char *) 0);	/* note: this does a chdir */
#endif
	for_entry_list(ep) {
	    if (_nc_name_match(ep->tterm.term_names, tn, "|:")) {
		/*
		 * Make a local copy of the terminal capabilities, delinked
		 * from the list.
		 */
		*tp = ep->tterm;
		_nc_delink_entry(_nc_head, &(ep->tterm));
		free(ep);

		/*
		 * OK, now try to write the type to user's terminfo directory. 
		 * Next time he loads this, it will come through terminfo.
		 *
		 * Advantage:  Second and subsequent fetches of this entry will
		 * be very fast.
		 *
		 * Disadvantage:  After the first time a termcap type is loaded
		 * by its user, editing it in the /etc/termcap file, or in
		 * TERMCAP, or in a local ~/.termcap, will be ineffective
		 * unless the terminfo entry is explicitly removed.
		 */
#if USE_GETCAP_CACHE
		(void) _nc_write_entry(tp);
#endif
		found = TGETENT_YES;
		break;
	    }
	}
#if USE_GETCAP_CACHE
	chdir(cwd_buf);
    }
#endif

    return (found);
}
#else
extern
NCURSES_EXPORT(void)
_nc_read_termcap(void);
NCURSES_EXPORT(void)
_nc_read_termcap(void)
{
}
#endif /* PURE_TERMINFO */
