* Copyright (c) 1980 The Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 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 acknowledgement:
* 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
static char sccsid
[] = "@(#)termcap.c 5.7 (Berkeley) 8/6/92";
#define PBUFSIZ 512 /* max length of filename path */
#define PVECSIZ 32 /* max number of names in path */
* termcap - routines for dealing with the terminal capability data base
* BUG: Should use a "last" pointer in tbuf, so that searching
* for capabilities alphabetically would not be a n**2/2
* process when large numbers of capabilities are given.
* Note: If we add a last pointer now we will screw up the
* tc capability. We really should compile termcap.
* Essentially all the work here is scanning and decoding escapes
* in string capabilities. We don't use stdio because the editor
* doesn't, and because living w/o it is not hard.
static char *tbuf
; /* termcap buffer */
* Get an entry for terminal name in buffer bp from the termcap file.
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 */
* 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.
if (!cp
|| *cp
!= '/') { /* no TERMCAP or it holds an entry */
if (termpath
= getenv("TERMPATH"))
strncpy(pathbuf
, termpath
, PBUFSIZ
);
if (home
= getenv("HOME")) { /* set up default */
p
+= strlen(home
); /* path, looking in */
strcpy(pathbuf
, home
); /* $HOME first */
} /* if no $HOME look in current directory */
strncpy(p
, _PATH_DEF
, PBUFSIZ
- (p
- pathbuf
));
else /* user-defined name in TERMCAP */
strncpy(pathbuf
, cp
, PBUFSIZ
); /* still can be tokenized */
*fname
++ = pathbuf
; /* tokenize path into vector of names */
if (*p
== ' ' || *p
== ':') {
if (*p
!= ' ' && *p
!= ':')
if (fname
>= pathvec
+ PVECSIZ
) {
*fname
= (char *) 0; /* mark end of vector */
if (cp
&& *cp
&& *cp
!= '/')
i
= cgetent(&dummy
, pathvec
, name
);
/* no tc reference loop return code in libterm XXX */
* Return the (numeric) option id.
* Numeric options look like
* i.e. the option string is separated from the numeric value by
* a # character. If the option is not found we return -1.
* Note that we handle octal numbers beginning with 0.
if (cgetnum(tbuf
, id
, &num
) == 0)
* Flag options are given "naked", i.e. followed by a : or the end
* of the buffer. Return 1 if we find the option, or 0 if it is
return(cgetcap(tbuf
, id
, ':') != NULL
);
* Get a string valued option.
* Much decoding is done on the strings, and the strings are
* placed in area, which is a ref parameter which is updated.
* No checking on area overflow.
if ((i
= cgetstr(tbuf
, id
, &s
)) < 0)