octave-ruby 1.0.9 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +6 -0
- data/README.txt +1 -1
- data/ext/octave_api/Makefile +124 -59
- data/ext/octave_api/extconf.rb +5 -1
- data/ext/octave_api/octave-includes.h +5 -0
- data/ext/octave_api/octave-ruby.cpp +18 -7
- data/ext/octave_api/octave-ruby.h +10 -0
- data/ext/octave_api/octave_api.c +12 -1
- data/ext/octave_api/octave_api.h +2 -1
- data/ext/octave_api/or-array.cpp +6 -6
- data/ext/octave_api/or-cell_matrix.cpp +2 -2
- data/ext/octave_api/or-hash.cpp +3 -3
- data/ext/octave_api/or-matrix.cpp +3 -3
- data/ext/octave_api/or-string.cpp +1 -1
- data/ext/octave_api/or-struct_matrix.cpp +5 -5
- data/ext/octave_api/or-variable.cpp +1 -1
- data/lib/octave/driver/native/driver.rb +2 -7
- data/octave-ruby.gemspec +2 -2
- data/test/driver/native/test_conversions.rb +4 -3
- data/test/driver/native/test_driver.rb +4 -1
- data/test/test_engine.rb +5 -2
- metadata +17 -17
data/History.txt
CHANGED
data/README.txt
CHANGED
@@ -55,4 +55,4 @@ If you have Octave installed in a non-standard location, you can specify the loc
|
|
55
55
|
|
56
56
|
octave-ruby is licensed under the GPL License.
|
57
57
|
|
58
|
-
Copyright (c) 2007 Jonathan Younger <jonathan
|
58
|
+
Copyright (c) 2007-2012 Jonathan Younger <jonathan@daikini.com>
|
data/ext/octave_api/Makefile
CHANGED
@@ -1,63 +1,98 @@
|
|
1
1
|
|
2
2
|
SHELL = /bin/sh
|
3
3
|
|
4
|
+
# V=0 quiet, V=1 verbose. other values don't work.
|
5
|
+
V = 0
|
6
|
+
Q1 = $(V:1=)
|
7
|
+
Q = $(Q1:0=@)
|
8
|
+
n=$(NULLCMD)
|
9
|
+
ECHO1 = $(V:1=@$n)
|
10
|
+
ECHO = $(ECHO1:0=@echo)
|
11
|
+
|
4
12
|
#### Start of system configuration section. ####
|
5
13
|
|
6
|
-
srcdir =
|
7
|
-
topdir = /
|
8
|
-
hdrdir =
|
9
|
-
|
10
|
-
|
14
|
+
srcdir = /Volumes/MacintoshHD/Projects/Daikini/octave-ruby/ext/octave_api
|
15
|
+
topdir = /Users/jonathan/.rbenv/versions/1.9.3-p286/include/ruby-1.9.1
|
16
|
+
hdrdir = /Users/jonathan/.rbenv/versions/1.9.3-p286/include/ruby-1.9.1
|
17
|
+
arch_hdrdir = /Users/jonathan/.rbenv/versions/1.9.3-p286/include/ruby-1.9.1/$(arch)
|
18
|
+
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
|
19
|
+
prefix = $(DESTDIR)/Users/jonathan/.rbenv/versions/1.9.3-p286
|
20
|
+
rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
|
11
21
|
exec_prefix = $(prefix)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
psdir = $(docdir)
|
22
|
+
vendorhdrdir = $(rubyhdrdir)/vendor_ruby
|
23
|
+
sitehdrdir = $(rubyhdrdir)/site_ruby
|
24
|
+
rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version)
|
25
|
+
vendordir = $(rubylibprefix)/vendor_ruby
|
26
|
+
sitedir = $(rubylibprefix)/site_ruby
|
27
|
+
ridir = $(datarootdir)/$(RI_BASE_NAME)
|
28
|
+
mandir = $(datarootdir)/man
|
20
29
|
localedir = $(datarootdir)/locale
|
30
|
+
libdir = $(exec_prefix)/lib
|
31
|
+
psdir = $(docdir)
|
32
|
+
pdfdir = $(docdir)
|
33
|
+
dvidir = $(docdir)
|
21
34
|
htmldir = $(docdir)
|
22
|
-
|
35
|
+
infodir = $(datarootdir)/info
|
36
|
+
docdir = $(datarootdir)/doc/$(PACKAGE)
|
37
|
+
oldincludedir = $(DESTDIR)/usr/include
|
23
38
|
includedir = $(prefix)/include
|
24
|
-
|
25
|
-
sysconfdir = $(prefix)/etc
|
26
|
-
mandir = $(DESTDIR)/usr/share/man
|
27
|
-
libdir = $(exec_prefix)/lib
|
39
|
+
localstatedir = $(prefix)/var
|
28
40
|
sharedstatedir = $(prefix)/com
|
29
|
-
|
30
|
-
|
31
|
-
|
41
|
+
sysconfdir = $(prefix)/etc
|
42
|
+
datadir = $(datarootdir)
|
43
|
+
datarootdir = $(prefix)/share
|
44
|
+
libexecdir = $(exec_prefix)/libexec
|
45
|
+
sbindir = $(exec_prefix)/sbin
|
32
46
|
bindir = $(exec_prefix)/bin
|
33
|
-
|
47
|
+
rubylibdir = $(rubylibprefix)/$(ruby_version)
|
48
|
+
archdir = $(rubylibdir)/$(arch)
|
34
49
|
sitelibdir = $(sitedir)/$(ruby_version)
|
35
|
-
|
50
|
+
sitearchdir = $(sitelibdir)/$(sitearch)
|
51
|
+
vendorlibdir = $(vendordir)/$(ruby_version)
|
52
|
+
vendorarchdir = $(vendorlibdir)/$(sitearch)
|
53
|
+
|
54
|
+
NULLCMD = :
|
36
55
|
|
37
56
|
CC = gcc
|
38
|
-
|
57
|
+
CXX = g++
|
58
|
+
LIBRUBY = $(LIBRUBY_A)
|
39
59
|
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
|
40
|
-
LIBRUBYARG_SHARED =
|
41
|
-
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)
|
60
|
+
LIBRUBYARG_SHARED =
|
61
|
+
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
|
62
|
+
empty =
|
63
|
+
OUTFLAG = -o $(empty)
|
64
|
+
COUTFLAG = -o $(empty)
|
42
65
|
|
43
66
|
RUBY_EXTCONF_H =
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
67
|
+
cflags = $(optflags) $(debugflags) $(warnflags)
|
68
|
+
optflags = -O3
|
69
|
+
debugflags = -ggdb
|
70
|
+
warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration
|
71
|
+
CFLAGS = -fno-common $(cflags) -pipe $(ARCH_FLAG)
|
72
|
+
INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
|
73
|
+
DEFS =
|
74
|
+
CPPFLAGS = -DHAVE_OCTAVE_H -I/usr/local/include -I/usr/local/lib/octave -I/usr/local/include/octave-3.6.2/octave -I/usr/local/lib/octave/3.6.2 -I/usr/local/include/octave-3.6.2
|
75
|
+
CXXFLAGS = $(CFLAGS) $(cxxflags)
|
76
|
+
ldflags = -L. -L'/Users/jonathan/.rbenv/versions/1.9.3-p286/lib'
|
77
|
+
dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -Wl,-flat_namespace
|
78
|
+
ARCH_FLAG =
|
79
|
+
DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
|
49
80
|
LDSHARED = g++ -pipe -bundle
|
81
|
+
LDSHAREDXX = $(CXX) -dynamic -bundle
|
50
82
|
AR = ar
|
51
83
|
EXEEXT =
|
52
84
|
|
85
|
+
RUBY_BASE_NAME = ruby
|
53
86
|
RUBY_INSTALL_NAME = ruby
|
54
87
|
RUBY_SO_NAME = ruby
|
55
|
-
arch =
|
56
|
-
sitearch =
|
57
|
-
ruby_version = 1.
|
58
|
-
ruby = /
|
88
|
+
arch = x86_64-darwin12.2.0
|
89
|
+
sitearch = $(arch)
|
90
|
+
ruby_version = 1.9.1
|
91
|
+
ruby = /Users/jonathan/.rbenv/versions/1.9.3-p286/bin/ruby
|
59
92
|
RUBY = $(ruby)
|
60
93
|
RM = rm -f
|
94
|
+
RM_RF = $(RUBY) -run -e rm -- -rf
|
95
|
+
RMDIRS = rmdir -p
|
61
96
|
MAKEDIRS = mkdir -p
|
62
97
|
INSTALL = /usr/bin/install -c
|
63
98
|
INSTALL_PROG = $(INSTALL) -m 0755
|
@@ -68,18 +103,19 @@ COPY = cp
|
|
68
103
|
|
69
104
|
preload =
|
70
105
|
|
71
|
-
libpath = . $(libdir) /
|
72
|
-
LIBPATH = -L
|
106
|
+
libpath = . $(libdir) /usr/local/lib/octave /usr/local/lib/octave/3.6.2
|
107
|
+
LIBPATH = -L. -L$(libdir) -L/usr/local/lib/octave -L/usr/local/lib/octave/3.6.2
|
73
108
|
DEFFILE =
|
74
109
|
|
75
110
|
CLEANFILES = mkmf.log
|
76
111
|
DISTCLEANFILES =
|
112
|
+
DISTCLEANDIRS =
|
77
113
|
|
78
114
|
extout =
|
79
115
|
extout_prefix =
|
80
116
|
target_prefix =
|
81
117
|
LOCAL_LIBS =
|
82
|
-
LIBS =
|
118
|
+
LIBS = -loctinterp -lcruft -loctave -lpthread -ldl -lobjc
|
83
119
|
SRCS = octave_api.c octave-ruby.cpp or-array.cpp or-boolean_matrix.cpp or-cell_matrix.cpp or-hash.cpp or-matrix.cpp or-string.cpp or-struct_matrix.cpp or-variable.cpp
|
84
120
|
OBJS = octave_api.o octave-ruby.o or-array.o or-boolean_matrix.o or-cell_matrix.o or-hash.o or-matrix.o or-string.o or-struct_matrix.o or-variable.o
|
85
121
|
TARGET = octave_api
|
@@ -87,63 +123,92 @@ DLLIB = $(TARGET).bundle
|
|
87
123
|
EXTSTATIC =
|
88
124
|
STATIC_LIB =
|
89
125
|
|
126
|
+
BINDIR = $(bindir)
|
90
127
|
RUBYCOMMONDIR = $(sitedir)$(target_prefix)
|
91
128
|
RUBYLIBDIR = $(sitelibdir)$(target_prefix)
|
92
129
|
RUBYARCHDIR = $(sitearchdir)$(target_prefix)
|
130
|
+
HDRDIR = $(rubyhdrdir)/ruby$(target_prefix)
|
131
|
+
ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix)
|
93
132
|
|
94
133
|
TARGET_SO = $(DLLIB)
|
95
|
-
CLEANLIBS = $(TARGET).bundle
|
96
|
-
CLEANOBJS = *.o
|
97
|
-
|
98
|
-
all:
|
99
|
-
static:
|
100
|
-
|
101
|
-
clean
|
134
|
+
CLEANLIBS = $(TARGET).bundle
|
135
|
+
CLEANOBJS = *.o *.bak
|
136
|
+
|
137
|
+
all: $(DLLIB)
|
138
|
+
static: $(STATIC_LIB)
|
139
|
+
.PHONY: all install static install-so install-rb
|
140
|
+
.PHONY: clean clean-so clean-rb
|
141
|
+
|
142
|
+
clean-rb-default::
|
143
|
+
clean-rb::
|
144
|
+
clean-so::
|
145
|
+
clean: clean-so clean-rb-default clean-rb
|
102
146
|
@-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
|
103
147
|
|
104
|
-
distclean
|
148
|
+
distclean-rb-default::
|
149
|
+
distclean-rb::
|
150
|
+
distclean-so::
|
151
|
+
distclean: clean distclean-so distclean-rb-default distclean-rb
|
105
152
|
@-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
|
106
153
|
@-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
|
154
|
+
@-$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true
|
107
155
|
|
108
|
-
realclean:
|
156
|
+
realclean: distclean
|
109
157
|
install: install-so install-rb
|
110
158
|
|
111
159
|
install-so: $(RUBYARCHDIR)
|
112
160
|
install-so: $(RUBYARCHDIR)/$(DLLIB)
|
113
161
|
$(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
|
114
|
-
|
162
|
+
@-$(MAKEDIRS) $(@D)
|
163
|
+
$(INSTALL_PROG) $(DLLIB) $(@D)
|
115
164
|
install-rb: pre-install-rb install-rb-default
|
116
165
|
install-rb-default: pre-install-rb-default
|
117
166
|
pre-install-rb: Makefile
|
118
167
|
pre-install-rb-default: Makefile
|
168
|
+
pre-install-rb-default:
|
169
|
+
$(ECHO) installing default octave_api libraries
|
119
170
|
$(RUBYARCHDIR):
|
120
|
-
$(MAKEDIRS) $@
|
171
|
+
$(Q) $(MAKEDIRS) $@
|
121
172
|
|
122
173
|
site-install: site-install-so site-install-rb
|
123
174
|
site-install-so: install-so
|
124
175
|
site-install-rb: install-rb
|
125
176
|
|
126
|
-
.SUFFIXES: .c .m .cc .cxx .cpp .C .o
|
177
|
+
.SUFFIXES: .c .m .cc .mm .cxx .cpp .C .o
|
127
178
|
|
128
179
|
.cc.o:
|
129
|
-
$(
|
180
|
+
$(ECHO) compiling $(<)
|
181
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
182
|
+
|
183
|
+
.mm.o:
|
184
|
+
$(ECHO) compiling $(<)
|
185
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
130
186
|
|
131
187
|
.cxx.o:
|
132
|
-
$(
|
188
|
+
$(ECHO) compiling $(<)
|
189
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
133
190
|
|
134
191
|
.cpp.o:
|
135
|
-
$(
|
192
|
+
$(ECHO) compiling $(<)
|
193
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
136
194
|
|
137
195
|
.C.o:
|
138
|
-
$(
|
196
|
+
$(ECHO) compiling $(<)
|
197
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
139
198
|
|
140
199
|
.c.o:
|
141
|
-
$(
|
200
|
+
$(ECHO) compiling $(<)
|
201
|
+
$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
|
202
|
+
|
203
|
+
.m.o:
|
204
|
+
$(ECHO) compiling $(<)
|
205
|
+
$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
|
142
206
|
|
143
|
-
$(DLLIB): $(OBJS)
|
144
|
-
|
145
|
-
|
207
|
+
$(DLLIB): $(OBJS) Makefile
|
208
|
+
$(ECHO) linking shared-object $(DLLIB)
|
209
|
+
@-$(RM) $(@)
|
210
|
+
$(Q) $(LDSHAREDXX) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
|
146
211
|
|
147
212
|
|
148
213
|
|
149
|
-
$(OBJS): ruby.h defines.h
|
214
|
+
$(OBJS): $(hdrdir)/ruby.h $(hdrdir)/ruby/defines.h $(arch_hdrdir)/ruby/config.h
|
data/ext/octave_api/extconf.rb
CHANGED
@@ -7,7 +7,7 @@ dep_dirs = dir_config( "dep", octave_dirs.first.split(File::SEPARATOR)[0..-3].jo
|
|
7
7
|
if have_header("octave.h" ) &&
|
8
8
|
have_library("octave") &&
|
9
9
|
have_library("cruft") &&
|
10
|
-
have_library("octinterp"
|
10
|
+
have_library("octinterp")
|
11
11
|
|
12
12
|
if Config::CONFIG["arch"] =~ /-darwin\d/
|
13
13
|
CONFIG['LDSHARED'] = "g++ -pipe -bundle"
|
@@ -26,5 +26,9 @@ if have_header("octave.h" ) &&
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
+
if RUBY_VERSION =~ /1.8/ then
|
30
|
+
$CPPFLAGS += " -DRUBY_18"
|
31
|
+
end
|
32
|
+
|
29
33
|
create_makefile( "octave_api" )
|
30
34
|
end
|
@@ -1,3 +1,6 @@
|
|
1
|
+
#ifndef OCTAVE_INCLUDES_H_INCLUDED_
|
2
|
+
#define OCTAVE_INCLUDES_H_INCLUDED_
|
3
|
+
|
1
4
|
#include "octave/config.h"
|
2
5
|
#include "octave.h"
|
3
6
|
#include "symtab.h"
|
@@ -9,3 +12,5 @@
|
|
9
12
|
#include "sighandlers.h"
|
10
13
|
#include "sysdep.h"
|
11
14
|
#include "ov-struct.h"
|
15
|
+
|
16
|
+
#endif /*OCTAVE_INCLUDES_H_INCLUDED_ */
|
@@ -13,11 +13,11 @@ void initialize_octave()
|
|
13
13
|
|
14
14
|
extern void recover_from_exception(void)
|
15
15
|
{
|
16
|
-
unwind_protect::run_all();
|
16
|
+
// unwind_protect::run_all();
|
17
17
|
can_interrupt = true;
|
18
18
|
octave_interrupt_immediately = 0;
|
19
19
|
octave_interrupt_state = 0;
|
20
|
-
|
20
|
+
octave_exception_state = octave_no_exception;
|
21
21
|
}
|
22
22
|
|
23
23
|
VALUE or_feval(VALUE function_name, VALUE arguments)
|
@@ -26,14 +26,14 @@ VALUE or_feval(VALUE function_name, VALUE arguments)
|
|
26
26
|
int i, n;
|
27
27
|
octave_value_list argList;
|
28
28
|
|
29
|
-
n =
|
29
|
+
n = RARRAY_LEN(arguments);
|
30
30
|
|
31
31
|
for (i = 0; i < n; i++) {
|
32
|
-
argList(i) = OR_Variable(
|
32
|
+
argList(i) = OR_Variable(RARRAY_PTR(arguments)[i]).to_octave();
|
33
33
|
}
|
34
34
|
|
35
35
|
if (octave_set_current_context) {
|
36
|
-
unwind_protect::run_all();
|
36
|
+
// unwind_protect::run_all();
|
37
37
|
raw_mode(0);
|
38
38
|
}
|
39
39
|
|
@@ -41,10 +41,10 @@ VALUE or_feval(VALUE function_name, VALUE arguments)
|
|
41
41
|
octave_initialized = true;
|
42
42
|
|
43
43
|
try {
|
44
|
-
|
44
|
+
symbol_table::set_scope(symbol_table::top_scope());
|
45
45
|
reset_error_handler();
|
46
46
|
|
47
|
-
octave_value_list val = feval(std::string(
|
47
|
+
octave_value_list val = feval(std::string(RSTRING_PTR(function_name)), argList, 1);
|
48
48
|
if(val.length() > 0 && val(0).is_defined()) {
|
49
49
|
ruby_val = OR_Variable(val(0)).to_ruby();
|
50
50
|
}
|
@@ -60,3 +60,14 @@ VALUE or_feval(VALUE function_name, VALUE arguments)
|
|
60
60
|
|
61
61
|
return(ruby_val);
|
62
62
|
}
|
63
|
+
|
64
|
+
extern VALUE or_get_variable(VALUE variable_name)
|
65
|
+
{
|
66
|
+
return OR_Variable(get_top_level_value(std::string(RSTRING_PTR(variable_name)))).to_ruby();
|
67
|
+
}
|
68
|
+
|
69
|
+
extern VALUE or_put_variable(VALUE variable_name, VALUE value)
|
70
|
+
{
|
71
|
+
set_top_level_value(std::string(RSTRING_PTR(variable_name)), OR_Variable(value).to_octave());
|
72
|
+
return value;
|
73
|
+
}
|
@@ -7,8 +7,18 @@
|
|
7
7
|
extern "C"
|
8
8
|
{
|
9
9
|
#endif
|
10
|
+
|
11
|
+
/* Macros for backwards compatibility with 1.8 */
|
12
|
+
#ifdef RUBY_18
|
13
|
+
#define RARRAY_LEN(a) (RARRAY(a)->len)
|
14
|
+
#define RARRAY_PTR(a) (RARRAY(a)->ptr)
|
15
|
+
#define RFLOAT_VALUE(v) (RFLOAT(v)->value)
|
16
|
+
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
|
17
|
+
#endif
|
10
18
|
|
11
19
|
extern VALUE or_feval(VALUE function_name, VALUE arguments);
|
20
|
+
extern VALUE or_get_variable(VALUE variable_name);
|
21
|
+
extern VALUE or_put_variable(VALUE variable_name, VALUE value);
|
12
22
|
extern void initialize_octave();
|
13
23
|
|
14
24
|
#ifdef __cplusplus /* extern "C" */
|
data/ext/octave_api/octave_api.c
CHANGED
@@ -12,7 +12,8 @@ void Init_octave_api() {
|
|
12
12
|
OCTAVE_API = rb_define_module_under(OCTAVE_API, "Native");
|
13
13
|
OCTAVE_API = rb_define_module_under(OCTAVE_API, "API");
|
14
14
|
rb_define_module_function(OCTAVE_API, "feval", feval, 2);
|
15
|
-
|
15
|
+
rb_define_module_function(OCTAVE_API, "get_variable", get_variable, 1);
|
16
|
+
rb_define_module_function(OCTAVE_API, "put_variable", put_variable, 2);
|
16
17
|
initialize_octave();
|
17
18
|
}
|
18
19
|
|
@@ -20,3 +21,13 @@ VALUE feval(VALUE self, VALUE function_name, VALUE arguments)
|
|
20
21
|
{
|
21
22
|
return or_feval(function_name, arguments);
|
22
23
|
}
|
24
|
+
|
25
|
+
static VALUE get_variable(VALUE self, VALUE variable_name)
|
26
|
+
{
|
27
|
+
return or_get_variable(variable_name);
|
28
|
+
}
|
29
|
+
|
30
|
+
static VALUE put_variable(VALUE self, VALUE variable_name, VALUE value)
|
31
|
+
{
|
32
|
+
return or_put_variable(variable_name, value);
|
33
|
+
}
|
data/ext/octave_api/octave_api.h
CHANGED
@@ -7,7 +7,8 @@ extern "C" {
|
|
7
7
|
// Prototype for the initialization method - Ruby calls this, not you
|
8
8
|
void Init_octave_api();
|
9
9
|
static VALUE feval(VALUE self, VALUE function_name, VALUE arguments);
|
10
|
-
|
10
|
+
static VALUE get_variable(VALUE self, VALUE variable_name);
|
11
|
+
static VALUE put_variable(VALUE self, VALUE variable_name, VALUE value);
|
11
12
|
#ifdef __cplusplus
|
12
13
|
}
|
13
14
|
#endif
|
data/ext/octave_api/or-array.cpp
CHANGED
@@ -6,14 +6,14 @@ OR_Array::~OR_Array() {}
|
|
6
6
|
octave_value OR_Array::to_octave()
|
7
7
|
{
|
8
8
|
int row_index;
|
9
|
-
int number_of_rows =
|
9
|
+
int number_of_rows = RARRAY_LEN(ruby_val);
|
10
10
|
VALUE cell;
|
11
11
|
|
12
12
|
if (should_convert_to_cell_matrix()) {
|
13
13
|
Cell matrix = Cell(number_of_rows, 1);
|
14
14
|
|
15
15
|
for (row_index = 0; row_index < number_of_rows; row_index++) {
|
16
|
-
cell =
|
16
|
+
cell = RARRAY_PTR(ruby_val)[row_index];
|
17
17
|
matrix(row_index, 0) = OR_Variable(cell).to_octave();
|
18
18
|
}
|
19
19
|
|
@@ -22,10 +22,10 @@ octave_value OR_Array::to_octave()
|
|
22
22
|
Matrix matrix = Matrix(number_of_rows, 1);
|
23
23
|
|
24
24
|
for (row_index = 0; row_index < number_of_rows; row_index++) {
|
25
|
-
cell =
|
25
|
+
cell = RARRAY_PTR(ruby_val)[row_index];
|
26
26
|
|
27
27
|
if (rb_type(cell) == T_FLOAT) {
|
28
|
-
matrix(row_index, 0) =
|
28
|
+
matrix(row_index, 0) = RFLOAT_VALUE(cell);
|
29
29
|
} else if (rb_type(cell) == T_FIXNUM) {
|
30
30
|
matrix(row_index, 0) = FIX2LONG(cell);
|
31
31
|
} else {
|
@@ -42,10 +42,10 @@ bool OR_Array::should_convert_to_cell_matrix()
|
|
42
42
|
int row_index;
|
43
43
|
VALUE value;
|
44
44
|
VALUE type;
|
45
|
-
int number_of_rows =
|
45
|
+
int number_of_rows = RARRAY_LEN(ruby_val);
|
46
46
|
|
47
47
|
for (row_index = 0; row_index < number_of_rows; row_index++) {
|
48
|
-
value =
|
48
|
+
value = RARRAY_PTR(ruby_val)[row_index];
|
49
49
|
type = rb_type(value);
|
50
50
|
if (type != T_FLOAT && type != T_FIXNUM && value != Qnil) {
|
51
51
|
return true;
|
@@ -54,10 +54,10 @@ octave_value OR_CellMatrix::to_octave()
|
|
54
54
|
Cell matrix = Cell(number_of_rows, number_of_columns);
|
55
55
|
|
56
56
|
for (row_index = 0; row_index < number_of_rows; row_index++) {
|
57
|
-
row =
|
57
|
+
row = RARRAY_PTR(cells)[row_index];
|
58
58
|
|
59
59
|
for (column_index = 0; column_index < number_of_columns; column_index++) {
|
60
|
-
cell =
|
60
|
+
cell = RARRAY_PTR(row)[column_index];
|
61
61
|
matrix(row_index, column_index) = OR_Variable(cell).to_octave();
|
62
62
|
}
|
63
63
|
}
|
data/ext/octave_api/or-hash.cpp
CHANGED
@@ -7,16 +7,16 @@ octave_value OR_Hash::to_octave()
|
|
7
7
|
{
|
8
8
|
int i;
|
9
9
|
VALUE names = rb_funcall(ruby_val, rb_intern("keys"), 0);
|
10
|
-
int number_of_keys =
|
10
|
+
int number_of_keys = RARRAY_LEN(names);
|
11
11
|
|
12
12
|
string_vector keys = string_vector();
|
13
13
|
for (i = 0; i < number_of_keys; i++) {
|
14
|
-
keys.append(std::string(
|
14
|
+
keys.append(std::string(RSTRING_PTR(RARRAY_PTR(names)[i])));
|
15
15
|
}
|
16
16
|
|
17
17
|
Octave_map struct_matrix = Octave_map(dim_vector(1, 1), Cell(keys));
|
18
18
|
for (i = 0; i < number_of_keys; i++) {
|
19
|
-
struct_matrix.contents(std::string(
|
19
|
+
struct_matrix.contents(std::string(RSTRING_PTR(RARRAY_PTR(names)[i]))) = OR_Variable(rb_hash_aref(ruby_val, rb_str_new2(RSTRING_PTR(RARRAY_PTR(names)[i])))).to_octave();
|
20
20
|
}
|
21
21
|
|
22
22
|
return struct_matrix;
|
@@ -70,13 +70,13 @@ octave_value OR_Matrix::to_octave()
|
|
70
70
|
Matrix matrix = Matrix(number_of_rows, number_of_columns);
|
71
71
|
|
72
72
|
for (row_index = 0; row_index < number_of_rows; row_index++) {
|
73
|
-
row =
|
73
|
+
row = RARRAY_PTR(cells)[row_index];
|
74
74
|
|
75
75
|
for (column_index = 0; column_index < number_of_columns; column_index++) {
|
76
|
-
cell =
|
76
|
+
cell = RARRAY_PTR(row)[column_index];
|
77
77
|
|
78
78
|
if (rb_type(cell) == T_FLOAT) {
|
79
|
-
matrix(row_index, column_index) =
|
79
|
+
matrix(row_index, column_index) = RFLOAT_VALUE(cell);
|
80
80
|
} else if (rb_type(cell) == T_FIXNUM) {
|
81
81
|
matrix(row_index, column_index) = FIX2LONG(cell);
|
82
82
|
} else {
|
@@ -62,24 +62,24 @@ octave_value OR_StructMatrix::to_octave()
|
|
62
62
|
VALUE row, cell;
|
63
63
|
VALUE cells = rb_iv_get(ruby_val, "@cells");
|
64
64
|
VALUE names = rb_iv_get(ruby_val, "@names");
|
65
|
-
int number_of_keys =
|
65
|
+
int number_of_keys = RARRAY_LEN(names);
|
66
66
|
int number_of_rows = FIX2INT(rb_iv_get(ruby_val, "@m"));
|
67
67
|
int number_of_columns = FIX2INT(rb_iv_get(ruby_val, "@n"));
|
68
68
|
|
69
69
|
string_vector keys = string_vector();
|
70
70
|
for (i = 0; i < number_of_keys; i++) {
|
71
|
-
keys.append(std::string(
|
71
|
+
keys.append(std::string(RSTRING_PTR(RARRAY_PTR(names)[i])));
|
72
72
|
}
|
73
73
|
|
74
74
|
Octave_map struct_matrix = Octave_map(dim_vector(number_of_rows, number_of_columns), Cell(keys));
|
75
75
|
for (row_index = 0; row_index < number_of_rows; row_index++) {
|
76
|
-
row =
|
76
|
+
row = RARRAY_PTR(cells)[row_index];
|
77
77
|
|
78
78
|
for (column_index = 0; column_index < number_of_columns; column_index++) {
|
79
|
-
cell =
|
79
|
+
cell = RARRAY_PTR(row)[column_index];
|
80
80
|
|
81
81
|
for (i = 0; i < number_of_keys; i++) {
|
82
|
-
struct_matrix.contents(std::string(
|
82
|
+
struct_matrix.contents(std::string(RSTRING_PTR(RARRAY_PTR(names)[i])))(row_index, column_index) = OR_Variable(rb_hash_aref(cell, rb_str_new2(RSTRING_PTR(RARRAY_PTR(names)[i])))).to_octave();
|
83
83
|
}
|
84
84
|
}
|
85
85
|
}
|
@@ -39,7 +39,7 @@ octave_value OR_Variable::to_octave()
|
|
39
39
|
} else if (ruby_val == Qnil) {
|
40
40
|
return octave_NaN;
|
41
41
|
} else if (rb_type(ruby_val) == T_FLOAT) {
|
42
|
-
return
|
42
|
+
return RFLOAT_VALUE(ruby_val);
|
43
43
|
} else if (rb_type(ruby_val) == T_FIXNUM) {
|
44
44
|
return FIX2LONG(ruby_val);
|
45
45
|
} else if (rb_obj_is_kind_of(ruby_val, rb_path2class("Array")) == Qtrue) {
|
@@ -11,16 +11,11 @@ module Octave ; module Driver ; module Native
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def put_variable(name, value)
|
14
|
-
|
15
|
-
feval("eval", "function octave_ruby_put_variable(value) global #{global_name}; #{global_name} = value; endfunction")
|
16
|
-
feval("octave_ruby_put_variable", value)
|
17
|
-
result = feval("eval", "global #{global_name}; #{name} = #{global_name}")
|
18
|
-
feval("clear", global_name)
|
19
|
-
result
|
14
|
+
API.put_variable(name, value)
|
20
15
|
end
|
21
16
|
|
22
17
|
def get_variable(name)
|
23
|
-
|
18
|
+
API.get_variable(name)
|
24
19
|
end
|
25
20
|
end
|
26
21
|
end ; end ; end
|
data/octave-ruby.gemspec
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = %q{octave-ruby}
|
3
|
-
s.version = "
|
3
|
+
s.version = "2.0.0"
|
4
4
|
|
5
5
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
6
|
s.authors = ["Jonathan Younger"]
|
7
|
-
s.date = %q{
|
7
|
+
s.date = %q{2012-11-08}
|
8
8
|
s.description = %q{== USAGE: require 'octave' engine = Octave::Engine.new engine.eval "123.456 * 789.101112" engine.rand(10) matrix = Octave::Matrix.new(20, 400) 20.times { |m| 400.times { |n| matrix[m, n] = rand } } engine.put_variable("m", matrix) engine.save "/tmp/20_x_400_matrix" == REQUIREMENTS: * Octave * GCC or some other compiler to build the included extension * Mocha (For testing only)}
|
9
9
|
s.email = ["jonathan@daikini.com"]
|
10
10
|
s.extensions = ["ext/octave_api/extconf.rb"]
|
@@ -9,11 +9,11 @@ require 'yaml'
|
|
9
9
|
class ConversionsTest < Test::Unit::TestCase
|
10
10
|
def setup
|
11
11
|
@driver = Octave::Driver::Native::Driver.new
|
12
|
-
@driver.feval "eval", "function r = to_octave(val); r = val; endfunction"
|
13
12
|
end
|
14
13
|
|
15
14
|
def to_octave_to_ruby(value)
|
16
|
-
@driver.
|
15
|
+
@driver.put_variable("to_octave_to_ruby_variable", value)
|
16
|
+
@driver.get_variable("to_octave_to_ruby_variable")
|
17
17
|
end
|
18
18
|
|
19
19
|
def assert_octave_and_ruby_equal(value)
|
@@ -197,7 +197,8 @@ class ConversionsTest < Test::Unit::TestCase
|
|
197
197
|
|
198
198
|
def test_should_convert_boolean_matrix
|
199
199
|
assert_octave_and_ruby_equal [true, false, true]
|
200
|
-
|
200
|
+
@driver.put_variable("x", [1,2])
|
201
|
+
boolean_matrix = @driver.feval "eval", "(x > 2 | x < 2)"
|
201
202
|
assert_equal [true, false], boolean_matrix
|
202
203
|
end
|
203
204
|
end
|
@@ -24,9 +24,12 @@ class DriverTest < Test::Unit::TestCase
|
|
24
24
|
|
25
25
|
def test_putting_variable_with_same_name_multiple_times
|
26
26
|
assert_equal "foo", @driver.put_variable("some_variable_name", "foo")
|
27
|
+
assert_equal "foo", @driver.get_variable("some_variable_name")
|
28
|
+
|
27
29
|
assert_equal "bar", @driver.put_variable("some_variable_name", "bar")
|
28
|
-
assert_equal "
|
30
|
+
assert_equal "bar", @driver.get_variable("some_variable_name")
|
29
31
|
|
32
|
+
assert_equal "baz", @driver.put_variable("some_variable_name", "baz")
|
30
33
|
assert_equal "baz", @driver.get_variable("some_variable_name")
|
31
34
|
end
|
32
35
|
end
|
data/test/test_engine.rb
CHANGED
@@ -19,12 +19,15 @@ class EngineTest_Init < Test::Unit::TestCase
|
|
19
19
|
exception = assert_raise(LoadError) do
|
20
20
|
engine = Octave::Engine.new(:driver => "foo")
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
|
+
expected_message = "-- octave/driver/foo/driver"
|
24
|
+
assert_equal expected_message, exception.message[-expected_message.length, expected_message.length]
|
23
25
|
|
24
26
|
exception = assert_raise(LoadError) do
|
25
27
|
engine = Octave::Engine.new(:driver => :bar)
|
26
28
|
end
|
27
|
-
|
29
|
+
expected_message = "-- octave/driver/bar/driver"
|
30
|
+
assert_equal expected_message, exception.message[-expected_message.length, expected_message.length]
|
28
31
|
end
|
29
32
|
|
30
33
|
def test_new_with_native_driver
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: octave-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 2
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
version: 2.0.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Jonathan Younger
|
@@ -9,19 +14,10 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2012-11-08 00:00:00 -07:00
|
13
18
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
name: hoe
|
17
|
-
type: :development
|
18
|
-
version_requirement:
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 1.8.2
|
24
|
-
version:
|
19
|
+
dependencies: []
|
20
|
+
|
25
21
|
description: "== USAGE: require 'octave' engine = Octave::Engine.new engine.eval \"123.456 * 789.101112\" engine.rand(10) matrix = Octave::Matrix.new(20, 400) 20.times { |m| 400.times { |n| matrix[m, n] = rand } } engine.put_variable(\"m\", matrix) engine.save \"/tmp/20_x_400_matrix\" == REQUIREMENTS: * Octave * GCC or some other compiler to build the included extension * Mocha (For testing only)"
|
26
22
|
email:
|
27
23
|
- jonathan@daikini.com
|
@@ -76,6 +72,8 @@ files:
|
|
76
72
|
- test/test_engine.rb
|
77
73
|
has_rdoc: true
|
78
74
|
homepage: http://octave-ruby.rubyforge.org/
|
75
|
+
licenses: []
|
76
|
+
|
79
77
|
post_install_message:
|
80
78
|
rdoc_options:
|
81
79
|
- --main
|
@@ -87,20 +85,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
87
85
|
requirements:
|
88
86
|
- - ">="
|
89
87
|
- !ruby/object:Gem::Version
|
88
|
+
segments:
|
89
|
+
- 0
|
90
90
|
version: "0"
|
91
|
-
version:
|
92
91
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
92
|
requirements:
|
94
93
|
- - ">="
|
95
94
|
- !ruby/object:Gem::Version
|
95
|
+
segments:
|
96
|
+
- 0
|
96
97
|
version: "0"
|
97
|
-
version:
|
98
98
|
requirements: []
|
99
99
|
|
100
100
|
rubyforge_project: octave-ruby
|
101
|
-
rubygems_version: 1.3.
|
101
|
+
rubygems_version: 1.3.6
|
102
102
|
signing_key:
|
103
|
-
specification_version:
|
103
|
+
specification_version: 3
|
104
104
|
summary: A Ruby interface to the Octave interpreted language.
|
105
105
|
test_files:
|
106
106
|
- test/driver/native/test_conversions.rb
|