changeset 73:077a44d23b54

Work-around the locale problem by running temporarily in C locale.
author David Grundberg <individ@acc.umu.se>
date Wed, 01 Jul 2009 14:37:29 +0200
parents e3de0f6f1552 (current diff) e9834fd34416 (diff)
children 6517417e75b2
files test/test.py
diffstat 5 files changed, 89 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Jun 19 13:51:36 2009 +0200
+++ b/ChangeLog	Wed Jul 01 14:37:29 2009 +0200
@@ -1,3 +1,13 @@
+2009-07-01  David Grundberg  <individ@acc.umu.se>
+
+	* pytave.cc [HAVE_USELOCALE] (init, func_eval, str_eval): Run
+	Octave interpreter in C locale.
+	* configure.ac: Define HAVE_USELOCALE. Substitute @PYTHON@. Added
+	checks for integer typedefs.  Make setup.py executable.  Friendly
+	message on configuration completion.
+	* setup.py.in: Let setup.py be interpreted by the same version of
+	Python we configured for.
+
 2009-06-19  Jaroslav Hajek  <highegg@gmail.com>
 
 	* configure.ac: Support --enable-numpy
--- a/configure.ac	Fri Jun 19 13:51:36 2009 +0200
+++ b/configure.ac	Wed Jul 01 14:37:29 2009 +0200
@@ -74,12 +74,23 @@
 # Checks for libraries.
 
 # Checks for header files.
+AC_CHECK_HEADERS([locale.h])
 
 # Checks for typedefs, structures, and compiler characteristics.
 AC_HEADER_STDBOOL
 AC_C_CONST
+AC_C_INLINE
+AC_TYPE_INT16_T
+AC_TYPE_INT32_T
+AC_TYPE_INT64_T
+AC_TYPE_INT8_T
+AC_TYPE_SIZE_T
+AC_TYPE_UINT16_T
+AC_TYPE_UINT32_T
+AC_TYPE_UINT8_T
 
 # Checks for library functions.
