[Pharo-project] Question about FFI and constants
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
Another alternative to what Andreas suggested is to reify in meaningful messages the constants, see senders of YAZODRFFILibrary>>odrCreate: in the Z3950 project at SqueakSource. Cheers, Hernán 2009/9/30 Mariano Martinez Peck <marianopeck@gmail.com>:
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
Hi Mariano, what about the rule in Kent Beck Smalltalk best practices book, put magic numbers into a method. OpenDBUnix>>odbxErrBackend. ^ 1 OpenDBUnix apiError: handle number: OpenDBUnix odbxErrBackend. Or i you prefer also can code a mapping method like this one ( although the first solution is much more elegant ) OpenDBUnix>>errorFromString: 'ODBX_ERR_BACKEND' OpenDBUnix apiError: handle number: ( OpenDBUnix errorFromString: 'ODBX_ERR_BACKEND')
2009/9/30 Mariano Martinez Peck <marianopeck@gmail.com>:
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
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
participants (3)
-
Fernando olivero -
Hernán Morales Durand -
Mariano Martinez Peck