ncurses 5.7 - patch 20081122
authorThomas E. Dickey <dickey@invisible-island.net>
Sun, 23 Nov 2008 01:33:11 +0000 (01:33 +0000)
committerThomas E. Dickey <dickey@invisible-island.net>
Sun, 23 Nov 2008 01:33:11 +0000 (01:33 +0000)
+ change _nc_has_mouse() to has_mouse(), reflect its use in C++ and
  Ada95 (patch by Juergen Pfeifer).
+ document in TO-DO an issue with Cygwin's package for GNAT (report
  by Mike Dennison).
+ improve error-checking of command-line options in "tabs" program.

Ada95/samples/Makefile.in
Ada95/src/terminal_interface-curses-mouse.adb
NEWS
TO-DO
c++/cursesw.cc
dist.mk
include/curses.tail
man/curs_mouse.3x
ncurses/base/lib_mouse.c
ncurses/curses.priv.h
progs/tabs.c

index 5ee78df0a3515162651a4a21998639f8606b8cd3..340e3bd4bcb449842ae6484e09cfd0a83e4fc19d 100644 (file)
@@ -1,5 +1,5 @@
 ##############################################################################
-# Copyright (c) 1998-2004,2005 Free Software Foundation, Inc.                #
+# Copyright (c) 1998-2005,2008 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 "Software"), #
@@ -28,7 +28,7 @@
 #
 #  Author:  Juergen Pfeifer, 1996
 #
-#  $Id: Makefile.in,v 1.34 2006/12/17 16:45:02 tom Exp $
+#  $Id: Makefile.in,v 1.35 2008/11/23 00:17:20 juergen Exp $
 #
 .SUFFIXES:
 
@@ -145,7 +145,7 @@ mostlyclean:
 
 clean :: mostlyclean
        rm -f *.o *.ali b_t*.* *.s $(PROGS) a.out core b_*_test.c *.xr[bs] \
-       explain.msg trace screendump 
+       explain.msg trace screendump b~*.ad[bs]
 
 distclean :: clean
        rm -f Makefile
index fa4c69d2765fbf30914a785fe984af62178c179e..1fce1dc88a70d6965df9b7ef49665781cdf5f8f6 100644 (file)
@@ -35,8 +35,8 @@
 ------------------------------------------------------------------------------
 --  Author:  Juergen Pfeifer, 1996
 --  Version Control:
---  $Revision: 1.22 $
---  $Date: 2008/07/26 18:51:11 $
+--  $Revision: 1.23 $
+--  $Date: 2008/11/16 00:19:59 $
 --  Binding Version 01.00
 ------------------------------------------------------------------------------
 with Terminal_Interface.Curses.Aux; use Terminal_Interface.Curses.Aux;
@@ -50,7 +50,7 @@ package body Terminal_Interface.Curses.Mouse is
    function Has_Mouse return Boolean
    is
       function Mouse_Avail return C_Int;
-      pragma Import (C, Mouse_Avail, "_nc_has_mouse");
+      pragma Import (C, Mouse_Avail, "has_mouse");
    begin
       if Has_Key (Key_Mouse) or else Mouse_Avail /= 0 then
          return True;
diff --git a/NEWS b/NEWS
index 73b153a5df53d48b07992fe88aa6c9002a4fed3c..caf4acfb4f3054d7c684fb3879a41ea94e9df34a 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.1322 2008/11/16 00:35:35 tom Exp $
+-- $Id: NEWS,v 1.1325 2008/11/23 00:20:04 tom Exp $
 -------------------------------------------------------------------------------
 
 This is a log of changes that ncurses has gone through since Zeyd started
@@ -45,6 +45,13 @@ 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.
 
+20081122
+       + change _nc_has_mouse() to has_mouse(), reflect its use in C++ and
+         Ada95 (patch by Juergen Pfeifer).
+       + document in TO-DO an issue with Cygwin's package for GNAT (report
+         by Mike Dennison).
+       + improve error-checking of command-line options in "tabs" program.
+
 20081115
        + change several terminfo entries to make consistent use of ANSI
          clear-all-tabs -TD
