ncurses 5.9 - patch 20120204
authorThomas E. Dickey <dickey@invisible-island.net>
Sun, 5 Feb 2012 01:59:13 +0000 (01:59 +0000)
committerThomas E. Dickey <dickey@invisible-island.net>
Sun, 5 Feb 2012 01:59:13 +0000 (01:59 +0000)
+ improved tic -D option, avoid making target directory and provide
  better diagnostics.

NEWS
dist.mk
man/tic.1m
progs/tic.c
test/movewindow.c

diff --git a/NEWS b/NEWS
index 810327f232876f376e8218394af28e47b42ba5b1..4518a4c46e6692a023943c137bf36c4181e03185 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -25,7 +25,7 @@
 -- sale, use or other dealings in this Software without prior written        --
 -- authorization.                                                            --
 -------------------------------------------------------------------------------
--- $Id: NEWS,v 1.1853 2012/01/29 01:47:05 tom Exp $
+-- $Id: NEWS,v 1.1854 2012/02/04 22:25:57 tom Exp $
 -------------------------------------------------------------------------------
 
 This is a log of changes that ncurses has gone through since Zeyd started
@@ -45,6 +45,10 @@ See the AUTHORS file for the corresponding full names.
 Changes through 1.9.9e did not credit all contributions;
 it is not possible to add this information.
 
