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 <b...@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/PharoBookWorkInProgress/lastSuccessfulBuild/artifact/book-result/UnifiedFFI/UnifiedFFI.pdf >