[squeak-dev] Re: Question about FFI and constants

Andreas Raab andreas.raab at gmx.de
Wed Sep 30 16:50:34 UTC 2009


Use symbolic constants (pool/class vars), i.e.,

ODBXConstants class>>initialize
   ODBXErrSuccess := 1.
   "..."

and then

OpenDBXUnix apiError: handle number: ODBXErrBackend.

Cheers,
   - Andreas

Mariano Martinez Peck wrote:
> Hi folks: I am calling to the OpenDBX library and this library uses C 
> constants. Suppose something like this:
> 
> enum odbxerr {
>     ODBX_ERR_SUCCESS,
> #define ODBX_ERR_SUCCESS   ODBX_ERR_SUCCESS
>     ODBX_ERR_BACKEND,
> #define ODBX_ERR_BACKEND   ODBX_ERR_BACKEND
>     ODBX_ERR_NOCAP,
> #define ODBX_ERR_NOCAP   ODBX_ERR_NOCAP
>     ODBX_ERR_PARAM,
> .........
> 
> 
> Then I have a function like this:
> 
> char* odbx_error( odbx_t* handle, int error )
> 
> In that case the int error es the index of the array or I can use the 
> constant.
> Right now, I am using int from 0 to N. But I would like to invoke calls 
> to that function using Smalltalk Strings that represent C constants.
> 
> For example, now I have this:
> 
> OpenDBXUnix>>apiError: handle number: err
>     "long odbx_error(odbx_t*, int)"
>     <cdecl: char* 'odbx_error' (ulong long) module: 'opendbx' >
>     ^self externalCallFailed   
> 
> And I call them this way for example:
> 
> OpenDBXUnix apiError:  handle number: 1.
> 
> But, I would love to do:
> 
> OpenDBXUnix apiError:  handle number: 'ODBX_ERR_BACKEND'.
> 
> Of course this fails because it cannot coerce and String to a long.
> 
> So, that someone know how can I do this (if I can) ?
> 
> Thanks
> 
> Mariano
> 
> 
> 
> ------------------------------------------------------------------------
> 
> 




More information about the Squeak-dev mailing list