ncurses 5.9 - patch 20120324
authorThomas E. Dickey <dickey@invisible-island.net>
Sat, 24 Mar 2012 23:37:46 +0000 (23:37 +0000)
committerThomas E. Dickey <dickey@invisible-island.net>
Sat, 24 Mar 2012 23:37:46 +0000 (23:37 +0000)
+ amend an old fix so that next_char() exits properly for empty files,
  e.g., from reading /dev/null (cf: 20080804).
+ modify tic so that it can read from the standard input, or from
  a character device.  Because tic uses seek's, this requires writing
  the data to a temporary file first (prompted by remark by Sven
  Joachim) (cf: 20000923).

NEWS
dist.mk
man/tic.1m
ncurses/tinfo/comp_expand.c
ncurses/tinfo/comp_scan.c
ncurses/widechar/lib_cchar.c
progs/tic.c

diff --git a/NEWS b/NEWS
index b6c22d957417eddac6f322196f2937a3ca5b1f72..b5cd5836575cdd3a2fb7bbabc60a2915489803ed 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -25,7 +25,7 @@
 -- sale, use or other dealings in this Software without prior written        --
 -- authorization.                                                            --
 -------------------------------------------------------------------------------
 -- sale, use or other dealings in this Software without prior written        --
 -- authorization.                                                            --
 -------------------------------------------------------------------------------
--- $Id: NEWS,v 1.1880 2012/03/17 21:16:50 tom Exp $
+-- $Id: NEWS,v 1.1883 2012/03/24 22:27:20 tom Exp $
 -------------------------------------------------------------------------------
 
 This is a log of changes that ncurses has gone through since Zeyd started
 -------------------------------------------------------------------------------
 
 This is a log of changes that ncurses has gone through since Zeyd started
@@ -45,6 +45,14 @@ 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.
 
 Changes through 1.9.9e did not credit all contributions;
 it is not possible to add this information.
 
+20120324
+       + amend an old fix so that next_char() exits properly for empty files,
+         e.g., from reading /dev/null (cf: 20080804).
+       + modify tic so that it can read from the standard input, or from
+         a character device.  Because tic uses seek's, this requires writing
+         the data to a temporary file first (prompted by remark by Sven
+         Joachim) (cf: 20000923).
+
 20120317
        + correct a check made in lib_napms.c, so that terminfo applications
          can again use napms() (cf: 20110604).
 20120317
        + correct a check made in lib_napms.c, so that terminfo applications
          can again use napms() (cf: 20110604).
diff --git a/dist.mk b/dist.mk
index 28b4f00f74b2615416d84a4a412fde9dd69b130b..ffeae1b13297faf4d8aff17741764c434bd99c95 100644 (file)
--- a/dist.mk
+++ b/dist.mk
@@ -25,7 +25,7 @@
 # use or other dealings in this Software without prior written               #
 # authorization.                                                             #
 ##############################################################################
 # use or other dealings in this Software without prior written               #
 # authorization.                                                             #
 ##############################################################################
-# $Id: dist.mk,v 1.864 2012/03/17 13:40:53 tom Exp $
+# $Id: dist.mk,v 1.865 2012/03/24 18:16:44 tom Exp $
 # Makefile for creating ncurses distributions.
 #
 # This only needs to be used directly as a makefile by developers, but
 # 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
 # These define the major/minor/patch versions of ncurses.
 NCURSES_MAJOR = 5
 NCURSES_MINOR = 9
-NCURSES_PATCH = 20120317
+NCURSES_PATCH = 20120324
 
 # We don't append the patch to the version, since this only applies to releases
 VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
 
 # We don't append the patch to the version, since this only applies to releases
 VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
index 580abf40ee9b4885c4ff88fa63bd076208512a6c..95a4e13b73c0845c923f54c175f4874a22a728c3 100644 (file)
@@ -26,7 +26,7 @@
 .\" authorization.                                                           *
 .\"***************************************************************************
 .\"
 .\" authorization.                                                           *
 .\"***************************************************************************
 .\"
-.\" $Id: tic.1m,v 1.54 2012/02/04 23:09:43 tom Exp $
+.\" $Id: tic.1m,v 1.55 2012/03/24 21:21:05 tom Exp $
 .TH @TIC@ 1M ""
 .ds n 5
 .ds d @TERMINFO@
 .TH @TIC@ 1M ""
 .ds n 5
 .ds d @TERMINFO@