+AC_CHECK_FUNCS([uselocale], [pytave_have_uselocale=yes], [pytave_have_uselocale=no])
 
 # This needs a more usable, less unusual solution.
 AS_IF(test "x${prefix}" == "xNONE",
@@ -96,12 +107,32 @@
 PYTAVE_OCTAVE_RPATH="$OCTAVE_LIBRARYDIR"
 AC_SUBST(PYTAVE_OCTAVE_RPATH)
 AC_SUBST(PYTAVE_MODULE_INSTALL_PATH)
-AC_SUBST(pytave_enable_numpy) 
+AC_SUBST(pytave_enable_numpy)
 
 # Substitutes for the Jamfile. XXX: Replace lib*.so with OS independent name.
 AC_SUBST(JAM_LIBOCTAVE, $OCTAVE_LIBRARYDIR/liboctave.so)
 AC_SUBST(JAM_LIBCRUFT, $OCTAVE_LIBRARYDIR/libcruft.so)
 AC_SUBST(JAM_LIBOCTINTERP, $OCTAVE_LIBRARYDIR/liboctinterp.so)
 
+# setup.py
+AC_SUBST(PYTHON)
+
 # Substitute in these files, copy project-root.jam to VPATH too
 AC_OUTPUT([Makefile Jamfile setup.py project-root.jam])
+
+chmod u+x "setup.py"
+
+AC_MSG_NOTICE([
+========================================================================
+Pytave now configured with the following setup:
+
+Dependencies
+  Octave ............. $OCTAVE_INCLUDEDIR
+  Python ............. $PYTHON_CPPFLAGS
+    executable ....... $PYTHON
+
+Features
+  NumPy .............. $pytave_enable_numpy
+  uselocale .......... $pytave_have_uselocale
+
+========================================================================])
--- a/pytave.cc	Fri Jun 19 13:51:36 2009 +0200
+++ b/pytave.cc	Wed Jul 01 14:37:29 2009 +0200
@@ -36,6 +36,9 @@
 #include <iostream>
 #include <sstream>
 #include <sys/types.h>
+#ifdef HAVE_USELOCALE
+#include <locale.h>
+#endif
 
 #include "pytavedefs.h"
 
@@ -46,9 +49,16 @@
 using namespace boost::python;
 using namespace std;
 
-namespace pytave { /* {{{ */ 
+namespace pytave { /* {{{ */
+
+#ifdef HAVE_USELOCALE
+   locale_t c_locale;
+#endif
 
    void init(bool silent = true) {
+#ifdef HAVE_USELOCALE
+      c_locale = newlocale(LC_ALL, "C", 0);
+#endif
 
       if (!octave_error_exception::init()
           || !value_convert_exception::init()
@@ -73,8 +83,18 @@
          argc = 3;
       }
 
+#ifdef HAVE_USELOCALE
+      // Set C locale
+      locale_t old_locale = uselocale(c_locale);
+#endif
+
       octave_main(argc, const_cast<char**>(argv), 1);
 
+#ifdef HAVE_USELOCALE
+      // Reset locale
+      uselocale(old_locale);
+#endif
+
       // Initialize Python Numeric Array
 
       // This is actually a macro that becomes a block expression. If an error
@@ -133,7 +153,6 @@
       return exceptionmsg.str ();
    }
 
-     
    boost::python::tuple func_eval(const int nargout,
                                   const string &funcname,
                                   const boost::python::tuple &arguments) {
@@ -147,11 +166,21 @@
 
       // Updating the timestamp makes Octave reread changed files
       Vlast_prompt_time.stamp();
-      
+
+#ifdef HAVE_USELOCALE
+      // Set C locale
+      locale_t old_locale = uselocale(c_locale);
+#endif
+
       Py_BEGIN_ALLOW_THREADS
       retval = feval(funcname, octave_args, (nargout >= 0) ? nargout : 0);
       Py_END_ALLOW_THREADS
 
+#ifdef HAVE_USELOCALE
+      // Reset locale
+      uselocale(old_locale);
+#endif
+
       if (error_state != 0) {
 // error_state values:
 // -2 error without traceback
@@ -190,12 +219,22 @@
 
       // Updating the timestamp makes Octave reread changed files
       Vlast_prompt_time.stamp();
-      
+
+#ifdef HAVE_USELOCALE
+      // Set C locale
+      locale_t old_locale = uselocale(c_locale);
+#endif
+
       Py_BEGIN_ALLOW_THREADS
       retval = eval_string(code, silent, parse_status,
          (nargout >= 0) ? nargout : 0);
       Py_END_ALLOW_THREADS
 
+#ifdef HAVE_USELOCALE
+      // Reset locale
+      uselocale(old_locale);
+#endif
+
       if (parse_status != 0 || error_state != 0) {
 // error_state values:
 // -2 error without traceback
@@ -301,7 +340,7 @@
             octave_call_stack::pop();
          }
    }
-      
+
 } /* namespace pytave }}} */
 
 BOOST_PYTHON_MODULE(_pytave) { /* {{{ */
--- a/setup.py.in	Fri Jun 19 13:51:36 2009 +0200
+++ b/setup.py.in	Wed Jul 01 14:37:29 2009 +0200
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!@PYTHON@
 # -*- coding: utf-8; c-basic-offset: 3; indent-tabs-mode: nil; tab-width: 3; -*-
 # @configure_input@
 
--- a/test/test.py	Fri Jun 19 13:51:36 2009 +0200
+++ b/test/test.py	Wed Jul 01 14:37:29 2009 +0200
@@ -187,7 +187,8 @@
 testequal(["mystringåäöÅÄÖ"])
 
 testexpect(1,Numeric.array([[1]],Numeric.Int))
-testexpect(1L,Numeric.array([[1]],Numeric.Int64))
+if "Int64" in Numeric.__dict__:
+    testexpect(1L,Numeric.array([[1]],Numeric.Int64))
 testexpect(1.0,Numeric.array([[1]],Numeric.Float))
 
 # Vector arrays