ncurses 5.9 - patch 20111217
[ncurses.git] / ncurses / tinfo / db_iterator.c
index f7e4d6064bf30f020e79cee27fc1a3a1bf6324d5..0cf687644b4216b339789073a6f816a028362c37 100644 (file)
 #include <hashed_db.h>
 #endif
 
-MODULE_ID("$Id: db_iterator.c,v 1.18 2011/09/26 09:52:00 tom Exp $")
+MODULE_ID("$Id: db_iterator.c,v 1.25 2011/12/17 21:30:20 tom Exp $")
 
 #define HaveTicDirectory _nc_globals.have_tic_directory
 #define KeepTicDirectory _nc_globals.keep_tic_directory
 #define TicDirectory     _nc_globals.tic_directory
-
-/*
- * FIXME: need a no-leaks entrypoint.
- */
-static char *my_blob;          /* string-heap for my_list[] */
-static char **my_list;         /* distinct places to look for data */
-static int my_size;            /* length of my_list[] */
-static time_t my_time;         /* cache last updated */
-static struct {
-    const char *name;
-    char *value;
-} my_vars[dbdLAST];
+#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)
@@ -155,7 +148,7 @@ cache_expired(void)
        result = TRUE;
     } else {
        DBDIRS n;
-       for (n = 0; n < dbdLAST; ++n) {
+       for (n = (DBDIRS) 0; n < dbdLAST; ++n) {
            if (my_vars[n].name != 0
                && update_getenv(my_vars[n].name, n)) {
                result = TRUE;
@@ -191,7 +184,7 @@ _nc_tic_dir(const char *path)
                return _nc_tic_dir(envp);
        }
     }
-    return TicDirectory;
+    return TicDirectory ? TicDirectory : TERMINFO;
 }
 
 /*
@@ -290,6 +283,11 @@ _nc_first_db(DBDIRS * state, int *offset)
 #endif
 #if 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;
+           }
            values[dbdEnvList2] = cache_getenv("TERMPATH", dbdEnvList2);
 #endif /* USE_TERMCAP */
        }
@@ -333,11 +331,11 @@ _nc_first_db(DBDIRS * state, int *offset)
                for (j = 0; my_list[j] != 0; ++j) {
 #ifdef TERMINFO
                    if (*my_list[j] == '\0')
-                       my_list[j] = TERMINFO;
+                       my_list[j] = strdup(TERMINFO);
 #endif
                    for (k = 0; k < j; ++k) {
                        if (!strcmp(my_list[j], my_list[k])) {
-                           k = --j;
+                           k = j - 1;
                            while ((my_list[j] = my_list[j + 1]) != 0) {
                                ++j;
                            }
@@ -377,6 +375,18 @@ _nc_first_db(DBDIRS * state, int *offset)
            } else {
                FreeAndNull(my_blob);
            }
+           free(my_stat);
        }
     }
 }
+
+#if NO_LEAKS
+void
+_nc_db_iterator_leaks(void)
+{
+    if (my_blob != 0)
+       FreeAndNull(my_blob);
+    if (my_list != 0)
+       FreeAndNull(my_list);
+}
+#endif