summaryrefslogtreecommitdiff
path: root/ncurses/tinfo
diff options
context:
space:
mode:
Diffstat (limited to 'ncurses/tinfo')
-rwxr-xr-xncurses/tinfo/MKcaptab.sh10
-rw-r--r--ncurses/tinfo/access.c43
-rw-r--r--ncurses/tinfo/alloc_entry.c55
-rw-r--r--ncurses/tinfo/alloc_ttype.c55
-rw-r--r--ncurses/tinfo/captoinfo.c212
-rw-r--r--ncurses/tinfo/comp_error.c20
-rw-r--r--ncurses/tinfo/comp_expand.c19
-rw-r--r--ncurses/tinfo/comp_parse.c187
-rw-r--r--ncurses/tinfo/comp_scan.c171
-rw-r--r--ncurses/tinfo/db_iterator.c429
-rw-r--r--ncurses/tinfo/doalloc.c21
-rw-r--r--ncurses/tinfo/entries.c11
-rw-r--r--ncurses/tinfo/getenv_num.c21
-rw-r--r--ncurses/tinfo/hashed_db.c163
-rw-r--r--ncurses/tinfo/home_terminfo.c10
-rw-r--r--ncurses/tinfo/lib_acs.c9
-rw-r--r--ncurses/tinfo/lib_baudrate.c71
-rw-r--r--ncurses/tinfo/lib_cur_term.c24
-rw-r--r--ncurses/tinfo/lib_data.c15
-rw-r--r--ncurses/tinfo/lib_has_cap.c8
-rw-r--r--ncurses/tinfo/lib_napms.c12
-rw-r--r--ncurses/tinfo/lib_options.c57
-rw-r--r--ncurses/tinfo/lib_print.c10
-rw-r--r--ncurses/tinfo/lib_raw.c35
-rw-r--r--ncurses/tinfo/lib_setup.c178
-rw-r--r--ncurses/tinfo/lib_termcap.c51
-rw-r--r--ncurses/tinfo/lib_tgoto.c9
-rw-r--r--ncurses/tinfo/lib_ti.c16
-rw-r--r--ncurses/tinfo/lib_tparm.c86
-rw-r--r--ncurses/tinfo/lib_tputs.c105
-rw-r--r--ncurses/tinfo/lib_ttyflags.c24
-rw-r--r--ncurses/tinfo/make_hash.c52
-rw-r--r--ncurses/tinfo/make_keys.c6
-rw-r--r--ncurses/tinfo/name_match.c42
-rw-r--r--ncurses/tinfo/obsolete.c239
-rw-r--r--ncurses/tinfo/parse_entry.c40
-rw-r--r--ncurses/tinfo/read_entry.c391
-rw-r--r--ncurses/tinfo/read_termcap.c89
-rw-r--r--ncurses/tinfo/setbuf.c169
-rw-r--r--ncurses/tinfo/strings.c8
-rw-r--r--ncurses/tinfo/tinfo_driver.c261
-rw-r--r--ncurses/tinfo/trim_sgr0.c83
-rw-r--r--ncurses/tinfo/write_entry.c110
43 files changed, 2327 insertions, 1300 deletions
diff --git a/ncurses/tinfo/MKcaptab.sh b/ncurses/tinfo/MKcaptab.sh
index 4d1b53a..20c94a6 100755
--- a/ncurses/tinfo/MKcaptab.sh
+++ b/ncurses/tinfo/MKcaptab.sh
@@ -1,6 +1,6 @@
#!/bin/sh
##############################################################################
-# Copyright (c) 2007-2009,2010 Free Software Foundation, Inc. #
+# Copyright (c) 2007-2010,2011 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"), #
@@ -26,7 +26,7 @@
# use or other dealings in this Software without prior written #
# authorization. #
##############################################################################
-# $Id: MKcaptab.sh,v 1.13 2010/12/25 23:43:58 tom Exp $
+# $Id: MKcaptab.sh,v 1.14 2011/10/22 16:34:50 tom Exp $
AWK=${1-awk}
OPT1=${2-0}
OPT2=${3-tinfo/MKcaptab.awk}
@@ -99,12 +99,12 @@ static const struct alias *
_nc_build_alias(struct alias **actual,
const alias_table_data *source,
const char *strings,
- unsigned tablesize)
+ size_t tablesize)
{
if (*actual == 0) {
*actual = typeCalloc(struct alias, tablesize + 1);
if (*actual != 0) {
- unsigned n;
+ size_t n;
for (n = 0; n < tablesize; ++n) {
add_alias(from);
add_alias(to);
@@ -178,7 +178,7 @@ tcap_hash(const char *string)
static int
compare_tcap_names(const char *a, const char *b)
{
- return !strncmp(a, b, TCAP_LEN);
+ return !strncmp(a, b, (size_t) TCAP_LEN);
}
static int
diff --git a/ncurses/tinfo/access.c b/ncurses/tinfo/access.c
index 87c4f46..d987687 100644
--- a/ncurses/tinfo/access.c
+++ b/ncurses/tinfo/access.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2011,2012 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 *
@@ -33,11 +33,18 @@
#include <curses.priv.h>
#include <ctype.h>
-#include <sys/stat.h>
#include <tic.h>
-MODULE_ID("$Id: access.c,v 1.16 2010/01/23 17:57:43 tom Exp $")
+MODULE_ID("$Id: access.c,v 1.23 2012/09/01 19:21:29 tom Exp $")
+
+#ifdef __TANDEM
+#define ROOT_UID 65535
+#endif
+
+#ifndef ROOT_UID
+#define ROOT_UID 0
+#endif
#define LOWERCASE(c) ((isalpha(UChar(c)) && isupper(UChar(c))) ? tolower(UChar(c)) : (c))
@@ -53,7 +60,7 @@ _nc_rootname(char *path)
result = temp;
#if !MIXEDCASE_FILENAMES
for (s = result; *s != '\0'; ++s) {
- *s = LOWERCASE(*s);
+ *s = (char) LOWERCASE(*s);
}
#endif
#if defined(PROG_EXT)
@@ -108,24 +115,33 @@ _nc_basename(char *path)
NCURSES_EXPORT(int)
_nc_access(const char *path, int mode)
{
- if (access(path, mode) < 0) {
+ int result;
+
+ if (path == 0) {
+ result = -1;
+ } else if (access(path, mode) < 0) {
if ((mode & W_OK) != 0
&& errno == ENOENT
&& strlen(path) < PATH_MAX) {
char head[PATH_MAX];
- char *leaf = _nc_basename(strcpy(head, path));
+ char *leaf;
+ _nc_STRCPY(head, path, sizeof(head));
+ leaf = _nc_basename(head);
if (leaf == 0)
leaf = head;
*leaf = '\0';
if (head == leaf)
- (void) strcpy(head, ".");
+ _nc_STRCPY(head, ".", sizeof(head));
- return access(head, R_OK | W_OK | X_OK);
+ result = access(head, R_OK | W_OK | X_OK);
+ } else {
+ result = -1;
}
- return -1;
+ } else {
+ result = 0;
}
- return 0;
+ return result;
}
NCURSES_EXPORT(bool)
@@ -135,7 +151,7 @@ _nc_is_dir_path(const char *path)
struct stat sb;
if (stat(path, &sb) == 0
- && (sb.st_mode & S_IFMT) == S_IFDIR) {
+ && S_ISDIR(sb.st_mode)) {
result = TRUE;
}
return result;
@@ -148,7 +164,7 @@ _nc_is_file_path(const char *path)
struct stat sb;
if (stat(path, &sb) == 0
- && (sb.st_mode & S_IFMT) == S_IFREG) {
+ && S_ISREG(sb.st_mode)) {
result = TRUE;
}
return result;
@@ -170,6 +186,7 @@ _nc_env_access(void)
|| getgid() != getegid())
return FALSE;
#endif
- return getuid() != 0 && geteuid() != 0; /* ...finally, disallow root */
+ /* ...finally, disallow root */
+ return (getuid() != ROOT_UID) && (geteuid() != ROOT_UID);
}
#endif
diff --git a/ncurses/tinfo/alloc_entry.c b/ncurses/tinfo/alloc_entry.c
index 506fb38..14ea391 100644
--- a/ncurses/tinfo/alloc_entry.c
+++ b/ncurses/tinfo/alloc_entry.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2008,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2013 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 *
@@ -47,7 +47,7 @@
#include <tic.h>
-MODULE_ID("$Id: alloc_entry.c,v 1.51 2010/12/25 23:06:01 tom Exp $")
+MODULE_ID("$Id: alloc_entry.c,v 1.58 2013/08/17 19:20:38 tom Exp $")
#define ABSENT_OFFSET -1
#define CANCELLED_OFFSET -2
@@ -61,8 +61,6 @@ NCURSES_EXPORT(void)
_nc_init_entry(TERMTYPE *const tp)
/* initialize a terminal type data block */
{
- unsigned i;
-
#if NO_LEAKS
if (tp == 0) {
if (stringbuf != 0) {
@@ -73,33 +71,11 @@ _nc_init_entry(TERMTYPE *const tp)
#endif
if (stringbuf == 0)
- stringbuf = (char *) malloc(MAX_STRTAB);
-
-#if NCURSES_XNAMES
- tp->num_Booleans = BOOLCOUNT;
- tp->num_Numbers = NUMCOUNT;
- tp->num_Strings = STRCOUNT;
- tp->ext_Booleans = 0;
- tp->ext_Numbers = 0;
- tp->ext_Strings = 0;
-#endif
- if (tp->Booleans == 0)
- tp->Booleans = typeMalloc(NCURSES_SBOOL, BOOLCOUNT);
- if (tp->Numbers == 0)
- tp->Numbers = typeMalloc(short, NUMCOUNT);
- if (tp->Strings == 0)
- tp->Strings = typeMalloc(char *, STRCOUNT);
-
- for_each_boolean(i, tp)
- tp->Booleans[i] = FALSE;
-
- for_each_number(i, tp)
- tp->Numbers[i] = ABSENT_NUMERIC;
-
- for_each_string(i, tp)
- tp->Strings[i] = ABSENT_STRING;
+ TYPE_MALLOC(char, (size_t) MAX_STRTAB, stringbuf);
next_free = 0;
+
+ _nc_init_termtype(tp);
}
NCURSES_EXPORT(ENTRY *)
@@ -131,13 +107,13 @@ _nc_save_str(const char *const string)
result = (stringbuf + next_free - 1);
}
} else if (next_free + len < MAX_STRTAB) {
- strcpy(&stringbuf[next_free], string);
+ _nc_STRCPY(&stringbuf[next_free], string, MAX_STRTAB);
DEBUG(7, ("Saved string %s", _nc_visbuf(string)));
DEBUG(7, ("at location %d", (int) next_free));
next_free += len;
result = (stringbuf + old_next_free);
} else {
- _nc_warning("Too much data, some is lost");
+ _nc_warning("Too much data, some is lost: %s", string);
}
return result;
}
@@ -194,8 +170,7 @@ _nc_wrap_entry(ENTRY * const ep, bool copy_strings)
useoffsets[i] = (int) (ep->uses[i].name - stringbuf);
}
- if ((tp->str_table = typeMalloc(char, next_free)) == (char *) 0)
- _nc_err_abort(MSG_NO_MEMORY);
+ TYPE_MALLOC(char, next_free, tp->str_table);
(void) memcpy(tp->str_table, stringbuf, next_free);
tp->term_names = tp->str_table + n;
@@ -216,16 +191,18 @@ _nc_wrap_entry(ENTRY * const ep, bool copy_strings)
if ((n = (unsigned) NUM_EXT_NAMES(tp)) != 0) {
if (n < SIZEOF(offsets)) {
size_t length = 0;
+ size_t offset;
for (i = 0; i < n; i++) {
length += strlen(tp->ext_Names[i]) + 1;
offsets[i] = (int) (tp->ext_Names[i] - stringbuf);
}
- if ((tp->ext_str_table = typeMalloc(char, length)) == 0)
- _nc_err_abort(MSG_NO_MEMORY);
- for (i = 0, length = 0; i < n; i++) {
- tp->ext_Names[i] = tp->ext_str_table + length;
- strcpy(tp->ext_Names[i], stringbuf + offsets[i]);
- length += strlen(tp->ext_Names[i]) + 1;
+ TYPE_MALLOC(char, length, tp->ext_str_table);
+ for (i = 0, offset = 0; i < n; i++) {
+ tp->ext_Names[i] = tp->ext_str_table + offset;
+ _nc_STRCPY(tp->ext_Names[i],
+ stringbuf + offsets[i],
+ length - offset);
+ offset += strlen(tp->ext_Names[i]) + 1;
}
}
}
diff --git a/ncurses/tinfo/alloc_ttype.c b/ncurses/tinfo/alloc_ttype.c
index b02cb9c..35c92dd 100644
--- a/ncurses/tinfo/alloc_ttype.c
+++ b/ncurses/tinfo/alloc_ttype.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1999-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1999-2012,2013 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 *
@@ -42,7 +42,7 @@
#include <tic.h>
-MODULE_ID("$Id: alloc_ttype.c,v 1.22 2010/12/19 00:24:09 tom Exp $")
+MODULE_ID("$Id: alloc_ttype.c,v 1.27 2013/06/08 16:54:50 tom Exp $")
#if NCURSES_XNAMES
/*
@@ -104,7 +104,7 @@ realign_data(TERMTYPE *to, char **ext_Names,
if (to->ext_Booleans != ext_Booleans) {
EXTEND_NUM(num_Booleans, ext_Booleans);
- to->Booleans = typeRealloc(NCURSES_SBOOL, to->num_Booleans, to->Booleans);
+ TYPE_REALLOC(NCURSES_SBOOL, to->num_Booleans, to->Booleans);
for (n = to->ext_Booleans - 1,
m = ext_Booleans - 1,
base = to->num_Booleans - (m + 1); m >= 0; m--) {
@@ -116,9 +116,10 @@ realign_data(TERMTYPE *to, char **ext_Names,
}
to->ext_Booleans = UShort(ext_Booleans);
}
+
if (to->ext_Numbers != ext_Numbers) {
EXTEND_NUM(num_Numbers, ext_Numbers);
- to->Numbers = typeRealloc(short, to->num_Numbers, to->Numbers);
+ TYPE_REALLOC(short, to->num_Numbers, to->Numbers);
for (n = to->ext_Numbers - 1,
m = ext_Numbers - 1,
base = to->num_Numbers - (m + 1); m >= 0; m--) {
@@ -132,7 +133,7 @@ realign_data(TERMTYPE *to, char **ext_Names,
}
if (to->ext_Strings != ext_Strings) {
EXTEND_NUM(num_Strings, ext_Strings);
- to->Strings = typeRealloc(char *, to->num_Strings, to->Strings);
+ TYPE_REALLOC(char *, to->num_Strings, to->Strings);
for (n = to->ext_Strings - 1,
m = ext_Strings - 1,
base = to->num_Strings - (m + 1); m >= 0; m--) {
@@ -301,7 +302,7 @@ _nc_ins_ext_name(TERMTYPE *tp, char *name, int token_type)
}
}
- tp->ext_Names = typeRealloc(char *, total, tp->ext_Names);
+ TYPE_REALLOC(char *, total, tp->ext_Names);
for (k = total - 1; k > j; k--)
tp->ext_Names[k] = tp->ext_Names[k - 1];
tp->ext_Names[j] = name;
@@ -311,21 +312,21 @@ _nc_ins_ext_name(TERMTYPE *tp, char *name, int token_type)
case BOOLEAN:
tp->ext_Booleans++;
tp->num_Booleans++;
- tp->Booleans = typeRealloc(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans);
+ TYPE_REALLOC(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans);
for (k = (unsigned) (tp->num_Booleans - 1); k > j; k--)
tp->Booleans[k] = tp->Booleans[k - 1];
break;
case NUMBER:
tp->ext_Numbers++;
tp->num_Numbers++;
- tp->Numbers = typeRealloc(short, tp->num_Numbers, tp->Numbers);
+ TYPE_REALLOC(short, tp->num_Numbers, tp->Numbers);
for (k = (unsigned) (tp->num_Numbers - 1); k > j; k--)
tp->Numbers[k] = tp->Numbers[k - 1];
break;
case STRING:
tp->ext_Strings++;
tp->num_Strings++;
- tp->Strings = typeRealloc(char *, tp->num_Strings, tp->Strings);
+ TYPE_REALLOC(char *, tp->num_Strings, tp->Strings);
for (k = (unsigned) (tp->num_Strings - 1); k > j; k--)
tp->Strings[k] = tp->Strings[k - 1];
break;
@@ -417,7 +418,7 @@ _nc_align_termtype(TERMTYPE *to, TERMTYPE *from)
* into it, updating to's counts for booleans, etc. Fortunately we do
* this only for the terminfo compiler (tic) and comparer (infocmp).
*/
- ext_Names = typeMalloc(char *, (size_t)(na + nb));
+ TYPE_MALLOC(char *, (size_t)(na + nb), ext_Names);
if (to->ext_Strings && (from->ext_Booleans + from->ext_Numbers))
adjust_cancels(to, from);
@@ -461,7 +462,7 @@ _nc_align_termtype(TERMTYPE *to, TERMTYPE *from)
if (nb != (ext_Booleans + ext_Numbers + ext_Strings)) {
nb = (ext_Booleans + ext_Numbers + ext_Strings);
realign_data(from, ext_Names, ext_Booleans, ext_Numbers, ext_Strings);
- from->ext_Names = typeRealloc(char *, (size_t) nb, from->ext_Names);
+ TYPE_REALLOC(char *, (size_t) nb, from->ext_Names);
memcpy(from->ext_Names, ext_Names, sizeof(char *) * (size_t) nb);
DEBUG(2, ("realigned %d extended names for '%s' (from)",
NUM_EXT_NAMES(from), from->term_names));
@@ -473,22 +474,27 @@ _nc_align_termtype(TERMTYPE *to, TERMTYPE *from)
#endif
NCURSES_EXPORT(void)
-_nc_copy_termtype(TERMTYPE *dst, TERMTYPE *src)
+_nc_copy_termtype(TERMTYPE *dst, const TERMTYPE *src)
{
+#if NCURSES_XNAMES
unsigned i;
+#endif
*dst = *src; /* ...to copy the sizes and string-tables */
- dst->Booleans = typeMalloc(NCURSES_SBOOL, NUM_BOOLEANS(dst));
- dst->Numbers = typeMalloc(short, NUM_NUMBERS(dst));
- dst->Strings = typeMalloc(char *, NUM_STRINGS(dst));
-
- /* FIXME: use memcpy for these and similar loops */
- for_each_boolean(i, dst)
- dst->Booleans[i] = src->Booleans[i];
- for_each_number(i, dst)
- dst->Numbers[i] = src->Numbers[i];
- for_each_string(i, dst)
- dst->Strings[i] = src->Strings[i];
+
+ TYPE_MALLOC(NCURSES_SBOOL, NUM_BOOLEANS(dst), dst->Booleans);
+ TYPE_MALLOC(short, NUM_NUMBERS(dst), dst->Numbers);
+ TYPE_MALLOC(char *, NUM_STRINGS(dst), dst->Strings);
+
+ memcpy(dst->Booleans,
+ src->Booleans,
+ NUM_BOOLEANS(dst) * sizeof(dst->Booleans[0]));
+ memcpy(dst->Numbers,
+ src->Numbers,
+ NUM_NUMBERS(dst) * sizeof(dst->Numbers[0]));
+ memcpy(dst->Strings,
+ src->Strings,
+ NUM_STRINGS(dst) * sizeof(dst->Strings[0]));
/* FIXME: we probably should also copy str_table and ext_str_table,
* but tic and infocmp are not written to exploit that (yet).
@@ -496,11 +502,10 @@ _nc_copy_termtype(TERMTYPE *dst, TERMTYPE *src)
#if NCURSES_XNAMES
if ((i = NUM_EXT_NAMES(src)) != 0) {
- dst->ext_Names = typeMalloc(char *, i);
+ TYPE_MALLOC(char *, i, dst->ext_Names);
memcpy(dst->ext_Names, src->ext_Names, i * sizeof(char *));
} else {
dst->ext_Names = 0;
}
#endif
-
}
diff --git a/ncurses/tinfo/captoinfo.c b/ncurses/tinfo/captoinfo.c
index a0da44d..e02e622 100644
--- a/ncurses/tinfo/captoinfo.c
+++ b/ncurses/tinfo/captoinfo.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2011,2012 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 *
@@ -93,7 +93,7 @@
#include <ctype.h>
#include <tic.h>
-MODULE_ID("$Id: captoinfo.c,v 1.58 2010/12/04 20:08:19 tom Exp $")
+MODULE_ID("$Id: captoinfo.c,v 1.77 2012/12/30 00:50:40 tom Exp $")
#define MAX_PUSHED 16 /* max # args we can push onto the stack */
@@ -114,9 +114,7 @@ init_string(void)
/* initialize 'my_string', 'my_length' */
{
if (my_string == 0)
- my_string = typeMalloc(char, my_length = 256);
- if (my_string == 0)
- _nc_err_abort(MSG_NO_MEMORY);
+ TYPE_MALLOC(char, my_length = 256, my_string);
*my_string = '\0';
return my_string;
@@ -133,7 +131,7 @@ save_string(char *d, const char *const s)
_nc_err_abort(MSG_NO_MEMORY);
d = my_string + have;
}
- (void) strcpy(d, s);
+ _nc_STRCPY(d, s, my_length - have);
return d + strlen(d);
}
@@ -240,6 +238,12 @@ getparm(int parm, int n)
else if (parm == 2)
parm = 1;
}
+
+ while (n--) {
+ dp = save_string(dp, "%p");
+ dp = save_char(dp, '0' + parm);
+ }
+
if (onstack == parm) {
if (n > 1) {
_nc_warning("string may not be optimal");
@@ -255,11 +259,6 @@ getparm(int parm, int n)
onstack = parm;
- while (n--) {
- dp = save_string(dp, "%p");
- dp = save_char(dp, '0' + parm);
- }
-
if (seenn && parm < 3) {
dp = save_string(dp, "%{96}%^");
}
@@ -469,73 +468,9 @@ _nc_captoinfo(const char *cap, const char *s, int const parameterized)
break;
}
break;
-#ifdef REVISIBILIZE
- case '\\':
- dp = save_char(dp, *s++);
- dp = save_char(dp, *s++);
- break;
- case '\n':
- dp = save_string(dp, "\\n");
- s++;
- break;
- case '\t':
- dp = save_string(dp, "\\t");
- s++;
- break;
- case '\r':
- dp = save_string(dp, "\\r");
- s++;
- break;
- case '\200':
- dp = save_string(dp, "\\0");
- s++;
- break;
- case '\f':
- dp = save_string(dp, "\\f");
- s++;
- break;
- case '\b':
- dp = save_string(dp, "\\b");
- s++;
- break;
- case ' ':
- dp = save_string(dp, "\\s");
- s++;
- break;
- case '^':
- dp = save_string(dp, "\\^");
- s++;
- break;
- case ':':
- dp = save_string(dp, "\\:");
- s++;
- break;
- case ',':
- dp = save_string(dp, "\\,");
- s++;
- break;
- default:
- if (*s == '\033') {
- dp = save_string(dp, "\\E");
- s++;
- } else if (*s > 0 && *s < 32) {
- dp = save_char(dp, '^');
- dp = save_char(dp, *s + '@');
- s++;
- } else if (*s <= 0 || *s >= 127) {
- dp = save_char(dp, '\\');
- dp = save_char(dp, ((*s & 0300) >> 6) + '0');
- dp = save_char(dp, ((*s & 0070) >> 3) + '0');
- dp = save_char(dp, (*s & 0007) + '0');
- s++;
- } else
- dp = save_char(dp, *s++);
- break;
-#else
default:
dp = save_char(dp, *s++);
break;
-#endif
}
}
@@ -578,7 +513,7 @@ bcd_expression(const char *str)
{
char buffer[80];
int tst;
- sprintf(buffer, fmt, ch1, ch2);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) fmt, ch1, ch2);
tst = strlen(buffer) - 1;
assert(len == tst);
}
@@ -597,10 +532,13 @@ save_tc_char(char *bufptr, int c1)
bufptr = save_char(bufptr, '\\');
bufptr = save_char(bufptr, c1);
} else {
- if (c1 == (c1 & 0x1f)) /* iscntrl() returns T on 255 */
- (void) strcpy(temp, unctrl((chtype) c1));
- else
- (void) sprintf(temp, "\\%03o", c1);
+ if (c1 == (c1 & 0x1f)) { /* iscntrl() returns T on 255 */
+ _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+ "%.20s", unctrl((chtype) c1));
+ } else {
+ _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+ "\\%03o", c1);
+ }
bufptr = save_string(bufptr, temp);
}
return bufptr;
@@ -646,13 +584,15 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz
int in0, in1, in2;
char ch1 = 0, ch2 = 0;
char *bufptr = init_string();
+ char octal[4];
int len;
bool syntax_error = FALSE;
/* we may have to move some trailing mandatory padding up front */
padding = str + strlen(str) - 1;
- if (padding > str && *padding == '>' && *--padding == '/') {
- --padding;
+ if (padding > str && *padding == '>') {
+ if (*--padding == '/')
+ --padding;
while (isdigit(UChar(*padding)) || *padding == '.' || *padding == '*')
padding--;
if (padding > str && *padding == '<' && *--padding == '$')
@@ -663,7 +603,7 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz
bufptr = save_char(bufptr, *padding++);
}
- for (; *str && str != trimmed; str++) {
+ for (; *str && ((trimmed == 0) || (str < trimmed)); str++) {
int c1, c2;
char *cp = 0;
@@ -685,8 +625,72 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz
} else if (str[1] == ',') {
bufptr = save_char(bufptr, *++str);
} else {
+ int xx1, xx2;
+
bufptr = save_char(bufptr, *str++);
- bufptr = save_char(bufptr, *str);
+ xx1 = *str;
+ if (_nc_strict_bsd) {
+ if (isdigit(UChar(xx1))) {
+ int pad = 0;
+
+ if (!isdigit(UChar(str[1])))
+ pad = 2;
+ else if (str[1] && !isdigit(UChar(str[2])))
+ pad = 1;
+
+ /*
+ * Test for "\0", "\00" or "\000" and transform those
+ * into "\200".
+ */
+ if (xx1 == '0'
+ && ((pad == 2) || (str[1] == '0'))
+ && ((pad >= 1) || (str[2] == '0'))) {
+ xx2 = '2';
+ } else {
+ xx2 = '0';
+ pad = 0; /* FIXME - optionally pad to 3 digits */
+ }
+ while (pad-- > 0) {
+ bufptr = save_char(bufptr, xx2);
+ xx2 = '0';
+ }
+ } else if (strchr("E\\nrtbf", xx1) == 0) {
+ switch (xx1) {
+ case 'e':
+ xx1 = 'E';
+ break;
+ case 'l':
+ xx1 = 'n';
+ break;
+ case 's':
+ bufptr = save_char(bufptr, '0');
+ bufptr = save_char(bufptr, '4');
+ xx1 = '0';
+ break;
+ case ':':
+ /*
+ * Note: termcap documentation claims that ":"
+ * must be escaped as "\072", however the
+ * documentation is incorrect - read the code.
+ * The replacement does not work reliably,
+ * so the advice is not helpful.
+ */
+ bufptr = save_char(bufptr, '0');
+ bufptr = save_char(bufptr, '7');
+ xx1 = '2';
+ break;
+ default:
+ /* should not happen, but handle this anyway */
+ _nc_SPRINTF(octal, _nc_SLIMIT(sizeof(octal))
+ "%03o", UChar(xx1));
+ bufptr = save_char(bufptr, octal[0]);
+ bufptr = save_char(bufptr, octal[1]);
+ xx1 = octal[2];
+ break;
+ }
+ }
+ }
+ bufptr = save_char(bufptr, xx1);
}
} else if (str[0] == '$' && str[1] == '<') { /* discard padding */
str += 2;
@@ -703,7 +707,8 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz
&& ((in0 == 4 && in1 == 10 && in2 == 48)
|| (in0 == 3 && in1 == 9 && in2 == 38))) {
/* dumb-down an optimized case from xterm-256color for termcap */
- str = strstr(str, ";m");
+ if ((str = strstr(str, ";m")) == 0)
+ break; /* cannot happen */
++str;
if (in2 == 48) {
bufptr = save_string(bufptr, "[48;5;%dm");
@@ -720,13 +725,13 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz
bufptr = save_tc_inequality(bufptr, c1, c2);
} else if (sscanf(str, "%%?%%{%d}%%>%%t%%'%c'%%+%%;", &c1, &ch2) == 2) {
str = strchr(str, ';');
- bufptr = save_tc_inequality(bufptr, c1, c2);
+ bufptr = save_tc_inequality(bufptr, c1, ch2);
} else if (sscanf(str, "%%?%%'%c'%%>%%t%%{%d}%%+%%;", &ch1, &c2) == 2) {
str = strchr(str, ';');
- bufptr = save_tc_inequality(bufptr, c1, c2);
+ bufptr = save_tc_inequality(bufptr, ch1, c2);
} else if (sscanf(str, "%%?%%'%c'%%>%%t%%'%c'%%+%%;", &ch1, &ch2) == 2) {
str = strchr(str, ';');
- bufptr = save_tc_inequality(bufptr, c1, c2);
+ bufptr = save_tc_inequality(bufptr, ch1, ch2);
} else if ((len = bcd_expression(str)) != 0) {
str += len;
bufptr = save_string(bufptr, "%B");
@@ -741,15 +746,15 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz
bufptr = save_tc_char(bufptr, c1);
}
/* FIXME: this "works" for 'delta' */
- else if (strncmp(str, "%{2}%*%-", 8) == 0) {
+ else if (strncmp(str, "%{2}%*%-", (size_t) 8) == 0) {
str += 7;
bufptr = save_string(bufptr, "%D");
- } else if (strncmp(str, "%{96}%^", 7) == 0) {
+ } else if (strncmp(str, "%{96}%^", (size_t) 7) == 0) {
str += 6;
if (saw_m++ == 0) {
bufptr = save_string(bufptr, "%n");
}
- } else if (strncmp(str, "%{127}%^", 8) == 0) {
+ } else if (strncmp(str, "%{127}%^", (size_t) 8) == 0) {
str += 7;
if (saw_n++ == 0) {
bufptr = save_string(bufptr, "%m");
@@ -772,8 +777,25 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz
case '8':
case '9':
bufptr = save_char(bufptr, '%');
- while (isdigit(UChar(*str)))
- bufptr = save_char(bufptr, *str++);
+ ch1 = 0;
+ ch2 = 0;
+ while (isdigit(UChar(*str))) {
+ ch2 = ch1;
+ ch1 = *str++;
+ if (_nc_strict_bsd) {
+ if (ch1 > '3')
+ return 0;
+ } else {
+ bufptr = save_char(bufptr, ch1);
+ }
+ }
+ if (_nc_strict_bsd) {
+ if (ch2 != 0 && ch2 != '0')
+ return 0;
+ if (ch1 < '2')
+ ch1 = 'd';
+ bufptr = save_char(bufptr, ch1);
+ }
if (strchr("doxX.", *str)) {
if (*str != 'd') /* termcap doesn't have octal, hex */
return 0;
@@ -794,6 +816,8 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz
* termcap notation.
*/
case 's':
+ if (_nc_strict_bsd)
+ return 0;
bufptr = save_string(bufptr, "%s");
break;
@@ -826,7 +850,7 @@ _nc_infotocap(const char *cap GCC_UNUSED, const char *str, int const parameteriz
* but that may not be the end of the string.
*/
assert(str != 0);
- if (*str == '\0')
+ if (str == 0 || *str == '\0')
break;
} /* endwhile (*str) */
diff --git a/ncurses/tinfo/comp_error.c b/ncurses/tinfo/comp_error.c
index 56c362a..ff0acc7 100644
--- a/ncurses/tinfo/comp_error.c
+++ b/ncurses/tinfo/comp_error.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2005,2007 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2011,2012 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 *
@@ -41,7 +41,7 @@
#include <tic.h>
-MODULE_ID("$Id: comp_error.c,v 1.31 2007/04/21 23:38:32 tom Exp $")
+MODULE_ID("$Id: comp_error.c,v 1.36 2012/02/22 22:34:31 tom Exp $")
NCURSES_EXPORT_VAR(bool) _nc_suppress_warnings = FALSE;
NCURSES_EXPORT_VAR(int) _nc_curr_line = 0; /* current line # in input */
@@ -59,7 +59,8 @@ _nc_get_source(void)
NCURSES_EXPORT(void)
_nc_set_source(const char *const name)
{
- SourceName = name;
+ FreeIfNeeded(SourceName);
+ SourceName = strdup(name);
}
NCURSES_EXPORT(void)
@@ -70,7 +71,7 @@ _nc_set_type(const char *const name)
if (TermType != 0) {
TermType[0] = '\0';
if (name)
- strncat(TermType, name, MAX_NAME_SIZE);
+ strncat(TermType, name, (size_t) MAX_NAME_SIZE);
}
}
@@ -84,7 +85,7 @@ _nc_get_type(char *name)
}
#endif
if (name != 0)
- strcpy(name, TermType != 0 ? TermType : "");
+ _nc_STRCPY(name, TermType != 0 ? TermType : "", MAX_NAME_SIZE);
}
static NCURSES_INLINE void
@@ -151,3 +152,12 @@ _nc_syserr_abort(const char *const fmt,...)
exit(EXIT_FAILURE);
#endif
}
+
+#if NO_LEAKS
+NCURSES_EXPORT(void)
+_nc_comp_error_leaks(void)
+{
+ FreeAndNull(SourceName);
+ FreeAndNull(TermType);
+}
+#endif
diff --git a/ncurses/tinfo/comp_expand.c b/ncurses/tinfo/comp_expand.c
index 71012b6..2ab06eb 100644
--- a/ncurses/tinfo/comp_expand.c
+++ b/ncurses/tinfo/comp_expand.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2008,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2011,2012 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 *
@@ -35,7 +35,7 @@
#include <ctype.h>
#include <tic.h>
-MODULE_ID("$Id: comp_expand.c,v 1.21 2010/01/16 17:11:23 tom Exp $")
+MODULE_ID("$Id: comp_expand.c,v 1.25 2012/03/24 18:37:17 tom Exp $")
static int
trailing_spaces(const char *src)
@@ -49,6 +49,8 @@ trailing_spaces(const char *src)
#define REALCTL(s) (UChar(*(s)) < 127 && iscntrl(UChar(*(s))))
#define REALPRINT(s) (UChar(*(s)) < 127 && isprint(UChar(*(s))))
+#define P_LIMIT(p) (length - (size_t)(p))
+
NCURSES_EXPORT(char *)
_nc_tic_expand(const char *srcp, bool tic_format, int numbers)
{
@@ -61,15 +63,15 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers)
size_t need = (2 + strlen(str)) * 4;
int ch;
-#if NO_LEAKS
if (srcp == 0) {
+#if NO_LEAKS
if (buffer != 0) {
FreeAndNull(buffer);
length = 0;
}
+#endif
return 0;
}
-#endif
if (buffer == 0 || need > length) {
if ((buffer = typeRealloc(char, length = need, buffer)) == 0)
return 0;
@@ -90,7 +92,8 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers)
&& str[1] != '\\'
&& REALPRINT(str + 1)
&& str[2] == S_QUOTE) {
- sprintf(buffer + bufp, "{%d}", str[1]);
+ _nc_SPRINTF(buffer + bufp, _nc_SLIMIT(P_LIMIT(bufp))
+ "{%d}", str[1]);
bufp += (int) strlen(buffer + bufp);
str += 2;
} else {
@@ -177,10 +180,12 @@ _nc_tic_expand(const char *srcp, bool tic_format, int numbers)
#define UnCtl(c) ((c) + '@')
else if (REALCTL(str) && ch != '\\'
&& (!islong || isdigit(UChar(str[1])))) {
- (void) sprintf(&buffer[bufp], "^%c", UnCtl(ch));
+ _nc_SPRINTF(&buffer[bufp], _nc_SLIMIT(P_LIMIT(bufp))
+ "^%c", UnCtl(ch));
bufp += 2;
} else {
- (void) sprintf(&buffer[bufp], "\\%03o", ch);
+ _nc_SPRINTF(&buffer[bufp], _nc_SLIMIT(P_LIMIT(bufp))
+ "\\%03o", ch);
bufp += 4;
}
diff --git a/ncurses/tinfo/comp_parse.c b/ncurses/tinfo/comp_parse.c
index 8204d75..82a61a5 100644
--- a/ncurses/tinfo/comp_parse.c
+++ b/ncurses/tinfo/comp_parse.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2013 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 *
@@ -35,15 +35,10 @@
/*
* comp_parse.c -- parser driver loop and use handling.
*
- * _nc_read_entry_source(FILE *, literal, bool, bool (*hook)())
- * _nc_resolve_uses2(void)
- * _nc_free_entries(void)
- *
* Use this code by calling _nc_read_entry_source() on as many source
* files as you like (either terminfo or termcap syntax). If you
* want use-resolution, call _nc_resolve_uses2(). To free the list
* storage, do _nc_free_entries().
- *
*/
#include <curses.priv.h>
@@ -52,7 +47,7 @@
#include <tic.h>
-MODULE_ID("$Id: comp_parse.c,v 1.73 2010/12/25 23:06:37 tom Exp $")
+MODULE_ID("$Id: comp_parse.c,v 1.90 2013/08/31 15:22:31 tom Exp $")
static void sanity_check2(TERMTYPE *, bool);
NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype2) (TERMTYPE *, bool) = sanity_check2;
@@ -61,6 +56,8 @@ NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype2) (TERMTYPE *, bool) = sanit
static void sanity_check(TERMTYPE *);
NCURSES_IMPEXP void NCURSES_API(*_nc_check_termtype) (TERMTYPE *) = sanity_check;
+static void fixup_acsc(TERMTYPE *, int);
+
static void
enqueue(ENTRY * ep)
/* add an entry to the in-core list */
@@ -86,16 +83,28 @@ force_bar(char *dst, char *src)
if (len > MAX_NAME_SIZE)
len = MAX_NAME_SIZE;
(void) strncpy(dst, src, len);
- (void) strcpy(dst + len, "|");
+ _nc_STRCPY(dst + len, "|", MAX_NAME_SIZE);
src = dst;
}
return src;
}
#define ForceBar(dst, src) ((strchr(src, '|') == 0) ? force_bar(dst, src) : src)
-NCURSES_EXPORT(bool)
-_nc_entry_match(char *n1, char *n2)
-/* do any of the aliases in a pair of terminal names match? */
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+static char *
+skip_index(char *name)
+{
+ char *bar = strchr(name, '|');
+
+ if (bar != 0 && (bar - name) == 2)
+ name = bar + 1;
+
+ return name;
+}
+#endif
+
+static bool
+check_collisions(char *n1, char *n2, int counter)
{
char *pstart, *qstart, *pend, *qend;
char nc1[MAX_NAME_SIZE + 2];
@@ -104,15 +113,95 @@ _nc_entry_match(char *n1, char *n2)
n1 = ForceBar(nc1, n1);
n2 = ForceBar(nc2, n2);
- for (pstart = n1; (pend = strchr(pstart, '|')); pstart = pend + 1)
- for (qstart = n2; (qend = strchr(qstart, '|')); qstart = qend + 1)
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+ if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) {
+ n1 = skip_index(n1);
+ n2 = skip_index(n2);
+ }
+#endif
+
+ for (pstart = n1; (pend = strchr(pstart, '|')); pstart = pend + 1) {
+ for (qstart = n2; (qend = strchr(qstart, '|')); qstart = qend + 1) {
if ((pend - pstart == qend - qstart)
- && memcmp(pstart, qstart, (size_t) (pend - pstart)) == 0)
+ && memcmp(pstart, qstart, (size_t) (pend - pstart)) == 0) {
+ if (counter > 0)
+ (void) fprintf(stderr, "Name collision '%.*s' between\n",
+ (int) (pend - pstart), pstart);
return (TRUE);
+ }
+ }
+ }
return (FALSE);
}
+static char *
+next_name(char *name)
+{
+ if (*name != '\0')
+ ++name;
+ return name;
+}
+
+static char *
+name_ending(char *name)
+{
+ if (*name == '\0') {
+ name = 0;
+ } else {
+ while (*name != '\0' && *name != '|')
+ ++name;
+ }
+ return name;
+}
+
+/*
+ * Essentially, find the conflict reported in check_collisions() and remove
+ * it from the second name, unless that happens to be the last alias.
+ */
+static bool
+remove_collision(char *n1, char *n2)
+{
+ char *p2 = n2;
+ char *pstart, *qstart, *pend, *qend;
+ bool removed = FALSE;
+
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+ if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) {
+ n1 = skip_index(n1);
+ p2 = n2 = skip_index(n2);
+ }
+#endif
+
+ for (pstart = n1; (pend = name_ending(pstart)); pstart = next_name(pend)) {
+ for (qstart = n2; (qend = name_ending(qstart)); qstart = next_name(qend)) {
+ if ((pend - pstart == qend - qstart)
+ && memcmp(pstart, qstart, (size_t) (pend - pstart)) == 0) {
+ if (qstart != p2 || *qend == '|') {
+ if (*qend == '|')
+ ++qend;
+ while ((*qstart++ = *qend++) != '\0') ;
+ fprintf(stderr, "...now\t%s\n", p2);
+ } else {
+ fprintf(stderr, "Cannot remove alias '%.*s'\n",
+ (int) (qend - qstart), qstart);
+ }
+ removed = TRUE;
+ break;
+ }
+ }
+ }
+
+ return removed;
+}
+
+/* do any of the aliases in a pair of terminal names match? */
+NCURSES_EXPORT(bool)
+_nc_entry_match(char *n1, char *n2)
+{
+ return check_collisions(n1, n2, 0);
+}
+
/****************************************************************************
*
* Entry compiler and resolution logic
@@ -198,19 +287,19 @@ _nc_resolve_uses2(bool fullresolve, bool literal)
for_entry_list(rp) {
if (qp > rp
- && _nc_entry_match(qp->tterm.term_names, rp->tterm.term_names)) {
- matchcount++;
- if (matchcount == 1) {
- (void) fprintf(stderr, "Name collision between %s",
- _nc_first_name(qp->tterm.term_names));
- multiples++;
+ && check_collisions(qp->tterm.term_names,
+ rp->tterm.term_names,
+ matchcount + 1)) {
+ if (!matchcount++) {
+ (void) fprintf(stderr, "\t%s\n", rp->tterm.term_names);
+ }
+ (void) fprintf(stderr, "and\t%s\n", qp->tterm.term_names);
+ if (!remove_collision(rp->tterm.term_names,
+ qp->tterm.term_names)) {
+ ++multiples;
}
- if (matchcount >= 1)
- (void) fprintf(stderr, " %s", _nc_first_name(rp->tterm.term_names));
}
}
- if (matchcount >= 1)
- (void) putc('\n', stderr);
}
if (multiples > 0)
return (FALSE);
@@ -256,9 +345,7 @@ _nc_resolve_uses2(bool fullresolve, bool literal)
DEBUG(2, ("%s: resolving use=%s (compiled)",
child, lookfor));
- rp = typeMalloc(ENTRY, 1);
- if (rp == 0)
- _nc_err_abort(MSG_NO_MEMORY);
+ TYPE_MALLOC(ENTRY, 1, rp);
rp->tterm = thisterm;
rp->nuses = 0;
rp->next = lastread;
@@ -378,7 +465,34 @@ _nc_resolve_uses2(bool fullresolve, bool literal)
for_entry_list(qp) {
_nc_curr_line = (int) qp->startline;
_nc_set_type(_nc_first_name(qp->tterm.term_names));
- _nc_check_termtype2(&qp->tterm, literal);
+ /*
+ * tic overrides this function pointer to provide more verbose
+ * checking.
+ */
+ if (_nc_check_termtype2 != sanity_check2) {
+ SCREEN *save_SP = SP;
+ SCREEN fake_sp;
+ TERMINAL fake_tm;
+ TERMINAL *save_tm = cur_term;
+
+ /*
+ * Setup so that tic can use ordinary terminfo interface
+ * to obtain capability information.
+ */
+ memset(&fake_sp, 0, sizeof(fake_sp));
+ memset(&fake_tm, 0, sizeof(fake_tm));
+ fake_sp._term = &fake_tm;
+ fake_tm.type = qp->tterm;
+ _nc_set_screen(&fake_sp);
+ set_curterm(&fake_tm);
+
+ _nc_check_termtype2(&qp->tterm, literal);
+
+ _nc_set_screen(save_SP);
+ set_curterm(save_tm);
+ } else {
+ fixup_acsc(&qp->tterm, literal);
+ }
}
DEBUG(2, ("SANITY CHECK FINISHED"));
}
@@ -403,6 +517,17 @@ _nc_resolve_uses(bool fullresolve)
#define CUR tp->
static void
+fixup_acsc(TERMTYPE *tp, int literal)
+{
+ if (!literal) {
+ if (acs_chars == 0
+ && enter_alt_charset_mode != 0
+ && exit_alt_charset_mode != 0)
+ acs_chars = strdup(VT_ACSC);
+ }
+}
+
+static void
sanity_check2(TERMTYPE *tp, bool literal)
{
if (!PRESENT(exit_attribute_mode)) {
@@ -422,16 +547,14 @@ sanity_check2(TERMTYPE *tp, bool literal)
#endif /* __UNUSED__ */
PAIRED(enter_standout_mode, exit_standout_mode);
PAIRED(enter_underline_mode, exit_underline_mode);
+ PAIRED(enter_italics_mode, exit_italics_mode);
}
/* we do this check/fix in postprocess_termcap(), but some packagers
* prefer to bypass it...
*/
if (!literal) {
- if (acs_chars == 0
- && enter_alt_charset_mode != 0
- && exit_alt_charset_mode != 0)
- acs_chars = strdup(VT_ACSC);
+ fixup_acsc(tp, literal);
ANDMISSING(enter_alt_charset_mode, acs_chars);
ANDMISSING(exit_alt_charset_mode, acs_chars);
}
diff --git a/ncurses/tinfo/comp_scan.c b/ncurses/tinfo/comp_scan.c
index 8725b2e..fe6e8e7 100644
--- a/ncurses/tinfo/comp_scan.c
+++ b/ncurses/tinfo/comp_scan.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2008,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2013 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 *
@@ -50,7 +50,7 @@
#include <ctype.h>
#include <tic.h>
-MODULE_ID("$Id: comp_scan.c,v 1.89 2010/12/25 23:06:37 tom Exp $")
+MODULE_ID("$Id: comp_scan.c,v 1.102 2013/11/16 19:57:50 tom Exp $")
/*
* Maximum length of string capability we'll accept before raising an error.
@@ -61,6 +61,7 @@ MODULE_ID("$Id: comp_scan.c,v 1.89 2010/12/25 23:06:37 tom Exp $")
#define iswhite(ch) (ch == ' ' || ch == '\t')
NCURSES_EXPORT_VAR (int) _nc_syntax = 0; /* termcap or terminfo? */
+NCURSES_EXPORT_VAR (int) _nc_strict_bsd = 1; /* ncurses extended termcap? */
NCURSES_EXPORT_VAR (long) _nc_curr_file_pos = 0; /* file offset of current line */
NCURSES_EXPORT_VAR (long) _nc_comment_start = 0; /* start of comment range before name */
NCURSES_EXPORT_VAR (long) _nc_comment_end = 0; /* end of comment range before name */
@@ -127,14 +128,19 @@ _nc_reset_input(FILE *fp, char *buf)
* Returns the final nonblank character on the current input buffer
*/
static int
-last_char(void)
+last_char(int from_end)
{
size_t len = strlen(bufptr);
+ int result = 0;
+
while (len--) {
- if (!isspace(UChar(bufptr[len])))
- return bufptr[len];
+ if (!isspace(UChar(bufptr[len]))) {
+ if (from_end < (int) len)
+ result = bufptr[(int) len - from_end];
+ break;
+ }
}
- return 0;
+ return result;
}
/*
@@ -195,7 +201,8 @@ next_char(void)
result = typeRealloc(char, allocated, result);
if (result == 0)
return (EOF);
- bufstart = result;
+ if (bufstart)
+ bufstart = result;
}
if (used == 0)
_nc_curr_file_pos = ftell(yyin);
@@ -212,7 +219,7 @@ next_char(void)
}
} else {
if (used != 0)
- strcat(result, "\n");
+ _nc_STRCAT(result, "\n", allocated);
}
if ((bufptr = bufstart) != 0) {
used = strlen(bufptr);
@@ -256,12 +263,12 @@ next_char(void)
}
static void
-push_back(char c)
+push_back(int c)
/* push a character back onto the input stream */
{
if (bufptr == bufstart)
_nc_syserr_abort("Can't backspace off beginning of line");
- *--bufptr = c;
+ *--bufptr = (char) c;
_nc_curr_col--;
}
@@ -299,6 +306,8 @@ eat_escaped_newline(int ch)
*tok_ptr++ = (char) ch; \
*tok_ptr = '\0'
+static char *tok_buf;
+
/*
* int
* get_token()
@@ -336,15 +345,14 @@ NCURSES_EXPORT(int)
_nc_get_token(bool silent)
{
static const char terminfo_punct[] = "@%&*!#";
- static char *tok_buf;
- char *after_list;
- char *after_name;
+ char *after_name; /* after primary name */
+ char *after_list; /* after primary and alias list */
char *numchk;
char *tok_ptr;
char *s;
char numbuf[80];
- int ch;
+ int ch, c0, c1;
int dot_flag = FALSE;
int type;
long number;
@@ -372,11 +380,10 @@ _nc_get_token(bool silent)
if (end_of_stream()) {
yyin = 0;
- next_char(); /* frees its allocated memory */
+ (void) next_char(); /* frees its allocated memory */
if (tok_buf != 0) {
if (_nc_curr_token.tk_name == tok_buf)
_nc_curr_token.tk_name = 0;
- FreeAndNull(tok_buf);
}
return (EOF);
}
@@ -390,6 +397,7 @@ _nc_get_token(bool silent)
}
ch = eat_escaped_newline(ch);
+ _nc_curr_token.tk_valstring = 0;
#ifdef TRACE
old_line = _nc_curr_line;
@@ -424,7 +432,7 @@ _nc_get_token(bool silent)
#if NCURSES_EXT_FUNCS
&& !(ch == '.' && _nc_disable_period)
#endif
- && !strchr(terminfo_punct, (char) ch)) {
+ && ((strchr) (terminfo_punct, (char) ch) == 0)) {
if (!silent)
_nc_warning("Illegal character (expected alphanumeric or %s) - '%s'",
terminfo_punct, unctrl(UChar(ch)));
@@ -457,7 +465,7 @@ _nc_get_token(bool silent)
after_list = tok_ptr;
if (after_name == 0)
after_name = tok_ptr;
- } else if (ch == ':' && last_char() != ',') {
+ } else if (ch == ':' && last_char(0) != ',') {
_nc_syntax = SYN_TERMCAP;
separator = ':';
break;
@@ -471,12 +479,64 @@ _nc_get_token(bool silent)
if (after_name == 0)
break;
/*
- * If we see a comma, we assume this is terminfo unless we
- * subsequently run into a colon. But we don't stop
- * looking for a colon until hitting a newline. This
- * allows commas to be embedded in description fields of
- * either syntax.
+ * We saw a comma, but are not entirely sure this is
+ * terminfo format, since we can still be parsing the
+ * description field (for either syntax).
+ *
+ * A properly formatted termcap line ends with either a
+ * colon, or a backslash after a colon. It is possible
+ * to have a backslash in the middle of a capability, but
+ * then there would be no leading whitespace on the next
+ * line - something we want to discourage.
*/
+ c0 = last_char(0);
+ c1 = last_char(1);
+ if (c1 != ':' && c0 != '\\' && c0 != ':') {
+ bool capability = FALSE;
+
+ /*
+ * Since it is not termcap, assume the line is terminfo
+ * format. However, the comma can be embedded in a
+ * description field. It also can be a separator
+ * between a description field and a capability.
+ *
+ * Improve the guess by checking if the next word after
+ * the comma does not look like a capability. In that
+ * case, extend the description past the comma.
+ */
+ for (s = bufptr; isspace(UChar(*s)); ++s) {
+ ;
+ }
+ if (islower(UChar(*s))) {
+ char *name = s;
+ while (isalnum(UChar(*s))) {
+ ++s;
+ }
+ if (*s == '#' || *s == '=' || *s == '@') {
+ /*
+ * Checking solely with syntax allows us to
+ * support extended capabilities with string
+ * values.
+ */
+ capability = TRUE;
+ } else if (*s == ',') {
+ c0 = *s;
+ *s = '\0';
+ /*
+ * Otherwise, we can handle predefined boolean
+ * capabilities, still aided by syntax.
+ */
+ if (_nc_find_entry(name,
+ _nc_get_hash_table(FALSE))) {
+ capability = TRUE;
+ }
+ *s = (char) c0;
+ }
+ }
+ if (capability) {
+ break;
+ }
+ }
} else
ch = eat_escaped_newline(ch);
@@ -748,7 +808,7 @@ _nc_trans_string(char *ptr, char *last)
if (!(is7bits(c) && isprint(c))) {
_nc_warning("Illegal ^ character - '%s'", unctrl(UChar(c)));
}
- if (c == '?') {
+ if (c == '?' && (_nc_syntax != SYN_TERMCAP)) {
*(ptr++) = '\177';
if (_nc_tracing)
_nc_warning("Allow ^? as synonym for \\177");
@@ -758,23 +818,29 @@ _nc_trans_string(char *ptr, char *last)
*(ptr++) = (char) (c);
}
} else if (c == '\\') {
+ bool strict_bsd = ((_nc_syntax == SYN_TERMCAP) && _nc_strict_bsd);
+
c = next_char();
if (c == EOF)
_nc_err_abort(MSG_NO_INPUTS);
- if (c >= '0' && c <= '7') {
+#define isoctal(c) ((c) >= '0' && (c) <= '7')
+
+ if (isoctal(c) || (strict_bsd && isdigit(c))) {
number = c - '0';
for (i = 0; i < 2; i++) {
c = next_char();
if (c == EOF)
_nc_err_abort(MSG_NO_INPUTS);
- if (c < '0' || c > '7') {
+ if (!isoctal(c)) {
if (isdigit(c)) {
- _nc_warning("Non-octal digit `%c' in \\ sequence", c);
- /* allow the digit; it'll do less harm */
+ if (!strict_bsd) {
+ _nc_warning("Non-octal digit `%c' in \\ sequence", c);
+ /* allow the digit; it'll do less harm */
+ }
} else {
- push_back((char) c);
+ push_back(c);
break;
}
}
@@ -782,21 +848,16 @@ _nc_trans_string(char *ptr, char *last)
number = number * 8 + c - '0';
}
- if (number == 0)
+ number = UChar(number);
+ if (number == 0 && !strict_bsd)
number = 0200;
*(ptr++) = (char) number;
} else {
switch (c) {
case 'E':
- case 'e':
*(ptr++) = '\033';
break;
- case 'a':
- *(ptr++) = '\007';
- break;
-
- case 'l':
case 'n':
*(ptr++) = '\n';
break;
@@ -809,10 +870,6 @@ _nc_trans_string(char *ptr, char *last)
*(ptr++) = '\010';
break;
- case 's':
- *(ptr++) = ' ';
- break;
-
case 'f':
*(ptr++) = '\014';
break;
@@ -833,16 +890,33 @@ _nc_trans_string(char *ptr, char *last)
*(ptr++) = ',';
break;
- case ':':
- *(ptr++) = ':';
- break;
-
case '\n':
continue;
default:
- _nc_warning("Illegal character '%s' in \\ sequence",
- unctrl(UChar(c)));
+ if ((_nc_syntax == SYN_TERMINFO) || !_nc_strict_bsd) {
+ switch (c) {
+ case 'a':
+ c = '\007';
+ break;
+ case 'e':
+ c = '\033';
+ break;
+ case 'l':
+ c = '\n';
+ break;
+ case 's':
+ c = ' ';
+ break;
+ case ':':
+ c = ':';
+ break;
+ default:
+ _nc_warning("Illegal character '%s' in \\ sequence",
+ unctrl(UChar(c)));
+ break;
+ }
+ }
/* FALLTHRU */
case '|':
*(ptr++) = (char) c;
@@ -862,7 +936,7 @@ _nc_trans_string(char *ptr, char *last)
if (!ignored) {
if (_nc_curr_col <= 1) {
- push_back((char) c);
+ push_back(c);
c = '\n';
break;
}
@@ -934,5 +1008,8 @@ _nc_comp_scan_leaks(void)
if (pushname != 0) {
FreeAndNull(pushname);
}
+ if (tok_buf != 0) {
+ FreeAndNull(tok_buf);
+ }
}
#endif
diff --git a/ncurses/tinfo/db_iterator.c b/ncurses/tinfo/db_iterator.c
index 82665cb..94a4082 100644
--- a/ncurses/tinfo/db_iterator.c
+++ b/ncurses/tinfo/db_iterator.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 2006-2007,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 2006-2013,2014 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 *
@@ -36,13 +36,142 @@
#include <curses.priv.h>
+#include <time.h>
#include <tic.h>
-MODULE_ID("$Id: db_iterator.c,v 1.9 2010/12/25 23:00:25 tom Exp $")
+#if USE_HASHED_DB
+#include <hashed_db.h>
+#endif
+
+MODULE_ID("$Id: db_iterator.c,v 1.39 2014/11/01 14:47:00 tom Exp $")
#define HaveTicDirectory _nc_globals.have_tic_directory
#define KeepTicDirectory _nc_globals.keep_tic_directory
#define TicDirectory _nc_globals.tic_directory
+#define my_blob _nc_globals.dbd_blob
+#define my_list _nc_globals.dbd_list
+#define my_size _nc_globals.dbd_size
+#define my_time _nc_globals.dbd_time
+#define my_vars _nc_globals.dbd_vars
+
+static void
+add_to_blob(const char *text, size_t limit)
+{
+ (void) limit;
+
+ if (*text != '\0') {
+ char *last = my_blob + strlen(my_blob);
+ if (last != my_blob)
+ *last++ = NCURSES_PATHSEP;
+ _nc_STRCPY(last, text, limit);
+ }
+}
+
+static bool
+check_existence(const char *name, struct stat *sb)
+{
+ bool result = FALSE;
+
+ if (stat(name, sb) == 0
+ && (S_ISDIR(sb->st_mode) || S_ISREG(sb->st_mode))) {
+ result = TRUE;
+ }
+#if USE_HASHED_DB
+ else if (strlen(name) < PATH_MAX - sizeof(DBM_SUFFIX)) {
+ char temp[PATH_MAX];
+ _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%s%s", name, DBM_SUFFIX);
+ if (stat(temp, sb) == 0 && S_ISREG(sb->st_mode)) {
+ result = TRUE;
+ }
+ }
+#endif
+ return result;
+}
+
+/*
+ * Store the latest value of an environment variable in my_vars[] so we can
+ * detect if one changes, invalidating the cached search-list.
+ */
+static bool
+update_getenv(const char *name, DBDIRS which)
+{
+ bool result = FALSE;
+
+ if (which < dbdLAST) {
+ char *value;
+
+ if ((value = getenv(name)) == 0 || (value = strdup(value)) == 0) {
+ ;
+ } else if (my_vars[which].name == 0 || strcmp(my_vars[which].name, name)) {
+ FreeIfNeeded(my_vars[which].value);
+ my_vars[which].name = name;
+ my_vars[which].value = value;
+ result = TRUE;
+ } else if ((my_vars[which].value != 0) ^ (value != 0)) {
+ FreeIfNeeded(my_vars[which].value);
+ my_vars[which].value = value;
+ result = TRUE;
+ } else if (value != 0 && strcmp(value, my_vars[which].value)) {
+ FreeIfNeeded(my_vars[which].value);
+ my_vars[which].value = value;
+ result = TRUE;
+ } else {
+ free(value);
+ }
+ }
+ return result;
+}
+
+static char *
+cache_getenv(const char *name, DBDIRS which)
+{
+ char *result = 0;
+
+ (void) update_getenv(name, which);
+ if (which < dbdLAST) {
+ result = my_vars[which].value;
+ }
+ return result;
+}
+
+/*
+ * The cache expires if at least a second has passed since the initial lookup,
+ * or if one of the environment variables changed.
+ *
+ * Only a few applications use multiple lookups of terminal entries, seems that
+ * aside from bulk I/O such as tic and toe, that leaves interactive programs
+ * which should not be modifying the terminal databases in a way that would
+ * invalidate the search-list.
+ *
+ * The "1-second" is to allow for user-directed changes outside the program.
+ */
+static bool
+cache_expired(void)
+{
+ bool result = FALSE;
+ time_t now = time((time_t *) 0);
+
+ if (now > my_time) {
+ result = TRUE;
+ } else {
+ DBDIRS n;
+ for (n = (DBDIRS) 0; n < dbdLAST; ++n) {
+ if (my_vars[n].name != 0
+ && update_getenv(my_vars[n].name, n)) {
+ result = TRUE;
+ break;
+ }
+ }
+ }
+ return result;
+}
+
+static void
+free_cache(void)
+{
+ FreeAndNull(my_blob);
+ FreeAndNull(my_list);
+}
/*
* Record the "official" location of the terminfo directory, according to
@@ -51,17 +180,20 @@ MODULE_ID("$Id: db_iterator.c,v 1.9 2010/12/25 23:00:25 tom Exp $")
NCURSES_EXPORT(const char *)
_nc_tic_dir(const char *path)
{
+ T(("_nc_tic_dir %s", NonNull(path)));
if (!KeepTicDirectory) {
if (path != 0) {
TicDirectory = path;
HaveTicDirectory = TRUE;
- } else if (!HaveTicDirectory && use_terminfo_vars()) {
- char *envp;
- if ((envp = getenv("TERMINFO")) != 0)
- return _nc_tic_dir(envp);
+ } else if (HaveTicDirectory == 0) {
+ if (use_terminfo_vars()) {
+ const char *envp;
+ if ((envp = getenv("TERMINFO")) != 0)
+ return _nc_tic_dir(envp);
+ }
}
}
- return TicDirectory;
+ return TicDirectory ? TicDirectory : TERMINFO;
}
/*
@@ -77,61 +209,16 @@ _nc_keep_tic_dir(const char *path)
}
/*
- * Process the list of :-separated directories, looking for the terminal type.
- * We don't use strtok because it does not show us empty tokens.
- */
-#define ThisDbList _nc_globals.dbi_list
-#define ThisDbSize _nc_globals.dbi_size
-
-/*
* Cleanup.
*/
NCURSES_EXPORT(void)
_nc_last_db(void)
{
- if (ThisDbList != 0) {
- FreeAndNull(ThisDbList);
+ if (my_blob != 0 && cache_expired()) {
+ free_cache();
}
- ThisDbSize = 0;
}
-/* The TERMINFO_DIRS value, if defined by the configure script, begins with a
- * ":", which will be interpreted as TERMINFO.
- */
-static const char *
-next_list_item(const char *source, int *offset)
-{
- if (source != 0) {
- FreeIfNeeded(ThisDbList);
- ThisDbList = strdup(source);
- ThisDbSize = (int) strlen(source);
- }
-
- if (ThisDbList != 0 && ThisDbSize && *offset < ThisDbSize) {
- static char system_db[] = TERMINFO;
- char *result = ThisDbList + *offset;
- char *marker = strchr(result, NCURSES_PATHSEP);
-
- /*
- * Put a null on the marker if a separator was found. Set the offset
- * to the next position after the marker so we can call this function
- * again, using the data at the offset.
- */
- if (marker == 0) {
- *offset += (int) strlen(result);
- } else {
- *marker++ = 0;
- *offset = (int) (marker - ThisDbList);
- }
- if (*result == 0 && result != (ThisDbList + ThisDbSize))
- result = system_db;
- return result;
- }
- return 0;
-}
-
-#define NEXT_DBD(var, offset) next_list_item((*offset == 0) ? var : 0, offset)
-
/*
* This is a simple iterator which allows the caller to step through the
* possible locations for a terminfo directory. ncurses uses this to find
@@ -141,84 +228,186 @@ NCURSES_EXPORT(const char *)
_nc_next_db(DBDIRS * state, int *offset)
{
const char *result;
- char *envp;
-
- while (*state < dbdLAST) {
- DBDIRS next = (DBDIRS) ((int) (*state) + 1);
+ (void) offset;
+ if ((int) *state < my_size
+ && my_list != 0
+ && my_list[*state] != 0) {
+ result = my_list[*state];
+ (*state)++;
+ } else {
result = 0;
+ }
+ if (result != 0) {
+ T(("_nc_next_db %d %s", *state, result));
+ }
+ return result;
+}
- switch (*state) {
- case dbdTIC:
- if (HaveTicDirectory)
- result = _nc_tic_dir(0);
- break;
-#if USE_DATABASE
- case dbdEnvOnce:
- if (use_terminfo_vars()) {
- if ((envp = getenv("TERMINFO")) != 0)
- result = _nc_tic_dir(envp);
- }
- break;
- case dbdHome:
- if (use_terminfo_vars()) {
- result = _nc_home_terminfo();
- }
- break;
- case dbdEnvList:
- if (use_terminfo_vars()) {
- if ((result = NEXT_DBD(getenv("TERMINFO_DIRS"), offset)) != 0)
- next = *state;
- }
- break;
- case dbdCfgList:
+NCURSES_EXPORT(void)
+_nc_first_db(DBDIRS * state, int *offset)
+{
+ bool cache_has_expired = FALSE;
+ *state = dbdTIC;
+ *offset = 0;
+
+ T(("_nc_first_db"));
+
+ /* build a blob containing all of the strings we will use for a lookup
+ * table.
+ */
+ if (my_blob == 0 || (cache_has_expired = cache_expired())) {
+ size_t blobsize = 0;
+ const char *values[dbdLAST];
+ struct stat *my_stat;
+ int j, k;
+
+ if (cache_has_expired)
+ free_cache();
+
+ for (j = 0; j < dbdLAST; ++j)
+ values[j] = 0;
+
+ /*
+ * This is the first item in the list, and is used only when tic is
+ * writing to the database, as a performance improvement.
+ */
+ values[dbdTIC] = TicDirectory;
+
+#if NCURSES_USE_DATABASE
#ifdef TERMINFO_DIRS
- if ((result = NEXT_DBD(TERMINFO_DIRS, offset)) != 0)
- next = *state;
+ values[dbdCfgList] = TERMINFO_DIRS;
#endif
- break;
- case dbdCfgOnce:
-#ifndef TERMINFO_DIRS
- result = TERMINFO;
+#ifdef TERMINFO
+ values[dbdCfgOnce] = TERMINFO;
#endif
- break;
-#endif /* USE_DATABASE */
-#if USE_TERMCAP
- case dbdEnvOnce2:
- if (use_terminfo_vars()) {
- if ((envp = getenv("TERMCAP")) != 0)
- result = _nc_tic_dir(envp);
- }
- break;
- case dbdEnvList2:
- if (use_terminfo_vars()) {
- if ((result = NEXT_DBD(getenv("TERMPATH"), offset)) != 0)
- next = *state;
+#endif
+
+#if NCURSES_USE_TERMCAP
+ values[dbdCfgList2] = TERMPATH;
+#endif
+
+ if (use_terminfo_vars()) {
+#if NCURSES_USE_DATABASE
+ values[dbdEnvOnce] = cache_getenv("TERMINFO", dbdEnvOnce);
+ values[dbdHome] = _nc_home_terminfo();
+ (void) cache_getenv("HOME", dbdHome);
+ values[dbdEnvList] = cache_getenv("TERMINFO_DIRS", dbdEnvList);
+
+#endif
+#if NCURSES_USE_TERMCAP
+ values[dbdEnvOnce2] = cache_getenv("TERMCAP", dbdEnvOnce2);
+ /* only use $TERMCAP if it is an absolute path */
+ if (values[dbdEnvOnce2] != 0
+ && *values[dbdEnvOnce2] != '/') {
+ values[dbdEnvOnce2] = 0;
}
- break;
- case dbdCfgList2:
- if ((result = NEXT_DBD(TERMPATH, offset)) != 0)
- next = *state;
- break;
-#endif /* USE_TERMCAP */
- case dbdLAST:
- break;
+ values[dbdEnvList2] = cache_getenv("TERMPATH", dbdEnvList2);
+#endif /* NCURSES_USE_TERMCAP */
}
- if (*state != next) {
- *state = next;
- *offset = 0;
- _nc_last_db();
+
+ for (j = 0; j < dbdLAST; ++j) {
+ if (values[j] == 0)
+ values[j] = "";
+ blobsize += 2 + strlen(values[j]);
}
- if (result != 0) {
- return result;
+
+ my_blob = malloc(blobsize);
+ if (my_blob != 0) {
+ *my_blob = '\0';
+ for (j = 0; j < dbdLAST; ++j) {
+ add_to_blob(values[j], blobsize);
+ }
+
+ /* Now, build an array which will be pointers to the distinct
+ * strings in the blob.
+ */
+ blobsize = 2;
+ for (j = 0; my_blob[j] != '\0'; ++j) {
+ if (my_blob[j] == NCURSES_PATHSEP)
+ ++blobsize;
+ }
+ my_list = typeCalloc(char *, blobsize);
+ my_stat = typeCalloc(struct stat, blobsize);
+ if (my_list != 0 && my_stat != 0) {
+ k = 0;
+ my_list[k++] = my_blob;
+ for (j = 0; my_blob[j] != '\0'; ++j) {
+ if (my_blob[j] == NCURSES_PATHSEP) {
+ my_blob[j] = '\0';
+ my_list[k++] = &my_blob[j + 1];
+ }
+ }
+
+ /*
+ * Eliminate duplicates from the list.
+ */
+ for (j = 0; my_list[j] != 0; ++j) {
+#ifdef TERMINFO
+ if (*my_list[j] == '\0')
+ my_list[j] = strdup(TERMINFO);
+#endif
+ for (k = 0; k < j; ++k) {
+ if (!strcmp(my_list[j], my_list[k])) {
+ k = j - 1;
+ while ((my_list[j] = my_list[j + 1]) != 0) {
+ ++j;
+ }
+ j = k;
+ break;
+ }
+ }
+ }
+
+ /*
+ * Eliminate non-existent databases, and those that happen to
+ * be symlinked to another location.
+ */
+ for (j = 0; my_list[j] != 0; ++j) {
+ bool found = check_existence(my_list[j], &my_stat[j]);
+#if HAVE_LINK
+ if (found) {
+ for (k = 0; k < j; ++k) {
+ if (my_stat[j].st_dev == my_stat[k].st_dev
+ && my_stat[j].st_ino == my_stat[k].st_ino) {
+ found = FALSE;
+ break;
+ }
+ }
+ }
+#endif
+ if (!found) {
+ k = j;
+ while ((my_list[k] = my_list[k + 1]) != 0) {
+ ++k;
+ }
+ --j;
+ }
+ }
+ my_size = j;
+ my_time = time((time_t *) 0);
+ } else {
+ FreeAndNull(my_blob);
+ }
+ free(my_stat);
}
}
- return 0;
}
-NCURSES_EXPORT(void)
-_nc_first_db(DBDIRS * state, int *offset)
+#if NO_LEAKS
+void
+_nc_db_iterator_leaks(void)
{
- *state = dbdTIC;
- *offset = 0;
+ DBDIRS which;
+
+ if (my_blob != 0)
+ FreeAndNull(my_blob);
+ if (my_list != 0)
+ FreeAndNull(my_list);
+ for (which = 0; (int) which < dbdLAST; ++which) {
+ my_vars[which].name = 0;
+ FreeIfNeeded(my_vars[which].value);
+ my_vars[which].value = 0;
+ }
}
+#endif
diff --git a/ncurses/tinfo/doalloc.c b/ncurses/tinfo/doalloc.c
index fe2a009..7c502b0 100644
--- a/ncurses/tinfo/doalloc.c
+++ b/ncurses/tinfo/doalloc.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998,2000 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2000,2012 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 *
@@ -39,7 +39,7 @@
#include <curses.priv.h>
-MODULE_ID("$Id: doalloc.c,v 1.8 2002/08/31 21:48:11 Philippe.Blain Exp $")
+MODULE_ID("$Id: doalloc.c,v 1.11 2012/11/03 19:27:41 tom Exp $")
NCURSES_EXPORT(void *)
_nc_doalloc(void *oldp, size_t amount)
@@ -56,20 +56,3 @@ _nc_doalloc(void *oldp, size_t amount)
}
return newp;
}
-
-#if !HAVE_STRDUP
-NCURSES_EXPORT(char *)
-_nc_strdup(const char *src)
-{
- char *dst;
- if (src != 0) {
- dst = typeMalloc(char, strlen(src) + 1);
- if (dst != 0) {
- (void) strcpy(dst, src);
- }
- } else {
- dst = 0;
- }
- return dst;
-}
-#endif
diff --git a/ncurses/tinfo/entries.c b/ncurses/tinfo/entries.c
index b1e14a8..e84033d 100644
--- a/ncurses/tinfo/entries.c
+++ b/ncurses/tinfo/entries.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 2006-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 2006-2011,2012 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 *
@@ -37,7 +37,7 @@
#include <tic.h>
-MODULE_ID("$Id: entries.c,v 1.17 2010/01/23 17:57:43 tom Exp $")
+MODULE_ID("$Id: entries.c,v 1.21 2012/05/05 20:33:44 tom Exp $")
/****************************************************************************
*
@@ -96,6 +96,9 @@ _nc_delink_entry(ENTRY * headp, TERMTYPE *tterm)
if (last != 0) {
last->next = ep->next;
}
+ if (ep->next != 0) {
+ ep->next->last = last;
+ }
if (ep == _nc_head) {
_nc_head = ep->next;
}
@@ -128,19 +131,21 @@ _nc_leaks_tinfo(void)
_nc_free_entries(_nc_head);
_nc_get_type(0);
_nc_first_name(0);
+ _nc_db_iterator_leaks();
_nc_keyname_leaks();
#if BROKEN_LINKER || USE_REENTRANT
_nc_names_leaks();
_nc_codes_leaks();
FreeIfNeeded(_nc_prescreen.real_acs_map);
#endif
+ _nc_comp_error_leaks();
if ((s = _nc_home_terminfo()) != 0)
free(s);
#ifdef TRACE
trace(0);
- _nc_trace_buf(-1, 0);
+ _nc_trace_buf(-1, (size_t) 0);
#endif
#endif /* NO_LEAKS */
diff --git a/ncurses/tinfo/getenv_num.c b/ncurses/tinfo/getenv_num.c
index a90cc08..d5e35cb 100644
--- a/ncurses/tinfo/getenv_num.c
+++ b/ncurses/tinfo/getenv_num.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998,2000 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2013 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 *
@@ -36,7 +36,7 @@
#include <curses.priv.h>
-MODULE_ID("$Id: getenv_num.c,v 1.3 2000/12/10 02:55:07 tom Exp $")
+MODULE_ID("$Id: getenv_num.c,v 1.6 2013/09/28 20:25:08 tom Exp $")
NCURSES_EXPORT(int)
_nc_getenv_num(const char *name)
@@ -54,3 +54,20 @@ _nc_getenv_num(const char *name)
return (int) value;
}
+
+NCURSES_EXPORT(void)
+_nc_setenv_num(const char *name, int value)
+{
+ if (name != 0 && value >= 0) {
+ char buffer[128];
+#if HAVE_SETENV
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%d", value);
+ setenv(name, buffer, 1);
+#elif HAVE_PUTENV
+ char *s;
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "%s=%d", name, value);
+ if ((s = strdup(buffer)) != 0)
+ putenv(s);
+#endif
+ }
+}
diff --git a/ncurses/tinfo/hashed_db.c b/ncurses/tinfo/hashed_db.c
index bf7a968..b594205 100644
--- a/ncurses/tinfo/hashed_db.c
+++ b/ncurses/tinfo/hashed_db.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 2006,2008 Free Software Foundation, Inc. *
+ * Copyright (c) 2006-2011,2013 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 *
@@ -36,12 +36,81 @@
#if USE_HASHED_DB
-MODULE_ID("$Id: hashed_db.c,v 1.14 2008/12/13 20:59:02 tom Exp $")
+MODULE_ID("$Id: hashed_db.c,v 1.17 2013/12/15 00:33:01 tom Exp $")
#if HASHED_DB_API >= 2
static DBC *cursor;
#endif
+typedef struct _myconn {
+ struct _myconn *next;
+ DB *db;
+ char *path;
+ bool modify;
+} MYCONN;
+
+static MYCONN *connections;
+
+static void
+cleanup(void)
+{
+ while (connections != 0) {
+ _nc_db_close(connections->db);
+ }
+}
+
+static DB *
+find_connection(const char *path, bool modify)
+{
+ DB *result = 0;
+ MYCONN *p;
+
+ for (p = connections; p != 0; p = p->next) {
+ if (!strcmp(p->path, path) && p->modify == modify) {
+ result = p->db;
+ break;
+ }
+ }
+
+ return result;
+}
+
+static void
+drop_connection(DB * db)
+{
+ MYCONN *p, *q;
+
+ for (p = connections, q = 0; p != 0; q = p, p = p->next) {
+ if (p->db == db) {
+ if (q != 0)
+ q->next = p->next;
+ else
+ connections = p->next;
+ free(p->path);
+ free(p);
+ break;
+ }
+ }
+}
+
+static void
+make_connection(DB * db, const char *path, bool modify)
+{
+ MYCONN *p = typeCalloc(MYCONN, 1);
+
+ if (p != 0) {
+ p->db = db;
+ p->path = strdup(path);
+ p->modify = modify;
+ if (p->path != 0) {
+ p->next = connections;
+ connections = p;
+ } else {
+ free(p);
+ }
+ }
+}
+
/*
* Open the database.
*/
@@ -51,50 +120,57 @@ _nc_db_open(const char *path, bool modify)
DB *result = 0;
int code;
+ if (connections == 0)
+ atexit(cleanup);
+
+ if ((result = find_connection(path, modify)) == 0) {
+
#if HASHED_DB_API >= 4
- db_create(&result, NULL, 0);
- if ((code = result->open(result,
- NULL,
- path,
- NULL,
- DB_HASH,
- modify ? DB_CREATE : DB_RDONLY,
- 0644)) != 0) {
- result = 0;
- }
+ db_create(&result, NULL, 0);
+ if ((code = result->open(result,
+ NULL,
+ path,
+ NULL,
+ DB_HASH,
+ modify ? DB_CREATE : DB_RDONLY,
+ 0644)) != 0) {
+ result = 0;
+ }
#elif HASHED_DB_API >= 3
- db_create(&result, NULL, 0);
- if ((code = result->open(result,
- path,
- NULL,
- DB_HASH,
- modify ? DB_CREATE : DB_RDONLY,
- 0644)) != 0) {
- result = 0;
- }
+ db_create(&result, NULL, 0);
+ if ((code = result->open(result,
+ path,
+ NULL,
+ DB_HASH,
+ modify ? DB_CREATE : DB_RDONLY,
+ 0644)) != 0) {
+ result = 0;
+ }
#elif HASHED_DB_API >= 2
- if ((code = db_open(path,
- DB_HASH,
- modify ? DB_CREATE : DB_RDONLY,
- 0644,
- (DB_ENV *) 0,
- (DB_INFO *) 0,
- &result)) != 0) {
- result = 0;
- }
+ if ((code = db_open(path,
+ DB_HASH,
+ modify ? DB_CREATE : DB_RDONLY,
+ 0644,
+ (DB_ENV *) 0,
+ (DB_INFO *) 0,
+ &result)) != 0) {
+ result = 0;
+ }
#else
- if ((result = dbopen(path,
- modify ? (O_CREAT | O_RDWR) : O_RDONLY,
- 0644,
- DB_HASH,
- NULL)) == 0) {
- code = errno;
- }
+ if ((result = dbopen(path,
+ modify ? (O_CREAT | O_RDWR) : O_RDONLY,
+ 0644,
+ DB_HASH,
+ NULL)) == 0) {
+ code = errno;
+ }
#endif
- if (result != 0) {
- T(("opened %s", path));
- } else {
- T(("cannot open %s: %s", path, strerror(code)));
+ if (result != 0) {
+ make_connection(result, path, modify);
+ T(("opened %s", path));
+ } else {
+ T(("cannot open %s: %s", path, strerror(code)));
+ }
}
return result;
}
@@ -107,6 +183,7 @@ _nc_db_close(DB * db)
{
int result;
+ drop_connection(db);
#if HASHED_DB_API >= 2
result = db->close(db, 0);
#else
@@ -209,7 +286,7 @@ NCURSES_EXPORT(bool)
_nc_db_have_index(DBT * key, DBT * data, char **buffer, int *size)
{
bool result = FALSE;
- int used = data->size - 1;
+ int used = (int) data->size - 1;
char *have = (char *) data->data;
(void) key;
@@ -232,7 +309,7 @@ NCURSES_EXPORT(bool)
_nc_db_have_data(DBT * key, DBT * data, char **buffer, int *size)
{
bool result = FALSE;
- int used = data->size - 1;
+ int used = (int) data->size - 1;
char *have = (char *) data->data;
if (*have++ == 0) {
diff --git a/ncurses/tinfo/home_terminfo.c b/ncurses/tinfo/home_terminfo.c
index 69d69f9..e77f71c 100644
--- a/ncurses/tinfo/home_terminfo.c
+++ b/ncurses/tinfo/home_terminfo.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2008,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2010,2012 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 *
@@ -37,7 +37,7 @@
#include <curses.priv.h>
#include <tic.h>
-MODULE_ID("$Id: home_terminfo.c,v 1.12 2010/12/25 23:43:58 tom Exp $")
+MODULE_ID("$Id: home_terminfo.c,v 1.15 2012/10/27 21:49:14 tom Exp $")
/* ncurses extension...fall back on user's private directory */
@@ -54,10 +54,8 @@ _nc_home_terminfo(void)
if (MyBuffer == 0) {
if ((home = getenv("HOME")) != 0) {
size_t want = (strlen(home) + sizeof(PRIVATE_INFO));
- MyBuffer = typeMalloc(char, want);
- if (MyBuffer == 0)
- _nc_err_abort(MSG_NO_MEMORY);
- (void) sprintf(MyBuffer, PRIVATE_INFO, home);
+ TYPE_MALLOC(char, want, MyBuffer);
+ _nc_SPRINTF(MyBuffer, _nc_SLIMIT(want) PRIVATE_INFO, home);
}
}
result = MyBuffer;
diff --git a/ncurses/tinfo/lib_acs.c b/ncurses/tinfo/lib_acs.c
index d8fdedc..69a1851 100644
--- a/ncurses/tinfo/lib_acs.c
+++ b/ncurses/tinfo/lib_acs.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
@@ -39,7 +39,7 @@
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: lib_acs.c,v 1.43 2010/12/25 23:00:45 tom Exp $")
+MODULE_ID("$Id: lib_acs.c,v 1.45 2014/03/08 20:32:59 tom Exp $")
#if BROKEN_LINKER || USE_REENTRANT
#define MyBuffer _nc_prescreen.real_acs_map
@@ -166,11 +166,10 @@ NCURSES_SP_NAME(_nc_init_acs) (NCURSES_SP_DCL0)
real_map['E'] = '+'; /* large plus or crossover */
#ifdef USE_TERM_DRIVER
- CallDriver_2(SP_PARM, initacs, real_map, fake_map);
+ CallDriver_2(SP_PARM, td_initacs, real_map, fake_map);
#else
if (ena_acs != NULL) {
- TPUTS_TRACE("ena_acs");
- putp(ena_acs);
+ NCURSES_PUTP2("ena_acs", ena_acs);
}
#if NCURSES_EXT_FUNCS
/*
diff --git a/ncurses/tinfo/lib_baudrate.c b/ncurses/tinfo/lib_baudrate.c
index 9302f02..1dee46c 100644
--- a/ncurses/tinfo/lib_baudrate.c
+++ b/ncurses/tinfo/lib_baudrate.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
@@ -49,7 +49,7 @@
* of the indices up to B115200 fit nicely in a 'short', allowing us to retain
* ospeed's type for compatibility.
*/
-#if (defined(__FreeBSD__) && (__FreeBSD_version < 700000)) || defined(__NetBSD__) || defined(__OpenBSD__)
+#if NCURSES_OSPEED_COMPAT && ((defined(__FreeBSD__) && (__FreeBSD_version < 700000)) || defined(__NetBSD__) || defined(__OpenBSD__))
#undef B0
#undef B50
#undef B75
@@ -79,7 +79,7 @@
#undef USE_OLD_TTY
#endif /* USE_OLD_TTY */
-MODULE_ID("$Id: lib_baudrate.c,v 1.31 2010/12/19 01:50:50 tom Exp $")
+MODULE_ID("$Id: lib_baudrate.c,v 1.35 2014/04/26 18:48:19 juergen Exp $")
/*
* int
@@ -90,54 +90,55 @@ MODULE_ID("$Id: lib_baudrate.c,v 1.31 2010/12/19 01:50:50 tom Exp $")
*/
struct speed {
- int s; /* value for 'ospeed' is an index */
+ NCURSES_OSPEED s; /* values for 'ospeed' */
int sp; /* the actual speed */
};
+#define DATA(number) { B##number, number }
+
static struct speed const speeds[] =
{
- {B0, 0},
- {B50, 50},
- {B75, 75},
- {B110, 110},
- {B134, 134},
- {B150, 150},
- {B200, 200},
- {B300, 300},
- {B600, 600},
- {B1200, 1200},
- {B1800, 1800},
- {B2400, 2400},
- {B4800, 4800},
- {B9600, 9600},
+ DATA(0),
+ DATA(50),
+ DATA(75),
+ DATA(110),
+ DATA(134),
+ DATA(150),
+ DATA(200),
+ DATA(300),
+ DATA(600),
+ DATA(1200),
+ DATA(1800),
+ DATA(2400),
+ DATA(4800),
+ DATA(9600),
#ifdef B19200
- {B19200, 19200},
-#else
-#ifdef EXTA
+ DATA(19200),
+#elif defined(EXTA)
{EXTA, 19200},
#endif
-#endif
#ifdef B38400
- {B38400, 38400},
-#else
-#ifdef EXTB
+ DATA(38400),
+#elif defined(EXTB)
{EXTB, 38400},
#endif
-#endif
#ifdef B57600
- {B57600, 57600},
+ DATA(57600),
#endif
+ /* ifdef to prevent overflow when OLD_TTY is not available */
+#if !(NCURSES_OSPEED_COMPAT && defined(__FreeBSD__) && (__FreeBSD_version > 700000))
#ifdef B115200
- {B115200, 115200},
+ DATA(115200),
#endif
#ifdef B230400
- {B230400, 230400},
+ DATA(230400),
#endif
#ifdef B460800
- {B460800, 460800},
+ DATA(460800),
#endif
#ifdef B921600
- {B921600, 921600},
+ DATA(921600),
+#endif
#endif
};
@@ -167,7 +168,7 @@ _nc_baudrate(int OSpeed)
}
}
#if !USE_REENTRANT
- if (OSpeed == last_OSpeed) {
+ if (OSpeed != last_OSpeed) {
last_OSpeed = OSpeed;
last_baudrate = result;
}
@@ -207,7 +208,7 @@ NCURSES_SP_NAME(baudrate) (NCURSES_SP_DCL0)
*/
#ifdef TRACE
if (IsValidTIScreen(SP_PARM)
- && !isatty(fileno(SP_PARM ? SP_PARM->_ofp : stdout))
+ && !NC_ISATTY(fileno(SP_PARM ? SP_PARM->_ofp : stdout))
&& getenv("BAUDRATE") != 0) {
int ret;
if ((ret = _nc_getenv_num("BAUDRATE")) <= 0)
@@ -219,8 +220,8 @@ NCURSES_SP_NAME(baudrate) (NCURSES_SP_DCL0)
if (IsValidTIScreen(SP_PARM)) {
#ifdef USE_OLD_TTY
- result = cfgetospeed(&(TerminalOf(SP_PARM)->Nttyb));
- ospeed = _nc_ospeed(result);
+ result = (int) cfgetospeed(&(TerminalOf(SP_PARM)->Nttyb));
+ ospeed = (NCURSES_OSPEED) _nc_ospeed(result);
#else /* !USE_OLD_TTY */
#ifdef TERMIOS
ospeed = (NCURSES_OSPEED) cfgetospeed(&(TerminalOf(SP_PARM)->Nttyb));
diff --git a/ncurses/tinfo/lib_cur_term.c b/ncurses/tinfo/lib_cur_term.c
index 86e130e..9941d13 100644
--- a/ncurses/tinfo/lib_cur_term.c
+++ b/ncurses/tinfo/lib_cur_term.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
@@ -39,14 +39,12 @@
#include <curses.priv.h>
#include <termcap.h> /* ospeed */
-MODULE_ID("$Id: lib_cur_term.c,v 1.30 2010/12/19 01:38:45 tom Exp $")
+MODULE_ID("$Id: lib_cur_term.c,v 1.33 2014/03/08 20:32:59 tom Exp $")
#undef CUR
#define CUR termp->type.
-#if BROKEN_LINKER && !USE_REENTRANT
-NCURSES_EXPORT_VAR(TERMINAL *) cur_term = 0;
-#elif BROKEN_LINKER || USE_REENTRANT
+#if USE_REENTRANT
NCURSES_EXPORT(TERMINAL *)
NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_DCL0)
@@ -55,6 +53,7 @@ NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_DCL0)
}
#if NCURSES_SP_FUNCS
+
NCURSES_EXPORT(TERMINAL *)
_nc_get_cur_term(void)
{
@@ -87,10 +86,10 @@ NCURSES_SP_NAME(set_curterm) (NCURSES_SP_DCLx TERMINAL * termp)
oldterm = cur_term;
if (SP_PARM)
SP_PARM->_term = termp;
-#if BROKEN_LINKER && !USE_REENTRANT
- cur_term = termp;
-#else
+#if USE_REENTRANT
CurTerm = termp;
+#else
+ cur_term = termp;
#endif
if (termp != 0) {
#ifdef USE_TERM_DRIVER
@@ -133,9 +132,7 @@ NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL * termp)
TERMINAL_CONTROL_BLOCK *TCB = (TERMINAL_CONTROL_BLOCK *) termp;
#endif
TERMINAL *cur = (
-#if BROKEN_LINKER && !USE_REENTRANT
- cur_term
-#elif BROKEN_LINKER || USE_REENTRANT
+#if USE_REENTRANT
NCURSES_SP_NAME(_nc_get_cur_term) (NCURSES_SP_ARG)
#else
cur_term
@@ -148,12 +145,13 @@ NCURSES_SP_NAME(del_curterm) (NCURSES_SP_DCLx TERMINAL * termp)
FreeIfNeeded(termp->_termname);
#if USE_HOME_TERMINFO
- if (_nc_globals.home_terminfo != 0)
+ if (_nc_globals.home_terminfo != 0) {
FreeAndNull(_nc_globals.home_terminfo);
+ }
#endif
#ifdef USE_TERM_DRIVER
if (TCB->drv)
- TCB->drv->release(TCB);
+ TCB->drv->td_release(TCB);
#endif
free(termp);
diff --git a/ncurses/tinfo/lib_data.c b/ncurses/tinfo/lib_data.c
index 195ddf9..06b6f88 100644
--- a/ncurses/tinfo/lib_data.c
+++ b/ncurses/tinfo/lib_data.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2013 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 *
@@ -42,7 +42,7 @@
#include <curses.priv.h>
-MODULE_ID("$Id: lib_data.c,v 1.61 2010/05/15 22:06:56 tom Exp $")
+MODULE_ID("$Id: lib_data.c,v 1.66 2013/08/24 17:28:24 tom Exp $")
/*
* OS/2's native linker complains if we don't initialize public data when
@@ -114,6 +114,7 @@ NCURSES_EXPORT_VAR(SCREEN *) SP = NULL; /* Some linkers require initialized data
#define TGETENT_0s { TGETENT_0, TGETENT_0, TGETENT_0, TGETENT_0 }
NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = {
+ 0, /* have_sigtstp */
0, /* have_sigwinch */
0, /* cleanup_nested */
@@ -125,13 +126,14 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = {
FALSE, /* have_tic_directory */
FALSE, /* keep_tic_directory */
- TERMINFO, /* tic_directory */
+ 0, /* tic_directory */
NULL, /* dbi_list */
0, /* dbi_size */
NULL, /* first_name */
NULL, /* keyname_table */
+ 0, /* init_keyname */
0, /* slk_format */
@@ -142,6 +144,12 @@ NCURSES_EXPORT_VAR(NCURSES_GLOBALS) _nc_globals = {
0, /* tgetent_index */
0, /* tgetent_sequence */
+ 0, /* dbd_blob */
+ 0, /* dbd_list */
+ 0, /* dbd_size */
+ 0, /* dbd_time */
+ { { 0, 0 } }, /* dbd_vars */
+
#ifndef USE_SP_WINDOWLIST
0, /* _nc_windowlist */
#endif
@@ -249,6 +257,7 @@ NCURSES_EXPORT_VAR(NCURSES_PRESCREEN) _nc_prescreen = {
NULL, /* _tputs_trace */
#endif
#endif
+ FALSE, /* use_tioctl */
};
/* *INDENT-ON* */
diff --git a/ncurses/tinfo/lib_has_cap.c b/ncurses/tinfo/lib_has_cap.c
index d1b9b8d..17e59d5 100644
--- a/ncurses/tinfo/lib_has_cap.c
+++ b/ncurses/tinfo/lib_has_cap.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2003,2009 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2009,2013 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 *
@@ -46,7 +46,7 @@
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: lib_has_cap.c,v 1.9 2009/10/24 22:15:47 tom Exp $")
+MODULE_ID("$Id: lib_has_cap.c,v 1.10 2013/11/16 19:57:22 tom Exp $")
NCURSES_EXPORT(bool)
NCURSES_SP_NAME(has_ic) (NCURSES_SP_DCL0)
@@ -55,7 +55,7 @@ NCURSES_SP_NAME(has_ic) (NCURSES_SP_DCL0)
T((T_CALLED("has_ic(%p)"), (void *) SP_PARM));
- if (IsValidTIScreen(SP_PARM) && IsTermInfo(SP_PARM)) {
+ if (HasTInfoTerminal(SP_PARM)) {
code = ((insert_character || parm_ich
|| (enter_insert_mode && exit_insert_mode))
&& (delete_character || parm_dch)) ? TRUE : FALSE;
@@ -77,7 +77,7 @@ NCURSES_SP_NAME(has_il) (NCURSES_SP_DCL0)
{
bool code = FALSE;
T((T_CALLED("has_il(%p)"), (void *) SP_PARM));
- if (IsValidTIScreen(SP_PARM) && IsTermInfo(SP_PARM)) {
+ if (HasTInfoTerminal(SP_PARM)) {
code = ((insert_line || parm_insert_line)
&& (delete_line || parm_delete_line)) ? TRUE : FALSE;
}
diff --git a/ncurses/tinfo/lib_napms.c b/ncurses/tinfo/lib_napms.c
index 1e6abda..df17363 100644
--- a/ncurses/tinfo/lib_napms.c
+++ b/ncurses/tinfo/lib_napms.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2014 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 *
@@ -51,17 +51,21 @@
#endif
#endif
-MODULE_ID("$Id: lib_napms.c,v 1.20 2009/11/07 20:37:30 tom Exp $")
+MODULE_ID("$Id: lib_napms.c,v 1.24 2014/03/08 20:32:59 tom Exp $")
NCURSES_EXPORT(int)
NCURSES_SP_NAME(napms) (NCURSES_SP_DCLx int ms)
{
- (void) SP_PARM;
T((T_CALLED("napms(%d)"), ms));
#ifdef USE_TERM_DRIVER
- CallDriver_1(SP_PARM, nap, ms);
+ if (HasTerminal(SP_PARM)) {
+ CallDriver_1(SP_PARM, td_nap, ms);
+ }
#else /* !USE_TERM_DRIVER */
+#if NCURSES_SP_FUNCS
+ (void) sp;
+#endif
#if HAVE_NANOSLEEP
{
struct timespec request, remaining;
diff --git a/ncurses/tinfo/lib_options.c b/ncurses/tinfo/lib_options.c
index 654bf94..b736d5f 100644
--- a/ncurses/tinfo/lib_options.c
+++ b/ncurses/tinfo/lib_options.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2008,2009 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
@@ -46,7 +46,7 @@
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: lib_options.c,v 1.71 2009/10/24 21:56:15 tom Exp $")
+MODULE_ID("$Id: lib_options.c,v 1.78 2014/09/27 21:55:24 tom Exp $")
NCURSES_EXPORT(int)
idlok(WINDOW *win, bool flag)
@@ -56,7 +56,11 @@ idlok(WINDOW *win, bool flag)
if (win) {
SCREEN *sp = _nc_screen_of(win);
- if (sp && IsTermInfo(sp)) {
+ if (sp != 0
+#ifdef USE_TERM_DRIVER
+ && IsTermInfo(sp)
+#endif
+ ) {
sp->_nc_sp_idlok =
win->_idlok = (flag && (NCURSES_SP_NAME(has_il) (NCURSES_SP_ARG)
|| change_scroll_region));
@@ -165,16 +169,16 @@ meta(WINDOW *win GCC_UNUSED, bool flag)
#ifdef USE_TERM_DRIVER
if (IsTermInfo(sp)) {
if (flag) {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "meta_on", meta_on);
+ NCURSES_PUTP2("meta_on", meta_on);
} else {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "meta_off", meta_off);
+ NCURSES_PUTP2("meta_off", meta_off);
}
}
#else
if (flag) {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "meta_on", meta_on);
+ NCURSES_PUTP2("meta_on", meta_on);
} else {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "meta_off", meta_off);
+ NCURSES_PUTP2("meta_off", meta_off);
}
#endif
result = OK;
@@ -192,30 +196,31 @@ NCURSES_SP_NAME(curs_set) (NCURSES_SP_DCLx int vis)
if (SP_PARM != 0 && vis >= 0 && vis <= 2) {
int cursor = SP_PARM->_cursor;
- bool bBuiltIn = !IsTermInfo(SP_PARM);
if (vis == cursor) {
code = cursor;
} else {
- if (!bBuiltIn) {
+#ifdef USE_TERM_DRIVER
+ code = CallDriver_1(SP_PARM, td_cursorSet, vis);
+#else
+ if (IsTermInfo(SP_PARM)) {
switch (vis) {
case 2:
- code = NCURSES_SP_NAME(_nc_putp_flush) (NCURSES_SP_ARGx
- "cursor_visible",
- cursor_visible);
+ code = NCURSES_PUTP2_FLUSH("cursor_visible",
+ cursor_visible);
break;
case 1:
- code = NCURSES_SP_NAME(_nc_putp_flush) (NCURSES_SP_ARGx
- "cursor_normal",
- cursor_normal);
+ code = NCURSES_PUTP2_FLUSH("cursor_normal",
+ cursor_normal);
break;
case 0:
- code = NCURSES_SP_NAME(_nc_putp_flush) (NCURSES_SP_ARGx
- "cursor_invisible",
- cursor_invisible);
+ code = NCURSES_PUTP2_FLUSH("cursor_invisible",
+ cursor_invisible);
break;
}
- } else
+ } else {
code = ERR;
+ }
+#endif
if (code != ERR)
code = (cursor == -1 ? 1 : cursor);
SP_PARM->_cursor = vis;
@@ -301,7 +306,7 @@ NCURSES_EXPORT(int)
NCURSES_SP_NAME(_nc_putp_flush) (NCURSES_SP_DCLx
const char *name, const char *value)
{
- int rc = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx name, value);
+ int rc = NCURSES_PUTP2(name, value);
if (rc != ERR) {
_nc_flush();
}
@@ -324,7 +329,7 @@ _nc_putp_flush(const char *name, const char *value)
* the terminal state _before_ switching modes.
*/
NCURSES_EXPORT(int)
-_nc_keypad(SCREEN *sp, bool flag)
+_nc_keypad(SCREEN *sp, int flag)
{
int rc = ERR;
@@ -349,18 +354,14 @@ _nc_keypad(SCREEN *sp, bool flag)
#endif
{
#ifdef USE_TERM_DRIVER
- rc = CallDriver_1(sp, kpad, flag);
+ rc = CallDriver_1(sp, td_kpad, flag);
if (rc == OK)
sp->_keypad_on = flag;
#else
if (flag) {
- (void) NCURSES_SP_NAME(_nc_putp_flush) (NCURSES_SP_ARGx
- "keypad_xmit",
- keypad_xmit);
+ (void) NCURSES_PUTP2_FLUSH("keypad_xmit", keypad_xmit);
} else if (!flag && keypad_local) {
- (void) NCURSES_SP_NAME(_nc_putp_flush) (NCURSES_SP_ARGx
- "keypad_local",
- keypad_local);
+ (void) NCURSES_PUTP2_FLUSH("keypad_local", keypad_local);
}
if (flag && !sp->_tried) {
diff --git a/ncurses/tinfo/lib_print.c b/ncurses/tinfo/lib_print.c
index c7bd3a6..0dab4d4 100644
--- a/ncurses/tinfo/lib_print.c
+++ b/ncurses/tinfo/lib_print.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2011,2012 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 *
@@ -39,7 +39,7 @@
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: lib_print.c,v 1.20 2010/06/05 22:18:35 tom Exp $")
+MODULE_ID("$Id: lib_print.c,v 1.23 2012/02/22 22:34:31 tom Exp $")
NCURSES_EXPORT(int)
NCURSES_SP_NAME(mcprint) (NCURSES_SP_DCLx char *data, int len)
@@ -76,10 +76,10 @@ NCURSES_SP_NAME(mcprint) (NCURSES_SP_DCLx char *data, int len)
return (ERR);
}
- (void) strcpy(mybuf, switchon);
- memcpy(mybuf + onsize, data, (unsigned) len);
+ _nc_STRCPY(mybuf, switchon, need);
+ memcpy(mybuf + onsize, data, (size_t) len);
if (offsize)
- (void) strcpy(mybuf + onsize + len, prtr_off);
+ _nc_STRCPY(mybuf + onsize + len, prtr_off, need);
/*
* We're relying on the atomicity of UNIX writes here. The
diff --git a/ncurses/tinfo/lib_raw.c b/ncurses/tinfo/lib_raw.c
index b524a1b..928692b 100644
--- a/ncurses/tinfo/lib_raw.c
+++ b/ncurses/tinfo/lib_raw.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2011,2012 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 *
@@ -49,11 +49,7 @@
#include <curses.priv.h>
-MODULE_ID("$Id: lib_raw.c,v 1.19 2010/04/24 23:49:12 tom Exp $")
-
-#if SVR4_TERMIO && !defined(_POSIX_SOURCE)
-#define _POSIX_SOURCE
-#endif
+MODULE_ID("$Id: lib_raw.c,v 1.21 2012/01/21 19:21:29 KO.Myung-Hun Exp $")
#if HAVE_SYS_TERMIO_H
#include <sys/termio.h> /* needed for ISC */
@@ -66,6 +62,11 @@ MODULE_ID("$Id: lib_raw.c,v 1.19 2010/04/24 23:49:12 tom Exp $")
#define _nc_setmode(mode) /* nothing */
#endif
+#if USE_KLIBC_KBD
+#define INCL_KBD
+#include <os2.h>
+#endif
+
#define COOKED_INPUT (IXON|BRKINT|PARMRK)
#ifdef TRACE
@@ -100,6 +101,17 @@ NCURSES_SP_NAME(raw) (NCURSES_SP_DCL0)
#endif
result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
if (result == OK) {
+#if USE_KLIBC_KBD
+ KBDINFO kbdinfo;
+
+ kbdinfo.cb = sizeof(kbdinfo);
+ KbdGetStatus(&kbdinfo, 0);
+
+ kbdinfo.cb = sizeof(kbdinfo);
+ kbdinfo.fsMask &= ~KEYBOARD_ASCII_MODE;
+ kbdinfo.fsMask |= KEYBOARD_BINARY_MODE;
+ KbdSetStatus(&kbdinfo, 0);
+#endif
SP_PARM->_raw = TRUE;
SP_PARM->_cbreak = 1;
termp->Nttyb = buf;
@@ -218,6 +230,17 @@ NCURSES_SP_NAME(noraw) (NCURSES_SP_DCL0)
#endif
result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf);
if (result == OK) {
+#if USE_KLIBC_KBD
+ KBDINFO kbdinfo;
+
+ kbdinfo.cb = sizeof(kbdinfo);
+ KbdGetStatus(&kbdinfo, 0);
+
+ kbdinfo.cb = sizeof(kbdinfo);
+ kbdinfo.fsMask &= ~KEYBOARD_BINARY_MODE;
+ kbdinfo.fsMask |= KEYBOARD_ASCII_MODE;
+ KbdSetStatus(&kbdinfo, 0);
+#endif
SP_PARM->_raw = FALSE;
SP_PARM->_cbreak = 0;
termp->Nttyb = buf;
diff --git a/ncurses/tinfo/lib_setup.c b/ncurses/tinfo/lib_setup.c
index 5fcf2ae..0b81a5e 100644
--- a/ncurses/tinfo/lib_setup.c
+++ b/ncurses/tinfo/lib_setup.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
@@ -37,21 +37,18 @@
* Terminal setup routines common to termcap and terminfo:
*
* use_env(bool)
+ * use_tioctl(bool)
* setupterm(char *, int, int *)
*/
#include <curses.priv.h>
#include <tic.h> /* for MAX_NAME_SIZE */
-#if SVR4_TERMIO && !defined(_POSIX_SOURCE)
-#define _POSIX_SOURCE
-#endif
-
#if HAVE_LOCALE_H
#include <locale.h>
#endif
-MODULE_ID("$Id: lib_setup.c,v 1.135 2011/02/06 01:04:21 tom Exp $")
+MODULE_ID("$Id: lib_setup.c,v 1.161 2014/11/01 12:33:16 tom Exp $")
/****************************************************************************
*
@@ -225,6 +222,7 @@ NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f)
{
T((T_CALLED("use_env(%p,%d)"), (void *) SP_PARM, (int) f));
#if NCURSES_SP_FUNCS
+ START_TRACE();
if (IsPreScreen(SP_PARM)) {
SP_PARM->_use_env = f;
}
@@ -234,14 +232,39 @@ NCURSES_SP_NAME(use_env) (NCURSES_SP_DCLx bool f)
returnVoid;
}
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(use_tioctl) (NCURSES_SP_DCLx bool f)
+{
+ T((T_CALLED("use_tioctl(%p,%d)"), (void *) SP_PARM, (int) f));
+#if NCURSES_SP_FUNCS
+ START_TRACE();
+ if (IsPreScreen(SP_PARM)) {
+ SP_PARM->_use_tioctl = f;
+ }
+#else
+ _nc_prescreen.use_tioctl = f;
+#endif
+ returnVoid;
+}
+
#if NCURSES_SP_FUNCS
NCURSES_EXPORT(void)
use_env(bool f)
{
T((T_CALLED("use_env(%d)"), (int) f));
+ START_TRACE();
_nc_prescreen.use_env = f;
returnVoid;
}
+
+NCURSES_EXPORT(void)
+use_tioctl(bool f)
+{
+ T((T_CALLED("use_tioctl(%d)"), (int) f));
+ START_TRACE();
+ _nc_prescreen.use_tioctl = f;
+ returnVoid;
+}
#endif
NCURSES_EXPORT(void)
@@ -260,7 +283,7 @@ _nc_get_screensize(SCREEN *sp,
TCB = (TERMINAL_CONTROL_BLOCK *) termp;
my_tabsize = TCB->info.tabsize;
- TCB->drv->size(TCB, linep, colp);
+ TCB->drv->td_size(TCB, linep, colp);
#if USE_REENTRANT
if (sp != 0) {
@@ -281,7 +304,7 @@ _nc_get_screensize(SCREEN *sp,
*linep = (int) lines;
*colp = (int) columns;
- if (_nc_prescreen.use_env) {
+ if (_nc_prescreen.use_env || _nc_prescreen.use_tioctl) {
int value;
#ifdef __EMX__
@@ -289,14 +312,16 @@ _nc_get_screensize(SCREEN *sp,
int screendata[2];
_scrsize(screendata);
*colp = screendata[0];
- *linep = screendata[1];
+ *linep = ((sp != 0 && sp->_filtered)
+ ? 1
+ : screendata[1]);
T(("EMX screen size: environment LINES = %d COLUMNS = %d",
*linep, *colp));
}
#endif
#if HAVE_SIZECHANGE
/* try asking the OS */
- if (isatty(cur_term->Filedes)) {
+ if (NC_ISATTY(cur_term->Filedes)) {
STRUCT_WINSIZE size;
errno = 0;
@@ -315,19 +340,33 @@ _nc_get_screensize(SCREEN *sp,
}
#endif /* HAVE_SIZECHANGE */
- /*
- * Finally, look for environment variables.
- *
- * Solaris lets users override either dimension with an environment
- * variable.
- */
- if ((value = _nc_getenv_num("LINES")) > 0) {
- *linep = value;
- T(("screen size: environment LINES = %d", *linep));
- }
- if ((value = _nc_getenv_num("COLUMNS")) > 0) {
- *colp = value;
- T(("screen size: environment COLUMNS = %d", *colp));
+ if (_nc_prescreen.use_env) {
+ if (_nc_prescreen.use_tioctl) {
+ /*
+ * If environment variables are used, update them.
+ */
+ if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) {
+ _nc_setenv_num("LINES", *linep);
+ }
+ if (_nc_getenv_num("COLUMNS") > 0) {
+ _nc_setenv_num("COLUMNS", *colp);
+ }
+ }
+
+ /*
+ * Finally, look for environment variables.
+ *
+ * Solaris lets users override either dimension with an environment
+ * variable.
+ */
+ if ((value = _nc_getenv_num("LINES")) > 0) {
+ *linep = value;
+ T(("screen size: environment LINES = %d", *linep));
+ }
+ if ((value = _nc_getenv_num("COLUMNS")) > 0) {
+ *colp = value;
+ T(("screen size: environment COLUMNS = %d", *colp));
+ }
}
/* if we can't get dynamic info about the size, use static */
@@ -384,7 +423,7 @@ _nc_update_screensize(SCREEN *sp)
assert(sp != 0);
- CallDriver_2(sp, getsize, &old_lines, &old_cols);
+ CallDriver_2(sp, td_getsize, &old_lines, &old_cols);
#else
TERMINAL *termp = cur_term;
@@ -399,10 +438,12 @@ _nc_update_screensize(SCREEN *sp)
* We're doing it this way because those functions belong to the upper
* ncurses library, while this resides in the lower terminfo library.
*/
- if (sp != 0
- && sp->_resize != 0) {
- if ((new_lines != old_lines) || (new_cols != old_cols))
+ if (sp != 0 && sp->_resize != 0) {
+ if ((new_lines != old_lines) || (new_cols != old_cols)) {
sp->_resize(NCURSES_SP_ARGx new_lines, new_cols);
+ } else if (sp->_sig_winch && (sp->_ungetch != 0)) {
+ sp->_ungetch(SP_PARM, KEY_RESIZE); /* so application can know this */
+ }
sp->_sig_winch = FALSE;
}
}
@@ -414,23 +455,7 @@ _nc_update_screensize(SCREEN *sp)
*
****************************************************************************/
-#define ret_error(code, fmt, arg) if (errret) {\
- *errret = code;\
- returnCode(ERR);\
- } else {\
- fprintf(stderr, fmt, arg);\
- exit(EXIT_FAILURE);\
- }
-
-#define ret_error0(code, msg) if (errret) {\
- *errret = code;\
- returnCode(ERR);\
- } else {\
- fprintf(stderr, msg);\
- exit(EXIT_FAILURE);\
- }
-
-#if USE_DATABASE || USE_TERMCAP
+#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP
/*
* Return 1 if entry found, 0 if not found, -1 if database not accessible,
* just like tgetent().
@@ -467,7 +492,7 @@ _nc_setup_tinfo(const char *const tn, TERMTYPE *const tp)
** and substitute it in for the prototype given in 'command_character'.
*/
void
-_nc_tinfo_cmdch(TERMINAL * termp, char proto)
+_nc_tinfo_cmdch(TERMINAL * termp, int proto)
{
unsigned i;
char CC;
@@ -481,8 +506,8 @@ _nc_tinfo_cmdch(TERMINAL * termp, char proto)
if ((tmp = getenv("CC")) != 0 && strlen(tmp) == 1) {
CC = *tmp;
for_each_string(i, &(termp->type)) {
- for (tmp = termp->type.Strings[i]; *tmp; tmp++) {
- if (*tmp == proto)
+ for (tmp = termp->type.Strings[i]; tmp && *tmp; tmp++) {
+ if (UChar(*tmp) == proto)
*tmp = CC;
}
}
@@ -520,7 +545,9 @@ NCURSES_EXPORT(int)
_nc_unicode_locale(void)
{
int result = 0;
-#if HAVE_LANGINFO_CODESET
+#if defined(__MINGW32__) && USE_WIDEC_SUPPORT
+ result = 1;
+#elif HAVE_LANGINFO_CODESET
char *env = nl_langinfo(CODESET);
result = !strcmp(env, "UTF-8");
T(("_nc_unicode_locale(%s) ->%d", env, result));
@@ -547,11 +574,11 @@ NCURSES_EXPORT(int)
_nc_locale_breaks_acs(TERMINAL * termp)
{
const char *env_name = "NCURSES_NO_UTF8_ACS";
- char *env;
+ const char *env;
int value;
int result = 0;
- if ((env = getenv(env_name)) != 0) {
+ if (getenv(env_name) != 0) {
result = _nc_getenv_num(env_name);
} else if ((value = tigetnum("U8")) >= 0) {
result = value; /* use extension feature */
@@ -578,7 +605,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
NCURSES_CONST char *tname,
int Filedes,
int *errret,
- bool reuse)
+ int reuse)
{
#ifdef USE_TERM_DRIVER
TERMINAL_CONTROL_BLOCK *TCB = 0;
@@ -608,7 +635,11 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
if (tname == 0) {
tname = getenv("TERM");
if (tname == 0 || *tname == '\0') {
+#ifdef USE_TERM_DRIVER
+ tname = "unknown";
+#else
ret_error0(TGETENT_ERR, "TERM environment variable not set.\n");
+#endif
}
}
@@ -624,7 +655,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
* Allow output redirection. This is what SVr3 does. If stdout is
* directed to a file, screen updates go to standard error.
*/
- if (Filedes == STDOUT_FILENO && !isatty(Filedes))
+ if (Filedes == STDOUT_FILENO && !NC_ISATTY(Filedes))
Filedes = STDERR_FILENO;
/*
@@ -651,9 +682,14 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
&& _nc_name_match(termp->type.term_names, tname, "|")) {
T(("reusing existing terminal information and mode-settings"));
code = OK;
+#ifdef USE_TERM_DRIVER
+ TCB = (TERMINAL_CONTROL_BLOCK *) termp;
+#endif
} else {
#ifdef USE_TERM_DRIVER
- termp = (TERMINAL *) typeCalloc(TERMINAL_CONTROL_BLOCK, 1);
+ TERMINAL_CONTROL_BLOCK *my_tcb;
+ my_tcb = typeCalloc(TERMINAL_CONTROL_BLOCK, 1);
+ termp = &(my_tcb->term);
#else
termp = typeCalloc(TERMINAL, 1);
#endif
@@ -673,7 +709,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
"Could not find any driver to handle this terminal.\n");
}
#else
-#if USE_DATABASE || USE_TERMCAP
+#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP
status = _nc_setup_tinfo(tname, &termp->type);
#else
status = TGETENT_NO;
@@ -684,7 +720,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
const TERMTYPE *fallback = _nc_fallback(tname);
if (fallback) {
- termp->type = *fallback;
+ _nc_copy_termtype(&(termp->type), fallback);
status = TGETENT_YES;
}
}
@@ -694,11 +730,11 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
if (status == TGETENT_ERR) {
ret_error0(status, "terminals database is inaccessible\n");
} else if (status == TGETENT_NO) {
- ret_error(status, "'%s': unknown terminal type.\n", tname);
+ ret_error1(status, "unknown terminal type.\n", tname);
}
}
#if !USE_REENTRANT
- strncpy(ttytype, termp->type.term_names, NAMESIZE - 1);
+ strncpy(ttytype, termp->type.term_names, (size_t) (NAMESIZE - 1));
ttytype[NAMESIZE - 1] = '\0';
#endif
@@ -708,7 +744,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
set_curterm(termp);
if (command_character)
- _nc_tinfo_cmdch(termp, *command_character);
+ _nc_tinfo_cmdch(termp, UChar(*command_character));
/*
* If an application calls setupterm() rather than initscr() or
@@ -716,7 +752,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
* _nc_setupscreen(). Do it now anyway, so we can initialize the
* baudrate.
*/
- if (isatty(Filedes)) {
+ if (NC_ISATTY(Filedes)) {
def_prog_mode();
baudrate();
}
@@ -727,7 +763,7 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
#ifdef USE_TERM_DRIVER
*tp = termp;
NCURSES_SP_NAME(set_curterm) (sp, termp);
- TCB->drv->init(TCB);
+ TCB->drv->td_init(TCB);
#else
sp = SP;
#endif
@@ -742,10 +778,20 @@ TINFO_SETUP_TERM(TERMINAL ** tp,
#ifndef USE_TERM_DRIVER
if (generic_type) {
- ret_error(TGETENT_NO, "'%s': I need something more specific.\n", tname);
- }
- if (hard_copy) {
- ret_error(TGETENT_YES, "'%s': I can't handle hardcopy terminals.\n", tname);
+ /*
+ * BSD 4.3's termcap contains mis-typed "gn" for wy99. Do a sanity
+ * check before giving up.
+ */
+ if ((VALID_STRING(cursor_address)
+ || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home)))
+ && VALID_STRING(clear_screen)) {
+ ret_error1(TGETENT_YES, "terminal is not really generic.\n", tname);
+ } else {
+ del_curterm(termp);
+ ret_error1(TGETENT_NO, "I need something more specific.\n", tname);
+ }
+ } else if (hard_copy) {
+ ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", tname);
}
#endif
returnCode(code);
@@ -798,10 +844,10 @@ NCURSES_EXPORT(int)
_nc_setupterm(NCURSES_CONST char *tname,
int Filedes,
int *errret,
- bool reuse)
+ int reuse)
{
int res;
- TERMINAL *termp;
+ TERMINAL *termp = 0;
res = TINFO_SETUP_TERM(&termp, tname, Filedes, errret, reuse);
if (ERR != res)
NCURSES_SP_NAME(set_curterm) (CURRENT_SCREEN_PRE, termp);
diff --git a/ncurses/tinfo/lib_termcap.c b/ncurses/tinfo/lib_termcap.c
index e9dae85..fdfc494 100644
--- a/ncurses/tinfo/lib_termcap.c
+++ b/ncurses/tinfo/lib_termcap.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2013 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 *
@@ -48,7 +48,7 @@
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: lib_termcap.c,v 1.73 2010/12/25 19:27:12 tom Exp $")
+MODULE_ID("$Id: lib_termcap.c,v 1.80 2013/06/08 16:48:47 tom Exp $")
NCURSES_EXPORT_VAR(char *) UP = 0;
NCURSES_EXPORT_VAR(char *) BC = 0;
@@ -63,6 +63,15 @@ NCURSES_EXPORT_VAR(char *) BC = 0;
#define LAST_USE MyCache[CacheInx].last_used
#define LAST_SEQ MyCache[CacheInx].sequence
+/*
+ * Termcap names are matched only using the first two bytes.
+ * Ignore any extended names longer than two bytes, to avoid problems
+ * with legacy code which passes in parameters whose use is long forgotten.
+ */
+#define ValidCap(cap) (((cap)[0] != '\0') && ((cap)[1] != '\0'))
+#define SameCap(a,b) (((a)[0] == (b)[0]) && ((a)[1] == (b)[1]))
+#define ValidExt(ext) (ValidCap(ext) && (ext)[2] == '\0')
+
/***************************************************************************
*
* tgetent(bufp, term)
@@ -97,7 +106,7 @@ NCURSES_SP_NAME(tgetent) (NCURSES_SP_DCLx char *bufp, const char *name)
#ifdef USE_TERM_DRIVER
if (termp == 0 ||
!((TERMINAL_CONTROL_BLOCK *) termp)->drv->isTerminfo)
- return (rc);
+ returnCode(rc);
#endif
/*
@@ -202,11 +211,13 @@ tgetent(char *bufp, const char *name)
static bool
same_tcname(const char *a, const char *b)
{
- fprintf(stderr, "compare(%s,%s)\n", a, b);
- return !strncmp(a, b, 2);
+ bool code = SameCap(a, b);
+ fprintf(stderr, "compare(%s,%s) %s\n", a, b, code ? "same" : "diff");
+ return code;
}
+
#else
-#define same_tcname(a,b) !strncmp(a,b,2)
+#define same_tcname(a,b) SameCap(a,b)
#endif
/***************************************************************************
@@ -222,10 +233,10 @@ NCURSES_EXPORT(int)
NCURSES_SP_NAME(tgetflag) (NCURSES_SP_DCLx NCURSES_CONST char *id)
{
int result = 0; /* Solaris returns zero for missing flag */
- int i, j;
+ int j = -1;
T((T_CALLED("tgetflag(%p, %s)"), (void *) SP_PARM, id));
- if (HasTInfoTerminal(SP_PARM)) {
+ if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) {
TERMTYPE *tp = &(TerminalOf(SP_PARM)->type);
struct name_table_entry const *entry_ptr;
@@ -235,10 +246,10 @@ NCURSES_SP_NAME(tgetflag) (NCURSES_SP_DCLx NCURSES_CONST char *id)
}
#if NCURSES_XNAMES
else {
- j = -1;
+ int i;
for_each_ext_boolean(i, tp) {
const char *capname = ExtBoolname(tp, i, boolcodes);
- if (same_tcname(id, capname)) {
+ if (same_tcname(id, capname) && ValidExt(capname)) {
j = i;
break;
}
@@ -274,10 +285,10 @@ NCURSES_EXPORT(int)
NCURSES_SP_NAME(tgetnum) (NCURSES_SP_DCLx NCURSES_CONST char *id)
{
int result = ABSENT_NUMERIC;
- int i, j;
+ int j = -1;
T((T_CALLED("tgetnum(%p, %s)"), (void *) SP_PARM, id));
- if (HasTInfoTerminal(SP_PARM)) {
+ if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) {
TERMTYPE *tp = &(TerminalOf(SP_PARM)->type);
struct name_table_entry const *entry_ptr;
@@ -287,10 +298,10 @@ NCURSES_SP_NAME(tgetnum) (NCURSES_SP_DCLx NCURSES_CONST char *id)
}
#if NCURSES_XNAMES
else {
- j = -1;
+ int i;
for_each_ext_number(i, tp) {
const char *capname = ExtNumname(tp, i, numcodes);
- if (same_tcname(id, capname)) {
+ if (same_tcname(id, capname) && ValidExt(capname)) {
j = i;
break;
}
@@ -326,10 +337,10 @@ NCURSES_EXPORT(char *)
NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx NCURSES_CONST char *id, char **area)
{
char *result = NULL;
- int i, j;
+ int j = -1;
T((T_CALLED("tgetstr(%s,%p)"), id, (void *) area));
- if (HasTInfoTerminal(SP_PARM)) {
+ if (HasTInfoTerminal(SP_PARM) && ValidCap(id)) {
TERMTYPE *tp = &(TerminalOf(SP_PARM)->type);
struct name_table_entry const *entry_ptr;
@@ -339,10 +350,10 @@ NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx NCURSES_CONST char *id, char **area)
}
#if NCURSES_XNAMES
else {
- j = -1;
+ int i;
for_each_ext_string(i, tp) {
const char *capname = ExtStrname(tp, i, strcodes);
- if (same_tcname(id, capname)) {
+ if (same_tcname(id, capname) && ValidExt(capname)) {
j = i;
break;
}
@@ -351,7 +362,7 @@ NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx NCURSES_CONST char *id, char **area)
#endif
if (j >= 0) {
result = tp->Strings[j];
- TR(TRACE_DATABASE, ("found match : %s", _nc_visbuf(result)));
+ TR(TRACE_DATABASE, ("found match %d: %s", j, _nc_visbuf(result)));
/* setupterm forces canceled strings to null */
if (VALID_STRING(result)) {
if (result == exit_attribute_mode
@@ -361,7 +372,7 @@ NCURSES_SP_NAME(tgetstr) (NCURSES_SP_DCLx NCURSES_CONST char *id, char **area)
}
if (area != 0
&& *area != 0) {
- (void) strcpy(*area, result);
+ _nc_STRCPY(*area, result, 1024);
result = *area;
*area += strlen(*area) + 1;
}
diff --git a/ncurses/tinfo/lib_tgoto.c b/ncurses/tinfo/lib_tgoto.c
index e07f464..31daf44 100644
--- a/ncurses/tinfo/lib_tgoto.c
+++ b/ncurses/tinfo/lib_tgoto.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 2000-2006,2008 Free Software Foundation, Inc. *
+ * Copyright (c) 2000-2008,2012 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 *
@@ -35,7 +35,7 @@
#include <ctype.h>
#include <termcap.h>
-MODULE_ID("$Id: lib_tgoto.c,v 1.13 2008/08/16 19:29:32 tom Exp $")
+MODULE_ID("$Id: lib_tgoto.c,v 1.16 2012/02/24 02:08:08 tom Exp $")
#if !PURE_TERMINFO
static bool
@@ -159,7 +159,8 @@ tgoto_internal(const char *string, int x, int y)
break;
}
if (fmt != 0) {
- sprintf(result + used, fmt, *value++);
+ _nc_SPRINTF(result + used, _nc_SLIMIT(length - used)
+ fmt, *value++);
used += strlen(result + used);
fmt = 0;
}
@@ -174,7 +175,7 @@ tgoto_internal(const char *string, int x, int y)
}
if (result != 0) {
if (need_BC) {
- strcpy(result + used, BC);
+ _nc_STRCPY(result + used, BC, length - used);
used += strlen(BC);
}
result[used] = '\0';
diff --git a/ncurses/tinfo/lib_ti.c b/ncurses/tinfo/lib_ti.c
index e412342..e9ae746 100644
--- a/ncurses/tinfo/lib_ti.c
+++ b/ncurses/tinfo/lib_ti.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2010,2013 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 *
@@ -36,7 +36,7 @@
#include <tic.h>
-MODULE_ID("$Id: lib_ti.c,v 1.29 2010/01/23 17:57:43 tom Exp $")
+MODULE_ID("$Id: lib_ti.c,v 1.30 2013/06/08 16:55:05 tom Exp $")
#if 0
static bool
@@ -53,7 +53,7 @@ NCURSES_EXPORT(int)
NCURSES_SP_NAME(tigetflag) (NCURSES_SP_DCLx NCURSES_CONST char *str)
{
int result = ABSENT_BOOLEAN;
- int i, j;
+ int j = -1;
T((T_CALLED("tigetflag(%p, %s)"), (void *) SP_PARM, str));
@@ -67,7 +67,7 @@ NCURSES_SP_NAME(tigetflag) (NCURSES_SP_DCLx NCURSES_CONST char *str)
}
#if NCURSES_XNAMES
else {
- j = -1;
+ int i;
for_each_ext_boolean(i, tp) {
const char *capname = ExtBoolname(tp, i, boolnames);
if (same_name(str, capname)) {
@@ -97,7 +97,7 @@ tigetflag(NCURSES_CONST char *str)
NCURSES_EXPORT(int)
NCURSES_SP_NAME(tigetnum) (NCURSES_SP_DCLx NCURSES_CONST char *str)
{
- int i, j;
+ int j = -1;
int result = CANCELLED_NUMERIC; /* Solaris returns a -1 on error */
T((T_CALLED("tigetnum(%p, %s)"), (void *) SP_PARM, str));
@@ -112,7 +112,7 @@ NCURSES_SP_NAME(tigetnum) (NCURSES_SP_DCLx NCURSES_CONST char *str)
}
#if NCURSES_XNAMES
else {
- j = -1;
+ int i;
for_each_ext_number(i, tp) {
const char *capname = ExtNumname(tp, i, numnames);
if (same_name(str, capname)) {
@@ -145,7 +145,7 @@ NCURSES_EXPORT(char *)
NCURSES_SP_NAME(tigetstr) (NCURSES_SP_DCLx NCURSES_CONST char *str)
{
char *result = CANCELLED_STRING;
- int i, j;
+ int j = -1;
T((T_CALLED("tigetstr(%p, %s)"), (void *) SP_PARM, str));
@@ -159,7 +159,7 @@ NCURSES_SP_NAME(tigetstr) (NCURSES_SP_DCLx NCURSES_CONST char *str)
}
#if NCURSES_XNAMES
else {
- j = -1;
+ int i;
for_each_ext_string(i, tp) {
const char *capname = ExtStrname(tp, i, strnames);
if (same_name(str, capname)) {
diff --git a/ncurses/tinfo/lib_tparm.c b/ncurses/tinfo/lib_tparm.c
index 7cd12f7..44a2061 100644
--- a/ncurses/tinfo/lib_tparm.c
+++ b/ncurses/tinfo/lib_tparm.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
@@ -42,7 +42,7 @@
#include <ctype.h>
#include <tic.h>
-MODULE_ID("$Id: lib_tparm.c,v 1.82 2011/01/15 22:19:12 tom Exp $")
+MODULE_ID("$Id: lib_tparm.c,v 1.93 2014/10/11 03:04:31 tom Exp $")
/*
* char *
@@ -53,7 +53,7 @@ MODULE_ID("$Id: lib_tparm.c,v 1.82 2011/01/15 22:19:12 tom Exp $")
*
* Cursor addressing and other strings requiring parame-
* ters in the terminal are described by a parameterized string
- * capability, with like escapes %x in it. For example, to
+ * capability, with escapes like %x in it. For example, to
* address the cursor, the cup capability is given, using two
* parameters: the row and column to address to. (Rows and
* columns are numbered from zero and refer to the physical
@@ -107,6 +107,7 @@ MODULE_ID("$Id: lib_tparm.c,v 1.82 2011/01/15 22:19:12 tom Exp $")
NCURSES_EXPORT_VAR(int) _nc_tparm_err = 0;
#define TPS(var) _nc_prescreen.tparm_state.var
+#define popcount _nc_popcount /* workaround for NetBSD 6.0 defect */
#if NO_LEAKS
NCURSES_EXPORT(void)
@@ -128,9 +129,7 @@ get_space(size_t need)
need += TPS(out_used);
if (need > TPS(out_size)) {
TPS(out_size) = need * 2;
- TPS(out_buff) = typeRealloc(char, TPS(out_size), TPS(out_buff));
- if (TPS(out_buff) == 0)
- _nc_err_abort(MSG_NO_MEMORY);
+ TYPE_REALLOC(char, TPS(out_size), TPS(out_buff));
}
}
@@ -143,7 +142,9 @@ save_text(const char *fmt, const char *s, int len)
get_space(s_len + 1);
- (void) sprintf(TPS(out_buff) + TPS(out_used), fmt, s);
+ _nc_SPRINTF(TPS(out_buff) + TPS(out_used),
+ _nc_SLIMIT(TPS(out_size) - TPS(out_used))
+ fmt, s);
TPS(out_used) += strlen(TPS(out_buff) + TPS(out_used));
}
@@ -153,9 +154,11 @@ save_number(const char *fmt, int number, int len)
if (len < 30)
len = 30; /* actually log10(MAX_INT)+1 */
- get_space((unsigned) len + 1);
+ get_space((size_t) len + 1);
- (void) sprintf(TPS(out_buff) + TPS(out_used), fmt, number);
+ _nc_SPRINTF(TPS(out_buff) + TPS(out_used),
+ _nc_SLIMIT(TPS(out_size) - TPS(out_used))
+ fmt, number);
TPS(out_used) += strlen(TPS(out_buff) + TPS(out_used));
}
@@ -164,7 +167,7 @@ save_char(int c)
{
if (c == 0)
c = 0200;
- get_space(1);
+ get_space((size_t) 1);
TPS(out_buff)[TPS(out_used)++] = (char) c;
}
@@ -250,6 +253,9 @@ parse_format(const char *s, char *format, int *len)
case 'x': /* FALLTHRU */
case 'X': /* FALLTHRU */
case 's':
+#ifdef EXP_XTERM_1005
+ case 'u':
+#endif
*format++ = *s;
done = TRUE;
break;
@@ -369,6 +375,9 @@ _nc_tparm_analyze(const char *string, char *p_is_s[NUM_PARM], int *popcount)
case 'x': /* FALLTHRU */
case 'X': /* FALLTHRU */
case 'c': /* FALLTHRU */
+#ifdef EXP_XTERM_1005
+ case 'u':
+#endif
if (lastpop <= 0)
number++;
lastpop = -1;
@@ -450,7 +459,7 @@ _nc_tparm_analyze(const char *string, char *p_is_s[NUM_PARM], int *popcount)
}
static NCURSES_INLINE char *
-tparam_internal(bool use_TPARM_ARG, const char *string, va_list ap)
+tparam_internal(int use_TPARM_ARG, const char *string, va_list ap)
{
char *p_is_s[NUM_PARM];
TPARM_ARG param[NUM_PARM];
@@ -463,6 +472,8 @@ tparam_internal(bool use_TPARM_ARG, const char *string, va_list ap)
int i;
const char *cp = string;
size_t len2;
+ bool termcap_hack;
+ bool incremented_two;
if (cp == NULL)
return NULL;
@@ -479,6 +490,8 @@ tparam_internal(bool use_TPARM_ARG, const char *string, va_list ap)
if (TPS(fmt_buff) == 0)
return NULL;
+ incremented_two = FALSE;
+
if (number > NUM_PARM)
number = NUM_PARM;
if (popcount > NUM_PARM)
@@ -511,7 +524,9 @@ tparam_internal(bool use_TPARM_ARG, const char *string, va_list ap)
* style, which means tparam() will expand termcap strings OK.
*/
TPS(stack_ptr) = 0;
+ termcap_hack = FALSE;
if (popcount == 0) {
+ termcap_hack = TRUE;
popcount = number;
for (i = number - 1; i >= 0; i--) {
if (p_is_s[i])
@@ -522,7 +537,7 @@ tparam_internal(bool use_TPARM_ARG, const char *string, va_list ap)
}
#ifdef TRACE
if (USE_TRACEF(TRACE_CALLS)) {
- for (i = 0; i < popcount; i++) {
+ for (i = 0; i < num_args; i++) {
if (p_is_s[i] != 0)
save_text(", %s", _nc_visbuf(p_is_s[i]), 0);
else
@@ -558,8 +573,22 @@ tparam_internal(bool use_TPARM_ARG, const char *string, va_list ap)
save_char(npop());
break;
+#ifdef EXP_XTERM_1005
+ case 'u':
+ {
+ unsigned char target[10];
+ unsigned source = (unsigned) npop();
+ int rc = _nc_conv_to_utf8(target, source, (unsigned)
+ sizeof(target));
+ int n;
+ for (n = 0; n < rc; ++n) {
+ save_char(target[n]);
+ }
+ }
+ break;
+#endif
case 'l':
- save_number("%d", (int) strlen(spop()), 0);
+ npush((int) strlen(spop()));
break;
case 's':
@@ -570,10 +599,11 @@ tparam_internal(bool use_TPARM_ARG, const char *string, va_list ap)
cp++;
i = (UChar(*cp) - '1');
if (i >= 0 && i < NUM_PARM) {
- if (p_is_s[i])
+ if (p_is_s[i]) {
spush(p_is_s[i]);
- else
+ } else {
npush((int) param[i]);
+ }
}
break;
@@ -688,10 +718,26 @@ tparam_internal(bool use_TPARM_ARG, const char *string, va_list ap)
break;
case 'i':
- if (p_is_s[0] == 0)
- param[0]++;
- if (p_is_s[1] == 0)
- param[1]++;
+ /*
+ * Increment the first two parameters -- if they are numbers
+ * rather than strings. As a side effect, assign into the
+ * stack; if this is termcap, then the stack was populated
+ * using the termcap hack above rather than via the terminfo
+ * 'p' case.
+ */
+ if (!incremented_two) {
+ incremented_two = TRUE;
+ if (p_is_s[0] == 0) {
+ param[0]++;
+ if (termcap_hack)
+ TPS(stack)[0].data.num = (int) param[0];
+ }
+ if (p_is_s[1] == 0) {
+ param[1]++;
+ if (termcap_hack)
+ TPS(stack)[1].data.num = (int) param[1];
+ }
+ }
break;
case '?':
@@ -757,7 +803,7 @@ tparam_internal(bool use_TPARM_ARG, const char *string, va_list ap)
cp++;
} /* endwhile (*cp) */
- get_space(1);
+ get_space((size_t) 1);
TPS(out_buff)[TPS(out_used)] = '\0';
T((T_RETURN("%s"), _nc_visbuf(TPS(out_buff))));
diff --git a/ncurses/tinfo/lib_tputs.c b/ncurses/tinfo/lib_tputs.c
index dc70f3e..09cbbc2 100644
--- a/ncurses/tinfo/lib_tputs.c
+++ b/ncurses/tinfo/lib_tputs.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2015 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 *
@@ -51,7 +51,7 @@
#include <termcap.h> /* ospeed */
#include <tic.h>
-MODULE_ID("$Id: lib_tputs.c,v 1.81 2010/12/20 00:42:50 tom Exp $")
+MODULE_ID("$Id: lib_tputs.c,v 1.96 2015/01/03 23:51:23 tom Exp $")
NCURSES_EXPORT_VAR(char) PC = 0; /* used by termcap library */
NCURSES_EXPORT_VAR(NCURSES_OSPEED) ospeed = 0; /* used by termcap library */
@@ -119,7 +119,30 @@ delay_output(int ms)
NCURSES_EXPORT(void)
NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_DCL0)
{
- (void) fflush(NC_OUTPUT(SP_PARM));
+ if (SP_PARM != 0 && SP_PARM->_ofd >= 0) {
+ if (SP_PARM->out_inuse) {
+ char *buf = SP_PARM->out_buffer;
+ size_t amount = SP->out_inuse;
+ ssize_t res;
+
+ SP->out_inuse = 0;
+ while (amount) {
+ res = write(SP_PARM->_ofd, buf, amount);
+
+ if (res > 0) {
+ /* if the write was incomplete, try again */
+ amount -= (size_t) res;
+ buf += res;
+ } else if (errno == EAGAIN) {
+ continue;
+ } else if (errno == EINTR) {
+ continue;
+ } else {
+ break; /* an error we can not recover from */
+ }
+ }
+ }
+ }
}
#if NCURSES_SP_FUNCS
@@ -138,17 +161,23 @@ NCURSES_SP_NAME(_nc_outch) (NCURSES_SP_DCLx int ch)
COUNT_OUTCHARS(1);
if (HasTInfoTerminal(SP_PARM)
- && SP_PARM != 0
- && SP_PARM->_cleanup) {
- char tmp = (char) ch;
- /*
- * POSIX says write() is safe in a signal handler, but the
- * buffered I/O is not.
- */
- if (write(fileno(NC_OUTPUT(SP_PARM)), &tmp, 1) == -1)
- rc = ERR;
+ && SP_PARM != 0) {
+ if (SP_PARM->out_buffer != 0) {
+ if (SP_PARM->out_inuse + 1 >= SP_PARM->out_limit)
+ NCURSES_SP_NAME(_nc_flush) (NCURSES_SP_ARG);
+ SP_PARM->out_buffer[SP_PARM->out_inuse++] = (char) ch;
+ } else {
+ char tmp = (char) ch;
+ /*
+ * POSIX says write() is safe in a signal handler, but the
+ * buffered I/O is not.
+ */
+ if (write(fileno(NC_OUTPUT(SP_PARM)), &tmp, (size_t) 1) == -1)
+ rc = ERR;
+ }
} else {
- if (putc(ch, NC_OUTPUT(SP_PARM)) == EOF)
+ char tmp = (char) ch;
+ if (write(fileno(stdout), &tmp, (size_t) 1) == -1)
rc = ERR;
}
return rc;
@@ -162,13 +191,48 @@ _nc_outch(int ch)
}
#endif
+/*
+ * This is used for the putp special case.
+ */
+NCURSES_EXPORT(int)
+NCURSES_SP_NAME(_nc_putchar) (NCURSES_SP_DCLx int ch)
+{
+ (void) SP_PARM;
+ return putchar(ch);
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+_nc_putchar(int ch)
+{
+ return putchar(ch);
+}
+#endif
+
+/*
+ * putp is special - per documentation it calls tputs with putchar as the
+ * parameter for outputting characters. This means that it uses stdio, which
+ * is not signal-safe. Applications call this entrypoint; we do not call it
+ * from within the library.
+ */
NCURSES_EXPORT(int)
NCURSES_SP_NAME(putp) (NCURSES_SP_DCLx const char *string)
{
return NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
- string, 1, NCURSES_SP_NAME(_nc_outch));
+ string, 1, NCURSES_SP_NAME(_nc_putchar));
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(int)
+putp(const char *string)
+{
+ return NCURSES_SP_NAME(putp) (CURRENT_SCREEN, string);
}
+#endif
+/*
+ * Use these entrypoints rather than "putp" within the library.
+ */
NCURSES_EXPORT(int)
NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_DCLx
const char *name GCC_UNUSED,
@@ -178,19 +242,14 @@ NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_DCLx
if (string != 0) {
TPUTS_TRACE(name);
- rc = NCURSES_SP_NAME(putp) (NCURSES_SP_ARGx string);
+ rc = NCURSES_SP_NAME(tputs) (NCURSES_SP_ARGx
+ string, 1, NCURSES_SP_NAME(_nc_outch));
}
return rc;
}
#if NCURSES_SP_FUNCS
NCURSES_EXPORT(int)
-putp(const char *string)
-{
- return NCURSES_SP_NAME(putp) (CURRENT_SCREEN, string);
-}
-
-NCURSES_EXPORT(int)
_nc_putp(const char *name, const char *string)
{
return NCURSES_SP_NAME(_nc_putp) (CURRENT_SCREEN, name, string);
@@ -216,9 +275,9 @@ NCURSES_SP_NAME(tputs) (NCURSES_SP_DCLx
if (USE_TRACEF(TRACE_TPUTS)) {
if (outc == NCURSES_SP_NAME(_nc_outch))
- (void) strcpy(addrbuf, "_nc_outch");
+ _nc_STRCPY(addrbuf, "_nc_outch", sizeof(addrbuf));
else
- (void) sprintf(addrbuf, "%p", outc);
+ _nc_SPRINTF(addrbuf, _nc_SLIMIT(sizeof(addrbuf)) "%p", outc);
if (_nc_tputs_trace) {
_tracef("tputs(%s = %s, %d, %s) called", _nc_tputs_trace,
_nc_visbuf(string), affcnt, addrbuf);
diff --git a/ncurses/tinfo/lib_ttyflags.c b/ncurses/tinfo/lib_ttyflags.c
index 663a068..43bed35 100644
--- a/ncurses/tinfo/lib_ttyflags.c
+++ b/ncurses/tinfo/lib_ttyflags.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2014 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 *
@@ -41,7 +41,7 @@
#define CUR SP_TERMTYPE
#endif
-MODULE_ID("$Id: lib_ttyflags.c,v 1.27 2010/12/25 23:43:58 tom Exp $")
+MODULE_ID("$Id: lib_ttyflags.c,v 1.30 2014/04/26 18:47:20 juergen Exp $")
NCURSES_EXPORT(int)
NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_DCLx TTY * buf)
@@ -57,7 +57,7 @@ NCURSES_SP_NAME(_nc_get_tty_mode) (NCURSES_SP_DCLx TTY * buf)
result = ERR;
} else {
#ifdef USE_TERM_DRIVER
- result = CallDriver_2(SP_PARM, sgmode, FALSE, buf);
+ result = CallDriver_2(SP_PARM, td_sgmode, FALSE, buf);
#else
for (;;) {
if (GET_TTY(termp->Filedes, buf) != 0) {
@@ -102,10 +102,14 @@ NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_DCLx TTY * buf)
result = ERR;
} else {
#ifdef USE_TERM_DRIVER
- result = CallDriver_2(SP_PARM, sgmode, TRUE, buf);
+ result = CallDriver_2(SP_PARM, td_sgmode, TRUE, buf);
#else
for (;;) {
- if (SET_TTY(termp->Filedes, buf) != 0) {
+ if ((SET_TTY(termp->Filedes, buf) != 0)
+#if USE_KLIBC_KBD
+ && !NC_ISATTY(termp->Filedes)
+#endif
+ ) {
if (errno == EINTR)
continue;
if ((errno == ENOTTY) && (SP_PARM != 0))
@@ -141,7 +145,7 @@ NCURSES_SP_NAME(def_shell_mode) (NCURSES_SP_DCL0)
if (termp != 0) {
#ifdef USE_TERM_DRIVER
- rc = CallDriver_2(SP_PARM, mode, FALSE, TRUE);
+ rc = CallDriver_2(SP_PARM, td_mode, FALSE, TRUE);
#else
/*
* If XTABS was on, remove the tab and backtab capabilities.
@@ -179,7 +183,7 @@ NCURSES_SP_NAME(def_prog_mode) (NCURSES_SP_DCL0)
if (termp != 0) {
#ifdef USE_TERM_DRIVER
- rc = CallDriver_2(SP_PARM, mode, TRUE, TRUE);
+ rc = CallDriver_2(SP_PARM, td_mode, TRUE, TRUE);
#else
/*
* Turn off the XTABS bit in the tty structure if it was on.
@@ -215,13 +219,12 @@ NCURSES_SP_NAME(reset_prog_mode) (NCURSES_SP_DCL0)
if (termp != 0) {
#ifdef USE_TERM_DRIVER
- rc = CallDriver_2(SP_PARM, mode, TRUE, FALSE);
+ rc = CallDriver_2(SP_PARM, td_mode, TRUE, FALSE);
#else
if (_nc_set_tty_mode(&termp->Nttyb) == OK) {
if (SP_PARM) {
if (SP_PARM->_keypad_on)
_nc_keypad(SP_PARM, TRUE);
- NC_BUFFERED(SP_PARM, TRUE);
}
rc = OK;
}
@@ -248,12 +251,11 @@ NCURSES_SP_NAME(reset_shell_mode) (NCURSES_SP_DCL0)
if (termp != 0) {
#ifdef USE_TERM_DRIVER
- rc = CallDriver_2(SP_PARM, mode, FALSE, FALSE);
+ rc = CallDriver_2(SP_PARM, td_mode, FALSE, FALSE);
#else
if (SP_PARM) {
_nc_keypad(SP_PARM, FALSE);
_nc_flush();
- NC_BUFFERED(SP_PARM, FALSE);
}
rc = _nc_set_tty_mode(&termp->Ottyb);
#endif
diff --git a/ncurses/tinfo/make_hash.c b/ncurses/tinfo/make_hash.c
index 15c281d..37ac765 100644
--- a/ncurses/tinfo/make_hash.c
+++ b/ncurses/tinfo/make_hash.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2013 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 *
@@ -44,7 +44,7 @@
#include <ctype.h>
-MODULE_ID("$Id: make_hash.c,v 1.3 2010/05/22 18:02:50 tom Exp $")
+MODULE_ID("$Id: make_hash.c,v 1.13 2013/09/28 20:55:47 tom Exp $")
/*
* _nc_make_hash_table()
@@ -59,6 +59,24 @@ MODULE_ID("$Id: make_hash.c,v 1.3 2010/05/22 18:02:50 tom Exp $")
#define MODULE_ID(id) /*nothing */
#include <tinfo/doalloc.c>
+static void
+failed(const char *s)
+{
+ perror(s);
+ exit(EXIT_FAILURE);
+}
+
+static char *
+strmalloc(char *s)
+{
+ size_t need = strlen(s) + 1;
+ char *result = malloc(need);
+ if (result == 0)
+ failed("strmalloc");
+ _nc_STRCPY(result, s, need);
+ return result;
+}
+
/*
* int hash_function(string)
*
@@ -119,6 +137,18 @@ _nc_make_hash_table(struct name_table_entry *table,
#define MAX_COLUMNS BUFSIZ /* this _has_ to be worst-case */
+static int
+count_columns(char **list)
+{
+ int result = 0;
+ if (list != 0) {
+ while (*list++) {
+ ++result;
+ }
+ }
+ return result;
+}
+
static char **
parse_columns(char *buffer)
{
@@ -126,7 +156,7 @@ parse_columns(char *buffer)
int col = 0;
- if (list == 0 && (list = typeCalloc(char *, MAX_COLUMNS)) == 0)
+ if (list == 0 && (list = typeCalloc(char *, (MAX_COLUMNS + 1))) == 0)
return (0);
if (*buffer != '#') {
@@ -201,8 +231,15 @@ main(int argc, char **argv)
list = parse_columns(buffer);
if (list == 0) /* blank or comment */
continue;
+ if (column > count_columns(list)) {
+ fprintf(stderr, "expected %d columns, have %d:\n%s\n",
+ column,
+ count_columns(list),
+ buffer);
+ exit(EXIT_FAILURE);
+ }
name_table[n].nte_link = -1; /* end-of-hash */
- name_table[n].nte_name = strdup(list[column]);
+ name_table[n].nte_name = strmalloc(list[column]);
if (!strcmp(list[2], "bool")) {
name_table[n].nte_type = BOOLEAN;
name_table[n].nte_index = BoolCount++;
@@ -256,13 +293,12 @@ main(int argc, char **argv)
printf("static struct name_table_entry *_nc_%s_table = 0;\n\n", root_name);
} else {
- printf("static struct name_table_entry %s _nc_%s_table[] =\n",
- bigstring ? "" : "const",
+ printf("static struct name_table_entry const _nc_%s_table[] =\n",
root_name);
printf("{\n");
for (n = 0; n < CAPTABSIZE; n++) {
- sprintf(buffer, "\"%s\"",
- name_table[n].nte_name);
+ _nc_SPRINTF(buffer, _nc_SLIMIT(sizeof(buffer)) "\"%s\"",
+ name_table[n].nte_name);
printf("\t{ %15s,\t%10s,\t%3d, %3d }%c\n",
buffer,
typenames[name_table[n].nte_type],
diff --git a/ncurses/tinfo/make_keys.c b/ncurses/tinfo/make_keys.c
index a7854e3..f44f7c7 100644
--- a/ncurses/tinfo/make_keys.c
+++ b/ncurses/tinfo/make_keys.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2008,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2010,2011 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 *
@@ -39,7 +39,7 @@
#define USE_TERMLIB 1
#include <build.priv.h>
-MODULE_ID("$Id: make_keys.c,v 1.19 2010/06/05 22:08:00 tom Exp $")
+MODULE_ID("$Id: make_keys.c,v 1.20 2011/10/22 16:34:50 tom Exp $")
#include <names.c>
@@ -76,7 +76,7 @@ make_keys(FILE *ifp, FILE *ofp)
unsigned maxlen = 16;
int scanned;
- while (fgets(buffer, sizeof(buffer), ifp) != 0) {
+ while (fgets(buffer, (int) sizeof(buffer), ifp) != 0) {
if (*buffer == '#')
continue;
diff --git a/ncurses/tinfo/name_match.c b/ncurses/tinfo/name_match.c
index a9ac642..c648535 100644
--- a/ncurses/tinfo/name_match.c
+++ b/ncurses/tinfo/name_match.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1999-2007,2008 Free Software Foundation, Inc. *
+ * Copyright (c) 1999-2012,2013 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 *
@@ -33,25 +33,38 @@
#include <curses.priv.h>
#include <tic.h>
-MODULE_ID("$Id: name_match.c,v 1.18 2008/11/16 00:19:59 juergen Exp $")
+MODULE_ID("$Id: name_match.c,v 1.23 2013/05/25 20:20:08 tom Exp $")
-/*
- * _nc_first_name(char *names)
- *
- * Extract the primary name from a compiled entry.
- */
#define FirstName _nc_globals.first_name
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+static const char *
+skip_index(const char *name)
+{
+ if ((_nc_syntax == SYN_TERMCAP) && _nc_user_definable) {
+ const char *bar = strchr(name, '|');
+ if (bar != 0 && (bar - name) == 2)
+ name = bar + 1;
+ }
+ return name;
+}
+#endif
+
+/*
+ * Get the primary name from the given name list. For terminfo, this is the
+ * first name. For termcap, this may be the second name, if the first one
+ * happens to be two characters.
+ */
NCURSES_EXPORT(char *)
_nc_first_name(const char *const sp)
-/* get the first name from the given name list */
{
unsigned n;
#if NO_LEAKS
if (sp == 0) {
- if (FirstName != 0)
+ if (FirstName != 0) {
FreeAndNull(FirstName);
+ }
} else
#endif
{
@@ -59,8 +72,12 @@ _nc_first_name(const char *const sp)
FirstName = typeMalloc(char, MAX_NAME_SIZE + 1);
if (FirstName != 0) {
+ const char *src = sp;
+#if NCURSES_USE_TERMCAP && NCURSES_XNAMES
+ src = skip_index(sp);
+#endif
for (n = 0; n < MAX_NAME_SIZE; n++) {
- if ((FirstName[n] = sp[n]) == '\0'
+ if ((FirstName[n] = src[n]) == '\0'
|| (FirstName[n] == '|'))
break;
}
@@ -71,11 +88,8 @@ _nc_first_name(const char *const sp)
}
/*
- * int _nc_name_match(namelist, name, delim)
- *
- * Is the given name matched in namelist?
+ * Is the given name matched in namelist?
*/
-
NCURSES_EXPORT(int)
_nc_name_match(const char *const namelst, const char *const name, const char *const delim)
{
diff --git a/ncurses/tinfo/obsolete.c b/ncurses/tinfo/obsolete.c
new file mode 100644
index 0000000..63476dc
--- /dev/null
+++ b/ncurses/tinfo/obsolete.c
@@ -0,0 +1,239 @@
+/****************************************************************************
+ * Copyright (c) 2013,2014 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: Thomas E. Dickey 2013-on *
+ ****************************************************************************/
+
+/*
+** Support for obsolete/unusual features.
+*/
+
+#include <curses.priv.h>
+
+MODULE_ID("$Id: obsolete.c,v 1.3 2014/10/11 02:39:35 tom Exp $")
+
+/*
+ * Obsolete entrypoint retained for binary compatbility.
+ */
+NCURSES_EXPORT(void)
+NCURSES_SP_NAME(_nc_set_buffer) (NCURSES_SP_DCLx FILE *ofp, int buffered)
+{
+#if NCURSES_SP_FUNCS
+ (void) SP_PARM;
+#endif
+ (void) ofp;
+ (void) buffered;
+}
+
+#if NCURSES_SP_FUNCS
+NCURSES_EXPORT(void)
+_nc_set_buffer(FILE *ofp, int buffered)
+{
+ NCURSES_SP_NAME(_nc_set_buffer) (CURRENT_SCREEN, ofp, buffered);
+}
+#endif
+
+#if !HAVE_STRDUP
+NCURSES_EXPORT(char *)
+_nc_strdup(const char *s)
+{
+ char *result = 0;
+ if (s != 0) {
+ size_t need = strlen(s);
+ result = malloc(need + 1);
+ if (result != 0) {
+ strcpy(result, s);
+ }
+ }
+ return result;
+}
+#endif
+
+#if USE_MY_MEMMOVE
+#define DST ((char *)s1)
+#define SRC ((const char *)s2)
+NCURSES_EXPORT(void *)
+_nc_memmove(void *s1, const void *s2, size_t n)
+{
+ if (n != 0) {
+ if ((DST + n > SRC) && (SRC + n > DST)) {
+ static char *bfr;
+ static size_t length;
+ register size_t j;
+ if (length < n) {
+ length = (n * 3) / 2;
+ bfr = typeRealloc(char, length, bfr);
+ }
+ for (j = 0; j < n; j++)
+ bfr[j] = SRC[j];
+ s2 = bfr;
+ }
+ while (n-- != 0)
+ DST[n] = SRC[n];
+ }
+ return s1;
+}
+#endif /* USE_MY_MEMMOVE */
+
+#ifdef EXP_XTERM_1005
+NCURSES_EXPORT(int)
+_nc_conv_to_utf8(unsigned char *target, unsigned source, unsigned limit)
+{
+#define CH(n) UChar((source) >> ((n) * 8))
+ int rc = 0;
+
+ if (source <= 0x0000007f)
+ rc = 1;
+ else if (source <= 0x000007ff)
+ rc = 2;
+ else if (source <= 0x0000ffff)
+ rc = 3;
+ else if (source <= 0x001fffff)
+ rc = 4;
+ else if (source <= 0x03ffffff)
+ rc = 5;
+ else /* (source <= 0x7fffffff) */
+ rc = 6;
+
+ if ((unsigned) rc > limit) { /* whatever it is, we cannot decode it */
+ rc = 0;
+ }
+
+ if (target != 0) {
+ switch (rc) {
+ case 1:
+ target[0] = CH(0);
+ break;
+
+ case 2:
+ target[1] = UChar(0x80 | (CH(0) & 0x3f));
+ target[0] = UChar(0xc0 | (CH(0) >> 6) | ((CH(1) & 0x07) << 2));
+ break;
+
+ case 3:
+ target[2] = UChar(0x80 | (CH(0) & 0x3f));
+ target[1] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
+ target[0] = UChar(0xe0 | ((int) (CH(1) & 0xf0) >> 4));
+ break;
+
+ case 4:
+ target[3] = UChar(0x80 | (CH(0) & 0x3f));
+ target[2] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
+ target[1] = UChar(0x80 |
+ ((int) (CH(1) & 0xf0) >> 4) |
+ ((int) (CH(2) & 0x03) << 4));
+ target[0] = UChar(0xf0 | ((int) (CH(2) & 0x1f) >> 2));
+ break;
+
+ case 5:
+ target[4] = UChar(0x80 | (CH(0) & 0x3f));
+ target[3] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
+ target[2] = UChar(0x80 |
+ ((int) (CH(1) & 0xf0) >> 4) |
+ ((int) (CH(2) & 0x03) << 4));
+ target[1] = UChar(0x80 | (CH(2) >> 2));
+ target[0] = UChar(0xf8 | (CH(3) & 0x03));
+ break;
+
+ case 6:
+ target[5] = UChar(0x80 | (CH(0) & 0x3f));
+ target[4] = UChar(0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2));
+ target[3] = UChar(0x80 | (CH(1) >> 4) | ((CH(2) & 0x03) << 4));
+ target[2] = UChar(0x80 | (CH(2) >> 2));
+ target[1] = UChar(0x80 | (CH(3) & 0x3f));
+ target[0] = UChar(0xfc | ((int) (CH(3) & 0x40) >> 6));
+ break;
+ }
+ }
+
+ return rc; /* number of bytes needed in target */
+#undef CH
+}
+
+NCURSES_EXPORT(int)
+_nc_conv_to_utf32(unsigned *target, const char *source, unsigned limit)
+{
+#define CH(n) UChar((*target) >> ((n) * 8))
+ int rc = 0;
+ int j;
+ unsigned mask = 0;
+
+ /*
+ * Find the number of bytes we will need from the source.
+ */
+ if ((*source & 0x80) == 0) {
+ rc = 1;
+ mask = (unsigned) *source;
+ } else if ((*source & 0xe0) == 0xc0) {
+ rc = 2;
+ mask = (unsigned) (*source & 0x1f);
+ } else if ((*source & 0xf0) == 0xe0) {
+ rc = 3;
+ mask = (unsigned) (*source & 0x0f);
+ } else if ((*source & 0xf8) == 0xf0) {
+ rc = 4;
+ mask = (unsigned) (*source & 0x07);
+ } else if ((*source & 0xfc) == 0xf8) {
+ rc = 5;
+ mask = (unsigned) (*source & 0x03);
+ } else if ((*source & 0xfe) == 0xfc) {
+ rc = 6;
+ mask = (unsigned) (*source & 0x01);
+ }
+
+ if ((unsigned) rc > limit) { /* whatever it is, we cannot decode it */
+ rc = 0;
+ }
+
+ /*
+ * sanity-check.
+ */
+ if (rc > 1) {
+ for (j = 1; j < rc; j++) {
+ if ((source[j] & 0xc0) != 0x80)
+ break;
+ }
+ if (j != rc) {
+ rc = 0;
+ }
+ }
+
+ if (target != 0) {
+ int shift = 0;
+ *target = 0;
+ for (j = 1; j < rc; j++) {
+ *target |= (unsigned) (source[rc - j] & 0x3f) << shift;
+ shift += 6;
+ }
+ *target |= mask << shift;
+ }
+ return rc;
+#undef CH
+}
+#endif /* EXP_XTERM_1005 */
diff --git a/ncurses/tinfo/parse_entry.c b/ncurses/tinfo/parse_entry.c
index ddbc252..2936a64 100644
--- a/ncurses/tinfo/parse_entry.c
+++ b/ncurses/tinfo/parse_entry.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2011,2012 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 *
@@ -47,7 +47,7 @@
#include <ctype.h>
#include <tic.h>
-MODULE_ID("$Id: parse_entry.c,v 1.75 2010/05/01 19:35:09 tom Exp $")
+MODULE_ID("$Id: parse_entry.c,v 1.79 2012/10/27 21:43:45 tom Exp $")
#ifdef LINT
static short const parametrized[] =
@@ -145,27 +145,27 @@ _nc_extend_names(ENTRY * entryp, char *name, int token_type)
case BOOLEAN:
tp->ext_Booleans++;
tp->num_Booleans++;
- tp->Booleans = typeRealloc(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans);
+ TYPE_REALLOC(NCURSES_SBOOL, tp->num_Booleans, tp->Booleans);
for_each_value(tp->num_Booleans)
tp->Booleans[last] = tp->Booleans[last - 1];
break;
case NUMBER:
tp->ext_Numbers++;
tp->num_Numbers++;
- tp->Numbers = typeRealloc(short, tp->num_Numbers, tp->Numbers);
+ TYPE_REALLOC(short, tp->num_Numbers, tp->Numbers);
for_each_value(tp->num_Numbers)
tp->Numbers[last] = tp->Numbers[last - 1];
break;
case STRING:
tp->ext_Strings++;
tp->num_Strings++;
- tp->Strings = typeRealloc(char *, tp->num_Strings, tp->Strings);
+ TYPE_REALLOC(char *, tp->num_Strings, tp->Strings);
for_each_value(tp->num_Strings)
tp->Strings[last] = tp->Strings[last - 1];
break;
}
actual = NUM_EXT_NAMES(tp);
- tp->ext_Names = typeRealloc(char *, actual, tp->ext_Names);
+ TYPE_REALLOC(char *, actual, tp->ext_Names);
while (--actual > offset)
tp->ext_Names[actual] = tp->ext_Names[actual - 1];
tp->ext_Names[offset] = _nc_save_str(name);
@@ -203,6 +203,8 @@ _nc_extend_names(ENTRY * entryp, char *name, int token_type)
{ bad_tc_usage = TRUE; \
_nc_warning("Legacy termcap allows only a trailing tc= clause"); }
+#define MAX_NUMBER 0x7fff /* positive shorts only */
+
NCURSES_EXPORT(int)
_nc_parse_entry(struct entry *entryp, int literal, bool silent)
{
@@ -444,8 +446,12 @@ _nc_parse_entry(struct entry *entryp, int literal, bool silent)
break;
case NUMBER:
- entryp->tterm.Numbers[entry_ptr->nte_index] =
- (short) _nc_curr_token.tk_valnumber;
+ if (_nc_curr_token.tk_valnumber > MAX_NUMBER) {
+ entryp->tterm.Numbers[entry_ptr->nte_index] = MAX_NUMBER;
+ } else {
+ entryp->tterm.Numbers[entry_ptr->nte_index] =
+ (short) _nc_curr_token.tk_valnumber;
+ }
break;
case STRING:
@@ -654,14 +660,16 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
if (WANTED(carriage_return)) {
if (carriage_return_delay > 0) {
- sprintf(buf, "%s$<%d>", C_CR, carriage_return_delay);
+ _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+ "%s$<%d>", C_CR, carriage_return_delay);
carriage_return = _nc_save_str(buf);
} else
carriage_return = _nc_save_str(C_CR);
}
if (WANTED(cursor_left)) {
if (backspace_delay > 0) {
- sprintf(buf, "%s$<%d>", C_BS, backspace_delay);
+ _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+ "%s$<%d>", C_BS, backspace_delay);
cursor_left = _nc_save_str(buf);
} else if (backspaces_with_bs == 1)
cursor_left = _nc_save_str(C_BS);
@@ -674,7 +682,8 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
cursor_down = linefeed_if_not_lf;
else if (linefeed_is_newline != 1) {
if (new_line_delay > 0) {
- sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
+ _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+ "%s$<%d>", C_LF, new_line_delay);
cursor_down = _nc_save_str(buf);
} else
cursor_down = _nc_save_str(C_LF);
@@ -685,7 +694,8 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
cursor_down = linefeed_if_not_lf;
else if (linefeed_is_newline != 1) {
if (new_line_delay > 0) {
- sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
+ _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+ "%s$<%d>", C_LF, new_line_delay);
scroll_forward = _nc_save_str(buf);
} else
scroll_forward = _nc_save_str(C_LF);
@@ -694,7 +704,8 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
if (WANTED(newline)) {
if (linefeed_is_newline == 1) {
if (new_line_delay > 0) {
- sprintf(buf, "%s$<%d>", C_LF, new_line_delay);
+ _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+ "%s$<%d>", C_LF, new_line_delay);
newline = _nc_save_str(buf);
} else
newline = _nc_save_str(C_LF);
@@ -736,7 +747,8 @@ postprocess_termcap(TERMTYPE *tp, bool has_base)
*/
if (WANTED(tab)) {
if (horizontal_tab_delay > 0) {
- sprintf(buf, "%s$<%d>", C_HT, horizontal_tab_delay);
+ _nc_SPRINTF(buf, _nc_SLIMIT(sizeof(buf))
+ "%s$<%d>", C_HT, horizontal_tab_delay);
tab = _nc_save_str(buf);
} else
tab = _nc_save_str(C_HT);
diff --git a/ncurses/tinfo/read_entry.c b/ncurses/tinfo/read_entry.c
index e38b9cb..e5c26b5 100644
--- a/ncurses/tinfo/read_entry.c
+++ b/ncurses/tinfo/read_entry.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
@@ -41,11 +41,13 @@
#include <tic.h>
-MODULE_ID("$Id: read_entry.c,v 1.108 2011/02/26 15:36:06 tom Exp $")
+MODULE_ID("$Id: read_entry.c,v 1.128 2014/06/14 22:30:41 tom Exp $")
#define TYPE_CALLOC(type,elts) typeCalloc(type, (unsigned)(elts))
-#if USE_DATABASE
+#define MyNumber(n) (short) LOW_MSB(n)
+
+#if NCURSES_USE_DATABASE
static void
convert_shorts(char *buf, short *Numbers, int count)
{
@@ -56,7 +58,7 @@ convert_shorts(char *buf, short *Numbers, int count)
else if (IS_NEG2(buf + 2 * i))
Numbers[i] = CANCELLED_NUMERIC;
else
- Numbers[i] = (short) LOW_MSB(buf + 2 * i);
+ Numbers[i] = MyNumber(buf + 2 * i);
TR(TRACE_DATABASE, ("get Numbers[%d]=%d", i, Numbers[i]));
}
}
@@ -72,10 +74,10 @@ convert_strings(char *buf, char **Strings, int count, int size, char *table)
Strings[i] = ABSENT_STRING;
} else if (IS_NEG2(buf + 2 * i)) {
Strings[i] = CANCELLED_STRING;
- } else if ((int) LOW_MSB(buf + 2 * i) > size) {
+ } else if (MyNumber(buf + 2 * i) > size) {
Strings[i] = ABSENT_STRING;
} else {
- Strings[i] = (LOW_MSB(buf + 2 * i) + table);
+ Strings[i] = (MyNumber(buf + 2 * i) + table);
TR(TRACE_DATABASE, ("Strings[%d] = %s", i, _nc_visbuf(Strings[i])));
}
@@ -99,7 +101,7 @@ fake_read(char *src, int *offset, int limit, char *dst, unsigned want)
if (have > 0) {
if ((int) want > have)
want = (unsigned) have;
- memcpy(dst, src + *offset, want);
+ memcpy(dst, src + *offset, (size_t) want);
*offset += (int) want;
} else {
want = 0;
@@ -107,22 +109,72 @@ fake_read(char *src, int *offset, int limit, char *dst, unsigned want)
return (int) want;
}
-#define Read(buf, count) fake_read(buffer, &offset, limit, buf, count)
+#define Read(buf, count) fake_read(buffer, &offset, limit, (char *) buf, (unsigned) count)
#define read_shorts(buf, count) \
- (Read(buf, (unsigned) (count)*2) == (int) (count)*2)
+ (Read(buf, (count)*2) == (int) (count)*2)
#define even_boundary(value) \
if ((value) % 2 != 0) Read(buf, 1)
+#endif
+
+NCURSES_EXPORT(void)
+_nc_init_termtype(TERMTYPE *const tp)
+{
+ unsigned i;
+
+#if NCURSES_XNAMES
+ tp->num_Booleans = BOOLCOUNT;
+ tp->num_Numbers = NUMCOUNT;
+ tp->num_Strings = STRCOUNT;
+ tp->ext_Booleans = 0;
+ tp->ext_Numbers = 0;
+ tp->ext_Strings = 0;
+#endif
+ if (tp->Booleans == 0)
+ TYPE_MALLOC(NCURSES_SBOOL, BOOLCOUNT, tp->Booleans);
+ if (tp->Numbers == 0)
+ TYPE_MALLOC(short, NUMCOUNT, tp->Numbers);
+ if (tp->Strings == 0)
+ TYPE_MALLOC(char *, STRCOUNT, tp->Strings);
+
+ for_each_boolean(i, tp)
+ tp->Booleans[i] = FALSE;
+
+ for_each_number(i, tp)
+ tp->Numbers[i] = ABSENT_NUMERIC;
+
+ for_each_string(i, tp)
+ tp->Strings[i] = ABSENT_STRING;
+}
+#if NCURSES_USE_DATABASE
+#if NCURSES_XNAMES
+static bool
+valid_shorts(char *buffer, int limit)
+{
+ bool result = FALSE;
+ int n;
+ for (n = 0; n < limit; ++n) {
+ if (MyNumber(buffer + (n * 2)) > 0) {
+ result = TRUE;
+ break;
+ }
+ }
+ return result;
+}
+#endif
+
+/*
+ * Return TGETENT_YES if read, TGETENT_NO if not found or garbled.
+ */
NCURSES_EXPORT(int)
_nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
-/* return 1 if read, 0 if not found or garbled */
{
int offset = 0;
int name_size, bool_count, num_count, str_count, str_size;
int i;
- char buf[MAX_ENTRY_SIZE + 1];
+ char buf[MAX_ENTRY_SIZE + 2];
char *string_table;
unsigned want, have;
@@ -136,11 +188,11 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
return (TGETENT_NO);
}
- name_size = LOW_MSB(buf + 2);
- bool_count = LOW_MSB(buf + 4);
- num_count = LOW_MSB(buf + 6);
- str_count = LOW_MSB(buf + 8);
- str_size = LOW_MSB(buf + 10);
+ name_size = MyNumber(buf + 2);
+ bool_count = MyNumber(buf + 4);
+ num_count = MyNumber(buf + 6);
+ str_count = MyNumber(buf + 8);
+ str_size = MyNumber(buf + 10);
TR(TRACE_DATABASE,
("TERMTYPE name_size=%d, bool=%d/%d, num=%d/%d str=%d/%d(%d)",
@@ -157,7 +209,7 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
want = (unsigned) (str_size + name_size + 1);
if (str_size) {
/* try to allocate space for the string table */
- if (str_count * 2 >= (int) sizeof(buf)
+ if (str_count * 2 >= MAX_ENTRY_SIZE
|| (string_table = typeMalloc(char, want)) == 0) {
return (TGETENT_NO);
}
@@ -173,7 +225,7 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
ptr->str_table = string_table;
ptr->term_names = string_table;
if ((have = (unsigned) Read(ptr->term_names, want)) != want) {
- memset(ptr->term_names + have, 0, want - have);
+ memset(ptr->term_names + have, 0, (size_t) (want - have));
}
ptr->term_names[want] = '\0';
string_table += (want + 1);
@@ -203,8 +255,9 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
}
convert_shorts(buf, ptr->Numbers, num_count);
- if ((ptr->Strings = TYPE_CALLOC(char *, max(STRCOUNT, str_count))) == 0)
- return (TGETENT_NO);
+ if ((ptr->Strings = TYPE_CALLOC(char *, max(STRCOUNT, str_count))) == 0) {
+ return (TGETENT_NO);
+ }
if (str_count) {
/* grab the string offsets */
@@ -212,8 +265,9 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
return (TGETENT_NO);
}
/* finally, grab the string table itself */
- if (Read(string_table, (unsigned) str_size) != str_size)
+ if (Read(string_table, (unsigned) str_size) != str_size) {
return (TGETENT_NO);
+ }
convert_strings(buf, ptr->Strings, str_count, str_size, string_table);
}
#if NCURSES_XNAMES
@@ -227,32 +281,33 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
*/
even_boundary(str_size);
TR(TRACE_DATABASE, ("READ extended_header @%d", offset));
- if (_nc_user_definable && read_shorts(buf, 5)) {
- int ext_bool_count = LOW_MSB(buf + 0);
- int ext_num_count = LOW_MSB(buf + 2);
- int ext_str_count = LOW_MSB(buf + 4);
- int ext_str_size = LOW_MSB(buf + 6);
- int ext_str_limit = LOW_MSB(buf + 8);
+ if (_nc_user_definable && read_shorts(buf, 5) && valid_shorts(buf, 5)) {
+ int ext_bool_count = MyNumber(buf + 0);
+ int ext_num_count = MyNumber(buf + 2);
+ int ext_str_count = MyNumber(buf + 4);
+ int ext_str_size = MyNumber(buf + 6);
+ int ext_str_limit = MyNumber(buf + 8);
unsigned need = (unsigned) (ext_bool_count + ext_num_count + ext_str_count);
int base = 0;
- if (need >= sizeof(buf)
- || ext_str_size >= (int) sizeof(buf)
- || ext_str_limit >= (int) sizeof(buf)
+ if (need >= (MAX_ENTRY_SIZE / 2)
+ || ext_str_size >= MAX_ENTRY_SIZE
+ || ext_str_limit >= MAX_ENTRY_SIZE
|| ext_bool_count < 0
|| ext_num_count < 0
|| ext_str_count < 0
|| ext_str_size < 0
- || ext_str_limit < 0)
+ || ext_str_limit < 0) {
return (TGETENT_NO);
+ }
ptr->num_Booleans = UShort(BOOLCOUNT + ext_bool_count);
ptr->num_Numbers = UShort(NUMCOUNT + ext_num_count);
ptr->num_Strings = UShort(STRCOUNT + ext_str_count);
- ptr->Booleans = typeRealloc(NCURSES_SBOOL, ptr->num_Booleans, ptr->Booleans);
- ptr->Numbers = typeRealloc(short, ptr->num_Numbers, ptr->Numbers);
- ptr->Strings = typeRealloc(char *, ptr->num_Strings, ptr->Strings);
+ TYPE_REALLOC(NCURSES_SBOOL, ptr->num_Booleans, ptr->Booleans);
+ TYPE_REALLOC(short, ptr->num_Numbers, ptr->Numbers);
+ TYPE_REALLOC(char *, ptr->num_Strings, ptr->Strings);
TR(TRACE_DATABASE, ("extended header is %d/%d/%d(%d:%d)",
ext_bool_count, ext_num_count, ext_str_count,
@@ -262,34 +317,42 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
ext_bool_count, offset));
if ((ptr->ext_Booleans = UShort(ext_bool_count)) != 0) {
if (Read(ptr->Booleans + BOOLCOUNT, (unsigned)
- ext_bool_count) != ext_bool_count)
+ ext_bool_count) != ext_bool_count) {
return (TGETENT_NO);
+ }
}
even_boundary(ext_bool_count);
TR(TRACE_DATABASE, ("READ %d extended-numbers @%d",
ext_num_count, offset));
if ((ptr->ext_Numbers = UShort(ext_num_count)) != 0) {
- if (!read_shorts(buf, ext_num_count))
+ if (!read_shorts(buf, ext_num_count)) {
return (TGETENT_NO);
+ }
TR(TRACE_DATABASE, ("Before converting extended-numbers"));
convert_shorts(buf, ptr->Numbers + NUMCOUNT, ext_num_count);
}
TR(TRACE_DATABASE, ("READ extended-offsets @%d", offset));
+ if ((unsigned) (ext_str_count + (int) need) >= (MAX_ENTRY_SIZE / 2)) {
+ return (TGETENT_NO);
+ }
if ((ext_str_count || need)
- && !read_shorts(buf, ext_str_count + (int) need))
+ && !read_shorts(buf, ext_str_count + (int) need)) {
return (TGETENT_NO);
+ }
TR(TRACE_DATABASE, ("READ %d bytes of extended-strings @%d",
ext_str_limit, offset));
if (ext_str_limit) {
ptr->ext_str_table = typeMalloc(char, (size_t) ext_str_limit);
- if (ptr->ext_str_table == 0)
+ if (ptr->ext_str_table == 0) {
return (TGETENT_NO);
- if (Read(ptr->ext_str_table, (unsigned) ext_str_limit) != ext_str_limit)
+ }
+ if (Read(ptr->ext_str_table, (unsigned) ext_str_limit) != ext_str_limit) {
return (TGETENT_NO);
+ }
TR(TRACE_DATABASE, ("first extended-string is %s", _nc_visbuf(ptr->ext_str_table)));
}
@@ -313,10 +376,12 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
}
if (need) {
- if (ext_str_count >= (MAX_ENTRY_SIZE * 2))
+ if (ext_str_count >= (MAX_ENTRY_SIZE / 2)) {
+ return (TGETENT_NO);
+ }
+ if ((ptr->ext_Names = TYPE_CALLOC(char *, need)) == 0) {
return (TGETENT_NO);
- if ((ptr->ext_Names = TYPE_CALLOC(char *, need)) == 0)
- return (TGETENT_NO);
+ }
TR(TRACE_DATABASE,
("ext_NAMES starting @%d in extended_strings, first = %s",
base, _nc_visbuf(ptr->ext_str_table + base)));
@@ -326,17 +391,18 @@ _nc_read_termtype(TERMTYPE *ptr, char *buffer, int limit)
ext_str_limit, ptr->ext_str_table + base);
}
- T(("...done reading terminfo bool %d(%d) num %d(%d) str %d(%d)",
- ptr->num_Booleans, ptr->ext_Booleans,
- ptr->num_Numbers, ptr->ext_Numbers,
- ptr->num_Strings, ptr->ext_Strings));
+ TR(TRACE_DATABASE,
+ ("...done reading terminfo bool %d(%d) num %d(%d) str %d(%d)",
+ ptr->num_Booleans, ptr->ext_Booleans,
+ ptr->num_Numbers, ptr->ext_Numbers,
+ ptr->num_Strings, ptr->ext_Strings));
TR(TRACE_DATABASE, ("extend: num_Booleans:%d", ptr->num_Booleans));
} else
#endif /* NCURSES_XNAMES */
{
- T(("...done reading terminfo bool %d num %d str %d",
- bool_count, num_count, str_count));
+ TR(TRACE_DATABASE, ("...done reading terminfo bool %d num %d str %d",
+ bool_count, num_count, str_count));
#if NCURSES_XNAMES
TR(TRACE_DATABASE, ("normal: num_Booleans:%d", ptr->num_Booleans));
#endif
@@ -371,13 +437,13 @@ _nc_read_file_entry(const char *const filename, TERMTYPE *ptr)
if (_nc_access(filename, R_OK) < 0
|| (fp = fopen(filename, "rb")) == 0) {
- T(("cannot open terminfo %s (errno=%d)", filename, errno));
+ TR(TRACE_DATABASE, ("cannot open terminfo %s (errno=%d)", filename, errno));
code = TGETENT_NO;
} else {
if ((limit = (int) fread(buffer, sizeof(char), sizeof(buffer), fp))
> 0) {
- T(("read terminfo %s", filename));
+ TR(TRACE_DATABASE, ("read terminfo %s", filename));
if ((code = _nc_read_termtype(ptr, buffer, limit)) == TGETENT_NO) {
_nc_free_termtype(ptr);
}
@@ -390,6 +456,58 @@ _nc_read_file_entry(const char *const filename, TERMTYPE *ptr)
return (code);
}
+#if USE_HASHED_DB
+/*
+ * Return if if we can build the filename of a ".db" file.
+ */
+static bool
+make_db_filename(char *filename, unsigned limit, const char *const path)
+{
+ static const char suffix[] = DBM_SUFFIX;
+
+ size_t lens = sizeof(suffix) - 1;
+ size_t size = strlen(path);
+ size_t test = lens + size;
+ bool result = FALSE;
+
+ if (test < limit) {
+ if (size >= lens
+ && !strcmp(path + size - lens, suffix))
+ _nc_STRCPY(filename, path, limit);
+ else
+ _nc_SPRINTF(filename, _nc_SLIMIT(limit) "%s%s", path, suffix);
+ result = TRUE;
+ }
+ return result;
+}
+#endif
+
+/*
+ * Return true if we can build the name of a filesystem entry.
+ */
+static bool
+make_dir_filename(char *filename,
+ unsigned limit,
+ const char *const path,
+ const char *name)
+{
+ bool result = FALSE;
+
+#if NCURSES_USE_TERMCAP
+ if (_nc_is_dir_path(path))
+#endif
+ {
+ unsigned need = (unsigned) (LEAF_LEN + 3 + strlen(path) + strlen(name));
+
+ if (need <= limit) {
+ _nc_SPRINTF(filename, _nc_SLIMIT(limit)
+ "%s/" LEAF_FMT "/%s", path, *name, name);
+ result = TRUE;
+ }
+ }
+ return result;
+}
+
/*
* Build a terminfo pathname and try to read the data. Returns TGETENT_YES on
* success, TGETENT_NO on failure.
@@ -401,103 +519,82 @@ _nc_read_tic_entry(char *filename,
const char *name,
TERMTYPE *const tp)
{
- int result = TGETENT_NO;
-
- /*
- * If we are looking in a directory, assume the entry is a file under that,
- * according to the normal rules.
- */
- unsigned need = (unsigned) (LEAF_LEN + 3 + strlen(path) + strlen(name));
- if (need <= limit)
- (void) sprintf(filename, "%s/" LEAF_FMT "/%s", path, *name, name);
+ int code = TGETENT_NO;
- if (_nc_is_dir_path(path))
- result = _nc_read_file_entry(filename, tp);
#if USE_HASHED_DB
- else {
- static const char suffix[] = DBM_SUFFIX;
- DB *capdbp;
- unsigned lens = sizeof(suffix) - 1;
- unsigned size = strlen(path);
- unsigned test = lens + size;
-
- if (test < limit) {
- if (size >= lens
- && !strcmp(path + size - lens, suffix))
- (void) strcpy(filename, path);
- else
- (void) sprintf(filename, "%s%s", path, suffix);
+ DB *capdbp;
+
+ if (make_db_filename(filename, limit, path)
+ && (capdbp = _nc_db_open(filename, FALSE)) != 0) {
+
+ DBT key, data;
+ int reccnt = 0;
+ char *save = strdup(name);
+
+ memset(&key, 0, sizeof(key));
+ key.data = save;
+ key.size = strlen(save);
+
+ /*
+ * This lookup could return termcap data, which we do not want. We are
+ * looking for compiled (binary) terminfo data.
+ *
+ * cgetent uses a two-level lookup. On the first it uses the given
+ * name to return a record containing only the aliases for an entry.
+ * On the second (using that list of aliases as a key), it returns the
+ * content of the terminal description. We expect second lookup to
+ * return data beginning with the same set of aliases.
+ *
+ * For compiled terminfo, the list of aliases in the second case will
+ * be null-terminated. A termcap entry will not be, and will run on
+ * into the description. So we can easily distinguish between the two
+ * (source/binary) by checking the lengths.
+ */
+ while (_nc_db_get(capdbp, &key, &data) == 0) {
+ int used = (int) data.size - 1;
+ char *have = (char *) data.data;
+
+ if (*have++ == 0) {
+ if (data.size > key.size
+ && IS_TIC_MAGIC(have)) {
+ code = _nc_read_termtype(tp, have, used);
+ if (code == TGETENT_NO) {
+ _nc_free_termtype(tp);
+ }
+ }
+ break;
+ }
/*
- * It would be nice to optimize the dbopen/close activity, as
- * done in the cgetent implementation for tc= clauses. However,
- * since we support multiple database locations, we cannot do
- * that.
+ * Just in case we have a corrupt database, do not waste time with
+ * it.
*/
- if ((capdbp = _nc_db_open(filename, FALSE)) != 0) {
- DBT key, data;
- int reccnt = 0;
- char *save = strdup(name);
-
- memset(&key, 0, sizeof(key));
- key.data = save;
- key.size = strlen(save);
-
- /*
- * This lookup could return termcap data, which we do not want.
- * We are looking for compiled (binary) terminfo data.
- *
- * cgetent uses a two-level lookup. On the first it uses the
- * given name to return a record containing only the aliases
- * for an entry. On the second (using that list of aliases as
- * a key), it returns the content of the terminal description.
- * We expect second lookup to return data beginning with the
- * same set of aliases.
- *
- * For compiled terminfo, the list of aliases in the second
- * case will be null-terminated. A termcap entry will not be,
- * and will run on into the description. So we can easily
- * distinguish between the two (source/binary) by checking the
- * lengths.
- */
- while (_nc_db_get(capdbp, &key, &data) == 0) {
- int used = data.size - 1;
- char *have = (char *) data.data;
-
- if (*have++ == 0) {
- if (data.size > key.size
- && IS_TIC_MAGIC(have)) {
- result = _nc_read_termtype(tp, have, used);
- if (result == TGETENT_NO) {
- _nc_free_termtype(tp);
- }
- }
- break;
- }
-
- /*
- * Just in case we have a corrupt database, do not waste
- * time with it.
- */
- if (++reccnt >= 3)
- break;
-
- /*
- * Prepare for the second level.
- */
- key.data = have;
- key.size = used;
- }
+ if (++reccnt >= 3)
+ break;
- _nc_db_close(capdbp);
- free(save);
- }
+ /*
+ * Prepare for the second level.
+ */
+ key.data = have;
+ key.size = used;
}
+
+ free(save);
+ } else /* may be either filesystem or flat file */
+#endif
+ if (make_dir_filename(filename, limit, path, name)) {
+ code = _nc_read_file_entry(filename, tp);
+ }
+#if NCURSES_USE_TERMCAP
+ else if (code != TGETENT_YES) {
+ code = _nc_read_termcap_entry(name, tp);
+ _nc_SPRINTF(filename, _nc_SLIMIT(PATH_MAX)
+ "%.*s", PATH_MAX - 1, _nc_get_source());
}
#endif
- return result;
+ return code;
}
-#endif /* USE_DATABASE */
+#endif /* NCURSES_USE_DATABASE */
/*
* _nc_read_entry(char *name, char *filename, TERMTYPE *tp)
@@ -513,31 +610,35 @@ _nc_read_entry(const char *const name, char *const filename, TERMTYPE *const tp)
{
int code = TGETENT_NO;
- sprintf(filename, "%.*s", PATH_MAX - 1, name);
+ _nc_SPRINTF(filename, _nc_SLIMIT(PATH_MAX)
+ "%.*s", PATH_MAX - 1, name);
+
if (strlen(name) == 0
|| strcmp(name, ".") == 0
|| strcmp(name, "..") == 0
|| _nc_pathlast(name) != 0
|| strchr(name, NCURSES_PATHSEP) != 0) {
- T(("illegal or missing entry name '%s'", name));
+ TR(TRACE_DATABASE, ("illegal or missing entry name '%s'", name));
} else {
-#if USE_DATABASE
- DBDIRS state = dbdTIC;
- int offset = 0;
+#if NCURSES_USE_DATABASE
+ DBDIRS state;
+ int offset;
const char *path;
+ _nc_first_db(&state, &offset);
while ((path = _nc_next_db(&state, &offset)) != 0) {
+ TR(TRACE_DATABASE, ("_nc_read_tic_entry path=%s, name=%s", path, name));
code = _nc_read_tic_entry(filename, PATH_MAX, path, name, tp);
if (code == TGETENT_YES) {
_nc_last_db();
break;
}
}
-#endif
-#if USE_TERMCAP
+#elif NCURSES_USE_TERMCAP
if (code != TGETENT_YES) {
code = _nc_read_termcap_entry(name, tp);
- sprintf(filename, "%.*s", PATH_MAX - 1, _nc_get_source());
+ _nc_SPRINTF(filename, _nc_SLIMIT(PATH_MAX)
+ "%.*s", PATH_MAX - 1, _nc_get_source());
}
#endif
}
diff --git a/ncurses/tinfo/read_termcap.c b/ncurses/tinfo/read_termcap.c
index b39a5be..6bfb23c 100644
--- a/ncurses/tinfo/read_termcap.c
+++ b/ncurses/tinfo/read_termcap.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2012,2013 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 *
@@ -54,10 +54,9 @@
#include <ctype.h>
#include <sys/types.h>
-#include <sys/stat.h>
#include <tic.h>
-MODULE_ID("$Id: read_termcap.c,v 1.74 2010/01/23 17:57:43 tom Exp $")
+MODULE_ID("$Id: read_termcap.c,v 1.89 2013/12/15 00:32:43 tom Exp $")
#if !PURE_TERMINFO
@@ -74,7 +73,7 @@ get_termpath(void)
if (!use_terminfo_vars() || (result = getenv("TERMPATH")) == 0)
result = TERMPATH;
- T(("TERMPATH is %s", result));
+ TR(TRACE_DATABASE, ("TERMPATH is %s", result));
return result;
}
@@ -162,7 +161,7 @@ _nc_cgetset(const char *ent)
return (-1);
}
gottoprec = 0;
- (void) strcpy(toprec, ent);
+ _nc_STRCPY(toprec, ent, topreclen);
return (0);
}
@@ -295,7 +294,7 @@ _nc_getent(
errno = ENOMEM;
return (TC_SYS_ERR);
}
- (void) strcpy(record, toprec);
+ _nc_STRCPY(record, toprec, topreclen + BFRAG);
rp = record + topreclen + 1;
r_end = rp + BFRAG;
current = in_array;
@@ -384,7 +383,14 @@ _nc_getent(
c = *bp++;
if (c == '\n') {
lineno++;
- if (rp == record || *(rp - 1) != '\\')
+ /*
+ * Unlike BSD 4.3, this ignores a backslash at the
+ * end of a comment-line. That makes it consistent
+ * with the rest of ncurses -TD
+ */
+ if (rp == record
+ || *record == '#'
+ || *(rp - 1) != '\\')
break;
}
*rp++ = c;
@@ -442,8 +448,10 @@ _nc_getent(
break;
}
- if (!foundit)
+ if (!foundit) {
+ free(record);
return (TC_NOT_FOUND);
+ }
}
/*
@@ -455,7 +463,7 @@ _nc_getent(
register int newilen;
unsigned ilen;
int diff, iret, tclen, oline;
- char *icap, *scan, *tc, *tcstart, *tcend;
+ char *icap = 0, *scan, *tc, *tcstart, *tcend;
/*
* Loop invariants:
@@ -468,8 +476,9 @@ _nc_getent(
scan = record;
tc_not_resolved = FALSE;
for (;;) {
- if ((tc = _nc_cgetcap(scan, "tc", '=')) == 0)
+ if ((tc = _nc_cgetcap(scan, "tc", '=')) == 0) {
break;
+ }
/*
* Find end of tc=name and stomp on the trailing `:'
@@ -486,6 +495,7 @@ _nc_getent(
tclen = 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. */
@@ -496,12 +506,13 @@ _nc_getent(
if (myfd)
(void) close(fd);
free(record);
+ FreeIfNeeded(icap);
return (iret);
}
- if (iret == TC_UNRESOLVED)
+ if (iret == TC_UNRESOLVED) {
tc_not_resolved = TRUE;
- /* couldn't resolve tc */
- if (iret == TC_NOT_FOUND) {
+ /* couldn't resolve tc */
+ } else if (iret == TC_NOT_FOUND) {
*(s - 1) = ':';
scan = s - 1;
tc_not_resolved = TRUE;
@@ -581,8 +592,9 @@ _nc_getent(
}
*cap = record;
- if (tc_not_resolved)
+ if (tc_not_resolved) {
return (TC_UNRESOLVED);
+ }
return (current);
}
@@ -697,8 +709,6 @@ _nc_nfcmp(const char *nf, char *rec)
#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 ':'.
@@ -760,7 +770,7 @@ copy_tc_token(char *dst, const char *src, size_t len)
dst = 0;
break;
}
- *dst++ = ch;
+ *dst++ = (char) ch;
}
return dst;
}
@@ -776,18 +786,16 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name)
register char *p;
register char *cp;
char *dummy = NULL;
- char **fname;
+ CGETENT_CONST 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 */
+ CGETENT_CONST char *pathvec[PVECSIZ]; /* point to names in pathbuf */
NCURSES_CONST char *termpath;
string_desc desc;
+ *lineno = 1;
fname = pathvec;
- pvec = pathvec;
- tbuf = bp;
p = pathbuf;
cp = use_terminfo_vars()? getenv("TERMCAP") : NULL;
@@ -812,10 +820,11 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name)
if ((home = getenv("HOME")) != 0 && *home != '\0'
&& strchr(home, ' ') == 0
&& strlen(home) < sizeof(temp) - 10) { /* setup path */
- sprintf(temp, "%s/", home); /* $HOME first */
+ _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp))
+ "%s/", home); /* $HOME first */
}
/* if no $HOME look in current directory */
- strcat(temp, ".termcap");
+ _nc_STRCAT(temp, ".termcap", sizeof(temp));
_nc_safe_strcat(&desc, temp);
_nc_safe_strcat(&desc, " ");
_nc_safe_strcat(&desc, get_termpath());
@@ -841,6 +850,9 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name)
}
}
*fname = 0; /* mark end of vector */
+#if !HAVE_BSD_CGETENT
+ (void) _nc_cgetset(0);
+#endif
if (_nc_is_abs_path(cp)) {
if (_nc_cgetset(cp) < 0) {
return (TC_SYS_ERR);
@@ -853,6 +865,7 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name)
* empty fields, and mistakenly use the last valid cap entry instead of
* the first (breaks tc= includes)
*/
+ *bp = '\0';
if (i >= 0) {
char *pd, *ps, *tok;
int endflag = FALSE;
@@ -874,7 +887,7 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name)
}
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;
@@ -932,7 +945,7 @@ add_tc(char *termpaths[], char *path, int count)
if (count < MAXPATHS
&& _nc_access(path, R_OK) == 0) {
termpaths[count++] = path;
- T(("Adding termpath %s", path));
+ TR(TRACE_DATABASE, ("Adding termpath %s", path));
}
termpaths[count] = 0;
if (save != 0)
@@ -956,13 +969,13 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
static char *source;
static int lineno;
- T(("read termcap entry for %s", tn));
+ TR(TRACE_DATABASE, ("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));
+ TR(TRACE_DATABASE, ("illegal or missing entry name '%s'", tn));
return TGETENT_NO;
}
@@ -980,7 +993,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
_nc_curr_line = lineno;
_nc_set_source(source);
}
- _nc_read_entry_source((FILE *) 0, tc, FALSE, FALSE, NULLHOOK);
+ _nc_read_entry_source((FILE *) 0, tc, FALSE, TRUE, NULLHOOK);
#else
/*
* Here is what the 4.4BSD termcap(3) page prescribes:
@@ -1027,7 +1040,9 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
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);
+ _nc_SPRINTF(tc_buf,
+ _nc_SLIMIT(sizeof(tc_buf))
+ "%.*s\n", (int) sizeof(tc_buf) - 2, tc);
normal = FALSE;
}
}
@@ -1049,8 +1064,9 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
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);
+ _nc_STRCPY(envhome, h, sizeof(envhome));
+ _nc_SPRINTF(pathbuf, _nc_SLIMIT(sizeof(pathbuf))
+ PRIVATE_CAP, envhome);
ADD_TC(pathbuf, filecount);
}
}
@@ -1063,7 +1079,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
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) {
+ || !S_ISREG(test_stat[j].st_mode)) {
omit = TRUE;
} else {
for (k = 0; k < j; k++) {
@@ -1075,7 +1091,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
}
}
if (omit) {
- T(("Path %s is a duplicate", termpaths[j]));
+ TR(TRACE_DATABASE, ("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];
@@ -1100,7 +1116,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
for (i = 0; i < filecount; i++) {
- T(("Looking for %s in %s", tn, termpaths[i]));
+ TR(TRACE_DATABASE, ("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]);
@@ -1138,8 +1154,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp)
* from the list.
*/
*tp = ep->tterm;
- _nc_delink_entry(_nc_head, &(ep->tterm));
- free(ep);
+ _nc_free_entry(_nc_head, &(ep->tterm));
/*
* OK, now try to write the type to user's terminfo directory.
diff --git a/ncurses/tinfo/setbuf.c b/ncurses/tinfo/setbuf.c
deleted file mode 100644
index a2e2660..0000000
--- a/ncurses/tinfo/setbuf.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/****************************************************************************
- * Copyright (c) 1998-2009,2010 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 *
- * and: Juergen Pfeifer 2008 *
- ****************************************************************************/
-
-/*
-** setbuf.c
-**
-** Support for set_term(), reset_shell_mode(), reset_prog_mode().
-**
-*/
-
-#include <curses.priv.h>
-
-MODULE_ID("$Id: setbuf.c,v 1.16 2010/08/28 21:08:31 tom Exp $")
-
-/*
- * If the output file descriptor is connected to a tty (the typical case) it
- * will probably be line-buffered. Keith Bostic pointed out that we don't want
- * this; it hoses people running over networks by forcing out a bunch of small
- * packets instead of one big one, so screen updates on ptys look jerky.
- * Restore block buffering to prevent this minor lossage.
- *
- * The buffer size is a compromise. Ideally we'd like a buffer that can hold
- * the maximum possible update size (the whole screen plus cup commands to
- * change lines as it's painted). On a 66-line xterm this can become
- * excessive. So we min it with the amount of data we think we can get through
- * two Ethernet packets (maximum packet size - 100 for TCP/IP overhead).
- *
- * Why two ethernet packets? It used to be one, on the theory that said
- * packets define the maximum size of atomic update. But that's less than the
- * 2000 chars on a 25 x 80 screen, and we don't want local updates to flicker
- * either. Two packet lengths will handle up to a 35 x 80 screen.
- *
- * The magic '6' is the estimated length of the end-of-line cup sequence to go
- * to the next line. It's generous. We used to mess with the buffering in
- * init_mvcur() after cost computation, but that lost the sequences emitted by
- * init_acs() in setupscreen().
- *
- * "The setvbuf function may be used only after the stream pointed to by stream
- * has been associated with an open file and before any other operation is
- * performed on the stream." (ISO 7.9.5.6.)
- *
- * Grrrr...
- *
- * On a lighter note, many implementations do in fact allow an application to
- * reset the buffering after it has been written to. We try to do this because
- * otherwise we leave stdout in buffered mode after endwin() is called. (This
- * also happens with SVr4 curses).
- *
- * There are pros/cons:
- *
- * con:
- * There is no guarantee that we can reestablish buffering once we've
- * dropped it.
- *
- * We _may_ lose data if the implementation does not coordinate this with
- * fflush.
- *
- * pro:
- * An implementation is more likely to refuse to change the buffering than
- * to do it in one of the ways mentioned above.
- *
- * The alternative is to have the application try to change buffering
- * itself, which is certainly no improvement.
- *
- * Just in case it does not work well on a particular system, the calls to
- * change buffering are all via the macro NC_BUFFERED. Some implementations
- * do indeed get confused by changing setbuf on/off, and will overrun the
- * buffer. So we disable this by default (there may yet be a workaround).
- */
-NCURSES_EXPORT(void)
-NCURSES_SP_NAME(_nc_set_buffer) (NCURSES_SP_DCLx FILE *ofp, bool buffered)
-{
- int Cols;
- int Lines;
-
- if (0 == SP_PARM)
- return;
-
- Cols = *(ptrCols(SP_PARM));
- Lines = *(ptrLines(SP_PARM));
-
- /* optional optimization hack -- do before any output to ofp */
-#if HAVE_SETVBUF || HAVE_SETBUFFER
- if (SP_PARM->_buffered != buffered) {
- unsigned buf_len;
- char *buf_ptr;
-
- if (getenv("NCURSES_NO_SETBUF") != 0)
- return;
-
- fflush(ofp);
-#ifdef __DJGPP__
- setmode(ofp, O_BINARY);
-#endif
- if (buffered != 0) {
- buf_len = (unsigned) min(Lines * (Cols + 6), 2800);
- if ((buf_ptr = SP_PARM->_setbuf) == 0) {
- if ((buf_ptr = typeMalloc(char, buf_len)) == NULL)
- return;
- SP_PARM->_setbuf = buf_ptr;
- /* Don't try to free this! */
- }
-#if !USE_SETBUF_0
- else
- return;
-#endif
- } else {
-#if !USE_SETBUF_0
- return;
-#else
- buf_len = 0;
- buf_ptr = 0;
-#endif
- }
-
-#if HAVE_SETVBUF
-#ifdef SETVBUF_REVERSED /* pre-svr3? */
- (void) setvbuf(ofp, buf_ptr, buf_len, buf_len ? _IOFBF : _IOLBF);
-#else
- (void) setvbuf(ofp, buf_ptr, buf_len ? _IOFBF : _IOLBF, buf_len);
-#endif
-#elif HAVE_SETBUFFER
- (void) setbuffer(ofp, buf_ptr, (int) buf_len);
-#endif
-
- SP_PARM->_buffered = buffered;
- }
-#endif /* HAVE_SETVBUF || HAVE_SETBUFFER */
-}
-
-#if NCURSES_SP_FUNCS
-NCURSES_EXPORT(void)
-_nc_set_buffer(FILE *ofp, bool buffered)
-{
- NCURSES_SP_NAME(_nc_set_buffer) (CURRENT_SCREEN, ofp, buffered);
-}
-#endif
diff --git a/ncurses/tinfo/strings.c b/ncurses/tinfo/strings.c
index 78cd2ef..393d8e7 100644
--- a/ncurses/tinfo/strings.c
+++ b/ncurses/tinfo/strings.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 2000-2003,2007 Free Software Foundation, Inc. *
+ * Copyright (c) 2000-2007,2012 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 *
@@ -36,7 +36,7 @@
#include <curses.priv.h>
-MODULE_ID("$Id: strings.c,v 1.6 2007/08/11 17:12:17 tom Exp $")
+MODULE_ID("$Id: strings.c,v 1.8 2012/02/22 22:34:31 tom Exp $")
/****************************************************************************
* Useful string functions (especially for mvcur)
@@ -110,7 +110,7 @@ _nc_safe_strcat(string_desc * dst, const char *src)
if (len < dst->s_size) {
if (dst->s_tail != 0) {
- strcpy(dst->s_tail, src);
+ _nc_STRCPY(dst->s_tail, src, dst->s_size);
dst->s_tail += len;
}
dst->s_size -= len;
@@ -131,7 +131,7 @@ _nc_safe_strcpy(string_desc * dst, const char *src)
if (len < dst->s_size) {
if (dst->s_head != 0) {
- strcpy(dst->s_head, src);
+ _nc_STRCPY(dst->s_head, src, dst->s_size);
dst->s_tail = dst->s_head + len;
}
dst->s_size = dst->s_init - len;
diff --git a/ncurses/tinfo/tinfo_driver.c b/ncurses/tinfo/tinfo_driver.c
index 5b3b55a..a17accd 100644
--- a/ncurses/tinfo/tinfo_driver.c
+++ b/ncurses/tinfo/tinfo_driver.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 2008-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 2008-2013,2014 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 *
@@ -50,7 +50,7 @@
# endif
#endif
-MODULE_ID("$Id: tinfo_driver.c,v 1.13 2010/12/20 01:47:09 tom Exp $")
+MODULE_ID("$Id: tinfo_driver.c,v 1.39 2014/09/27 21:58:57 tom Exp $")
/*
* SCO defines TIOCGSIZE and the corresponding struct. Other systems (SunOS,
@@ -93,7 +93,7 @@ NCURSES_EXPORT_VAR(int) COLORS = 0;
#define TCBMAGIC NCDRV_MAGIC(NCDRV_TINFO)
#define AssertTCB() assert(TCB!=0 && TCB->magic==TCBMAGIC)
-#define SetSP() assert(TCB->csp!=0); sp = TCB->csp
+#define SetSP() assert(TCB->csp!=0); sp = TCB->csp; (void) sp
/*
* This routine needs to do all the work to make curscr look
@@ -106,21 +106,12 @@ drv_doupdate(TERMINAL_CONTROL_BLOCK * TCB)
return TINFO_DOUPDATE(TCB->csp);
}
-#define ret_error(code, fmt, arg) if (errret) {\
- *errret = code;\
- return(FALSE); \
- } else {\
- fprintf(stderr, fmt, arg);\
- exit(EXIT_FAILURE);\
- }
-
-#define ret_error0(code, msg) if (errret) {\
- *errret = code;\
- return(FALSE);\
- } else {\
- fprintf(stderr, msg);\
- exit(EXIT_FAILURE);\
- }
+static const char *
+drv_Name(TERMINAL_CONTROL_BLOCK * TCB)
+{
+ (void) TCB;
+ return "tinfo";
+}
static bool
drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
@@ -130,12 +121,14 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
TERMINAL *termp;
SCREEN *sp;
+ T((T_CALLED("tinfo::drv_CanHandle(%p)"), TCB));
+
assert(TCB != 0 && tname != 0);
termp = (TERMINAL *) TCB;
sp = TCB->csp;
TCB->magic = TCBMAGIC;
-#if (USE_DATABASE || USE_TERMCAP)
+#if (NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP)
status = _nc_setup_tinfo(tname, &termp->type);
#else
status = TGETENT_NO;
@@ -156,12 +149,12 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
if (status == TGETENT_ERR) {
ret_error0(status, "terminals database is inaccessible\n");
} else if (status == TGETENT_NO) {
- ret_error(status, "'%s': unknown terminal type.\n", tname);
+ ret_error1(status, "unknown terminal type.\n", tname);
}
}
result = TRUE;
#if !USE_REENTRANT
- strncpy(ttytype, termp->type.term_names, NAMESIZE - 1);
+ strncpy(ttytype, termp->type.term_names, (size_t) NAMESIZE - 1);
ttytype[NAMESIZE - 1] = '\0';
#endif
@@ -169,17 +162,27 @@ drv_CanHandle(TERMINAL_CONTROL_BLOCK * TCB, const char *tname, int *errret)
_nc_tinfo_cmdch(termp, *command_character);
if (generic_type) {
- ret_error(TGETENT_NO, "'%s': I need something more specific.\n", tname);
+ /*
+ * BSD 4.3's termcap contains mis-typed "gn" for wy99. Do a sanity
+ * check before giving up.
+ */
+ if ((VALID_STRING(cursor_address)
+ || (VALID_STRING(cursor_down) && VALID_STRING(cursor_home)))
+ && VALID_STRING(clear_screen)) {
+ ret_error1(TGETENT_YES, "terminal is not really generic.\n", tname);
+ } else {
+ ret_error1(TGETENT_NO, "I need something more specific.\n", tname);
+ }
}
if (hard_copy) {
- ret_error(TGETENT_YES, "'%s': I can't handle hardcopy terminals.\n", tname);
+ ret_error1(TGETENT_YES, "I can't handle hardcopy terminals.\n", tname);
}
- return result;
+ returnBool(result);
}
static int
-drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, bool beepFlag)
+drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, int beepFlag)
{
SCREEN *sp;
int res = ERR;
@@ -190,22 +193,18 @@ drv_dobeepflash(TERMINAL_CONTROL_BLOCK * TCB, bool beepFlag)
/* FIXME: should make sure that we are not in altchar mode */
if (beepFlag) {
if (bell) {
- res = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "bell", bell);
+ res = NCURSES_PUTP2("bell", bell);
NCURSES_SP_NAME(_nc_flush) (sp);
} else if (flash_screen) {
- res = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx
- "flash_screen",
- flash_screen);
+ res = NCURSES_PUTP2("flash_screen", flash_screen);
NCURSES_SP_NAME(_nc_flush) (sp);
}
} else {
if (flash_screen) {
- res = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx
- "flash_screen",
- flash_screen);
+ res = NCURSES_PUTP2("flash_screen", flash_screen);
NCURSES_SP_NAME(_nc_flush) (sp);
} else if (bell) {
- res = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "bell", bell);
+ res = NCURSES_PUTP2("bell", bell);
NCURSES_SP_NAME(_nc_flush) (sp);
}
}
@@ -277,7 +276,7 @@ drv_defaultcolors(TERMINAL_CONTROL_BLOCK * TCB, int fg, int bg)
static void
drv_setcolor(TERMINAL_CONTROL_BLOCK * TCB,
- bool fore,
+ int fore,
int color,
NCURSES_SP_OUTC outc)
{
@@ -321,7 +320,7 @@ drv_rescol(TERMINAL_CONTROL_BLOCK * TCB)
SetSP();
if (orig_pair != 0) {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "orig_pair", orig_pair);
+ NCURSES_PUTP2("orig_pair", orig_pair);
result = TRUE;
}
return result;
@@ -337,7 +336,7 @@ drv_rescolors(TERMINAL_CONTROL_BLOCK * TCB)
SetSP();
if (orig_colors != 0) {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "orig_colors", orig_colors);
+ NCURSES_PUTP2("orig_colors", orig_colors);
result = TRUE;
}
return result;
@@ -348,14 +347,18 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp)
{
SCREEN *sp;
bool useEnv = TRUE;
+ bool useTioctl = TRUE;
AssertTCB();
sp = TCB->csp; /* can be null here */
if (sp) {
useEnv = sp->_use_env;
- } else
+ useTioctl = sp->_use_tioctl;
+ } else {
useEnv = _nc_prescreen.use_env;
+ useTioctl = _nc_prescreen.use_tioctl;
+ }
/* figure out the size of the screen */
T(("screen size: terminfo lines = %d columns = %d", lines, columns));
@@ -363,7 +366,7 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp)
*linep = (int) lines;
*colp = (int) columns;
- if (useEnv) {
+ if (useEnv || useTioctl) {
int value;
#ifdef __EMX__
@@ -371,7 +374,9 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp)
int screendata[2];
_scrsize(screendata);
*colp = screendata[0];
- *linep = screendata[1];
+ *linep = ((sp != 0 && sp->_filtered)
+ ? 1
+ : screendata[1]);
T(("EMX screen size: environment LINES = %d COLUMNS = %d",
*linep, *colp));
}
@@ -380,7 +385,7 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp)
/* try asking the OS */
{
TERMINAL *termp = (TERMINAL *) TCB;
- if (isatty(termp->Filedes)) {
+ if (NC_ISATTY(termp->Filedes)) {
STRUCT_WINSIZE size;
errno = 0;
@@ -400,19 +405,33 @@ drv_size(TERMINAL_CONTROL_BLOCK * TCB, int *linep, int *colp)
}
#endif /* HAVE_SIZECHANGE */
- /*
- * Finally, look for environment variables.
- *
- * Solaris lets users override either dimension with an environment
- * variable.
- */
- if ((value = _nc_getenv_num("LINES")) > 0) {
- *linep = value;
- T(("screen size: environment LINES = %d", *linep));
- }
- if ((value = _nc_getenv_num("COLUMNS")) > 0) {
- *colp = value;
- T(("screen size: environment COLUMNS = %d", *colp));
+ if (useEnv) {
+ if (useTioctl) {
+ /*
+ * If environment variables are used, update them.
+ */
+ if ((sp == 0 || !sp->_filtered) && _nc_getenv_num("LINES") > 0) {
+ _nc_setenv_num("LINES", *linep);
+ }
+ if (_nc_getenv_num("COLUMNS") > 0) {
+ _nc_setenv_num("COLUMNS", *colp);
+ }
+ }
+
+ /*
+ * Finally, look for environment variables.
+ *
+ * Solaris lets users override either dimension with an environment
+ * variable.
+ */
+ if ((value = _nc_getenv_num("LINES")) > 0) {
+ *linep = value;
+ T(("screen size: environment LINES = %d", *linep));
+ }
+ if ((value = _nc_getenv_num("COLUMNS")) > 0) {
+ *colp = value;
+ T(("screen size: environment COLUMNS = %d", *colp));
+ }
}
/* if we can't get dynamic info about the size, use static */
@@ -463,7 +482,7 @@ drv_setsize(TERMINAL_CONTROL_BLOCK * TCB, int l, int c)
}
static int
-drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, bool setFlag, TTY * buf)
+drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, int setFlag, TTY * buf)
{
SCREEN *sp = TCB->csp;
TERMINAL *_term = (TERMINAL *) TCB;
@@ -497,7 +516,7 @@ drv_sgmode(TERMINAL_CONTROL_BLOCK * TCB, bool setFlag, TTY * buf)
}
static int
-drv_mode(TERMINAL_CONTROL_BLOCK * TCB, bool progFlag, bool defFlag)
+drv_mode(TERMINAL_CONTROL_BLOCK * TCB, int progFlag, int defFlag)
{
SCREEN *sp;
TERMINAL *_term = (TERMINAL *) TCB;
@@ -527,7 +546,6 @@ drv_mode(TERMINAL_CONTROL_BLOCK * TCB, bool progFlag, bool defFlag)
if (sp) {
if (sp->_keypad_on)
_nc_keypad(sp, TRUE);
- NC_BUFFERED(sp, TRUE);
}
code = OK;
}
@@ -553,7 +571,6 @@ drv_mode(TERMINAL_CONTROL_BLOCK * TCB, bool progFlag, bool defFlag)
if (sp) {
_nc_keypad(sp, FALSE);
NCURSES_SP_NAME(_nc_flush) (sp);
- NC_BUFFERED(sp, FALSE);
}
code = drv_sgmode(TCB, TRUE, &(_term->Ottyb));
}
@@ -620,15 +637,13 @@ drv_screen_init(SCREEN *sp)
static void
drv_init(TERMINAL_CONTROL_BLOCK * TCB)
{
- SCREEN *sp;
TERMINAL *trm;
AssertTCB();
trm = (TERMINAL *) TCB;
- sp = TCB->csp;
- TCB->info.initcolor = initialize_color;
+ TCB->info.initcolor = VALID_STRING(initialize_color);
TCB->info.canchange = can_change;
TCB->info.hascolor = ((VALID_NUMERIC(max_colors) && VALID_NUMERIC(max_pairs)
&& (((set_foreground != NULL)
@@ -656,8 +671,8 @@ drv_init(TERMINAL_CONTROL_BLOCK * TCB)
* _nc_setupscreen(). Do it now anyway, so we can initialize the
* baudrate.
*/
- if (isatty(trm->Filedes)) {
- TCB->drv->mode(TCB, TRUE, TRUE);
+ if (NC_ISATTY(trm->Filedes)) {
+ TCB->drv->td_mode(TCB, TRUE, TRUE);
}
}
@@ -665,7 +680,7 @@ drv_init(TERMINAL_CONTROL_BLOCK * TCB)
#define InPalette(n) ((n) >= 0 && (n) < MAX_PALETTE)
static void
-drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, short pair, short f, short b)
+drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, int pair, int f, int b)
{
SCREEN *sp;
@@ -681,12 +696,11 @@ drv_initpair(TERMINAL_CONTROL_BLOCK * TCB, short pair, short f, short b)
tp[f].red, tp[f].green, tp[f].blue,
tp[b].red, tp[b].green, tp[b].blue));
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx
- "initialize_pair",
- TPARM_7(initialize_pair,
- pair,
- tp[f].red, tp[f].green, tp[f].blue,
- tp[b].red, tp[b].green, tp[b].blue));
+ NCURSES_PUTP2("initialize_pair",
+ TPARM_7(initialize_pair,
+ pair,
+ tp[f].red, tp[f].green, tp[f].blue,
+ tp[b].red, tp[b].green, tp[b].blue));
}
}
@@ -712,23 +726,22 @@ default_bg(SCREEN *sp)
static void
drv_initcolor(TERMINAL_CONTROL_BLOCK * TCB,
- short color, short r, short g, short b)
+ int color, int r, int g, int b)
{
SCREEN *sp = TCB->csp;
AssertTCB();
if (initialize_color != NULL) {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx
- "initialize_color",
- TPARM_4(initialize_color, color, r, g, b));
+ NCURSES_PUTP2("initialize_color",
+ TPARM_4(initialize_color, color, r, g, b));
}
}
static void
drv_do_color(TERMINAL_CONTROL_BLOCK * TCB,
- short old_pair,
- short pair,
- bool reverse,
+ int old_pair,
+ int pair,
+ int reverse,
NCURSES_SP_OUTC outc)
{
SCREEN *sp = TCB->csp;
@@ -759,7 +772,7 @@ drv_do_color(TERMINAL_CONTROL_BLOCK * TCB,
if (old_pair >= 0
&& sp != 0
&& NCURSES_SP_NAME(pair_content) (NCURSES_SP_ARGx
- old_pair,
+ (short) old_pair,
&old_fg,
&old_bg) !=ERR) {
if ((isDefaultColor(fg) && !isDefaultColor(old_fg))
@@ -845,7 +858,9 @@ drv_initmouse(TERMINAL_CONTROL_BLOCK * TCB)
}
static int
-drv_testmouse(TERMINAL_CONTROL_BLOCK * TCB, int delay)
+drv_testmouse(TERMINAL_CONTROL_BLOCK * TCB,
+ int delay
+ EVENTLIST_2nd(_nc_eventlist * evl))
{
int rc = 0;
SCREEN *sp;
@@ -860,11 +875,11 @@ drv_testmouse(TERMINAL_CONTROL_BLOCK * TCB, int delay)
} else
#endif
{
- rc = TCBOf(sp)->drv->twait(TCBOf(sp),
- TWAIT_MASK,
- delay,
- (int *) 0
- EVENTLIST_2nd(evl));
+ rc = TCBOf(sp)->drv->td_twait(TCBOf(sp),
+ TWAIT_MASK,
+ delay,
+ (int *) 0
+ EVENTLIST_2nd(evl));
#if USE_SYSMOUSE
if ((sp->_mouse_type == M_SYSMOUSE)
&& (sp->_sysmouse_head < sp->_sysmouse_tail)
@@ -882,7 +897,7 @@ drv_mvcur(TERMINAL_CONTROL_BLOCK * TCB, int yold, int xold, int ynew, int xnew)
{
SCREEN *sp = TCB->csp;
AssertTCB();
- return TINFO_MVCUR(sp, yold, xold, ynew, xnew);
+ return NCURSES_SP_NAME(_nc_mvcur) (sp, yold, xold, ynew, xnew);
}
static void
@@ -892,22 +907,21 @@ drv_hwlabel(TERMINAL_CONTROL_BLOCK * TCB, int labnum, char *text)
AssertTCB();
if (labnum > 0 && labnum <= num_labels) {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx
- "plab_norm",
- TPARM_2(plab_norm, labnum, text));
+ NCURSES_PUTP2("plab_norm",
+ TPARM_2(plab_norm, labnum, text));
}
}
static void
-drv_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, bool OnFlag)
+drv_hwlabelOnOff(TERMINAL_CONTROL_BLOCK * TCB, int OnFlag)
{
SCREEN *sp = TCB->csp;
AssertTCB();
if (OnFlag) {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "label_on", label_on);
+ NCURSES_PUTP2("label_on", label_on);
} else {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "label_off", label_off);
+ NCURSES_PUTP2("label_off", label_off);
}
}
@@ -948,6 +962,11 @@ drv_conattr(TERMINAL_CONTROL_BLOCK * TCB)
if (sp && sp->_coloron)
attrs |= A_COLOR;
+#if USE_ITALIC
+ if (enter_italics_mode)
+ attrs |= A_ITALIC;
+#endif
+
return (attrs);
}
@@ -972,7 +991,7 @@ drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map)
AssertTCB();
assert(sp != 0);
if (ena_acs != NULL) {
- NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx "ena_acs", ena_acs);
+ NCURSES_PUTP2("ena_acs", ena_acs);
}
#if NCURSES_EXT_FUNCS
/*
@@ -991,7 +1010,7 @@ drv_initacs(TERMINAL_CONTROL_BLOCK * TCB, chtype *real_map, chtype *fake_map)
size_t i;
for (i = 1; i < ACS_LEN; ++i) {
if (real_map[i] == 0) {
- real_map[i] = i;
+ real_map[i] = (chtype) i;
if (real_map != fake_map) {
if (sp != 0)
sp->_screen_acs_map[i] = TRUE;
@@ -1074,16 +1093,7 @@ _nc_cookie_init(SCREEN *sp)
if (magic_cookie_glitch > 0) { /* tvi, wyse */
- sp->_xmc_triggers = sp->_ok_attributes & (
- A_STANDOUT |
- A_UNDERLINE |
- A_REVERSE |
- A_BLINK |
- A_DIM |
- A_BOLD |
- A_INVIS |
- A_PROTECT
- );
+ sp->_xmc_triggers = sp->_ok_attributes & XMC_CONFLICT;
#if 0
/*
* We "should" treat colors as an attribute. The wyse350 (and its
@@ -1176,7 +1186,7 @@ drv_read(TERMINAL_CONTROL_BLOCK * TCB, int *buf)
if ((pthread_self) && (pthread_kill) && (pthread_equal))
_nc_globals.read_thread = pthread_self();
# endif
- n = read(sp->_ifd, &c2, 1);
+ n = read(sp->_ifd, &c2, (size_t) 1);
#if USE_PTHREADS_EINTR
_nc_globals.read_thread = 0;
#endif
@@ -1209,7 +1219,7 @@ __nc_putp(SCREEN *sp, const char *name GCC_UNUSED, const char *value)
int rc = ERR;
if (value) {
- rc = NCURSES_SP_NAME(_nc_putp) (NCURSES_SP_ARGx name, value);
+ rc = NCURSES_PUTP2(name, value);
}
return rc;
}
@@ -1225,7 +1235,7 @@ __nc_putp_flush(SCREEN *sp, const char *name, const char *value)
}
static int
-drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, bool flag)
+drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, int flag)
{
int ret = ERR;
SCREEN *sp;
@@ -1251,7 +1261,7 @@ drv_kpad(TERMINAL_CONTROL_BLOCK * TCB, bool flag)
}
static int
-drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, bool flag)
+drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, int flag)
{
SCREEN *sp;
int code = ERR;
@@ -1264,7 +1274,8 @@ drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, bool flag)
if (c >= 0) {
unsigned ch = (unsigned) c;
if (flag) {
- while ((s = _nc_expand_try(sp->_key_ok, ch, &count, 0)) != 0
+ while ((s = _nc_expand_try(sp->_key_ok,
+ ch, &count, (size_t) 0)) != 0
&& _nc_remove_key(&(sp->_key_ok), ch)) {
code = _nc_add_to_try(&(sp->_keytry), s, ch);
free(s);
@@ -1273,7 +1284,8 @@ drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, bool flag)
break;
}
} else {
- while ((s = _nc_expand_try(sp->_keytry, ch, &count, 0)) != 0
+ while ((s = _nc_expand_try(sp->_keytry,
+ ch, &count, (size_t) 0)) != 0
&& _nc_remove_key(&(sp->_keytry), ch)) {
code = _nc_add_to_try(&(sp->_key_ok), s, ch);
free(s);
@@ -1286,6 +1298,35 @@ drv_keyok(TERMINAL_CONTROL_BLOCK * TCB, int c, bool flag)
return (code);
}
+static int
+drv_cursorSet(TERMINAL_CONTROL_BLOCK * TCB, int vis)
+{
+ SCREEN *sp;
+ int code = ERR;
+
+ AssertTCB();
+ SetSP();
+
+ T((T_CALLED("tinfo:drv_cursorSet(%p,%d)"), (void *) SP_PARM, vis));
+
+ if (SP_PARM != 0 && IsTermInfo(SP_PARM)) {
+ switch (vis) {
+ case 2:
+ code = NCURSES_PUTP2_FLUSH("cursor_visible", cursor_visible);
+ break;
+ case 1:
+ code = NCURSES_PUTP2_FLUSH("cursor_normal", cursor_normal);
+ break;
+ case 0:
+ code = NCURSES_PUTP2_FLUSH("cursor_invisible", cursor_invisible);
+ break;
+ }
+ } else {
+ code = ERR;
+ }
+ returnCode(code);
+}
+
static bool
drv_kyExist(TERMINAL_CONTROL_BLOCK * TCB, int key)
{
@@ -1300,6 +1341,7 @@ drv_kyExist(TERMINAL_CONTROL_BLOCK * TCB, int key)
NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_TINFO_DRIVER = {
TRUE,
+ drv_Name, /* Name */
drv_CanHandle, /* CanHandle */
drv_init, /* init */
drv_release, /* release */
@@ -1333,5 +1375,6 @@ NCURSES_EXPORT_VAR (TERM_DRIVER) _nc_TINFO_DRIVER = {
drv_nap, /* nap */
drv_kpad, /* kpad */
drv_keyok, /* kyOk */
- drv_kyExist /* kyExist */
+ drv_kyExist, /* kyExist */
+ drv_cursorSet /* cursorSet */
};
diff --git a/ncurses/tinfo/trim_sgr0.c b/ncurses/tinfo/trim_sgr0.c
index 1f99208..ec5e2b7 100644
--- a/ncurses/tinfo/trim_sgr0.c
+++ b/ncurses/tinfo/trim_sgr0.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 2005-2007,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 2005-2010,2012 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 *
@@ -36,7 +36,7 @@
#include <tic.h>
-MODULE_ID("$Id: trim_sgr0.c,v 1.12 2010/12/25 23:03:57 tom Exp $")
+MODULE_ID("$Id: trim_sgr0.c,v 1.15 2012/12/15 20:57:17 tom Exp $")
#undef CUR
#define CUR tp->
@@ -48,21 +48,28 @@ MODULE_ID("$Id: trim_sgr0.c,v 1.12 2010/12/25 23:03:57 tom Exp $")
static char *
set_attribute_9(TERMTYPE *tp, int flag)
{
- const char *result;
+ const char *value;
+ char *result;
- if ((result = tparm(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, flag)) == 0)
- result = "";
- return strdup(result);
+ value = tparm(set_attributes, 0, 0, 0, 0, 0, 0, 0, 0, flag);
+ if (PRESENT(value))
+ result = strdup(value);
+ else
+ result = 0;
+ return result;
}
static int
is_csi(const char *s)
{
- if (UChar(s[0]) == CSI)
- return 1;
- else if (s[0] == ESC && s[1] == L_BRACK)
- return 2;
- return 0;
+ int result = 0;
+ if (s != 0) {
+ if (UChar(s[0]) == CSI)
+ result = 1;
+ else if (s[0] == ESC && s[1] == L_BRACK)
+ result = 2;
+ }
+ return result;
}
static char *
@@ -97,7 +104,7 @@ skip_delay(const char *s)
static bool
rewrite_sgr(char *s, char *attr)
{
- if (PRESENT(s)) {
+ if (s != 0) {
if (PRESENT(attr)) {
size_t len_s = strlen(s);
size_t len_a = strlen(attr);
@@ -108,7 +115,7 @@ rewrite_sgr(char *s, char *attr)
for (n = 0; n < len_s - len_a; ++n) {
s[n] = s[n + len_a];
}
- strcpy(s + n, attr);
+ _nc_STRCPY(s + n, attr, strlen(s) + 1);
TR(TRACE_DATABASE, ("to:\n\t%s", s));
}
}
@@ -121,33 +128,35 @@ static bool
similar_sgr(char *a, char *b)
{
bool result = FALSE;
- int csi_a = is_csi(a);
- int csi_b = is_csi(b);
- size_t len_a;
- size_t len_b;
+ if (a != 0 && b != 0) {
+ int csi_a = is_csi(a);
+ int csi_b = is_csi(b);
+ size_t len_a;
+ size_t len_b;
- TR(TRACE_DATABASE, ("similar_sgr:\n\t%s\n\t%s",
- _nc_visbuf2(1, a),
- _nc_visbuf2(2, b)));
- if (csi_a != 0 && csi_b != 0 && csi_a == csi_b) {
- a += csi_a;
- b += csi_b;
- if (*a != *b) {
- a = skip_zero(a);
- b = skip_zero(b);
+ TR(TRACE_DATABASE, ("similar_sgr:\n\t%s\n\t%s",
+ _nc_visbuf2(1, a),
+ _nc_visbuf2(2, b)));
+ if (csi_a != 0 && csi_b != 0 && csi_a == csi_b) {
+ a += csi_a;
+ b += csi_b;
+ if (*a != *b) {
+ a = skip_zero(a);
+ b = skip_zero(b);
+ }
}
+ len_a = strlen(a);
+ len_b = strlen(b);
+ if (len_a && len_b) {
+ if (len_a > len_b)
+ result = (strncmp(a, b, len_b) == 0);
+ else
+ result = (strncmp(a, b, len_a) == 0);
+ }
+ TR(TRACE_DATABASE, ("...similar_sgr: %d\n\t%s\n\t%s", result,
+ _nc_visbuf2(1, a),
+ _nc_visbuf2(2, b)));
}
- len_a = strlen(a);
- len_b = strlen(b);
- if (len_a && len_b) {
- if (len_a > len_b)
- result = (strncmp(a, b, len_b) == 0);
- else
- result = (strncmp(a, b, len_a) == 0);
- }
- TR(TRACE_DATABASE, ("...similar_sgr: %d\n\t%s\n\t%s", result,
- _nc_visbuf2(1, a),
- _nc_visbuf2(2, b)));
return result;
}
diff --git a/ncurses/tinfo/write_entry.c b/ncurses/tinfo/write_entry.c
index a86c112..b2edd5d 100644
--- a/ncurses/tinfo/write_entry.c
+++ b/ncurses/tinfo/write_entry.c
@@ -1,5 +1,5 @@
/****************************************************************************
- * Copyright (c) 1998-2009,2010 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
@@ -39,21 +39,15 @@
#include <curses.priv.h>
#include <hashed_db.h>
-#include <sys/stat.h>
-
#include <tic.h>
-#ifndef S_ISDIR
-#define S_ISDIR(mode) ((mode & S_IFMT) == S_IFDIR)
-#endif
-
#if 1
#define TRACE_OUT(p) DEBUG(2, p)
#else
#define TRACE_OUT(p) /*nothing */
#endif
-MODULE_ID("$Id: write_entry.c,v 1.78 2010/12/25 23:23:08 tom Exp $")
+MODULE_ID("$Id: write_entry.c,v 1.92 2014/11/01 14:47:00 tom Exp $")
static int total_written;
@@ -76,7 +70,7 @@ write_file(char *filename, TERMTYPE *tp)
DEBUG(1, ("Created %s", filename));
if (write_object(tp, buffer, &offset, limit) == ERR
- || fwrite(buffer, sizeof(char), offset, fp) != offset) {
+ || fwrite(buffer, sizeof(char), (size_t) offset, fp) != offset) {
_nc_syserr_abort("error writing %s/%s", _nc_tic_dir(0), filename);
}
@@ -99,13 +93,13 @@ check_writeable(int code)
char dir[sizeof(LEAF_FMT)];
char *s = 0;
- if (code == 0 || (s = strchr(dirnames, code)) == 0)
+ if (code == 0 || (s = (strchr) (dirnames, code)) == 0)
_nc_err_abort("Illegal terminfo subdirectory \"" LEAF_FMT "\"", code);
if (verified[s - dirnames])
return;
- sprintf(dir, LEAF_FMT, code);
+ _nc_SPRINTF(dir, _nc_SLIMIT(sizeof(dir)) LEAF_FMT, code);
if (make_db_root(dir) < 0) {
_nc_err_abort("%s/%s: permission denied", _nc_tic_dir(0), dir);
}
@@ -115,36 +109,35 @@ check_writeable(int code)
#endif /* !USE_HASHED_DB */
static int
-make_db_path(char *dst, const char *src, unsigned limit)
+make_db_path(char *dst, const char *src, size_t limit)
{
int rc = -1;
const char *top = _nc_tic_dir(0);
if (src == top || _nc_is_abs_path(src)) {
if (strlen(src) + 1 <= limit) {
- (void) strcpy(dst, src);
+ _nc_STRCPY(dst, src, limit);
rc = 0;
}
} else {
if (strlen(top) + strlen(src) + 2 <= limit) {
- (void) sprintf(dst, "%s/%s", top, src);
+ _nc_SPRINTF(dst, _nc_SLIMIT(limit) "%s/%s", top, src);
rc = 0;
}
}
#if USE_HASHED_DB
if (rc == 0) {
- if (_nc_is_dir_path(dst)) {
- rc = -1;
- } else {
- static const char suffix[] = DBM_SUFFIX;
- unsigned have = strlen(dst);
- unsigned need = strlen(suffix);
- if (have > need && strcmp(dst + have - need, suffix)) {
- if (have + need <= limit)
- strcat(dst, suffix);
- else
- rc = -1;
+ static const char suffix[] = DBM_SUFFIX;
+ size_t have = strlen(dst);
+ size_t need = strlen(suffix);
+ if (have > need && strcmp(dst + (int) (have - need), suffix)) {
+ if (have + need <= limit) {
+ _nc_STRCAT(dst, suffix, limit);
+ } else {
+ rc = -1;
}
+ } else if (_nc_is_dir_path(dst)) {
+ rc = -1;
}
}
#endif
@@ -164,10 +157,11 @@ make_db_root(const char *path)
#if USE_HASHED_DB
DB *capdbp;
- if ((capdbp = _nc_db_open(fullpath, TRUE)) == NULL)
+ if ((capdbp = _nc_db_open(fullpath, TRUE)) == NULL) {
rc = -1;
- else if (_nc_db_close(capdbp) < 0)
+ } else if (_nc_db_close(capdbp) < 0) {
rc = -1;
+ }
#else
struct stat statbuf;
@@ -191,13 +185,16 @@ make_db_root(const char *path)
* Set the write directory for compiled entries.
*/
NCURSES_EXPORT(void)
-_nc_set_writedir(char *dir)
+_nc_set_writedir(const char *dir)
{
const char *destination;
char actual[PATH_MAX];
if (dir == 0
- && use_terminfo_vars())
+#ifndef USE_ROOT_ENVIRON
+ && use_terminfo_vars()
+#endif
+ )
dir = getenv("TERMINFO");
if (dir != 0)
@@ -279,16 +276,21 @@ _nc_write_entry(TERMTYPE *const tp)
char name_list[MAX_TERMINFO_LENGTH];
char *first_name, *other_names;
char *ptr;
+ char *term_names = tp->term_names;
+ size_t name_size = strlen(term_names);
- assert(strlen(tp->term_names) != 0);
- assert(strlen(tp->term_names) < sizeof(name_list));
+ if (name_size == 0) {
+ _nc_syserr_abort("no terminal name found.");
+ } else if (name_size >= sizeof(name_list) - 1) {
+ _nc_syserr_abort("terminal name too long: %s", term_names);
+ }
- (void) strcpy(name_list, tp->term_names);
+ _nc_STRCPY(name_list, term_names, sizeof(name_list));
DEBUG(7, ("Name list = '%s'", name_list));
first_name = name_list;
- ptr = &name_list[strlen(name_list) - 1];
+ ptr = &name_list[name_size - 1];
other_names = ptr + 1;
while (ptr > name_list && *ptr != '|')
@@ -322,8 +324,8 @@ _nc_write_entry(TERMTYPE *const tp)
buffer[0] = 0;
memset(&key, 0, sizeof(key));
- key.data = tp->term_names;
- key.size = strlen(tp->term_names);
+ key.data = term_names;
+ key.size = name_size;
memset(&data, 0, sizeof(data));
data.data = buffer;
@@ -336,8 +338,10 @@ _nc_write_entry(TERMTYPE *const tp)
key.data = name_list;
key.size = strlen(name_list);
- strcpy(buffer + 1, tp->term_names);
- data.size = strlen(tp->term_names) + 1;
+ _nc_STRCPY(buffer + 1,
+ term_names,
+ sizeof(buffer) - 1);
+ data.size = name_size + 1;
_nc_db_put(capdb, &key, &data);
@@ -355,7 +359,6 @@ _nc_write_entry(TERMTYPE *const tp)
_nc_db_put(capdb, &key, &data);
}
- _nc_db_close(capdb);
}
}
#else /* !USE_HASHED_DB */
@@ -366,7 +369,8 @@ _nc_write_entry(TERMTYPE *const tp)
if (strlen(first_name) >= sizeof(filename) - (2 + LEAF_LEN))
_nc_warning("terminal name too long.");
- sprintf(filename, LEAF_FMT "/%s", first_name[0], first_name);
+ _nc_SPRINTF(filename, _nc_SLIMIT(sizeof(filename))
+ LEAF_FMT "/%s", first_name[0], first_name);
/*
* Has this primary name been written since the first call to
@@ -376,7 +380,22 @@ _nc_write_entry(TERMTYPE *const tp)
if (start_time > 0 &&
stat(filename, &statbuf) >= 0
&& statbuf.st_mtime >= start_time) {
+#if HAVE_LINK && !USE_SYMLINKS
+ /*
+ * If the file has more than one link, the reason for the previous
+ * write could be that the current primary name used to be an alias for
+ * the previous entry. In that case, unlink the file so that we will
+ * not modify the previous entry as we write this one.
+ */
+ if (statbuf.st_nlink > 1) {
+ _nc_warning("name redefined.");
+ unlink(filename);
+ } else {
+ _nc_warning("name multiply defined.");
+ }
+#else
_nc_warning("name multiply defined.");
+#endif
}
check_writeable(first_name[0]);
@@ -407,7 +426,8 @@ _nc_write_entry(TERMTYPE *const tp)
}
check_writeable(ptr[0]);
- sprintf(linkname, LEAF_FMT "/%s", ptr[0], ptr);
+ _nc_SPRINTF(linkname, _nc_SLIMIT(sizeof(linkname))
+ LEAF_FMT "/%s", ptr[0], ptr);
if (strcmp(filename, linkname) == 0) {
_nc_warning("self-synonym ignored");
@@ -422,7 +442,7 @@ _nc_write_entry(TERMTYPE *const tp)
if (first_name[0] == linkname[0])
strncpy(symlinkname, first_name, sizeof(symlinkname) - 1);
else {
- strcpy(symlinkname, "../");
+ _nc_STRCPY(symlinkname, "../", sizeof(suymlinkname));
strncat(symlinkname, filename, sizeof(symlinkname) - 4);
}
symlinkname[sizeof(symlinkname) - 1] = '\0';
@@ -491,7 +511,7 @@ fake_write(char *dst,
return (want / size);
}
-#define Write(buf, size, count) fake_write(buffer, offset, limit, (char *) buf, count, size)
+#define Write(buf, size, count) fake_write(buffer, offset, (size_t) limit, (char *) buf, (size_t) count, (size_t) size)
#undef LITTLE_ENDIAN /* BSD/OS defines this as a feature macro */
#define HI(x) ((x) / 256)
@@ -706,7 +726,7 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit)
return (ERR);
nextfree = compute_offsets(tp->Strings + STRCOUNT,
- tp->ext_Strings,
+ (size_t) tp->ext_Strings,
offsets);
TRACE_OUT(("after extended string capabilities, nextfree=%d", nextfree));
@@ -714,7 +734,7 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit)
return (ERR);
nextfree += compute_offsets(tp->ext_Names,
- extcnt,
+ (size_t) extcnt,
offsets + tp->ext_Strings);
TRACE_OUT(("after extended capnames, nextfree=%d", nextfree));
strmax = tp->ext_Strings + extcnt;
@@ -742,7 +762,7 @@ write_object(TERMTYPE *tp, char *buffer, unsigned *offset, unsigned limit)
TRACE_OUT(("WRITE %d numbers @%d", tp->ext_Numbers, *offset));
if (tp->ext_Numbers) {
- convert_shorts(buf, tp->Numbers + NUMCOUNT, tp->ext_Numbers);
+ convert_shorts(buf, tp->Numbers + NUMCOUNT, (size_t) tp->ext_Numbers);
if (Write(buf, 2, tp->ext_Numbers) != tp->ext_Numbers)
return (ERR);
}