+20120204
+       + improved tic -D option, avoid making target directory and provide
+         better diagnostics.
+
 20120128
        + add mach-gnu (Debian #614316, patch by Samuel Thibault)
        + add mach-gnu-color, tweaks to mach-gnu terminfo -TD
@@ -58,7 +62,7 @@ it is not possible to add this information.
        + amend fix intended to separate fixups for acsc to allow "tic -cv" to
          give verbose warnings (cf:  20110730). 
        + modify misc/gen-edit.sh to make the location of the tabset directory
-         consistent with misc/Makefile.in, i.., using ${datadir}/tabset
+         consistent with misc/Makefile.in, i.e., using ${datadir}/tabset
          (Debian #653435, patch by Sven Joachim).
 
 20120121
diff --git a/dist.mk b/dist.mk
index 5fcec1b555b5529b4799fc904f7e9b8ad2e2ccb1..a4bc0b5435e02a9e65f7ef4289a1da401b7cb861 100644 (file)
--- a/dist.mk
+++ b/dist.mk
@@ -25,7 +25,7 @@
 # use or other dealings in this Software without prior written               #
 # authorization.                                                             #
 ##############################################################################
-# $Id: dist.mk,v 1.855 2012/01/28 15:26:26 tom Exp $
+# $Id: dist.mk,v 1.856 2012/02/04 16:54:39 tom Exp $
 # Makefile for creating ncurses distributions.
 #
 # This only needs to be used directly as a makefile by developers, but
@@ -37,7 +37,7 @@ SHELL = /bin/sh
 # These define the major/minor/patch versions of ncurses.
 NCURSES_MAJOR = 5
 NCURSES_MINOR = 9
-NCURSES_PATCH = 20120128
+NCURSES_PATCH = 20120204
 
 # We don't append the patch to the version, since this only applies to releases
 VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
index 57c9b8a182ee174d3f0743d3a0b8e0188c308ad9..580abf40ee9b4885c4ff88fa63bd076208512a6c 100644 (file)
@@ -1,5 +1,5 @@
 .\"***************************************************************************
-.\" Copyright (c) 1998-2010,2011 Free Software Foundation, Inc.              *
+.\" Copyright (c) 1998-2011,2012 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            *
@@ -26,7 +26,7 @@
 .\" authorization.                                                           *
 .\"***************************************************************************
 .\"
-.\" $Id: tic.1m,v 1.53 2011/12/17 23:13:19 tom Exp $
+.\" $Id: tic.1m,v 1.54 2012/02/04 23:09:43 tom Exp $
 .TH @TIC@ 1M ""
 .ds n 5
 .ds d @TERMINFO@
@@ -74,7 +74,8 @@ the library routines in \fBncurses\fR(3X).
 .PP
 As described in \fBterm\fR(\*n), the database may be either a directory
 tree (one file per terminal entry) or a hashed database (one record per entry).
-The \fB@TIC@\fR writes only one type of entry, depending on how it was built:
+The \fB@TIC@\fR command writes only one type of entry,
+depending on how it was built:
 .bP
 For directory trees, the top-level directory, e.g., /usr/share/terminfo,
 specifies the location of the database.
@@ -87,14 +88,20 @@ then that is used.
 The default name for the hashed database is the same as the
 default directory name (only adding a ".db" suffix).
 .PP
+In either case (directory or hashed database),
+\fB@TIC@\fP will create the container if it does not exist.
+For a directory, this would be the "terminfo" leaf,
+versus a "terminfo.db" file.
+.PP
 The results are normally placed in the system terminfo database \fB\*d\fR.
-The compiled terminal description can be placed in a different terminfo database.
+The compiled terminal description can be placed
+in a different terminfo database.
 There are two ways to achieve this:
 .bP
-First, you may override the system default by setting the variable
-\fBTERMINFO\fR in your shell environment to a valid database
-location, e.g., an existing directory (for directory trees) or
-valid location for a hashed database.
+First, you may override the system default either by
+using the \fB\-o\fP option,
+or by setting the variable \fBTERMINFO\fR
+in your shell environment to a valid database location.
 .bP
 Secondly, if \fB@TIC@\fR cannot write in \fI\*d\fR
 or the location specified using your TERMINFO variable,
@@ -103,9 +110,15 @@ it looks for the directory \fI$HOME/.terminfo\fR
 if that location exists, the entry is placed there.
 .PP
 Libraries that read terminfo entries are expected to check for
+.bP
 a location specified with the TERMINFO variable first,
-look at \fI$HOME/.terminfo\fR if TERMINFO is not set, and
-finally look in \fI\*d\fR.
+.bP
+look in \fI$HOME/.terminfo\fR if TERMINFO is not set, next
+.bP
+directories listed in the TERMINFO_DIRS symbol, and
+.bP
+finally look in the system terminfo database (\fI\*d\fR).
+.SS OPTIONS
 .TP
 \fB\-0\fR
 restricts the output to a single line
@@ -265,6 +278,7 @@ it will infer its type (boolean, number or string) from the syntax and
 make an extended table entry for that.
 User-defined capability strings
 whose name begins with ``k'' are treated as function keys.
+.SS PARAMETERS
 .TP
 \fIfile\fR
 contains one or more \fBterminfo\fR terminal descriptions in source
@@ -296,6 +310,7 @@ List of tokens encountered by scanner
 All values computed in construction of the hash table
 .LP
 If the debug level \fIn\fR is not given, it is taken to be one.
+.SS PROCESSING
 .PP
 All but one of the capabilities recognized by \fB@TIC@\fR are documented
 in \fBterminfo\fR(\*n).
@@ -318,9 +333,6 @@ capabilities in \fIentry\fR_\fIname\fR_\fI2\fR must also appear in
 \fBentry_name_1\fR before \fBuse=\fR for these capabilities to be
 canceled in \fBentry_name_1\fR.
 .PP
-If the environment variable \fBTERMINFO\fR is set, the compiled
-results are placed there instead of \fB\*d\fR.
-.PP
 Total compiled entries cannot exceed 4096 bytes.
 The name field cannot
 exceed 512 bytes.
index 04ab3e528aba3ea7f971d08ceaa2eaf8e47092be..aa38840e7d9030a82f55070f5f7534b4b0be8c28 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
- * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc.              *
+ * Copyright (c) 1998-2011,2012 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 <sys/stat.h>
 
 #include <dump_entry.h>
+#include <hashed_db.h>
 #include <transform.h>
 
-MODULE_ID("$Id: tic.c,v 1.157 2011/12/31 21:11:59 tom Exp $")
+MODULE_ID("$Id: tic.c,v 1.160 2012/02/05 01:39:39 tom Exp $")
 
 const char *_nc_progname = "tic";
 
@@ -476,25 +477,107 @@ open_tempfile(char *name)
     return result;
 }
 
+static const char *
+valid_db_path(const char *nominal)
+{
+    struct stat sb;
+#if USE_HASHED_DB
+    char suffix[] = DBM_SUFFIX;
+    size_t need = strlen(nominal) + sizeof(suffix);
+    char *result = malloc(need);
+
+    strcpy(result, nominal);
+    if (strcmp(result + need - sizeof(suffix), suffix)) {
+       strcat(result, suffix);
+    }
+#else
+    char *result = strdup(nominal);
+#endif
+
+    DEBUG(1, ("** stat(%s)", result));
+    if (stat(result, &sb) >= 0) {
+#if USE_HASHED_DB
+       if (!S_ISREG(sb.st_mode)
+           || access(result, R_OK | W_OK) != 0) {
+           DEBUG(1, ("...not a writable file"));
+           free(result);
+           result = 0;
+       }
+#else
+       if (!S_ISDIR(sb.st_mode)
+           || access(result, R_OK | W_OK | X_OK) != 0) {
+           DEBUG(1, ("...not a writable directory"));
+           free(result);
+           result = 0;
+       }
+#endif
+    } else {
+       /* check if parent is directory and is writable */
+       unsigned leaf = _nc_pathlast(result);
+
+       DEBUG(1, ("...not found"));
+       if (leaf) {
+           char save = result[leaf];
+           result[leaf] = 0;
+           if (stat(result, &sb) >= 0
+               && S_ISDIR(sb.st_mode)
+               && access(result, R_OK | W_OK | X_OK) == 0) {
+               result[leaf] = save;
+           } else {
+               DEBUG(1, ("...parent directory %s is not writable", result));
+               free(result);
+               result = 0;
+           }
+       } else {
+           DEBUG(1, ("... no parent directory"));
+           free(result);
+           result = 0;
+       }
+    }
+    return result;
+}
+
 /*
- * Show the databases that tic knows about.  The location to which it writes is
- * always the first one.  If that is not writable, then tic errors out before
- * reaching this function.
+ * Show the databases to which tic could write.  The location to which it
+ * writes is always the first one.  If none are writable, print an error
+ * message.
  */
 static void
-show_databases(void)
+show_databases(const char *outdir)
 {
-    DBDIRS state;
-    int offset;
-    const char *path;
+    bool specific = (outdir != 0) || getenv("TERMINFO") != 0;
+    const char *result;
+    const char *tried = 0;
+
+    if (outdir == 0) {
+       outdir = _nc_tic_dir(0);
+    }
+    if ((result = valid_db_path(outdir)) != 0) {
+       printf("%s\n", result);
+    } else {
+       tried = outdir;
+    }
 
-    _nc_first_db(&state, &offset);
-    while ((path = _nc_next_db(&state, &offset)) != 0) {
-       printf("%s\n", path);
+    if ((outdir = _nc_home_terminfo())) {
+       if ((result = valid_db_path(outdir)) != 0) {
+           printf("%s\n", result);
+       } else if (!specific) {
+           tried = outdir;
+       }
+    }
+
+    /*
+     * If we can write in neither location, give an error message.
+     */
+    if (tried) {
+       fflush(stdout);
+       fprintf(stderr, "%s: %s (no permission)\n", _nc_progname, tried);
+       ExitProgram(EXIT_FAILURE);
     }
-    _nc_last_db();
 }
 
+#define VtoTrace(opt) (unsigned) ((opt > 0) ? opt : (opt == 0))
+
 int
 main(int argc, char *argv[])
 {
@@ -586,8 +669,9 @@ main(int argc, char *argv[])
            sortmode = S_TERMCAP;
            break;
        case 'D':
-           _nc_set_writedir(outdir);
-           show_databases();
+           debug_level = VtoTrace(v_opt);
+           set_trace_level(debug_level);
+           show_databases(outdir);
            ExitProgram(EXIT_SUCCESS);
            break;
        case 'I':
@@ -665,7 +749,7 @@ main(int argc, char *argv[])
        last_opt = this_opt;
     }
 
-    debug_level = (unsigned) ((v_opt > 0) ? v_opt : (v_opt == 0));
+    debug_level = VtoTrace(v_opt);
     set_trace_level(debug_level);
 
     if (_nc_tracing) {
@@ -685,7 +769,8 @@ main(int argc, char *argv[])
      */
     if (namelst && (!infodump && !capdump)) {
        (void) fprintf(stderr,
-                      "Sorry, -e can't be used without -I or -C\n");
+                      "%s: Sorry, -e can't be used without -I or -C\n",
+                      _nc_progname);
        cleanup(namelst);
        ExitProgram(EXIT_FAILURE);
     }
index 8fc0a716882b9e2b4a6ae2fcd7e3a70e1cff0015..7905a9356b7b493019874066edf1bf118e8363aa 100644 (file)
@@ -26,7 +26,7 @@
  * authorization.                                                           *
  ****************************************************************************/
 /*
- * $Id: movewindow.c,v 1.33 2012/01/15 00:30:35 tom Exp $
+ * $Id: movewindow.c,v 1.34 2012/02/05 01:16:47 tom Exp $
  *
  * Demonstrate move functions for windows and derived windows from the curses
  * library.
@@ -492,9 +492,6 @@ move_derwin(WINDOW *win)
                                     max_line, max_col,
                                     TRUE,
                                     &more)) != 0) {
-               int y0, x0;
-
-               getbegyx(parent, y0, x0);
                if (mvderwin(win, tmp->y, tmp->x) != ERR) {
                    refresh_all(win);
                    doupdate();