Calling an existing method with RubyInline - how?

Hi all,

RubyInline 3.6.0
Ruby 1.8.5
Suse Linux 10.1

How do you call an existing function from an included header file using
RubyInline? Do I have to wrap it in a 'built' function?

For example, say I have this bit of code, and that test.h has a function
defined as "const char* test_version(void)".

require 'inline'

class Foo
   inline do |builder|
      builder.include "<test.h>"
      builder.add_compile_flags "-ltest"
   end

   # And later...

   def self.version
      inline do |builder|
         # What do I put here?
      end
   end
end

I've tried a few variations, but haven't had any luck.

Thanks,

Dan

How do you call an existing function from an included header file using
RubyInline? Do I have to wrap it in a 'built' function?

This should help:

require 'inline'

class Foo
   inline do |builder|
     builder.include "<stdlib.h>"

     builder.c <<-EOF
       int c_atoi(char * nptr) {
         return atoi(nptr);
       }
     EOF

     builder.c_singleton <<-EOF
       int c_atol(char * nptr) {
         return atol(nptr);
       }
     EOF
   end

   class << self; alias atol c_atol; end
   alias atoi c_atoi

end

puts Foo.atol("5")
puts Foo.new.atoi("5")

For example, say I have this bit of code, and that test.h has a function
defined as "const char* test_version(void)".

From your example, probably:

require 'inline'

class Foo
   inline do |builder|
     builder.include "<test.h>"
     builder.add_compile_flags "-ltest"

     builder.c_singleton <<-EOF
       char * foo_test_version() {
         return test_version();
       }
     EOF
   end

   class << self; alias version foo_test_version; end
end

···

On Sep 29, 2006, at 9:49 PM, Daniel Berger wrote:

--
Eric Hodel - drbrain@segment7.net - http://blog.segment7.net
This implementation is HODEL-HASH-9600 compliant

http://trackmap.robotcoop.com

Thanks. Is there any way to avoid having to write wrappers for existing
functions? If not, could it be added as a feature?

I'd like to be able to just do this:

inline{ "return test_version();" }

Thanks,

Dan

···

On 9/30/06, Eric Hodel <drbrain@segment7.net> wrote:

On Sep 29, 2006, at 9:49 PM, Daniel Berger wrote:

> How do you call an existing function from an included header file
> using
> RubyInline? Do I have to wrap it in a 'built' function?

This should help:

require 'inline'

class Foo
   inline do |builder|
     builder.include "<stdlib.h>"

     builder.c <<-EOF
       int c_atoi(char * nptr) {
         return atoi(nptr);
       }
     EOF

     builder.c_singleton <<-EOF
       int c_atol(char * nptr) {
         return atol(nptr);
       }
     EOF
   end

   class << self; alias atol c_atol; end
   alias atoi c_atoi

end

puts Foo.atol("5")
puts Foo.new.atoi("5")

> For example, say I have this bit of code, and that test.h has a
> function
> defined as "const char* test_version(void)".

From your example, probably:

require 'inline'

class Foo
   inline do |builder|
     builder.include "<test.h>"
     builder.add_compile_flags "-ltest"

     builder.c_singleton <<-EOF
       char * foo_test_version() {
         return test_version();
       }
     EOF
   end

   class << self; alias version foo_test_version; end
end

Eric Hodel wrote:

> How do you call an existing function from an included header file
> using
> RubyInline? Do I have to wrap it in a 'built' function?

This should help:

require 'inline'

class Foo
   inline do |builder|
     builder.include "<stdlib.h>"

     builder.c <<-EOF
       int c_atoi(char * nptr) {
         return atoi(nptr);
       }
     EOF

     builder.c_singleton <<-EOF
       int c_atol(char * nptr) {
         return atol(nptr);
       }
     EOF
   end

   class << self; alias atol c_atol; end
   alias atoi c_atoi

end

puts Foo.atol("5")
puts Foo.new.atoi("5")

> For example, say I have this bit of code, and that test.h has a
> function
> defined as "const char* test_version(void)".

From your example, probably:

require 'inline'

class Foo
   inline do |builder|
     builder.include "<test.h>"
     builder.add_compile_flags "-ltest"

     builder.c_singleton <<-EOF
       char * foo_test_version() {
         return test_version();
       }
     EOF
   end

   class << self; alias version foo_test_version; end
end

Hm, so I have to wrap each function with a custom generated function.
Is there any chance of adding support for direct calls? Something
like:

inline{ "return test_version();" }

Or is that just not possible?

Thanks,

Dan

···

On Sep 29, 2006, at 9:49 PM, Daniel Berger wrote:

Inline doesn't have anything to read the header files to figure out the types...

···

On Sep 30, 2006, at 4:37 PM, Daniel Berger wrote:

On 9/30/06, Eric Hodel <drbrain@segment7.net> wrote:

On Sep 29, 2006, at 9:49 PM, Daniel Berger wrote:

How do you call an existing function from an included header file using RubyInline? Do I have to wrap it in a 'built' function?

From your example, probably:

require 'inline'

class Foo
   inline do |builder|
     builder.include "<test.h>"
     builder.add_compile_flags "-ltest"

     builder.c_singleton <<-EOF
       char * foo_test_version() {
         return test_version();
       }
     EOF
   end

   class << self; alias version foo_test_version; end
end

Thanks. Is there any way to avoid having to write wrappers for existing functions? If not, could it be added as a feature?

I'd like to be able to just do this:

inline{ "return test_version();" }

--
Eric Hodel - drbrain@segment7.net - http://blog.segment7.net
This implementation is HODEL-HASH-9600 compliant

http://trackmap.robotcoop.com