Commits

Martin von Löwis committed dd78b1a

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.

  • Participants
  • Parent commits cabb568
  • Branches legacy-trunk

Comments (0)

Files changed (5)

File Include/py_curses.h

 #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

File Modules/_cursesmodule.c

 #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"
 
 #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
   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)
 {
   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");
     return NULL;
   }
   
-#if !defined(__NetBSD__)
+#ifdef WINDOW_HAS_FLAGS
   if (self->win->_flags & _ISPAD)
     return PyCursesCheckERR(pechochar(self->win, ch | attr), 
 			    "echochar");
   int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
   int rtn;
 
-#if defined(__NetBSD__)
+#ifndef WINDOW_HAS_FLAGS
   if (0) {
 #else
   if (self->win->_flags & _ISPAD) {
   int pminrow,pmincol,sminrow,smincol,smaxrow,smaxcol;
   int rtn;
   
-#if defined(__NetBSD__)
+#ifndef WINDOW_HAS_FLAGS
   if (0) {
 #else
   if (self->win->_flags & _ISPAD) {
   }
 
   /* 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
 	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));
 	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));
 		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);
 		result = tparm(fmt,i1,i2,i3,i4,i5,i6,i7,i8,i9);
 		break;
 	}
-
+#endif /* __hpux */
 	return PyString_FromString(result);
 }
 
 /* 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! */
 

File configure.in

   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

File pyconfig.h.in

 /* 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