@@ -265,26 +265,7 @@ indicating the desired level of detail of information.
 If \fIn\fR is omitted, the default level is 1.
 If \fIn\fR is specified and greater than 1, the level of
 detail is increased.
 If \fIn\fR is omitted, the default level is 1.
 If \fIn\fR is specified and greater than 1, the level of
 detail is increased.
-.TP
-\fB\-w\fR\fIn\fR
-specifies the width of the output.
-The parameter is optional.
-If it is omitted, it defaults to 60.
-.TP
-\fB\-x\fR
-Treat unknown capabilities as user-defined.
-That is, if you supply a capability name which \fB@TIC@\fP does not recognize,
-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
-format [see \fBterminfo\fR(\*n)].
-Each description in the file
-describes the capabilities of a particular terminal.
+.RS
 .PP
 The debug flag levels are as follows:
 .TP
 .PP
 The debug flag levels are as follows:
 .TP
@@ -310,6 +291,30 @@ 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.
 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.
+.RE
+.TP
+\fB\-w\fR\fIn\fR
+specifies the width of the output.
+The parameter is optional.
+If it is omitted, it defaults to 60.
+.TP
+\fB\-x\fR
+Treat unknown capabilities as user-defined.
+That is, if you supply a capability name which \fB@TIC@\fP does not recognize,
+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
+format [see \fBterminfo\fR(\*n)].
+Each description in the file
+describes the capabilities of a particular terminal.
+.IP
+If \fIfile\fR is ``-'', then the data is read from the standard input.
+The \fIfile\fR parameter may also be the path of a character-device.
 .SS PROCESSING
 .PP
 All but one of the capabilities recognized by \fB@TIC@\fR are documented
 .SS PROCESSING
 .PP
 All but one of the capabilities recognized by \fB@TIC@\fR are documented
index 5841baa656f1fb1267845de6ea038a3350cb3316..2ab06ebabc89a14661ac7b08b0af88079a3b84f9 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            *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -35,7 +35,7 @@
 #include <ctype.h>
 #include <tic.h>
 
 #include <ctype.h>
 #include <tic.h>
 
-MODULE_ID("$Id: comp_expand.c,v 1.24 2012/02/22 22:40:24 tom Exp $")
+MODULE_ID("$Id: comp_expand.c,v 1.25 2012/03/24 18:37:17 tom Exp $")
 
 static int
 trailing_spaces(const char *src)
 
 static int
 trailing_spaces(const char *src)
index 459113bf1b972bdd6ebbe3770fd23219beeb8a53..a860c77ad81c0b7fe768b193b0205945a7f79824 100644 (file)
@@ -50,7 +50,7 @@
 #include <ctype.h>
 #include <tic.h>
 
 #include <ctype.h>
 #include <tic.h>
 
