freebsd-dev/lib/libmytinfo/termcap.c

166 lines
2.3 KiB
C

/*
* termcap.c
*
* By Ross Ridge
* Public Domain
* 92/06/01 07:43:08
*
* termcap compatibility functions
*
*/
#include "defs.h"
#include <term.h>
#ifdef __FreeBSD__
#include <unistd.h>
#endif
#ifdef USE_SCCS_IDS
static const char SCCSid[] = "@(#) mytinfo termcap.c 3.3 92/06/01 public domain, By Ross Ridge";
#endif
extern char _mytinfo_version[];
/* not static */
char *force = _mytinfo_version;
int
tgetent(buf, term)
char *term, *buf; {
char *s;
struct term_path *path;
int r = -1;
int fd;
if (term == NULL)
term = getenv("TERM");
if (term == NULL)
return 0;
path = _buildpath(
#ifdef USE_TERMINFO
"$MYTERMINFO", 2,
"$TERMINFO", 2,
#ifdef TERMINFODIR
TERMINFODIR, 0,
#endif
#ifdef TERMINFOSRC
TERMINFOSRC, 0,
#endif
#endif
#ifdef USE_TERMCAP
"$TERMCAP", 1,
#ifdef TERMCAPFILE
TERMCAPFILE, 0,
#endif
#endif
NULL, -1);
if (path == NULL)
return -1;
#if 1
{
char buf1[MAX_BUF];
r = _fillterm(term, path, buf1);
}
#else
r = _fillterm(term, path, buf);
#endif
_delpath(path);
switch(r) {
case -3:
case -2:
case -1:
return -1;
case 0:
return 0;
case 1:
case 2:
case 3:
if (isatty(1))
fd = 1;
else if (isatty(2))
fd = 2;
else if (isatty(3)) /* V10 /dev/tty ?? */
fd = 3;
else if (isatty(0))
fd = 0;
else
fd = 1;
cur_term->fd = fd;
_term_buf.fd = fd;
if (_init_tty() == ERR)
return 0;
if ((s = getenv("LINES")) != NULL && atoi(s) > 0)
lines = atoi(s);
if ((s = getenv("COLUMNS")) != NULL && atoi(s) > 0)
columns = atoi(s);
cur_term->termcap = 1;
return 1;
default:
return -1;
}
}
static char cap2[3];
int
tgetnum(cap)
char *cap; {
int ind;
cap2[0] = cap[0];
cap2[1] = cap[1];
cap2[2] = '\0';
ind = _findnumcode(cap2);
if (ind == -1)
return -1;
return cur_term->nums[ind];
}
int
tgetflag(cap)
char *cap; {
int ind;
cap2[0] = cap[0];
cap2[1] = cap[1];
cap2[2] = '\0';
ind = _findboolcode(cap2);
if (ind == -1)
return 0;
return cur_term->bools[ind];
}
char *
tgetstr(cap, area)
char *cap;
char **area; {
register char *sp, *dp;
int ind;
cap2[0] = cap[0];
cap2[1] = cap[1];
cap2[2] = '\0';
ind = _findstrcode(cap2);
if (ind == -1)
return NULL;
sp = cur_term->strs[ind];
if (area == NULL || sp == NULL)
return sp;
dp = *area;
while (*sp != '\0')
*dp++ = *sp++;
*dp++ = '\0';
sp = *area;
*area = dp;
return sp;
}