X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Fdb_iterator.c;h=17f160631df79e4c07f5fab8f853bd7023ee2bcf;hp=19f22c31634e787eea8f50a5766a8d3494c31423;hb=5eb177874dea59107a1a2ea44f5d8f5bb99550b2;hpb=76a479337308b4b5e749fa8c38b7b7f482998c5b diff --git a/ncurses/tinfo/db_iterator.c b/ncurses/tinfo/db_iterator.c index 19f22c31..17f16063 100644 --- a/ncurses/tinfo/db_iterator.c +++ b/ncurses/tinfo/db_iterator.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2006-2014,2016 Free Software Foundation, Inc. * + * Copyright (c) 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 * @@ -43,7 +43,7 @@ #include #endif -MODULE_ID("$Id: db_iterator.c,v 1.40 2016/05/28 23:22:52 tom Exp $") +MODULE_ID("$Id: db_iterator.c,v 1.44 2017/02/04 23:27:01 tom Exp $") #define HaveTicDirectory _nc_globals.have_tic_directory #define KeepTicDirectory _nc_globals.keep_tic_directory @@ -72,15 +72,18 @@ 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))) { + if (quick_prefix(name)) { + result = TRUE; + } else if (stat(name, sb) == 0 + && (S_ISDIR(sb->st_mode) + || (S_ISREG(sb->st_mode) && sb->st_size))) { 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)) { + if (stat(temp, sb) == 0 && S_ISREG(sb->st_mode) && sb->st_size) { result = TRUE; } } @@ -88,6 +91,27 @@ check_existence(const char *name, struct stat *sb) return result; } +/* + * Trim newlines (and backslashes preceding those) and tab characters to + * help simplify scripting of the quick-dump feature. Leave spaces and + * other backslashes alone. + */ +static void +trim_formatting(char *source) +{ + char *target = source; + char ch; + + while ((ch = *source++) != '\0') { + if (ch == '\\' && *source == '\n') + continue; + if (ch == '\n' || ch == '\t') + continue; + *target++ = ch; + } + *target = '\0'; +} + /* * Store the latest value of an environment variable in my_vars[] so we can * detect if one changes, invalidating the cached search-list. @@ -251,7 +275,7 @@ _nc_first_db(DBDIRS * state, int *offset) *state = dbdTIC; *offset = 0; - T(("_nc_first_db")); + T((T_CALLED("_nc_first_db"))); /* build a blob containing all of the strings we will use for a lookup * table. @@ -333,7 +357,9 @@ _nc_first_db(DBDIRS * state, int *offset) int k = 0; my_list[k++] = my_blob; for (j = 0; my_blob[j] != '\0'; ++j) { - if (my_blob[j] == NCURSES_PATHSEP) { + if (my_blob[j] == NCURSES_PATHSEP + && ((&my_blob[j] - my_list[k - 1]) != 3 + || !quick_prefix(my_list[k - 1]))) { my_blob[j] = '\0'; my_list[k++] = &my_blob[j + 1]; } @@ -347,8 +373,10 @@ _nc_first_db(DBDIRS * state, int *offset) if (*my_list[j] == '\0') my_list[j] = strdup(TERMINFO); #endif + trim_formatting(my_list[j]); for (k = 0; k < j; ++k) { if (!strcmp(my_list[j], my_list[k])) { + T(("duplicate %s", my_list[j])); k = j - 1; while ((my_list[j] = my_list[j + 1]) != 0) { ++j; @@ -377,6 +405,7 @@ _nc_first_db(DBDIRS * state, int *offset) } #endif if (!found) { + T(("not found %s", my_list[j])); k = j; while ((my_list[k] = my_list[k + 1]) != 0) { ++k; @@ -392,6 +421,7 @@ _nc_first_db(DBDIRS * state, int *offset) free(my_stat); } } + returnVoid; } #if NO_LEAKS