diff --git a/TO-DO b/TO-DO
index ca47d02d0ec83e689a634c208c1c82465e2d4321..4b492b6a4d08752b9a7f21d13a6458052f43ce96 100644 (file)
--- a/TO-DO
+++ b/TO-DO
@@ -25,7 +25,7 @@
 -- sale, use or other dealings in this Software without prior written        --
 -- authorization.                                                            --
 -------------------------------------------------------------------------------
--- $Id: TO-DO,v 1.51 2008/10/11 19:22:27 tom Exp $
+-- $Id: TO-DO,v 1.52 2008/11/22 22:58:59 tom Exp $
 -------------------------------------------------------------------------------
 
 SHORT-TERM TO-DO ITEMS:
@@ -66,6 +66,24 @@ Known Problems:
 + the --with-pthread configuration builds for Cygwin, but does not work
   properly (test/worm.c shows all of the worms in the same location).
 
++ the Ada95 tree requires a small fix to build on Cygwin, since the GNAT port
+  to that platform provides an incomplete Interrupts.Names package.  For
+  instance (your gcc version may be different):
+        /usr/lib/gcc/i686-pc-cygwin/3.4.4/adainclude/a-intnam.ads        
+
+  cut here...
+-------------------------------------------------------------------------------
+--- a-intnam.ads.orig   2003-10-21 13:41:51.000000000 +0000
++++ a-intnam.ads        2007-05-05 22:40:02.609375000 +0000
+@@ -44,5 +44,6 @@
+
+    DUMMY_INTERRUPT_1 : constant Interrupt_ID := 1;
+    DUMMY_INTERRUPT_2 : constant Interrupt_ID := 2;
++   SIGINT : constant Interrupt_ID := 1;
+
+ end Ada.Interrupts.Names;
+-------------------------------------------------------------------------------
+
 + the --enable-rpath configure option builds for the corresponding platforms;
   however combining it with --with-ticlib and --with-termlib does not always
   produce libraries that can be run without setting environment variables.
