/****************************************************************************
- * Copyright (c) 2006-2016,2017 Free Software Foundation, Inc. *
+ * Copyright 2018-2022,2023 Thomas E. Dickey *
+ * Copyright 2006-2016,2017 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>
#endif
-MODULE_ID("$Id: db_iterator.c,v 1.44 2017/02/04 23:27:01 tom Exp $")
+MODULE_ID("$Id: db_iterator.c,v 1.50 2023/06/24 21:52:32 tom Exp $")
#define HaveTicDirectory _nc_globals.have_tic_directory
#define KeepTicDirectory _nc_globals.keep_tic_directory
if (which < dbdLAST) {
char *value;
+ char *cached_value = my_vars[which].value;
+ bool same_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)) {
+ if ((value = getenv(name)) != 0) {
+ value = strdup(value);
+ }
+ same_value = ((value == 0 && cached_value == 0) ||
+ (value != 0 &&
+ cached_value != 0 &&
+ strcmp(value, cached_value) == 0));
+
+ /* Set variable name to enable checks in cache_expired(). */
+ my_vars[which].name = name;
+
+ if (!same_value) {
FreeIfNeeded(my_vars[which].value);
my_vars[which].value = value;
result = TRUE;
return result;
}
+#if NCURSES_USE_DATABASE || NCURSES_USE_TERMCAP
static char *
cache_getenv(const char *name, DBDIRS which)
{
}
return result;
}
+#endif
/*
* The cache expires if at least a second has passed since the initial lookup,
FreeAndNull(my_list);
}
+static void
+update_tic_dir(const char *update)
+{
+ free((char *) TicDirectory);
+ TicDirectory = update;
+}
+
/*
* Record the "official" location of the terminfo directory, according to
* the place where we're writing to, or the normal default, if not.
{
T(("_nc_tic_dir %s", NonNull(path)));
if (!KeepTicDirectory) {
- if (path != 0) {
- TicDirectory = path;
+ if (path != NULL) {
+ if (path != TicDirectory)
+ update_tic_dir(strdup(path));
HaveTicDirectory = TRUE;
} else if (HaveTicDirectory == 0) {
if (use_terminfo_vars()) {
*/
for (j = 0; my_list[j] != 0; ++j) {
#ifdef TERMINFO
- if (*my_list[j] == '\0')
- my_list[j] = strdup(TERMINFO);
+ if (*my_list[j] == '\0') {
+ char *my_copy = strdup(TERMINFO);
+ if (my_copy != 0)
+ my_list[j] = my_copy;
+ }
#endif
trim_formatting(my_list[j]);
for (k = 0; k < j; ++k) {
FreeIfNeeded(my_vars[which].value);
my_vars[which].value = 0;
}
+ update_tic_dir(NULL);
}
#endif