/****************************************************************************
- * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2018,2019 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 *
#include <sys/types.h>
#include <tic.h>
-MODULE_ID("$Id: read_termcap.c,v 1.87 2012/05/05 19:40:50 tom Exp $")
+MODULE_ID("$Id: read_termcap.c,v 1.97 2019/01/26 20:07:30 tom Exp $")
#if !PURE_TERMINFO
#define TC_REF_LOOP -3
#define TC_UNRESOLVED -4 /* this is not returned by BSD cgetent */
-static NCURSES_CONST char *
+static const char *
get_termpath(void)
{
- NCURSES_CONST char *result;
+ const char *result;
if (!use_terminfo_vars() || (result = getenv("TERMPATH")) == 0)
result = TERMPATH;
if (bp >= b_end) {
int n;
- n = read(fd, buf, sizeof(buf));
+ n = (int) read(fd, buf, sizeof(buf));
if (n <= 0) {
if (myfd)
(void) close(fd);
|| *(rp - 1) != '\\')
break;
}
- *rp++ = c;
+ *rp++ = (char) c;
/*
* Enforce loop invariant: if no room
unsigned pos;
size_t newsize;
- pos = rp - record;
- newsize = r_end - record + BFRAG;
+ pos = (unsigned) (rp - record);
+ newsize = (size_t) (r_end - record + BFRAG);
record = DOALLOC(newsize);
if (record == 0) {
if (myfd)
}
}
tcstart = tc - 3;
- tclen = s - tcstart;
+ tclen = (int) (s - tcstart);
tcend = s;
icap = 0;
iret = _nc_getent(&icap, &ilen, &oline, current, db_array, fd,
tc, depth + 1, 0);
newicap = icap; /* Put into a register. */
- newilen = ilen;
+ newilen = (int) ilen;
if (iret != TC_SUCCESS) {
/* an error */
if (iret < TC_NOT_FOUND) {
/* not interested in name field of tc'ed record */
s = newicap;
while (*s != '\0' && *s++ != ':') ;
- newilen -= s - newicap;
+ newilen -= (int) (s - newicap);
newicap = s;
/* make sure interpolated record is `:'-terminated */
unsigned pos, tcpos, tcposend;
size_t newsize;
- pos = rp - record;
- newsize = r_end - record + diff + BFRAG;
- tcpos = tcstart - record;
- tcposend = tcend - record;
+ pos = (unsigned) (rp - record);
+ newsize = (size_t) (r_end - record + diff + BFRAG);
+ tcpos = (unsigned) (tcstart - record);
+ tcposend = (unsigned) (tcend - record);
record = DOALLOC(newsize);
if (record == 0) {
if (myfd)
*/
if (myfd)
(void) close(fd);
- *len = rp - record - 1; /* don't count NUL */
+ *len = (unsigned) (rp - record - 1); /* don't count NUL */
if (r_end > rp) {
if ((record = DOALLOC((size_t) (rp - record))) == 0) {
errno = ENOMEM;
dst = 0;
break;
}
- *dst++ = ch;
+ *dst++ = (char) ch;
}
return dst;
}
int i;
char pathbuf[PBUFSIZ]; /* holds raw path of filenames */
CGETENT_CONST char *pathvec[PVECSIZ]; /* point to names in pathbuf */
- CGETENT_CONST char **pvec; /* holds usable tail of path vector */
- NCURSES_CONST char *termpath;
+ const char *termpath;
string_desc desc;
*lineno = 1;
fname = pathvec;
- pvec = pathvec;
p = pathbuf;
cp = use_terminfo_vars()? getenv("TERMCAP") : NULL;
}
if (ignore != TRUE) {
list[count++] = tok;
- pd = copy_tc_token(pd, tok, TBUFSIZ - (2 + pd - bp));
+ pd = copy_tc_token(pd, tok, (size_t) (TBUFSIZ - (2 + pd - bp)));
if (pd == 0) {
i = -1;
break;
#endif /* !USE_GETCAP */
NCURSES_EXPORT(int)
-_nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
+_nc_read_termcap_entry(const char *const tn, TERMTYPE2 *const tp)
{
int found = TGETENT_NO;
ENTRY *ep;
#endif
#if USE_GETCAP
char *p, tc[TBUFSIZ];
+ char *tc_buf = 0;
+#define MY_SIZE sizeof(tc) - 1
int status;
static char *source;
static int lineno;
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';
+ tc_buf = strdup(p);
_nc_set_source("TERMCAP");
} else {
/* we're using getcap(3) */
_nc_curr_line = lineno;
_nc_set_source(source);
+ tc_buf = tc;
}
- _nc_read_entry_source((FILE *) 0, tc, FALSE, TRUE, NULLHOOK);
+ if (tc_buf == 0)
+ return (TGETENT_ERR);
+ _nc_read_entry_source((FILE *) 0, tc_buf, FALSE, TRUE, NULLHOOK);
+ if (tc_buf != tc)
+ free(tc_buf);
#else
/*
* Here is what the 4.4BSD termcap(3) page prescribes:
int j, k;
bool use_buffer = FALSE;
bool normal = TRUE;
- char tc_buf[1024];
+ char *tc_buf = 0;
char pathbuf[PATH_MAX];
char *copied = 0;
char *cp;
ADD_TC(tc, 0);
normal = FALSE;
} else if (_nc_name_match(tc, tn, "|:")) { /* treat as a capability file */
- use_buffer = TRUE;
- _nc_SPRINTF(tc_buf,
- _nc_SLIMIT(sizeof(tc_buf))
- "%.*s\n", (int) sizeof(tc_buf) - 2, tc);
+ tc_buf = strdup(tc);
+ use_buffer = (tc_buf != 0);
normal = FALSE;
}
}
* 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);
+ free(tc_buf);
} else {
int i;
return (TGETENT_ERR);
/* resolve all use references */
- _nc_resolve_uses2(TRUE, FALSE);
+ if (_nc_resolve_uses2(TRUE, FALSE) != TRUE)
+ return (TGETENT_ERR);
/* find a terminal matching tn, if we can */
#if USE_GETCAP_CACHE