index 825d08ddd102ada225d4759d55b9bc464bbd6507..fb1832cd5512991a570bfb260a905741b2a1b428 100644 (file)
@@ -1,6 +1,6 @@
 // * this is for making emacs happy: -*-Mode: C++;-*-
 /****************************************************************************
- * Copyright (c) 2007 Free Software Foundation, Inc.                        *
+ * Copyright (c) 2007,2008 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            *
@@ -42,7 +42,7 @@
 #include "internal.h"
 #include "cursesw.h"
 
-MODULE_ID("$Id: cursesw.cc,v 1.49 2007/12/15 23:01:57 tom Exp $")
+MODULE_ID("$Id: cursesw.cc,v 1.50 2008/11/23 00:17:31 juergen Exp $")
 
 #define COLORS_NEED_INITIALIZATION  -1
 #define COLORS_NOT_INITIALIZED       0
@@ -287,7 +287,6 @@ NCursesWindow::NCursesWindow(WINDOW *win, int ncols)
 {
     initialize();
     w = win;
-    assert((w->_maxx +1 ) == ncols);
 }
 
 int _nc_xx_ripoff_init(WINDOW *w, int ncols)
@@ -464,7 +463,7 @@ NCursesWindow::setcolor(short pair)
 #if HAVE_HAS_KEY
 bool NCursesWindow::has_mouse() const
 {
-    return ((::has_key(KEY_MOUSE) || ::_nc_has_mouse())
+    return ((::has_key(KEY_MOUSE) || ::has_mouse())
             ? TRUE : FALSE);
 }
 #endif
diff --git a/dist.mk b/dist.mk
index 07a33a93ef9097ba81aa5021b3f59e9c38cc82c6..a791c4804b5b73ce6e3e761af6fb5ca4b4be76cb 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.672 2008/11/15 22:12:37 tom Exp $
+# $Id: dist.mk,v 1.673 2008/11/22 19:33:58 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 = 7
-NCURSES_PATCH = 20081115
+NCURSES_PATCH = 20081122
 
 # We don't append the patch to the version, since this only applies to releases
 VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR)
index aef7c378d5d53972fd098665719fd64569372998..53602afc927befad99085710b12d2a32f4d089f9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: curses.tail,v 1.16 2008/07/05 20:20:38 tom Exp $ */
+/* $Id: curses.tail,v 1.17 2008/11/23 00:12:12 tom Exp $ */
 /*
  * vile:cmode:
  * This file is part of ncurses, designed to be appended after curses.h.in
@@ -94,6 +94,7 @@ typedef struct
 }
 MEVENT;
 
+extern NCURSES_EXPORT(bool) has_mouse (void);
 extern NCURSES_EXPORT(int) getmouse (MEVENT *);
 extern NCURSES_EXPORT(int) ungetmouse (MEVENT *);
 extern NCURSES_EXPORT(mmask_t) mousemask (mmask_t, mmask_t *);
index 23f9f9c6d7d0ca8eb19587483a9b20c40af2cd45..16bc45df2d20966a7570aed4396c959478faa2bf 100644 (file)
@@ -1,6 +1,6 @@
 '\" t
 .\"***************************************************************************
-.\" Copyright (c) 1998-2005,2006 Free Software Foundation, Inc.              *
+.\" Copyright (c) 1998-2006,2008 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            *
 .\" authorization.                                                           *
 .\"***************************************************************************
 .\"
-.\" $Id: curs_mouse.3x,v 1.30 2006/12/30 23:43:34 tom Exp $
+.\" $Id: curs_mouse.3x,v 1.31 2008/11/23 00:09:53 tom Exp $
 .TH curs_mouse 3X ""
 .na
 .hy 0
 .SH NAME
+\fBhas_mouse\fR,
 \fBgetmouse\fR, \fBungetmouse\fR,
 \fBmousemask\fR, \fBwenclose\fR,
 \fBmouse_trafo\fR, \fBwmouse_trafo\fR,
@@ -53,7 +54,9 @@ typedef struct
 MEVENT;\fR
 .fi
 .br
-\fBint getmouse(MEVENT *event);\fR
+\fBbool has_mouse(void);\fR
+.br
+-\fBint getmouse(MEVENT *event);\fR
 .br
 \fBint ungetmouse(MEVENT *event);\fR
 .br
@@ -197,6 +200,9 @@ This function returns the previous interval value.
 Use \fBmouseinterval(-1)\fR to obtain the interval without altering it.
 The default is one sixth of a second.
 .PP
+The \fBhas_mouse\fP function returns TRUE if the mouse driver has been
+successfully initialized.
+.PP
 Note that mouse events will be ignored when input is in cooked mode, and will
 cause an error beep when cooked mode is being simulated in a window by a
 function such as \fBgetstr\fR that expects a linefeed for input-loop
index 95f29aa69111a47c8577536b921c31d823efa3cc..83f63a009143bfeff467a25b19c219058955db0e 100644 (file)
@@ -79,7 +79,7 @@
 
 #include <curses.priv.h>
 
-MODULE_ID("$Id: lib_mouse.c,v 1.102 2008/10/18 21:48:55 tom Exp $")
+MODULE_ID("$Id: lib_mouse.c,v 1.103 2008/11/23 00:11:46 tom Exp $")
 
 #include <term.h>
 #include <tic.h>
@@ -1397,10 +1397,16 @@ mouseinterval(int maxclick)
 
 /* This may be used by other routines to ask for the existence of mouse
    support */
-NCURSES_EXPORT(int)
-_nc_has_mouse(void)
+NCURSES_EXPORT(bool)
+_nc_has_mouse(SCREEN *sp)
+{
+    return ((sp->_mouse_type == M_NONE) ? FALSE : TRUE);
+}
+
+NCURSES_EXPORT(bool)
+has_mouse(void)
 {
-    return (SP->_mouse_type == M_NONE ? 0 : 1);
+    return _nc_has_mouse(SP);
 }
 
 NCURSES_EXPORT(bool)
index 29e131953415e4a5757bfa0c0eae68ead2bec08e..13edc36f743ba5a3d0249953c3288ae0b1770d13 100644 (file)
@@ -34,7 +34,7 @@
 
 
 /*
- * $Id: curses.priv.h,v 1.394 2008/10/04 21:37:45 tom Exp $
+ * $Id: curses.priv.h,v 1.395 2008/11/23 00:09:04 tom Exp $
  *
  *     curses.priv.h
  *
@@ -1519,7 +1519,7 @@ extern NCURSES_EXPORT(void) _nc_screen_resume (void);
 extern NCURSES_EXPORT(void) _nc_screen_wrap (void);
 
 /* lib_mouse.c */
