web-dev-qa-db-fra.com

Structures imbriquées en Ruby Fiddle

  • Est-il possible de définir des signatures de structure imbriquées dans Ruby Fiddle lib?
  • Ou à ce stade via une autre bibliothèque mise à jour avec laquelle je ne suis pas familier?

C'est une sorte de question désespérée puisque j'ai parcouru la documentation et le code de Fiddle et que je n'ai trouvé aucun indice sur les structures imbriquées (bien que la bibliothèque FFI ait pu le faire apparemment et que Fiddle devrait être un wrapper pour FFI).

39
Ríša Werner

Que diriez-vous:

data.c

#include <stdio.h>

struct A
{
    int a_id;
};

struct B
{
    int b_id;
    struct A a_nested;
};

void dump_b(struct B* b) {
    printf("B.b_id: %d\n", b->b_id);
    printf("B.a_nested.a_id: %d\n", b->a_nested.a_id);
}

violon.rb

# frozen_string_literal: true

require 'fiddle'
require 'fiddle/import'

module Test
  extend Fiddle::Importer

  dlload './data.dylib'

  B = struct [
    "int id",
    "int a_id"
  ]

  extern 'void dump_b(struct B*)'
end

b = Test::B.malloc

b.id = 123
b.a_id = 13

puts b.id
puts b.a_id

Test.dump_b(b)

ou ffi.rb

require 'ffi'

module Test
  extend FFI::Library

  ffi_lib 'data.dylib'

  class A < FFI::Struct
    layout :id,  :int
  end

  class B < FFI::Struct
    layout :id,  :int,
           :a_nested, A
  end

  attach_function :dump_b, [:pointer], :void
end

a = Test::A.new

a[:id] = 3000

b = Test::B.new

b[:id] = 1000
b[:a_nested] = a

puts b[:id]
puts b[:a_nested][:id]

Test.dump_b(b)

Résultat

$ gcc -c data.c
$ gcc -dynamiclib data.o -o data.dylib
$ Ruby fiddle.rb
123
13
B.b_id: 123
B.a_nested.a_id: 13
$ Ruby ffi.rb
1000
3000
B.b_id: 1000
B.a_nested.a_id: 3000
1
bliof