[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

[FFI] how to bind to a function with variable number of args

Ollivier Robert

1/16/2009 5:01:00 PM

I'm looking at ruby-ffi 0.2.0 with MRI 1.8.7 (haven't tried with
rubinius yet) and I can get to attach to setproctitle(3) defined like
this:

void
setproctitle(const char *fmt, ...);

-----
require "ffi"
#
module LibC
extend FFI::Library

attach_function :setproctitle, [:string, :string], []
end

LibC.setproctitle("Ruby: executing %s", $0)
----
gives
-----
FFI::NotFoundError: Function 'setproctitle' not found in [[current
process]]
from
/opt/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/library.rb:65:in
`attach_function'
-----
Any idea?
--
Posted via http://www.ruby-....

5 Answers

Luc Heinrich

1/17/2009 10:31:00 AM

0

On 16 janv. 09, at 18:00, Ollivier Robert wrote:

> I'm looking at ruby-ffi 0.2.0 with MRI 1.8.7 (haven't tried with
> rubinius yet) and I can get to attach to setproctitle(3) defined like
> this:
>
> void
> setproctitle(const char *fmt, ...);

This would be defined like this:

module LibC
extend FFI::Library
attach_function : setproctitle, [:string, :varargs], :void
end

And then used like this:

LibC.setproctitle("%d-%d", [:string, "foo", :int, 42])

--
Luc Heinrich - luc@honk-honk.com


Luc Heinrich

1/17/2009 10:36:00 AM

0

On 17 janv. 09, at 11:31, Luc Heinrich wrote:

> LibC.setproctitle("%d-%d", [:string, "foo", :int, 42])

Er, the format string should have obviously been "%s-%d" here, sorry.

--
Luc Heinrich - luc@honk-honk.com


Ollivier Robert

1/19/2009 11:23:00 AM

0

In article <AE36BD1B-11A2-4135-AB0E-33E531C2DADA@honk-honk.com>,
Luc Heinrich <luc@honk-honk.com> wrote:
>This would be defined like this:

The following does not work:
-----
module LibC
extend FFI::Library

attach_function :setproctitle, [:string, :varargs], :void
end

LibC.setproctitle("Ruby: executing %s", [:string, $0])
-----

Same error:
/opt/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/library.rb:65:in
`attach_function': Function 'setproctitle' not found in [[current process]]
(FFI::NotFoundError) from proc.rb:12

(OS X, 10.5.6, Ruby from MacPorts)

UPDATE: setproctitle may not be available in OS X. Retrying on FreeBSD leads
to this:

/usr/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/types.rb:18:in `find_type': Unable to resolve type 'stringproc.rb' (FFI::TypeError)
from /usr/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/variadic.rb:23:in `call'
from (eval):3:in `setproctitle'
from proc.rb:15

--
Ollivier ROBERT -=- EEC/RIF/SEU -=-
Systems Engineering Unit

Luc Heinrich

1/19/2009 12:06:00 PM

0

On 19 janv. 09, at 12:23, Ollivier Robert wrote:

> UPDATE: setproctitle may not be available in OS X.

Right. setproctitle is not available on OS X.

> Retrying on FreeBSD leads
> to this:
>
> /usr/local/lib/ruby/gems/1.8/gems/ffi-0.2.0/lib/ffi/types.rb:18:in
> `find_type': Unable to resolve type 'stringproc.rb' (FFI::TypeError)

Yes, and that's because I need some sleep ;)

This is the right way to call variadic functions using FFI (remove the
[ ]):

LibC.setproctitle("Ruby: executing %s", :string, $0)

Sorry about the wrong answers... :/

--
Luc Heinrich - luc@honk-honk.com


Ollivier Robert

1/19/2009 12:46:00 PM

0

In article <17C44979-6A1D-4646-945B-0595C624FBE8@honk-honk.com>,
Luc Heinrich <luc@honk-honk.com> wrote:
>This is the right way to call variadic functions using FFI (remove the
>[ ]):
>
>LibC.setproctitle("Ruby: executing %s", :string, $0)

.... and the winner is you :)

47629 ph S+ 0:00.26 ruby: Ruby: executing proc.rb (ruby)

(some redundancy there... :) )

>Sorry about the wrong answers... :/

No worry, merci.
--
Ollivier ROBERT -=- EEC/RIF/SEU -=-
Systems Engineering Unit