-MODULE_ID("$Id: comp_scan.c,v 1.96 2012/02/22 22:26:58 tom Exp $")
+MODULE_ID("$Id: comp_scan.c,v 1.97 2012/03/24 22:24:19 tom Exp $")
 
 /*
  * Maximum length of string capability we'll accept before raising an error.
 
 /*
  * Maximum length of string capability we'll accept before raising an error.
@@ -196,7 +196,8 @@ next_char(void)
                    result = typeRealloc(char, allocated, result);
                    if (result == 0)
                        return (EOF);
                    result = typeRealloc(char, allocated, result);
                    if (result == 0)
                        return (EOF);
-                   bufstart = result;
+                   if (bufstart)
+                       bufstart = result;
                }
                if (used == 0)
                    _nc_curr_file_pos = ftell(yyin);
                }
                if (used == 0)
                    _nc_curr_file_pos = ftell(yyin);
index 7fac5c505d489bc7d64f4cd45efeecd1fae57e72..679dd7171626eb8447c9acd98f1011c6b968a00e 100644 (file)
@@ -1,5 +1,5 @@
 /****************************************************************************
 /****************************************************************************
- * Copyright (c) 2001-2010,2011 Free Software Foundation, Inc.              *
+ * Copyright (c) 2001-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            *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
@@ -35,7 +35,7 @@
 
 #include <curses.priv.h>
 
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: lib_cchar.c,v 1.25 2012/03/10 20:52:21 tom Exp $")
+MODULE_ID("$Id: lib_cchar.c,v 1.26 2012/03/24 18:37:17 tom Exp $")
 
 /* 
  * The SuSv2 description leaves some room for interpretation.  We'll assume wch
 
 /* 
  * The SuSv2 description leaves some room for interpretation.  We'll assume wch
index 53fa7225a65285cc6979c3037b08499fa4daccd1..4881d655322b7e4674111430e854a253b4ada21e 100644 (file)
@@ -46,7 +46,9 @@
 #include <hashed_db.h>
 #include <transform.h>
 
 #include <hashed_db.h>
 #include <transform.h>
 
-MODULE_ID("$Id: tic.c,v 1.162 2012/02/22 23:59:45 tom Exp $")
+MODULE_ID("$Id: tic.c,v 1.165 2012/03/24 22:07:10 tom Exp $")
+
+#define STDIN_NAME "<stdin>"
 
 const char *_nc_progname = "tic";
 
 
 const char *_nc_progname = "tic";
 
@@ -365,19 +367,96 @@ stripped(char *src)
 }
 
 static FILE *
 }
 
 static FILE *
-open_input(const char *filename)
+open_tempfile(char *filename)
+{
+    FILE *result = 0;
+
+    _nc_STRCPY(filename, "/tmp/XXXXXX", PATH_MAX);
+#if HAVE_MKSTEMP
+    {
+       int fd = mkstemp(filename);
+       if (fd >= 0)
+           result = fdopen(fd, "w");
+    }
+#else
+    if (tmpnam(filename) != 0)
+       result = fopen(filename, "w");
+#endif
+    return result;
+}
+
+static FILE *
+copy_input(FILE *source, const char *filename, char *alt_file)
+{
+    FILE *result = 0;
+    FILE *target = open_tempfile(alt_file);
+    int ch;
+
+    if (source == 0) {
+       failed("copy_input (source)");
+    } else if (target == 0) {
+       failed("copy_input (target)");
+    } else {
+       clearerr(source);
+       for (;;) {
+           ch = fgetc(source);
+           if (feof(source)) {
+               break;
+           } else if (ferror(source)) {
+               failed(filename);
+           } else if (ch == 0) {
+               /* don't loop in case someone wants to convert /dev/zero */
+               fprintf(stderr, "%s: %s is not a text-file\n", _nc_progname, filename);
+               ExitProgram(EXIT_FAILURE);
+           }
+           fputc(ch, target);
+       }
+       fclose(source);
+       /*
+        * rewind() does not force the target file's data to disk (not does
+        * fflush()...).  So open a second stream on the data and then close
+        * the one that we were writing on before starting to read from the
+        * second stream.
+        */
+       result = fopen(alt_file, "r+");
+       fclose(target);
+       to_remove = alt_file;
+    }
+    return result;
+}
+
+static FILE *
+open_input(const char *filename, char *alt_file)
 {
 {
-    FILE *fp = fopen(filename, "r");
+    FILE *fp;
     struct stat sb;
     struct stat sb;
+    int mode;
 
 
-    if (fp == 0) {
-       fprintf(stderr, "%s: Can't open %s\n", _nc_progname, filename);
+    if (!strcmp(filename, "-")) {
+       fp = copy_input(stdin, STDIN_NAME, alt_file);
+    } else if (stat(filename, &sb) < 0) {
+       fprintf(stderr, "%s: %s %s\n", _nc_progname, filename, strerror(errno));
        ExitProgram(EXIT_FAILURE);
        ExitProgram(EXIT_FAILURE);
-    }
-    if (fstat(fileno(fp), &sb) < 0
-       || (sb.st_mode & S_IFMT) != S_IFREG) {
+    } else if ((mode = (sb.st_mode & S_IFMT)) == S_IFDIR
+              || (mode != S_IFREG && mode != S_IFCHR)) {
        fprintf(stderr, "%s: %s is not a file\n", _nc_progname, filename);
        ExitProgram(EXIT_FAILURE);
        fprintf(stderr, "%s: %s is not a file\n", _nc_progname, filename);
        ExitProgram(EXIT_FAILURE);
+    } else {
+       fp = fopen(filename, "r");
+
+       if (fp == 0) {
+           fprintf(stderr, "%s: Can't open %s\n", _nc_progname, filename);
+           ExitProgram(EXIT_FAILURE);
+       }
+       if (mode != S_IFREG) {
+           if (alt_file != 0) {
+               FILE *fp2 = copy_input(fp, filename, alt_file);
+               fp = fp2;
+           } else {
+               fprintf(stderr, "%s: %s is not a file\n", _nc_progname, filename);
+               ExitProgram(EXIT_FAILURE);
+           }
+       }
     }
     return fp;
 }
     }
     return fp;
 }
