This is an automated email from the git hooks/post-receive script. hmmr-guest pushed a commit to branch WIP in repository cnrun.
commit 9cb1548053ab70876ee688321e1f98f79d450a68 Author: Andrei Zavada <[email protected]> Date: Sun Oct 19 20:28:13 2014 +0300 WIP --- debian/control | 2 +- upstream/configure.ac | 18 ++- upstream/doc/Makefile.am | 3 +- upstream/doc/examples/example1.lua | 2 + upstream/src/Makefile.am | 2 +- upstream/src/cnrun/Makefile.am | 32 ------ upstream/src/cnrun/cnrun.hh | 162 --------------------------- upstream/src/cnrun/commands.cc | 1 + upstream/src/cnrun/interpreter.cc | 85 ++++++++------- upstream/src/{cnrun => libcnlua}/.gitignore | 0 upstream/src/libcnlua/Makefile.am | 36 ++++++ upstream/src/libcnlua/cnhost.hh | 154 ++++++++++++++++++++++++++ upstream/src/libcnlua/lua-iface.cc | 163 ++++++++++++++++++++++++++++ 13 files changed, 415 insertions(+), 245 deletions(-) diff --git a/debian/control b/debian/control index 4a4da22..758c177 100644 --- a/debian/control +++ b/debian/control @@ -5,7 +5,7 @@ Maintainer: Andrei Zavada <[email protected]> Build-Depends: debhelper (>= 9), dh-autoreconf, autoconf-archive, g++, libgomp1, libreadline6-dev, pkg-config, libgsl0-dev, libxml2-dev, liblua5.2-dev -Standards-Version: 3.9.5 +Standards-Version: 3.9.6 Homepage: http://johnhommer.com/academic/code/cnrun Vcs-Git: git://git.debian.org/git/debian-med/cnrun.git Vcs-Browser: http://anonscm.debian.org/gitweb/?p=debian-med/cnrun.git;a=summary diff --git a/upstream/configure.ac b/upstream/configure.ac index e6c2515..bbc859d 100644 --- a/upstream/configure.ac +++ b/upstream/configure.ac @@ -1,6 +1,6 @@ AC_COPYRIGHT([Copyright (c) 2008-14 Andrei Zavada <[email protected]>]) -AC_INIT([cnrun], [1.2_rc], [[email protected]]) +AC_INIT([cnrun], [2.0.0], [[email protected]]) AC_CONFIG_SRCDIR([src/cnrun/main.cc]) AC_CONFIG_MACRO_DIR([m4]) AC_PREREQ(2.61) @@ -47,7 +47,10 @@ ac_cv_cxx_cpp11_features, ]) AC_CXX_STDCPP11_FEATURES() test $ac_cv_cxx_cpp11_features = no && \ - AC_MSG_ERROR([g++ >= 4.7 is required to build $PACKAGE as we must use -std=c++11 features your compiler doesn't seem to support], 1) + AC_MSG_ERROR([ +Your C++ compiler seems to not support some c++11 features\ +that we would rather like to have. Please check config.log for details. +], 1) cxx_version=`$CXX --version | head -n1` AC_OPENMP() @@ -60,10 +63,15 @@ fi PKG_CHECK_MODULES([LIBCN], [gsl libxml-2.0]) -AX_PROG_LUA([5.1]) +AX_PROG_LUA([5.1], [5.3],) AX_LUA_LIBS AX_LUA_HEADERS - +dnl we cannot do strcmp in cpp, so here's bash to the rescue +if test x"$LUA_VERSION" = x"5.1"; then + AC_DEFINE([HAVE_LUA_51], [], ["Do we have lua 5.1?"]) +else + AC_DEFINE([HAVE_LUA_52], [], ["Do we have lua 5.2?"]) +fi AC_ARG_ENABLE( [tools], @@ -92,7 +100,7 @@ AC_OUTPUT([ src/Makefile src/libstilton/Makefile src/libcn/Makefile - src/cnrun/Makefile + src/libcnlua/Makefile data/Makefile doc/Makefile man/cnrun.1 diff --git a/upstream/doc/Makefile.am b/upstream/doc/Makefile.am index 312471a..a8393f7 100644 --- a/upstream/doc/Makefile.am +++ b/upstream/doc/Makefile.am @@ -1,9 +1,8 @@ -ACLOCAL_AMFLAGS = -I m4 - doc_DATA = \ README examples_DATA = \ + examples/example1.lua \ examples/ratiocoding/ORNa.x1000.in \ examples/ratiocoding/ORNb.x1000.in \ examples/ratiocoding/PN.0.sxf.target \ diff --git a/upstream/doc/examples/example1.lua b/upstream/doc/examples/example1.lua new file mode 100644 index 0000000..8b28bce --- /dev/null +++ b/upstream/doc/examples/example1.lua @@ -0,0 +1,2 @@ +libcn = require("libcn") + diff --git a/upstream/src/Makefile.am b/upstream/src/Makefile.am index 884db3b..092a045 100644 --- a/upstream/src/Makefile.am +++ b/upstream/src/Makefile.am @@ -1,6 +1,6 @@ include $(top_srcdir)/src/Common.mk -SUBDIRS = libstilton libcn cnrun +SUBDIRS = libstilton libcn libcnlua if DO_TOOLS SUBDIRS += tools endif diff --git a/upstream/src/cnrun/Makefile.am b/upstream/src/cnrun/Makefile.am deleted file mode 100644 index e08045f..0000000 --- a/upstream/src/cnrun/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -include $(top_srcdir)/src/Common.mk -AM_CXXFLAGS += $(LUA_INCLUDE) - -if DO_PCH -BUILT_SOURCES := \ - cnrun.hh.gch - -CLEANFILES := $(BUILT_SOURCES) -endif - -bin_PROGRAMS := \ - cnrun -cnrun_SOURCES := \ - interpreter.cc commands.cc cnrun.hh main.cc print_version.cc -cnrun_LDADD := \ - ../libcn/libcn.la \ - ../libstilton/libstilton.la \ - $(LIBCN_LIBS) \ - $(LUA_LIB) - -print_version.o: CXXFLAGS = $(AM_CXXFLAGS) -DGIT_DESCRIBE_TAGS=\"$(shell ../../make_version)\" -print_version.o: FORCE -FORCE: - -cnrun_LDFLAGS := \ - -shared - -install-exec-hook: - rm -f $(DESTDIR)/$(pkglibdir)/*.la -uninstall-hook: - rm -f $(DESTDIR)/$(pkglibdir)/*.so - diff --git a/upstream/src/cnrun/cnrun.hh b/upstream/src/cnrun/cnrun.hh deleted file mode 100644 index 2bf3aaf..0000000 --- a/upstream/src/cnrun/cnrun.hh +++ /dev/null @@ -1,162 +0,0 @@ -/* - * File name: cnrun/cnrun.hh - * Project: cnrun - * Author: Andrei Zavada <[email protected]> - * Initial version: 2008-11-04 - * - * Purpose: interpreter - * - * License: GPL - */ - -#ifndef CNRUN_CNRUN_CNRUN_H_ -#define CNRUN_CNRUN_CNRUN_H_ - -#if HAVE_CONFIG_H && !defined(VERSION) -# include "config.h" -#endif - -#include <list> -#include <string> -extern "C" { -#include <lua.h> -} - -#include "libstilton/misc.hh" -#include "libcn/model.hh" - -namespace cnrun { - -struct SInterpOptions - : public cnrun::SModelOptions { - bool list_units:1; - string working_dir; - - list<string> - scripts; - - SInterpOptions () - : list_units (false), - working_dir (".") - {} - SInterpOptions (const SInterpOptions& rv) - : cnrun::SModelOptions (rv), - list_units (rv.list_units), - working_dir (rv.working_dir), - scripts (rv.scripts) - {} -}; - - -class CInterpreterShell - : public cnrun::stilton::C_verprintf { - - DELETE_DEFAULT_METHODS (CInterpreterShell) - - public: - CInterpreterShell (const SInterpOptions&); - ~CInterpreterShell (); - - SInterpOptions - options; - - enum class TScriptExecResult { - ok, file_error, compile_error, stack_error, call_error - }; - TScriptExecResult exec_script( const string& script_fname); - int run(); - // individual commands - struct SArg { - char type; - double vg; int vd; string vs; - explicit SArg (const double& v) : type ('g'), vg (v) {} - explicit SArg (const int& v) : type ('d'), vd (v) {} - explicit SArg (const string& v) : type ('s'), vs (v) {} - }; - enum TCmdResult { - ok = 0, - no_function, bad_arity, - bad_id, bad_value, bad_param, logic_error, - no_file, system_error, exit, - }; - struct SCmdResult { - TCmdResult result; - string error_message; - vector<SArg> values; - SCmdResult () - : result (TCmdResult::ok) - {} - SCmdResult (SCmdResult&& rv) - : result (rv.result), error_message (move(rv.error_message)), - values (move(rv.values)) - {} - }; - using TArgs = vector<SArg>; - SCmdResult cmd_new_model( const TArgs&); - SCmdResult cmd_delete_model( const TArgs&); - SCmdResult cmd_import_nml( const TArgs&); - SCmdResult cmd_export_nml( const TArgs&); - SCmdResult cmd_reset_model( const TArgs&); - SCmdResult cmd_cull_deaf_synapses( const TArgs&); - SCmdResult cmd_describe_model( const TArgs&); - SCmdResult cmd_get_model_parameter( const TArgs&); - SCmdResult cmd_set_model_parameter( const TArgs&); - SCmdResult cmd_advance( const TArgs&); - SCmdResult cmd_advance_until( const TArgs&); - - SCmdResult cmd_new_neuron( const TArgs&); - SCmdResult cmd_new_synapse( const TArgs&); - SCmdResult cmd_get_unit_properties( const TArgs&); - SCmdResult cmd_get_unit_parameter( const TArgs&); - SCmdResult cmd_set_unit_parameter( const TArgs&); - SCmdResult cmd_get_unit_vars( const TArgs&); - SCmdResult cmd_reset_unit( const TArgs&); - - SCmdResult cmd_get_units_matching( const TArgs&); - SCmdResult cmd_get_units_of_type( const TArgs&); - SCmdResult cmd_set_matching_neuron_parameter( const TArgs&); - SCmdResult cmd_set_matching_synapse_parameter( const TArgs&); - SCmdResult cmd_revert_matching_unit_parameters( const TArgs&); - SCmdResult cmd_decimate( const TArgs&); - SCmdResult cmd_putout( const TArgs&); - - SCmdResult cmd_new_tape_source( const TArgs&); - SCmdResult cmd_new_periodic_source( const TArgs&); - SCmdResult cmd_new_noise_source( const TArgs&); - SCmdResult cmd_get_sources( const TArgs&); - SCmdResult cmd_connect_source( const TArgs&); - SCmdResult cmd_disconnect_source( const TArgs&); - - SCmdResult cmd_start_listen( const TArgs&); - SCmdResult cmd_stop_listen( const TArgs&); - SCmdResult cmd_start_log_spikes( const TArgs&); - SCmdResult cmd_stop_log_spikes( const TArgs&); - - // vp - int verbose_threshold() const - { return options.verbosely; } - private: - map<string, CModel*> - models; - - lua_State - *lua_state; - - // enum class TIssueType { warning, syntax_error, system_error }; - // static const char* _issue_type_s(TIssueType); - // void _report_script_issue( TIssueType, const char* fmt, ...) const - // __attribute__ ((format (printf, 3, 4))); - public: - static list<string> list_commands(); -}; - -} - -#endif - -// Local Variables: -// Mode: c++ -// indent-tabs-mode: nil -// tab-width: 8 -// c-basic-offset: 8 -// End: diff --git a/upstream/src/cnrun/commands.cc b/upstream/src/cnrun/commands.cc index 2da9c5a..ae6bb85 100644 --- a/upstream/src/cnrun/commands.cc +++ b/upstream/src/cnrun/commands.cc @@ -90,6 +90,7 @@ cmd_delete_model( const TArgs& aa) CMD_PROLOG (1, "delete_model"); delete &M; + models.erase( model); return move(R); diff --git a/upstream/src/cnrun/interpreter.cc b/upstream/src/cnrun/interpreter.cc index 9d8a5cf..0e623b2 100644 --- a/upstream/src/cnrun/interpreter.cc +++ b/upstream/src/cnrun/interpreter.cc @@ -133,54 +133,55 @@ host_fun( lua_State* L) // -> nargsout const char* opcode = lua_tostring( L, 2); - for ( auto& C : Commands ) - if ( strcmp( opcode, C.id) == 0 ) { - if ( nargsin != strlen(C.arg_sig) ) { - reperr( sasprintf( "Bad arity in call to %s (expecting %zu arg(s), got %zu", - opcode, strlen(C.arg_sig), nargsin).c_str()); - return 2; + for ( auto& C : Commands ) { + if ( strcmp( opcode, C.id) != 0 ) + continue; + if ( nargsin != strlen(C.arg_sig) ) { + reperr( sasprintf( "Bad arity in call to %s (expecting %zu arg(s), got %zu", + opcode, strlen(C.arg_sig), nargsin).c_str()); + return 2; + } + + // we don't accept arrays from lua yet + CInterpreterShell::TArgs args; + size_t argth = 0; + while ( ++argth <= nargsin ) { + CInterpreterShell::SArg A (0); + A.type = C.arg_sig[argth-1]; + switch ( A.type ) { + case 's': A.vs = lua_tostring( L, 2 + argth); break; + case 'd': A.vd = lua_tointeger( L, 2 + argth); break; + case 'b': A.vd = lua_tointeger( L, 2 + argth); break; + case 'g': A.vg = lua_tonumber( L, 2 + argth); break; + default: + throw "Fix type literals in SCmdDesc?"; } + args.push_back(A); + } - // we don't accept arrays from lua yet - CInterpreterShell::TArgs args; - size_t argth = 0; - while ( ++argth <= nargsin ) { - CInterpreterShell::SArg A (0); - A.type = C.arg_sig[argth-1]; - switch ( A.type ) { - case 's': A.vs = lua_tostring( L, 2 + argth); break; - case 'd': A.vd = lua_tointeger( L, 2 + argth); break; - case 'b': A.vd = lua_tointeger( L, 2 + argth); break; - case 'g': A.vg = lua_tonumber( L, 2 + argth); break; + // return: ok result code, # of values pushed, value0, value1, ...; o + // non-ok result code, error string + this_p->vp( 5, "fun %s/%zu\n", C.id, args.size()); + auto R = (this_p ->* C.fun)( args); + lua_settop( L, 0); + lua_pushboolean( L, true); + lua_pushinteger( L, R.result); + if ( R.result == CInterpreterShell::TCmdResult::ok ) { + lua_pushinteger( L, R.values.size()); + for ( auto& V : R.values ) + switch (V.type) { + case 's': lua_pushstring( L, V.vs.c_str()); break; + case 'd': lua_pushinteger( L, V.vd); break; + case 'g': lua_pushnumber( L, V.vg); break; default: throw "Fix type literals in SCmdDesc?"; } - args.push_back(A); - } - - // return: ok result code, # of values pushed, value0, value1, ...; o - // non-ok result code, error string - this_p->vp( 5, "fun %s/%zu\n", C.id, args.size()); - auto R = (this_p ->* C.fun)( args); - lua_settop( L, 0); - lua_pushboolean( L, true); - lua_pushinteger( L, R.result); - if ( R.result == CInterpreterShell::TCmdResult::ok ) { - lua_pushinteger( L, R.values.size()); - for ( auto& V : R.values ) - switch (V.type) { - case 's': lua_pushstring( L, V.vs.c_str()); break; - case 'd': lua_pushinteger( L, V.vd); break; - case 'g': lua_pushnumber( L, V.vg); break; - default: - throw "Fix type literals in SCmdDesc?"; - } - return 1 + 1 + 1 + R.values.size(); - } else { - lua_pushstring( L, R.error_message.c_str()); - return 1 + 1 + 1; - } + return 1 + 1 + 1 + R.values.size(); + } else { + lua_pushstring( L, R.error_message.c_str()); + return 1 + 1 + 1; } + } reperr( sasprintf( "Unrecognized function \"%s\"/%zu", opcode, nargsin - 2).c_str()); return 2; diff --git a/upstream/src/cnrun/.gitignore b/upstream/src/libcnlua/.gitignore similarity index 100% rename from upstream/src/cnrun/.gitignore rename to upstream/src/libcnlua/.gitignore diff --git a/upstream/src/libcnlua/Makefile.am b/upstream/src/libcnlua/Makefile.am new file mode 100644 index 0000000..2996281 --- /dev/null +++ b/upstream/src/libcnlua/Makefile.am @@ -0,0 +1,36 @@ +include $(top_srcdir)/src/Common.mk +AM_CXXFLAGS += $(LUA_INCLUDE) + +if DO_PCH +BUILT_SOURCES := \ + cnhost.hh.gch + +CLEANFILES := $(BUILT_SOURCES) +endif + + +lib_LTLIBRARIES = \ + libcnlua.la +libcnlua_la_SOURCES = \ + lua-iface.cc cnhost.hh +libcnlua_la_LIBADD := \ + ../libcn/libcn.la \ + ../libstilton/libstilton.la \ + $(LIBCN_LIBS) \ + $(LUA_LIB) +libcnlua_la_LDFLAGS := \ + -shared -version-info $(subst .,:,$(PACKAGE_VERSION)) + + +#print_version.o: CXXFLAGS = $(AM_CXXFLAGS) -DGIT_DESCRIBE_TAGS=\"$(shell ../../make_version)\" +#print_version.o: FORCE +#FORCE: + +lua_libdir := $(DESTDIR)/$(libdir)/lua/$(LUA_VERSION) +install-exec-hook: + rm -f "$(DESTDIR)/$(pkglibdir)/*.la" + $(MKDIR_P) "$(lua_libdir)" + $(LN_S) -f "$(DESTDIR)/$(libdir)/libcnlua.so.$(PACKAGE_VERSION)" \ + "$(lua_libdir)/libcn.so" +uninstall-hook: + rm "$(lua_libdir)/libcn.so" diff --git a/upstream/src/libcnlua/cnhost.hh b/upstream/src/libcnlua/cnhost.hh new file mode 100644 index 0000000..7c21eff --- /dev/null +++ b/upstream/src/libcnlua/cnhost.hh @@ -0,0 +1,154 @@ +/* + * File name: cnrun/cnhost.hh + * Project: cnrun + * Author: Andrei Zavada <[email protected]> + * Initial version: 2008-11-04 + * + * Purpose: C host side for cn lua library + * + * License: GPL + */ + +#ifndef CNRUN_CNRUN_CNHOST_H_ +#define CNRUN_CNRUN_CNHOST_H_ + +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif + +#include <list> +#include <string> +extern "C" { +#include <lua.h> +} + +#include "libcn/model.hh" + +namespace cnrun { + +struct SHostOptions + : public cnrun::SModelOptions { + string working_dir; + + SHostOptions () + : working_dir (".") + {} + SHostOptions (const SHostOptions& rv) + : cnrun::SModelOptions (rv), + working_dir (rv.working_dir) + {} +}; + + +class CHost + : public cnrun::stilton::C_verprintf { + + DELETE_DEFAULT_METHODS (CHost) + + public: + CHost (const SHostOptions& rv) + : options (rv) + {} + ~CHost () + { + for ( auto& m : models ) + delete m.second; + } + + SHostOptions + options; + + bool have_model( const string& name) const + { + return models.find(name) != models.end(); + } + list<const char*> list_models() const + { + list<const char*> L; + for ( auto& x : models ) + L.push_back(x.first.c_str()); + return move(L); + } + CModel* get_model( const string& name) + { + return models.at(name); + } + bool new_model( CModel& M) + { + if ( models.find(M.name) == models.end() ) { + models[M.name] = &M; + return 0; + } else + return -1; + } + void del_model( const string& name) + { + if ( models.find(name) != models.end() ) + delete models[name]; + models.erase( name); + } + // SCmdResult cmd_new_model( const TArgs&); + // SCmdResult cmd_delete_model( const TArgs&); + // SCmdResult cmd_import_nml( const TArgs&); + // SCmdResult cmd_export_nml( const TArgs&); + // SCmdResult cmd_reset_model( const TArgs&); + // SCmdResult cmd_cull_deaf_synapses( const TArgs&); + // SCmdResult cmd_describe_model( const TArgs&); + // SCmdResult cmd_get_model_parameter( const TArgs&); + // SCmdResult cmd_set_model_parameter( const TArgs&); + // SCmdResult cmd_advance( const TArgs&); + // SCmdResult cmd_advance_until( const TArgs&); + + // SCmdResult cmd_new_neuron( const TArgs&); + // SCmdResult cmd_new_synapse( const TArgs&); + // SCmdResult cmd_get_unit_properties( const TArgs&); + // SCmdResult cmd_get_unit_parameter( const TArgs&); + // SCmdResult cmd_set_unit_parameter( const TArgs&); + // SCmdResult cmd_get_unit_vars( const TArgs&); + // SCmdResult cmd_reset_unit( const TArgs&); + + // SCmdResult cmd_get_units_matching( const TArgs&); + // SCmdResult cmd_get_units_of_type( const TArgs&); + // SCmdResult cmd_set_matching_neuron_parameter( const TArgs&); + // SCmdResult cmd_set_matching_synapse_parameter( const TArgs&); + // SCmdResult cmd_revert_matching_unit_parameters( const TArgs&); + // SCmdResult cmd_decimate( const TArgs&); + // SCmdResult cmd_putout( const TArgs&); + + // SCmdResult cmd_new_tape_source( const TArgs&); + // SCmdResult cmd_new_periodic_source( const TArgs&); + // SCmdResult cmd_new_noise_source( const TArgs&); + // SCmdResult cmd_get_sources( const TArgs&); + // SCmdResult cmd_connect_source( const TArgs&); + // SCmdResult cmd_disconnect_source( const TArgs&); + + // SCmdResult cmd_start_listen( const TArgs&); + // SCmdResult cmd_stop_listen( const TArgs&); + // SCmdResult cmd_start_log_spikes( const TArgs&); + // SCmdResult cmd_stop_log_spikes( const TArgs&); + + // vp + int verbose_threshold() const + { return options.verbosely; } + private: + map<string, CModel*> + models; + + // enum class TIssueType { warning, syntax_error, system_error }; + // static const char* _issue_type_s(TIssueType); + // void _report_script_issue( TIssueType, const char* fmt, ...) const + // __attribute__ ((format (printf, 3, 4))); + public: + static list<string> list_commands(); +}; + +} + +#endif + +// Local Variables: +// Mode: c++ +// indent-tabs-mode: nil +// tab-width: 8 +// c-basic-offset: 8 +// End: diff --git a/upstream/src/libcnlua/lua-iface.cc b/upstream/src/libcnlua/lua-iface.cc new file mode 100644 index 0000000..8bba8b3 --- /dev/null +++ b/upstream/src/libcnlua/lua-iface.cc @@ -0,0 +1,163 @@ +/* + * File name: cnrun/lua-iface.cc + * Project: cnrun + * Author: Andrei Zavada <[email protected]> + * building on original work by Thomas Nowotny <[email protected]> + * Initial version: 2014-10-09 + * + * Purpose: libcn and some state, exported for use in your lua code. + * + * License: GPL + */ + +#if HAVE_CONFIG_H && !defined(VERSION) +# include "config.h" +#endif + +#include <list> + +extern "C" { +#include <lua.h> +#include <lualib.h> +#include <lauxlib.h> +} + +#include "libstilton/string.hh" +#include "cnhost.hh" + +using namespace std; +using namespace cnrun; + +namespace { + +int check_signature( lua_State* L, const char* fun, const char* sig) +{ + using cnrun::stilton::str::sasprintf; + + size_t siglen = strlen(sig), + nargsin = lua_gettop( L); + if ( nargsin != siglen ) { + lua_pushnil(L); + lua_pushstring(L, sasprintf("%s: Expected %zu arg(s), got %zu", fun, siglen, nargsin).c_str()); + return -1; + } + + for ( size_t i = 0; i < siglen; ++i ) + switch ( sig[i] ) { + case 's': + if ( !lua_isstring( L, i) ) { + lua_pushnil(L); + lua_pushstring( L, sasprintf( "%s(\"%s\"): Expected a string arg at position %zu", fun, sig, i).c_str()); + return i + 1; + } + case 'g': + case 'd': + if ( !lua_isnumber( L, i) ) { + lua_pushnil(L); + lua_pushstring( L, sasprintf( "%s(\"%s\"): Expected a numeric arg at position %zu", fun, sig, i).c_str()); + return i + 1; + } + case 'p': + if ( !lua_islightuserdata( L, i) ) { + lua_pushnil(L); + lua_pushstring( L, sasprintf( "%s(\"%s\"): Expected a light user data arg at position %zu", fun, sig, i).c_str()); + return i + 1; + } + } + return 0; +} + +const int TWO_ARGS_FOR_ERROR = 2; + +int cn_get_context( lua_State *L) +{ + if ( check_signature( L, "cn_get_context", "") ) + return TWO_ARGS_FOR_ERROR; + + auto ctx = new CHost (SHostOptions ()); + lua_pushinteger( L, 1); + lua_pushlightuserdata( L, ctx); + return 2; +} + +int cn_new_model( lua_State *L) +{ + if ( check_signature( L, "cn_new_model", "ps") ) + return TWO_ARGS_FOR_ERROR; + + auto& C = *(CHost*)lua_topointer( L, 1); + const char* model_name = lua_tostring( L, 2); + + if ( C.have_model( model_name) ) + return lua_pushnil(L), + lua_pushstring(L, sasprintf( "cn_new_model(): Model named %s already exists", model_name).c_str()), + TWO_ARGS_FOR_ERROR; + + auto M = new CModel( + model_name, + new CIntegrateRK65( + C.options.integration_dt_min, + C.options.integration_dt_max, + C.options.integration_dt_cap), + C.options); + if ( !M ) + return lua_pushnil(L), + lua_pushstring(L, sasprintf( "cn_new_model(): Failed to create a model (%s)", model_name).c_str()), + TWO_ARGS_FOR_ERROR; + + C.new_model(*M); + + return lua_pushinteger( L, 1), + lua_pushlightuserdata( L, M), + 2; +} + + +int cn_list_models( lua_State *L) +{ + if ( check_signature( L, "cn_list_models", "p") ) + return TWO_ARGS_FOR_ERROR; + + auto& C = *(CHost*)lua_topointer( L, 1); + + lua_pushinteger( L, 1); + auto MM = C.list_models(); + for ( auto& M : MM ) + lua_pushstring( L, M); + return MM.size() + 1; +} + + +const struct luaL_Reg cnlib [] = { + {"cn_get_context", cn_get_context}, + {"cn_new_model", cn_new_model}, + {"cn_list_models", cn_list_models}, + {NULL, NULL} +}; + +} + + +extern "C" { + +int luaopen_libcn( lua_State *L) +{ +#ifdef HAVE_LUA_51 + printf( "register cnlib\n"); + luaL_register(L, "cnlib", cnlib_funtable, 0); +#else // this must be 5.2 + printf( "newlib cnlib\n"); + luaL_newlib(L, cnlib); +#endif + return 1; +} + +} + + +// Local Variables: +// Mode: c++ +// indent-tabs-mode: nil +// tab-width: 8 +// c-basic-offset: 8 +// End: -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/cnrun.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
