From eb9b1032960dd47916ea31fe77f1c993e26c69f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20v=2E=20L=C3=B6wis?= Date: Wed, 24 Oct 2001 17:10:49 +0000 Subject: [PATCH] Check for HP/UX curses problems. Define _XOPEN_SOURCE_EXTENDED and STRICT_SYSV_CURSES when compiling curses module on HP/UX. Generalize access to _flags on systems where WINDOW is opaque. Fixes bugs #432497, #422265, and the curses parts of #467145 and #473150. --- Include/py_curses.h | 11 ++++++++++ Modules/_cursesmodule.c | 47 +++++++++++++++++++++++++++++++++++------ acconfig.h | 6 ++++++ configure.in | 32 ++++++++++++++++++++++++++++ pyconfig.h.in | 6 ++++++ 5 files changed, 95 insertions(+), 7 deletions(-) diff --git a/Include/py_curses.h b/Include/py_curses.h index b5f7e544596..1b6d2d3d323 100644 --- a/Include/py_curses.h +++ b/Include/py_curses.h @@ -12,6 +12,17 @@ #endif #endif +#ifdef HAVE_NCURSES_H +/* configure was checking , but we will + use , which has all these features. */ +#ifndef WINDOW_HAS_FLAGS +#define WINDOW_HAS_FLAGS 1 +#endif +#ifndef MVWDELCH_IS_EXPRESSION +#define MVWDELCH_IS_EXPRESSION 1 +#endif +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 092f658b62c..bd544ba342c 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -107,6 +107,11 @@ char *PyCursesVersion = "2.2"; #define STRICT_SYSV_CURSES /* Don't use ncurses extensions */ #endif +#ifdef __hpux +#define _XOPEN_SOURCE_EXTENDED +#define STRICT_SYSV_CURSES +#endif + #define CURSES_MODULE #include "py_curses.h" @@ -119,7 +124,7 @@ extern int setupterm(char *,int,int *); #include #endif -#if defined(sgi) || defined(__sun) +#if !defined(HAVE_NCURSES_H) && (defined(sgi) || defined(__sun)) #define STRICT_SYSV_CURSES /* Don't use ncurses extensions */ typedef chtype attr_t; /* No attr_t type is available */ #endif @@ -605,6 +610,19 @@ PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args) return Py_None; } +#if defined(HAVE_NCURSES_H) || defined(MVWDELCH_IS_EXPRESSION) +#define py_mvwdelch mvwdelch +#else +int py_mvwdelch(WINDOW *w, int y, int x) +{ + mvwdelch(w,y,x); + /* On HP/UX, mvwdelch already returns. On other systems, + we may well run into this return statement. */ + return 0; +} +#endif + + static PyObject * PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args) { @@ -618,7 +636,7 @@ PyCursesWindow_DelCh(PyCursesWindowObject *self, PyObject *args) case 2: if (!PyArg_Parse(args,"(ii);y,x", &y, &x)) return NULL; - rtn = mvwdelch(self->win,y,x); + rtn = py_mvwdelch(self->win,y,x); break; default: PyErr_SetString(PyExc_TypeError, "delch requires 0 or 2 arguments"); @@ -688,7 +706,7 @@ PyCursesWindow_EchoChar(PyCursesWindowObject *self, PyObject *args) return NULL; } -#if !defined(__NetBSD__) +#ifdef WINDOW_HAS_FLAGS if (self->win->_flags & _ISPAD) return PyCursesCheckERR(pechochar(self->win, ch | attr), "echochar"); @@ -1094,7 +1112,7 @@ PyCursesWindow_NoOutRefresh(PyCursesWindowObject *self, PyObject *args) int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol; int rtn; -#if defined(__NetBSD__) +#ifndef WINDOW_HAS_FLAGS if (0) { #else if (self->win->_flags & _ISPAD) { @@ -1236,7 +1254,7 @@ PyCursesWindow_Refresh(PyCursesWindowObject *self, PyObject *args) int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol; int rtn; -#if defined(__NetBSD__) +#ifndef WINDOW_HAS_FLAGS if (0) { #else if (self->win->_flags & _ISPAD) { @@ -1304,7 +1322,7 @@ PyCursesWindow_SubWin(PyCursesWindowObject *self, PyObject *args) } /* printf("Subwin: %i %i %i %i \n", nlines, ncols, begin_y, begin_x); */ -#if !defined(__NetBSD__) +#ifdef WINDOW_HAS_FLAGS if (self->win->_flags & _ISPAD) win = subpad(self->win, nlines, ncols, begin_y, begin_x); else @@ -1832,6 +1850,11 @@ PyCurses_InitScr(PyObject *self, PyObject *args) SetDictInt("ACS_HLINE", (ACS_HLINE)); SetDictInt("ACS_VLINE", (ACS_VLINE)); SetDictInt("ACS_PLUS", (ACS_PLUS)); +#if !defined(__hpux) || defined(HAVE_NCURSES_H) + /* On HP/UX 11, these are of type cchar_t, which is not an + integral type. If this is a problem on more platforms, a + configure test should be added to determine whether ACS_S1 + is of integral type. */ SetDictInt("ACS_S1", (ACS_S1)); SetDictInt("ACS_S9", (ACS_S9)); SetDictInt("ACS_DIAMOND", (ACS_DIAMOND)); @@ -1846,6 +1869,7 @@ PyCurses_InitScr(PyObject *self, PyObject *args) SetDictInt("ACS_BOARD", (ACS_BOARD)); SetDictInt("ACS_LANTERN", (ACS_LANTERN)); SetDictInt("ACS_BLOCK", (ACS_BLOCK)); +#endif SetDictInt("ACS_BSSB", (ACS_ULCORNER)); SetDictInt("ACS_SSBB", (ACS_LLCORNER)); SetDictInt("ACS_BBSS", (ACS_URCORNER)); @@ -2286,6 +2310,15 @@ PyCurses_tparm(PyObject *self, PyObject *args) return NULL; } +#ifdef __hpux + /* tparm is declared with 10 arguments on HP/UX 11. + If this is a problem on other platforms as well, + an autoconf test should be added to determine + whether tparm can be called with a variable number + of arguments. Perhaps the other arguments should + be initialized in this case also. */ + result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9); +#else switch (PyTuple_GET_SIZE(args)) { case 1: result = tparm(fmt); @@ -2318,7 +2351,7 @@ PyCurses_tparm(PyObject *self, PyObject *args) result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9); break; } - +#endif /* __hpux */ return PyString_FromString(result); } diff --git a/acconfig.h b/acconfig.h index 9e30ab5e3b7..94826ad3cf0 100644 --- a/acconfig.h +++ b/acconfig.h @@ -232,6 +232,12 @@ /* Define if you want to compile in rudimentary thread support */ #undef WITH_THREAD +/* Define if mvwdelch in curses.h is an expression. */ +#undef MVWDELCH_IS_EXPRESSION + +/* Define if WINDOW in curses.h offers a field _flags. */ +#undef WINDOW_HAS_FLAGS + /* Leave that blank line there-- autoheader needs it! */ diff --git a/configure.in b/configure.in index d9fdadf164c..dd724ae0969 100644 --- a/configure.in +++ b/configure.in @@ -1963,6 +1963,38 @@ then AC_DEFINE(HAVE_BROKEN_NICE) fi +# On HP/UX 11.0, mvwdelch is a block with a return statement +AC_MSG_CHECKING(whether mvwdelch is an expression) +AC_CACHE_VAL(ac_cv_mvwdelch_is_expression, +AC_TRY_COMPILE([#include ], [ + int rtn; + rtn = mvwdelch(0,0,0); +], ac_cv_mvwdelch_is_expression=yes, + ac_cv_mvwdelch_is_expression=no, + ac_cv_mvwdelch_is_expression=yes)) +AC_MSG_RESULT($ac_cv_mvwdelch_is_expression) + +if test "$ac_cv_mvwdelch_is_expression" = yes +then + AC_DEFINE(MVWDELCH_IS_EXPRESSION) +fi + +AC_MSG_CHECKING(whether WINDOW has _flags) +AC_CACHE_VAL(ac_cv_window_has_flags, +AC_TRY_COMPILE([#include ], [ + WINDOW *w; + w->_flags = 0; +], ac_cv_window_has_flags=yes, + ac_cv_window_has_flags=no, + ac_cv_window_has_flags=no)) +AC_MSG_RESULT($ac_cv_window_has_flags) + + +if test "$ac_cv_window_has_flags" = yes +then + AC_DEFINE(WINDOW_HAS_FLAGS) +fi + # THIS MUST BE LAST, IT CAN BREAK OTHER TESTS! # Add sys/socket.h to confdefs.h cat >> confdefs.h <<\EOF diff --git a/pyconfig.h.in b/pyconfig.h.in index 7de66aff132..40cb00df8e3 100644 --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -288,6 +288,12 @@ /* Define if you want to compile in rudimentary thread support */ #undef WITH_THREAD +/* Define if mvwdelch in curses.h is an expression. */ +#undef MVWDELCH_IS_EXPRESSION + +/* Define if WINDOW in curses.h offers a field _flags. */ +#undef WINDOW_HAS_FLAGS + /* The number of bytes in a char. */ #undef SIZEOF_CHAR