/****************************************************************************
- * Copyright (c) 1998-2010,2011 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 *
#include <tic.h>
-MODULE_ID("$Id: read_entry.c,v 1.116 2011/09/27 00:35:20 tom Exp $")
+MODULE_ID("$Id: read_entry.c,v 1.125 2013/08/17 19:06:59 tom Exp $")
#define TYPE_CALLOC(type,elts) typeCalloc(type, (unsigned)(elts))
-#if USE_DATABASE
+#if NCURSES_USE_DATABASE
static void
convert_shorts(char *buf, short *Numbers, int count)
{
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;
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)
+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;
+}
+
/*
* Return TGETENT_YES if read, TGETENT_NO 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;
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);
}
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);
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
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,
}
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))
return (TGETENT_NO);
}
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 (test < limit) {
if (size >= lens
&& !strcmp(path + size - lens, suffix))
- (void) strcpy(filename, path);
+ _nc_STRCPY(filename, path, limit);
else
- (void) sprintf(filename, "%s%s", path, suffix);
+ _nc_SPRINTF(filename, _nc_SLIMIT(limit) "%s%s", path, suffix);
result = TRUE;
}
return result;
{
bool result = FALSE;
-#if USE_TERMCAP
+#if NCURSES_USE_TERMCAP
if (_nc_is_dir_path(path))
#endif
{
unsigned need = (unsigned) (LEAF_LEN + 3 + strlen(path) + strlen(name));
if (need <= limit) {
- (void) sprintf(filename, "%s/" LEAF_FMT "/%s", path, *name, name);
+ _nc_SPRINTF(filename, _nc_SLIMIT(limit)
+ "%s/" LEAF_FMT "/%s", path, *name, name);
result = TRUE;
}
}
if (make_dir_filename(filename, limit, path, name)) {
code = _nc_read_file_entry(filename, tp);
}
-#if USE_TERMCAP
+#if NCURSES_USE_TERMCAP
else 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
return code;
}
-#endif /* USE_DATABASE */
+#endif /* NCURSES_USE_DATABASE */
/*
* _nc_read_entry(char *name, char *filename, TERMTYPE *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
|| strchr(name, NCURSES_PATHSEP) != 0) {
TR(TRACE_DATABASE, ("illegal or missing entry name '%s'", name));
} else {
-#if USE_DATABASE
+#if NCURSES_USE_DATABASE
DBDIRS state;
int offset;
const char *path;
break;
}
}
-#elif 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
}