/****************************************************************************
- * Copyright (c) 1998-2011,2012 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 <hashed_db.h>
#include <transform.h>
-MODULE_ID("$Id: tic.c,v 1.178 2012/10/27 19:57:21 tom Exp $")
+MODULE_ID("$Id: tic.c,v 1.188 2013/08/24 21:48:21 tom Exp $")
#define STDIN_NAME "<stdin>"
static void
cleanup(void)
{
+ int rc;
+
#if NO_LEAKS
free_namelist(namelst);
#endif
fclose(tmp_fp);
if (to_remove != 0) {
#if HAVE_REMOVE
- remove(to_remove);
+ rc = remove(to_remove);
#else
- unlink(to_remove);
+ rc = unlink(to_remove);
#endif
+ if (rc != 0)
+ perror(to_remove);
}
}
_nc_STRCPY(filename, "/tmp/XXXXXX", PATH_MAX);
#if HAVE_MKSTEMP
{
+ int oldmask = (int) umask(077);
int fd = mkstemp(filename);
if (fd >= 0)
result = fdopen(fd, "w");
+ umask((mode_t) oldmask);
}
#else
if (tmpnam(filename) != 0)
static FILE *
copy_input(FILE *source, const char *filename, char *alt_file)
{
+ char my_altfile[PATH_MAX];
FILE *result = 0;
- FILE *target = open_tempfile(alt_file);
+ FILE *target = 0;
int ch;
+ if (alt_file == 0)
+ alt_file = my_altfile;
+
if (source == 0) {
failed("copy_input (source)");
- } else if (target == 0) {
+ } else if ((target = open_tempfile(alt_file)) == 0) {
failed("copy_input (target)");
} else {
clearerr(source);
*/
result = fopen(alt_file, "r+");
fclose(target);
- to_remove = alt_file;
+ to_remove = strdup(alt_file);
}
return result;
}
return (code);
}
-static const char *
+static char *
valid_db_path(const char *nominal)
{
struct stat sb;
show_databases(const char *outdir)
{
bool specific = (outdir != 0) || getenv("TERMINFO") != 0;
- const char *result;
+ char *result;
const char *tried = 0;
if (outdir == 0) {
}
if ((result = valid_db_path(outdir)) != 0) {
printf("%s\n", result);
+ free(result);
} else {
tried = outdir;
}
if ((outdir = _nc_home_terminfo())) {
if ((result = valid_db_path(outdir)) != 0) {
printf("%s\n", result);
+ free(result);
} else if (!specific) {
tried = outdir;
}
}
#define EXPECTED(name) if (!PRESENT(name)) _nc_warning("expected " #name)
+#define UNEXPECTED(name) if (PRESENT(name)) _nc_warning("unexpected " #name ", for %s", why)
+
+static void
+check_noaddress(TERMTYPE *tp, const char *why)
+{
+ UNEXPECTED(column_address);
+ UNEXPECTED(cursor_address);
+ UNEXPECTED(cursor_home);
+ UNEXPECTED(cursor_mem_address);
+ UNEXPECTED(cursor_to_ll);
+ UNEXPECTED(row_address);
+ UNEXPECTED(row_address);
+}
static void
check_cursor(TERMTYPE *tp)
int count;
char *list[4];
+ if (hard_copy) {
+ check_noaddress(tp, "hard_copy");
+ } else if (generic_type) {
+ check_noaddress(tp, "generic_type");
+ } else if (strchr(tp->term_names, '+') == 0) {
+ int y = 0;
+ int x = 0;
+ if (PRESENT(column_address))
+ ++y;
+ if (PRESENT(cursor_address))
+ y = x = 10;
+ if (PRESENT(cursor_home))
+ ++y, ++x;
+ if (PRESENT(cursor_mem_address))
+ y = x = 10;
+ if (PRESENT(cursor_to_ll))
+ ++y, ++x;
+ if (PRESENT(row_address))
+ ++x;
+ if (PRESENT(cursor_down))
+ ++y;
+ if (PRESENT(cursor_up))
+ ++y;
+ if (PRESENT(cursor_left))
+ ++x;
+ if (PRESENT(cursor_right))
+ ++x;
+ if (x < 2 && y < 2) {
+ _nc_warning("terminal lacks cursor addressing");
+ } else {
+ if (x < 2)
+ _nc_warning("terminal lacks cursor column-addressing");
+ if (y < 2)
+ _nc_warning("terminal lacks cursor row-addressing");
+ }
+ }
+
/* it is rare to have an insert-line feature without a matching delete */
ANDMISSING(parm_insert_line, insert_line);
ANDMISSING(parm_delete_line, delete_line);
/*
* These warnings are useful for consistency checks - it is possible that
- * there are real terminals with mismatches in these
+ * there are real terminals with mismatches in these
*/
ANDMISSING(key_ic, key_dc);
}
static void
check_screen(TERMTYPE *tp)
{
+#if NCURSES_XNAMES
if (_nc_user_definable) {
int have_XT = tigetflag("XT");
int have_XM = tigetflag("XM");
_nc_warning("Expected XT to be set, given kmous");
}
}
+#endif
}
/*