]> granicus.if.org Git - python/commitdiff
Check for HP/UX curses problems. Define _XOPEN_SOURCE_EXTENDED and
authorMartin v. Löwis <martin@v.loewis.de>
Wed, 24 Oct 2001 17:10:49 +0000 (17:10 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Wed, 24 Oct 2001 17:10:49 +0000 (17:10 +0000)
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
Modules/_cursesmodule.c
acconfig.h
configure.in
pyconfig.h.in

index b5f7e54459675109514604e4d40be8e2301d34ab..1b6d2d3d323d24b94e3f0ffe7bca15928e6e0b3c 100644 (file)
 #endif
 #endif
 
+#ifdef HAVE_NCURSES_H
+/* configure was checking <curses.h>, but we will
+   use <ncurses.h>, 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
index 092f658b62ca4beae9ede7f2e8d771e771e3e1f1..bd544ba342cc3a8bf438fa3724349f91b8794ba0 100644 (file)
@@ -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 <term.h>
 #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);
 }
 
index 9e30ab5e3b76b7f28518b6304de5dba8255e89ec..94826ad3cf07bae7ce14d2d31024ced7b0aeab5e 100644 (file)
 /* 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
+
 \f
 /* Leave that blank line there-- autoheader needs it! */
 
index d9fdadf164c43d3a87cf3cf684f04f20440869e9..dd724ae09695b26d5aca98277ad6dcc07cddb3f9 100644 (file)
@@ -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 <curses.h>], [
+  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 <curses.h>], [
+  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
index 7de66aff132f4dffeef907f9375f7ab9f6b9d70c..40cb00df8e3f20d043fc89a23d4c75a1f1987bdd 100644 (file)
 /* 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