@@ -395,7 +474,7 @@ make_namelist(char *src)
     if (src == 0) {
        /* EMPTY */ ;
     } else if (strchr(src, '/') != 0) {                /* a filename */
     if (src == 0) {
        /* EMPTY */ ;
     } else if (strchr(src, '/') != 0) {                /* a filename */
-       FILE *fp = open_input(src);
+       FILE *fp = open_input(src, (char *) 0);
 
        for (pass = 1; pass <= 2; pass++) {
            nn = 0;
 
        for (pass = 1; pass <= 2; pass++) {
            nn = 0;
@@ -462,21 +541,6 @@ matches(char **needle, const char *haystack)
     return (code);
 }
 
     return (code);
 }
 
-static FILE *
-open_tempfile(char *name)
-{
-    FILE *result = 0;
-#if HAVE_MKSTEMP
-    int fd = mkstemp(name);
-    if (fd >= 0)
-       result = fdopen(fd, "w");
-#else
-    if (tmpnam(name) != 0)
-       result = fopen(name, "w");
-#endif
-    return result;
-}
-
 static const char *
 valid_db_path(const char *nominal)
 {
 static const char *
 valid_db_path(const char *nominal)
 {
@@ -582,6 +646,7 @@ int
 main(int argc, char *argv[])
 {
     char my_tmpname[PATH_MAX];
 main(int argc, char *argv[])
 {
     char my_tmpname[PATH_MAX];
+    char my_altfile[PATH_MAX];
     int v_opt = -1;
     unsigned debug_level;
     int smart_defaults = TRUE;
     int v_opt = -1;
     unsigned debug_level;
     int smart_defaults = TRUE;
@@ -796,14 +861,11 @@ main(int argc, char *argv[])
                    /* file exists */
                    source_file = termcap;
                } else {
                    /* file exists */
                    source_file = termcap;
                } else {
-                   _nc_STRCPY(my_tmpname,
-                              "/tmp/XXXXXX",
-                              sizeof(my_tmpname));
                    if ((tmp_fp = open_tempfile(my_tmpname)) != 0) {
                        source_file = my_tmpname;
                        fprintf(tmp_fp, "%s\n", termcap);
                        fclose(tmp_fp);
                    if ((tmp_fp = open_tempfile(my_tmpname)) != 0) {
                        source_file = my_tmpname;
                        fprintf(tmp_fp, "%s\n", termcap);
                        fclose(tmp_fp);
-                       tmp_fp = open_input(source_file);
+                       tmp_fp = open_input(source_file, (char *) 0);
                        to_remove = source_file;
                    } else {
                        failed("tmpnam");
                        to_remove = source_file;
                    } else {
                        failed("tmpnam");
@@ -822,19 +884,24 @@ main(int argc, char *argv[])
        }
     }
 
        }
     }
 
-    if (tmp_fp == 0)
-       tmp_fp = open_input(source_file);
+    if (tmp_fp == 0) {
+       tmp_fp = open_input(source_file, my_altfile);
+       if (!strcmp(source_file, "-")) {
+           source_file = STDIN_NAME;
+       }
+    }
 
 
-    if (infodump)
+    if (infodump) {
        dump_init(tversion,
                  smart_defaults
                  ? outform
                  : F_LITERAL,
                  sortmode, width, height, debug_level, formatted);
        dump_init(tversion,
                  smart_defaults
                  ? outform
                  : F_LITERAL,
                  sortmode, width, height, debug_level, formatted);
-    else if (capdump)
+    } else if (capdump) {
        dump_init(tversion,
                  outform,
                  sortmode, width, height, debug_level, FALSE);
        dump_init(tversion,
                  outform,
                  sortmode, width, height, debug_level, FALSE);
+    }
 
     /* parse entries out of the source file */
     _nc_set_source(source_file);
 
     /* parse entries out of the source file */
     _nc_set_source(source_file);