! 0MQ message definition.
!
-STRUCT: zmq_msg_t
- { data uchar[32] } ;
-
-FUNCTION: int zmq_msg_init ( zmq_msg_t* msg )
-FUNCTION: int zmq_msg_init_size ( zmq_msg_t* msg, size_t size )
-FUNCTION: int zmq_msg_init_data ( zmq_msg_t* msg, void* data, size_t size, void* ffn, void* hint )
-FUNCTION: int zmq_msg_send ( zmq_msg_t* msg, void* s, int flags )
-FUNCTION: int zmq_msg_recv ( zmq_msg_t* msg, void* s, int flags )
-FUNCTION: int zmq_msg_close ( zmq_msg_t* msg )
-FUNCTION: int zmq_msg_move ( zmq_msg_t* dest, zmq_msg_t* src )
-FUNCTION: int zmq_msg_copy ( zmq_msg_t* dest, zmq_msg_t* src )
-FUNCTION: void* zmq_msg_data ( zmq_msg_t* msg )
-FUNCTION: size_t zmq_msg_size ( zmq_msg_t* msg )
-FUNCTION: int zmq_msg_more ( zmq_msg_t* msg )
-FUNCTION: int zmq_msg_get ( zmq_msg_t* msg, int option )
-FUNCTION: int zmq_msg_set ( zmq_msg_t* msg, int option, int optval )
+FUNCTION: int zmq_msg_init ( void* msg )
+FUNCTION: int zmq_msg_init_size ( void* msg, size_t size )
+FUNCTION: int zmq_msg_init_data ( void* msg, void* data, size_t size, void* ffn, void* hint )
+FUNCTION: int zmq_msg_send ( void* msg, void* s, int flags )
+FUNCTION: int zmq_msg_recv ( void* msg, void* s, int flags )
+FUNCTION: int zmq_msg_close ( void* msg )
+FUNCTION: int zmq_msg_move ( void* dest, void* src )
+FUNCTION: int zmq_msg_copy ( void* dest, void* src )
+FUNCTION: void* zmq_msg_data ( void* msg )
+FUNCTION: size_t zmq_msg_size ( void* msg )
+FUNCTION: int zmq_msg_more ( void* msg )
+FUNCTION: int zmq_msg_get ( void* msg, int option )
+FUNCTION: int zmq_msg_set ( void* msg, int option, int optval )
!
! 0MQ socket definition.
FUNCTION: int zmq_recv ( void* s, void* buf, size_t len, int flags )
FUNCTION: int zmq_socket_monitor ( void* s, c-string addr, int events )
-FUNCTION: int zmq_sendmsg ( void* s, zmq_msg_t* msg, int flags )
-FUNCTION: int zmq_recvmsg ( void* s, zmq_msg_t* msg, int flags )
+FUNCTION: int zmq_sendmsg ( void* s, void* msg, int flags )
+FUNCTION: int zmq_recvmsg ( void* s, void* msg, int flags )
! Experimental
FUNCTION: int zmq_sendiov ( void* s, void* iov, size_t count, int flags )
! Copyright (C) 2011-2013 Eungju PARK, John Benediktsson.
! See http://factorcode.org/license.txt for BSD license.
-
USING: accessors alien.c-types alien.data arrays byte-arrays
-classes.struct combinators continuations destructors fry io
-kernel libc math namespaces sequences zeromq.ffi ;
+classes.struct combinators destructors fry kernel libc math math.order
+memoize sequences zeromq.ffi ;
IN: zeromq
: zmq-version ( -- version )
{ int int int } [ zmq_version ] with-out-parameters 3array ;
+: zmq-version-numeric ( -- n )
+ zmq-version first3 [ 100 * ] [ 10 * ] [ 1 * ] tri* + + ;
+
+! See
+! https://github.com/chuckremes/ffi-rzmq-core/blob/master/lib/ffi-rzmq-core/structures.rb
+MEMO: zmq-msg-size ( -- x )
+ zmq-version-numeric 410 <=> {
+ { +lt+ [ 32 ] }
+ { +eq+ [ 48 ] }
+ { +gt+ [ 64 ] }
+ } case ;
+
+! This word should be used to allocate the zmq_msg_t struct because
+! the size of it varies between versions.
+: <zmq_msg_t> ( -- byte-array )
+ zmq-msg-size (byte-array) ;
+
GENERIC# zmq-setopt 2 ( obj name value -- )
GENERIC# zmq-getopt 1 ( obj name -- value )
TUPLE: zmq-message underlying ;
: <zmq-message> ( -- msg )
- zmq_msg_t <struct>
+ <zmq_msg_t>
[ zmq_msg_init check-zmq-error ]
[ zmq-message boa ] bi ;
underlying>> zmq_msg_close check-zmq-error ;
: byte-array>zmq-message ( byte-array -- msg )
- zmq_msg_t <struct>
+ <zmq_msg_t>
[ over length zmq_msg_init_size check-zmq-error ]
[ zmq_msg_data swap dup length memcpy ]
[ zmq-message boa ] tri ;