Hi, (Short because I'm by phone) Const should be ignored so you can keep it (if not is a bug) Unsigned does not exist :) You can always put an alias, but the type you are looking for is "uint" Cheers, Esteban
On 31 Aug 2016, at 18:59, Ben Coman <btc@openinworld.com> wrote:
For this definition pulled from a library header file... typedef struct { const void *data; unsigned private_flags; } CXString;
which is used with a helper function to get a usable string like... void show_clang_version(void) { CXString version = clang_getClangVersion(); printf("%s\n", clang_getCString(version)); clang_disposeString(version); }
==> 'Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)'
So I defined... FFIExternalStructure subclass: #CXString instanceVariableNames: '' classVariableNames: '' package: 'LibCLang'
and ignoring the const as advised in the manual [1], I try... CXString class >> fieldsDesc ^ #( void *data; unsigned private_flags; )
but... CXString rebuildFieldAccessors. ==>Error: Unable to resolve external type: unsigned
I also tried "unsigned int private_flags;" but get the same error. Any ideas what is wrong?
Actually I can kind of ignore creating accessors since this is like an opaque type where I'm not expected to access its internals, but I do need CXString as a return value like this...
LibCLang class >> getClangVersion ^ self ffiCall: #( CXString clang_getClangVersion () ) module: LibCLang
which needs to be passed to this function to get a workable string....
LibCLang class >> getString: aCXString ^ self ffiCall: #( String clang_getCString ( CXString aCXString ) ) module: LibCLang
However this doesn't work if I use FFIOpaqueObject instead of FFIExternalStructure. I guess the difference is opaque objects are normally pointers to a type, whereas here that pointer is contained in a struct.
What I've done at the moment to push ahead with experimenting is avoid needing to generate accessors by adding...
CXString >> printOn: asStream self getString printOn: aStream
CXString >> getString ^ self ffiCall: #( String clang_getCString ( CXString self ) ) module: LibCLang
such that... LibCLang getClangVersion "<Print It>" ==> 'Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)'
Is there a better way to approach this?
cheers -ben
btw, this is in Pharo 5 (Moose 6).
[1] https://ci.inria.fr/pharo-contribution/view/Books/job/PharoBookWorkInProgres...