Subject: [ruby-ffi] Help with array of strings in a struct |
From: Drew |
Date: 5/13/10 8:14 AM |
To: ruby-ffi |
Hello, I'm trying to create an FFI wrapper for an Adobe Framemaker
automation library. Here's the sample code in C that I'm trying to re-
create in Ruby:
IntT j = 0;
UIntT i;
F_IntsT attributes;
F_StringsT strings;
/* Get name of each FontFamily and display it based on whether it is
visible
* in PGF Designer. */
strings = F_ApiGetStrings(0, FV_SessionId, FP_FontFamilyNames);
attributes = F_ApiGetInts(0, FV_SessionId, FP_FontFamilyAttributes);
for(i=0; i<attributes.len; i++){
j = attributes.val[i];
if(j & FV_FAMILY_VISIBLE)
F_Printf(NULL,"Family %s\n", strings.val[i]);
}
F_StringsT looks like this:
typedef struct {
UIntT len;
StringT *val;
} F_StringsT;
StringT is defined as unsigned char *, so I think I'm trying to read
an array of pointers to strings, or unsigned char **.
Right now I'm just trying to get the strings in Ruby:
# in my FFI module FM:
class FStringsT < FFI::Struct
layout :len, :int,
:val, :pointer
end
attach_function :FApiGetStrings,[:int,:int,:int], FStringsT.by_value
# in my script:
strings = FM.FApiGetStrings(0, FM.FVSessionId, FM.FPFontFamilyNames)
attributes = FM.FApiGetInts(0, FM.FVSessionId,
FM.FPFontFamilyAttributes)
puts strings[:len], attributes[:len] # => 337
strptr = strings[:val].read_pointer()
if !( strptr.null? )
puts strptr # => #<FFI::Pointer:0x3bd0e04>
sa = strptr.get_array_of_string(0,strings[:len]).compact # => causes
seg fault
puts sa
end
I found the get_array_of_string example on the wiki. Any ideas what I
might be doing wrong?
Thanks!
Drew