From: Thomas E. Dickey Date: Sun, 2 Aug 2009 00:48:52 +0000 (+0000) Subject: ncurses 5.7 - patch 20090801 X-Git-Tag: v5.8~79 X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=commitdiff_plain;h=8485ec820b6d0ad70950b63834f31b3ca235c84b;ds=sidebyside ncurses 5.7 - patch 20090801 + improve discussion in INSTALL for use of system's tic/infocmp for cross-compiling and building fallbacks. + modify test/demo_termcap.c to correspond better to options in test/demo_terminfo.c + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + fix logic for 'V' in test/ncurses.c tests f/F. --- diff --git a/INSTALL b/INSTALL index 7b777e91..cdc3513a 100644 --- a/INSTALL +++ b/INSTALL @@ -25,7 +25,7 @@ -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- --- $Id: INSTALL,v 1.139 2009/07/18 20:50:08 tom Exp $ +-- $Id: INSTALL,v 1.140 2009/08/01 19:32:04 tom Exp $ --------------------------------------------------------------------- How to install Ncurses/Terminfo on your system --------------------------------------------------------------------- @@ -1610,7 +1610,8 @@ CONFIGURING FALLBACK ENTRIES: tree is accessible (that is, in single-user mode or at OS installation time) the ncurses library can be compiled to include an array of pre-fetched fallback entries. This must be done on a machine which - has ncurses' infocmp and terminfo database installed. + has ncurses' infocmp and terminfo database installed (as well as + ncurses' tic and infocmp programs). These entries are checked by setupterm() only when the conventional fetches from the terminfo tree and the termcap fallback (if configured) @@ -1761,6 +1762,10 @@ BUILDING NCURSES WITH A CROSS-COMPILER option), ncurses uses the development platform's tic to do the "make install.data" portion. + The system's tic program is used to install the terminal database, + even for cross-compiles. For best results, the tic program should + be from the most current version of ncurses. + BUGS: Send any feedback to the ncurses mailing list at bug-ncurses@gnu.org. To subscribe send mail to diff --git a/NEWS b/NEWS index 8de8c2c8..c3ec241b 100644 --- a/NEWS +++ b/NEWS @@ -25,7 +25,7 @@ -- sale, use or other dealings in this Software without prior written -- -- authorization. -- ------------------------------------------------------------------------------- --- $Id: NEWS,v 1.1411 2009/07/28 22:22:43 tom Exp $ +-- $Id: NEWS,v 1.1414 2009/08/01 20:44:21 tom Exp $ ------------------------------------------------------------------------------- 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. +20090801 + + improve discussion in INSTALL for use of system's tic/infocmp for + cross-compiling and building fallbacks. + + modify test/demo_termcap.c to correspond better to options in + test/demo_terminfo.c + + continue integrating "sp-funcs" by Juergen Pfeifer (incomplete). + + fix logic for 'V' in test/ncurses.c tests f/F. + 20090728 + correct logic in tigetnum(), which caused tput program to treat all string capabilities as numeric (report by Rajeev V Pillai, diff --git a/dist.mk b/dist.mk index 2c5636db..83c1589d 100644 --- 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.711 2009/07/28 21:17:07 tom Exp $ +# $Id: dist.mk,v 1.712 2009/07/30 09:04:10 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 = 20090728 +NCURSES_PATCH = 20090801 # We don't append the patch to the version, since this only applies to releases VERSION = $(NCURSES_MAJOR).$(NCURSES_MINOR) diff --git a/ncurses/tinfo/lib_raw.c b/ncurses/tinfo/lib_raw.c index 5d5a5332..aea5df54 100644 --- a/ncurses/tinfo/lib_raw.c +++ b/ncurses/tinfo/lib_raw.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2007,2009 Free Software Foundation, Inc. * + * Copyright (c) 1998-2008,2009 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 * @@ -48,9 +48,8 @@ */ #include -#include /* cur_term */ -MODULE_ID("$Id: lib_raw.c,v 1.15 2009/02/15 00:49:02 tom Exp $") +MODULE_ID("$Id: lib_raw.c,v 1.17 2009/08/01 23:11:02 tom Exp $") #if SVR4_TERMIO && !defined(_POSIX_SOURCE) #define _POSIX_SOURCE @@ -81,16 +80,16 @@ NCURSES_EXPORT(int) NCURSES_SP_NAME(raw) (NCURSES_SP_DCL0) { int result = ERR; + TERMINAL *termp; - T((T_CALLED("raw()"))); - - if (SP_PARM != 0 && cur_term != 0) { + T((T_CALLED("raw(%p)"), SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; BEFORE("raw"); _nc_setmode(O_BINARY); - buf = cur_term->Nttyb; + buf = termp->Nttyb; #ifdef TERMIOS buf.c_lflag &= ~(ICANON | ISIG | IEXTEN); buf.c_iflag &= ~(COOKED_INPUT); @@ -99,10 +98,11 @@ NCURSES_SP_NAME(raw) (NCURSES_SP_DCL0) #else buf.sg_flags |= RAW; #endif - if ((result = _nc_set_tty_mode(&buf)) == OK) { + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { SP_PARM->_raw = TRUE; SP_PARM->_cbreak = 1; - cur_term->Nttyb = buf; + termp->Nttyb = buf; } AFTER("raw"); } @@ -121,16 +121,16 @@ NCURSES_EXPORT(int) NCURSES_SP_NAME(cbreak) (NCURSES_SP_DCL0) { int result = ERR; + TERMINAL *termp; - T((T_CALLED("cbreak()"))); - - if (SP_PARM != 0 && cur_term != 0) { + T((T_CALLED("cbreak(%p)"), SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; BEFORE("cbreak"); _nc_setmode(O_BINARY); - buf = cur_term->Nttyb; + buf = termp->Nttyb; #ifdef TERMIOS buf.c_lflag &= ~ICANON; buf.c_iflag &= ~ICRNL; @@ -140,9 +140,10 @@ NCURSES_SP_NAME(cbreak) (NCURSES_SP_DCL0) #else buf.sg_flags |= CBREAK; #endif - if ((result = _nc_set_tty_mode(&buf)) == OK) { + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { SP_PARM->_cbreak = 1; - cur_term->Nttyb = buf; + termp->Nttyb = buf; } AFTER("cbreak"); } @@ -165,22 +166,22 @@ NCURSES_EXPORT(void) NCURSES_SP_NAME(qiflush) (NCURSES_SP_DCL0) { int result = ERR; + TERMINAL *termp; - T((T_CALLED("qiflush()"))); - - if (cur_term != 0) { + T((T_CALLED("qiflush(%p)"), SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; BEFORE("qiflush"); - buf = cur_term->Nttyb; + buf = termp->Nttyb; #ifdef TERMIOS buf.c_lflag &= ~(NOFLSH); - result = _nc_set_tty_mode(&buf); + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); #else /* FIXME */ #endif if (result == OK) - cur_term->Nttyb = buf; + termp->Nttyb = buf; AFTER("qiflush"); } returnVoid; @@ -198,27 +199,28 @@ NCURSES_EXPORT(int) NCURSES_SP_NAME(noraw) (NCURSES_SP_DCL0) { int result = ERR; + TERMINAL *termp; - T((T_CALLED("noraw()"))); - - if (SP_PARM != 0 && cur_term != 0) { + T((T_CALLED("noraw(%p)"), SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; BEFORE("noraw"); _nc_setmode(O_TEXT); - buf = cur_term->Nttyb; + buf = termp->Nttyb; #ifdef TERMIOS buf.c_lflag |= ISIG | ICANON | - (cur_term->Ottyb.c_lflag & IEXTEN); + (termp->Ottyb.c_lflag & IEXTEN); buf.c_iflag |= COOKED_INPUT; #else buf.sg_flags &= ~(RAW | CBREAK); #endif - if ((result = _nc_set_tty_mode(&buf)) == OK) { + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { SP_PARM->_raw = FALSE; SP_PARM->_cbreak = 0; - cur_term->Nttyb = buf; + termp->Nttyb = buf; } AFTER("noraw"); } @@ -237,25 +239,26 @@ NCURSES_EXPORT(int) NCURSES_SP_NAME(nocbreak) (NCURSES_SP_DCL0) { int result = ERR; + TERMINAL *termp; - T((T_CALLED("nocbreak()"))); - - if (SP_PARM != 0 && cur_term != 0) { + T((T_CALLED("nocbreak(%p)"), SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; BEFORE("nocbreak"); _nc_setmode(O_TEXT); - buf = cur_term->Nttyb; + buf = termp->Nttyb; #ifdef TERMIOS buf.c_lflag |= ICANON; buf.c_iflag |= ICRNL; #else buf.sg_flags &= ~CBREAK; #endif - if ((result = _nc_set_tty_mode(&buf)) == OK) { + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); + if (result == OK) { SP_PARM->_cbreak = 0; - cur_term->Nttyb = buf; + termp->Nttyb = buf; } AFTER("nocbreak"); } @@ -270,31 +273,26 @@ nocbreak(void) } #endif -/* - * Note: - * this implementation may be wrong. See the comment under intrflush(). - */ NCURSES_EXPORT(void) NCURSES_SP_NAME(noqiflush) (NCURSES_SP_DCL0) { int result = ERR; + TERMINAL *termp; - T((T_CALLED("noqiflush()"))); - - if (cur_term != 0) { + T((T_CALLED("noqiflush(%p)"), SP_PARM)); + if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; BEFORE("noqiflush"); - buf = cur_term->Nttyb; + buf = termp->Nttyb; #ifdef TERMIOS buf.c_lflag |= NOFLSH; - result = _nc_set_tty_mode(&buf); + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); #else /* FIXME */ #endif - if (result == OK) { - cur_term->Nttyb = buf; - } + if (result == OK) + termp->Nttyb = buf; AFTER("noqiflush"); } returnVoid; @@ -319,25 +317,28 @@ NCURSES_EXPORT(int) NCURSES_SP_NAME(intrflush) (NCURSES_SP_DCLx WINDOW *win GCC_UNUSED, bool flag) { int result = ERR; + TERMINAL *termp; - T((T_CALLED("intrflush(%d)"), flag)); + T((T_CALLED("intrflush(%p,%d)"), SP_PARM, flag)); + if (SP_PARM == 0) + returnCode(ERR); - if (cur_term != 0) { + if ((termp = TerminalOf(SP_PARM)) != 0) { TTY buf; BEFORE("intrflush"); - buf = cur_term->Nttyb; + buf = termp->Nttyb; #ifdef TERMIOS if (flag) buf.c_lflag &= ~(NOFLSH); else buf.c_lflag |= (NOFLSH); - result = _nc_set_tty_mode(&buf); + result = NCURSES_SP_NAME(_nc_set_tty_mode) (NCURSES_SP_ARGx &buf); #else /* FIXME */ #endif if (result == OK) { - cur_term->Nttyb = buf; + termp->Nttyb = buf; } AFTER("intrflush"); } diff --git a/test/demo_termcap.c b/test/demo_termcap.c index 3e856489..b36ba96c 100644 --- a/test/demo_termcap.c +++ b/test/demo_termcap.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2005-2007,2008 Free Software Foundation, Inc. * + * Copyright (c) 2005-2008,2009 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 * @@ -29,7 +29,7 @@ /* * Author: Thomas E. Dickey * - * $Id: demo_termcap.c,v 1.7 2008/02/09 18:08:36 tom Exp $ + * $Id: demo_termcap.c,v 1.11 2009/08/02 00:02:53 tom Exp $ * * A simple demo of the termcap interface. */ @@ -38,10 +38,25 @@ #if HAVE_TGETENT +#if defined(HAVE_CURSES_DATA_BOOLNAMES) || defined(DECL_CURSES_DATA_BOOLNAMES) +#define USE_CODE_LISTS 1 +#else +#define USE_CODE_LISTS 0 +#endif + +#define FCOLS 8 +#define FNAME(type) "%s %-*s = ", #type, FCOLS + +#if USE_CODE_LISTS +static bool b_opt = FALSE; +static bool n_opt = FALSE; +static bool s_opt = FALSE; +#endif + #define isCapName(c) (isgraph(c) && strchr("^#=:\\", c) == 0) static void -dumpit(char *cap) +dumpit(NCURSES_CONST char *cap) { /* * One of the limitations of the termcap interface is that the library @@ -59,7 +74,7 @@ dumpit(char *cap) * Note that the strings returned are mostly terminfo format, since * ncurses does not convert except for a handful of special cases. */ - printf("str %s = ", cap); + printf(FNAME(str), cap); while (*str != 0) { int ch = UChar(*str++); switch (ch) { @@ -108,15 +123,17 @@ dumpit(char *cap) } printf("\n"); } else if ((num = tgetnum(cap)) >= 0) { - printf("num %s = %d\n", cap, num); + printf(FNAME(num), cap); + printf(" %d\n", num); } else if ((num = tgetflag(cap)) > 0) { - printf("flg %s\n", cap); + printf(FNAME(flg), cap); + printf("%s\n", "true"); } fflush(stdout); } static void -demo_termcap(char *name) +brute_force(const char *name) { char buffer[1024]; @@ -140,23 +157,142 @@ demo_termcap(char *name) } } +#if USE_CODE_LISTS +static void +demo_terminfo(NCURSES_CONST char *name) +{ + unsigned n; + NCURSES_CONST char *cap; + + printf("Terminal type \"%s\"\n", name); + setupterm(name, 1, (int *) 0); + + if (b_opt) { + for (n = 0;; ++n) { + cap = boolcodes[n]; + if (cap == 0) + break; + dumpit(cap); + } + } + + if (n_opt) { + for (n = 0;; ++n) { + cap = numcodes[n]; + if (cap == 0) + break; + dumpit(cap); + } + } + + if (s_opt) { + for (n = 0;; ++n) { + cap = strcodes[n]; + if (cap == 0) + break; + dumpit(cap); + } + } +} + +static void +usage(void) +{ + static const char *msg[] = + { + "Usage: demo_terminfo [options] [terminal]", + "", + "If no options are given, print all (boolean, numeric, string)", + "capabilities for the given terminal, using short names.", + "", + "Options:", + " -a try all names, print capabilities found", + " -b print boolean-capabilities", + " -n print numeric-capabilities", + " -r COUNT repeat for given count", + " -s print string-capabilities", + }; + unsigned n; + for (n = 0; n < SIZEOF(msg); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + ExitProgram(EXIT_FAILURE); +} +#endif + int main(int argc, char *argv[]) { int n; char *name; + bool a_opt = FALSE; + +#if USE_CODE_LISTS + int repeat; + int r_opt = 1; - if (argc > 1) { - for (n = 1; n < argc; ++n) { - demo_termcap(argv[n]); + while ((n = getopt(argc, argv, "abnr:s")) != -1) { + switch (n) { + case 'a': + a_opt = TRUE; + break; + case 'b': + b_opt = TRUE; + break; + case 'n': + n_opt = TRUE; + break; + case 'r': + if ((r_opt = atoi(optarg)) <= 0) + usage(); + break; + case 's': + s_opt = TRUE; + break; + default: + usage(); + break; } - } else if ((name = getenv("TERM")) != 0) { - demo_termcap(name); - } else { - static char dumb[] = "dumb"; - demo_termcap(dumb); } + if (!(b_opt || n_opt || s_opt)) { + b_opt = TRUE; + n_opt = TRUE; + s_opt = TRUE; + } +#else + a_opt = TRUE; +#endif + + if (a_opt) { + if (optind < argc) { + for (n = optind; n < argc; ++n) { + brute_force(argv[n]); + } + } else if ((name = getenv("TERM")) != 0) { + brute_force(name); + } else { + static char dumb[] = "dumb"; + brute_force(dumb); + } + } +#if USE_CODE_LISTS + else { + for (repeat = 0; repeat < r_opt; ++repeat) { + if (optind < argc) { + for (n = optind; n < argc; ++n) { + demo_terminfo(argv[n]); + } + } else if ((name = getenv("TERM")) != 0) { + demo_terminfo(name); + } else { + static char dumb[] = "dumb"; + demo_terminfo(dumb); + } + } + } +#endif + ExitProgram(EXIT_SUCCESS); } diff --git a/test/ncurses.c b/test/ncurses.c index ad5efb30..70b0d86a 100644 --- a/test/ncurses.c +++ b/test/ncurses.c @@ -40,7 +40,7 @@ AUTHOR Author: Eric S. Raymond 1993 Thomas E. Dickey (beginning revision 1.27 in 1996). -$Id: ncurses.c,v 1.342 2009/07/18 11:48:42 tom Exp $ +$Id: ncurses.c,v 1.343 2009/07/30 09:13:37 tom Exp $ ***************************************************************************/ @@ -2890,7 +2890,7 @@ cycle_attr(int ch, unsigned *at_code, chtype *attr) *at_code = 0; break; case 'V': - if (*at_code == 1) + if (*at_code == 0) *at_code = SIZEOF(attrs_to_cycle) - 1; else *at_code -= 1;