diff pytave.cc @ 0:4da14cce0890 pytave-branch

First launchpad.net check in.
author David Grundberg <c04dgg@cs.umu.se>
date Fri, 17 Oct 2008 12:05:46 +0200
parents
children d95e9d46f538
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pytave.cc	Fri Oct 17 12:05:46 2008 +0200
@@ -0,0 +1,164 @@
+/*
+ *  Copyright 2008 David Grundberg, HÃ¥kan Fors Nilsson
+ *
+ *  This file is part of Pytave.
+ *
+ *  Pytave is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  Pytave is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Pytave.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define PYTAVE_DO_DECLARE_SYMBOL
+#include "arrayobjectdefs.h"
+#include <boost/python.hpp>
+#include <boost/python/numeric.hpp>
+
+#undef HAVE_STAT /* Both boost.python and octave define HAVE_STAT... */
+#include <octave/oct.h>
+#include <octave/parse.h>
+#include <octave/load-path.h>
+#include <octave/file-io.h>
+#include <octave/ops.h>
+
+#include <iostream>
+#include <sstream>
+
+#include <sys/types.h>
+
+#include <octave/Matrix.h>
+#include <octave/ov.h>
+#include <octave/builtins.h>
+#include <octave/defaults.h>
+
+#include "pytavedefs.h"
+
+#include "exceptions.h"
+#include "python_to_octave.h"
+#include "octave_to_python.h"
+
+using namespace boost::python;
+using namespace std;
+
+namespace pytave { /* {{{ */ 
+
+   void init() {
+
+      if (!octave_error_exception::init()
+          || !value_convert_exception::init()
+          || !object_convert_exception::init()) {
+         PyErr_SetString(PyExc_ImportError, "_pytave: init failed");
+         return;
+      }
+
+      set_liboctave_error_handler(error);
+      set_liboctave_warning_handler(warning);
+      set_liboctave_warning_with_id_handler(warning_with_id);
+
+      // New in Octave 3
+      initialize_default_warning_state();
+
+      install_defaults();
+      initialize_file_io();
+      initialize_symbol_tables();
+      install_types();
+
+      install_ops();
+
+      install_builtins();
+
+      // true argument new in Octave 3
+      load_path::initialize(true); // or use false to set empty path
+
+      // initialize python numeric array
+      import_array();
+   }
+
+   boost::python::tuple get_exceptions() {
+      return make_tuple(object(handle<PyObject>(
+                                  octave_error_exception::excclass)),
+                        object(handle<PyObject>(
+                                  value_convert_exception::excclass)),
+                        object(handle<PyObject>(
+                                  object_convert_exception::excclass)));
+   }
+
+   boost::python::tuple func_eval(const int nargout,
+                                  const std::string &funcname,
+                                  const boost::python::tuple &arguments) {
+
+      octave_value_list octave_args, retval;
+
+      pytuple_to_octlist(octave_args, arguments);
+
+      reset_error_handler();
+      buffer_error_messages++;
+      
+      Py_BEGIN_ALLOW_THREADS
+      retval = feval(funcname, octave_args, nargout);
+      Py_END_ALLOW_THREADS
+
+      if (error_state != 0) {
+// error_state values:
+// -2 error without traceback
+// -1 traceback
+//  1 general error
+         int parse_status = 0;
+         reset_error_handler();
+         octave_value_list tmp = eval_string("lasterror.message",
+                                             true, parse_status, 1);
+         if (!tmp.empty() && tmp(0).is_string())
+            throw octave_error_exception(tmp(0).string_value());
+         else
+            throw octave_error_exception("");
+      }
+
+      if (nargout > 0) {
+         boost::python::tuple pytuple;
+         octlist_to_pytuple(pytuple, retval);
+         return pytuple;
+      } else {
+         // Return () if nargout <= 0.
+         return make_tuple();
+      }
+   }
+} /* namespace pytave }}} */
+
+BOOST_PYTHON_MODULE(_pytave) { /* {{{ */
+   using namespace boost::python;
+
+   def("init", pytave::init);
+   def("feval", pytave::func_eval);
+   def("get_exceptions", pytave::get_exceptions);
+
+   register_exception_translator<pytave::pytave_exception>(
+      pytave::pytave_exception::translate_exception);
+
+   register_exception_translator<pytave::octave_error_exception>(
+      pytave::octave_error_exception::translate_exception);
+
+   register_exception_translator<pytave::object_convert_exception>(
+      pytave::object_convert_exception::translate_exception);
+
+   register_exception_translator<pytave::value_convert_exception>(
+      pytave::value_convert_exception::translate_exception);
+
+} /* }}} */
+
+/* Emacs
+ * Local Variables:
+ * fill-column:79
+ * coding:utf-8
+ * indent-tabs-mode:nil
+ * c-basic-offset:3
+ * End:
+ * vim: set textwidth=79 expandtab shiftwidth=3 :
+ */