-extern NCURSES_EXPORT(int) _nc_has_mouse (void);
+extern NCURSES_EXPORT(bool) _nc_has_mouse (SCREEN *);
 
 /* lib_mvcur.c */
 #define INFINITY       1000000 /* cost: too high to use */
index 7588e8b2f0f5821b0f58ca4d3e13f0c28c9a0874..f3cc42fb7b009d9319668950ebd4ac27ac1132f5 100644 (file)
@@ -37,7 +37,7 @@
 #define USE_LIBTINFO
 #include <progs.priv.h>
 
-MODULE_ID("$Id: tabs.c,v 1.11 2008/11/16 00:58:24 tom Exp $")
+MODULE_ID("$Id: tabs.c,v 1.15 2008/11/23 00:47:51 tom Exp $")
 
 static void usage(void) GCC_NORETURN;
 
@@ -83,41 +83,48 @@ decode_tabs(const char *tab_list)
     int prior = 0;
     int ch;
 
-    while ((ch = *tab_list++) != '\0') {
-       if (isdigit(UChar(ch))) {
-           value *= 10;
-           value += (ch - '0');
-       } else if (ch == ',') {
-           result[n] = value + prior;
-           if (n > 0 && value <= result[n - 1]) {
-               fprintf(stderr, "tab-stops are not in increasing order\n");
-               ExitProgram(EXIT_FAILURE);
+    if (result != 0) {
+       while ((ch = *tab_list++) != '\0') {
+           if (isdigit(UChar(ch))) {
+               value *= 10;
+               value += (ch - '0');
+           } else if (ch == ',') {
+               result[n] = value + prior;
+               if (n > 0 && value <= result[n - 1]) {
+                   fprintf(stderr,
+                           "tab-stops are not in increasing order\n");
+                   free(result);
+                   result = 0;
+                   break;
+               }
+               ++n;
+               value = 0;
+               prior = 0;
+           } else if (ch == '+') {
+               if (n)
+                   prior = result[n - 1];
            }
-           ++n;
-           value = 0;
-           prior = 0;
-       } else if (ch == '+') {
-           if (n)
-               prior = result[n - 1];
        }
     }
 
-    /*
-     * If there is only one value, then it is an option such as "-8".
-     */
-    if ((n == 0) && (value > 0)) {
-       int step = value;
-       while (n < max_cols - 1) {
-           result[n++] = value;
-           value += step;
+    if (result != 0) {
+       /*
+        * If there is only one value, then it is an option such as "-8".
+        */
+       if ((n == 0) && (value > 0)) {
+           int step = value;
+           while (n < max_cols - 1) {
+               result[n++] = value;
+               value += step;
+           }
        }
-    }
 
-    /*
-     * Add the last value, if any.
-     */
-    result[n++] = value;
-    result[n] = 0;
+       /*
+        * Add the last value, if any.
+        */
+       result[n++] = value;
+       result[n] = 0;
+    }
     return result;
 }
 
@@ -180,6 +187,128 @@ write_tabs(int *tab_list)
     putchar('\n');
 }
 
+/*
+ * Trim leading/trailing blanks, as well as blanks after a comma.
+ * Convert embedded blanks to commas.
+ */
+static char *
+trimmed_tab_list(const char *source)
+{
+    char *result = strdup(source);
+    int ch, j, k, last;
+
+    if (result != 0) {
+       for (j = k = last = 0; result[j] != 0; ++j) {
+           ch = UChar(result[j]);
+           if (isspace(ch)) {
+               if (last == '\0') {
+                   continue;
+               } else if (isdigit(last) || last == ',') {
+                   ch = ',';
+               }
+           } else if (ch == ',') {
+               ;
+           } else {
+               if (last == ',')
+                   result[k++] = last;
+               result[k++] = ch;
+           }
+           last = ch;
+       }
+       result[k] = '\0';
+    }
+    return result;
+}
+
+static bool
+comma_is_needed(const char *source)
+{
+    bool result = FALSE;
+
+    if (source != 0) {
+       unsigned len = strlen(source);
+       if (len != 0)
+           result = (source[len - 1] != ',');
+    } else {
+       result = FALSE;
+    }
+    return result;
+}
+
+/*
+ * Add a command-line parameter to the tab-list.  It can be blank- or comma-
+ * separated (or a mixture).  For simplicity, empty tabs are ignored, e.g.,
+ *     tabs 1,,6,11
+ *     tabs 1,6,11
+ * are treated the same.
+ */
+static const char *
+add_to_tab_list(char **append, const char *value)
+{
+    char *result = *append;
+    char *copied = trimmed_tab_list(value);
+
+    if (copied != 0 && *copied != '\0') {
+       const char *comma = ",";
+       unsigned need = 1 + strlen(copied);
+
+       if (*copied == ',')
+           comma = "";
+       else if (!comma_is_needed(*append))
+           comma = "";
+
+       need += strlen(comma);
+       if (*append != 0)
+           need += strlen(*append);
+
+       result = malloc(need);
+       if (result != 0) {
+           *result = '\0';
+           if (*append != 0) {
+               strcpy(result, *append);
+               free(*append);
+           }
+           strcat(result, comma);
+           strcat(result, copied);
+       }
+
+       *append = result;
+    }
+    return result;
+}
+
+/*
+ * Check for illegal characters in the tab-list.
+ */
+static bool
+legal_tab_list(const char *program, const char *tab_list)
+{
+    bool result = TRUE;
+
+    if (tab_list != 0 && *tab_list != '\0') {
+       if (comma_is_needed(tab_list)) {
+           int n, ch;
+           for (n = 0; tab_list[n] != '\0'; ++n) {
+               ch = UChar(tab_list[n]);
+               if (!(isdigit(ch) || ch == ',')) {
+                   fprintf(stderr,
+                           "%s: unexpected character found '%c'\n",
+                           program, ch);
+                   result = FALSE;
+                   break;
+               }
+           }
+       } else {
+           fprintf(stderr, "%s: trailing comma found '%s'\n", program, tab_list);
+           result = FALSE;
+       }
+    } else {
+       fprintf(stderr, "%s: no tab-list given\n", program);
+       result = FALSE;
+    }
+    return result;
+}
+
 static void
 usage(void)
 {
@@ -218,7 +347,7 @@ usage(void)
 int
 main(int argc, char *argv[])
 {
-    int rc = EXIT_SUCCESS;
+    int rc = EXIT_FAILURE;
     bool debug = FALSE;
     bool no_op = FALSE;
     int n, ch;
@@ -324,25 +453,15 @@ main(int argc, char *argv[])
            }
            break;
        default:
-           if (isdigit(*option)) {
-               if (append != 0) {
-                   if (tab_list != (const char *) append) {
-                       /* one of the predefined options was used */
-                       append = strdup(option);
-                       tab_list = append;
-                   } else {
-                       append = malloc(strlen(tab_list) + strlen(option) + 2);
-                       sprintf(append, "%s,%s", tab_list, option);
-                       free((char *) tab_list);
-                       tab_list = append;
-                   }
-               } else {
-                   append = strdup(option);
-                   tab_list = append;
+           if (append != 0) {
+               if (tab_list != (const char *) append) {
+                   /* one of the predefined options was used */
+                   free(append);
+                   append = 0;
                }
-           } else {
-               usage();
            }
+           tab_list = add_to_tab_list(&append, option);
+           option += ((int) strlen(option)) - 1;
            break;
        }
     }
@@ -355,13 +474,11 @@ main(int argc, char *argv[])
        fprintf(stderr,
                "%s: terminal type '%s' cannot reset tabs\n",
                argv[0], term_name);
-       rc = EXIT_FAILURE;
     } else if (!VALID_STRING(set_tab)) {
        fprintf(stderr,
                "%s: terminal type '%s' cannot set tabs\n",
                argv[0], term_name);
-       rc = EXIT_FAILURE;
-    } else {
+    } else if (legal_tab_list(argv[0], tab_list)) {
        int *list = decode_tabs(tab_list);
 
        if (!no_op)
@@ -371,13 +488,19 @@ main(int argc, char *argv[])
            if (!no_op)
                do_tabs(list);
            if (debug) {
+               fflush(stderr);
+               printf("tabs %s\n", tab_list);
                print_ruler(list);
                write_tabs(list);
            }
            free(list);
+       } else if (debug) {
+           fflush(stderr);
+           printf("tabs %s\n", tab_list);
        }
+       rc = EXIT_SUCCESS;
     }
-    if (append)
+    if (append != 0)
        free(append);
     ExitProgram(rc);
 }