1module: nanomsg 2synopsis: generated bindings for the nanomsg library 3author: Bruce Mitchener, Jr. 4copyright: See LICENSE file in this distribution. 5 6define simple-C-mapped-subtype <C-buffer-offset> (<C-char*>) 7 export-map <machine-word>, export-function: identity; 8end; 9 10define interface 11 #include { 12 "sp/sp.h", 13 "sp/fanin.h", 14 "sp/inproc.h", 15 "sp/pair.h", 16 "sp/reqrep.h", 17 "sp/survey.h", 18 "sp/fanout.h", 19 "sp/ipc.h", 20 "sp/pubsub.h", 21 "sp/tcp.h" 22 }, 23 24 exclude: { 25 "SP_HAUSNUMERO", 26 "SP_PAIR_ID", 27 "SP_PUBSUB_ID", 28 "SP_REQREP_ID", 29 "SP_FANIN_ID", 30 "SP_FANOUT_ID", 31 "SP_SURVEY_ID" 32 }, 33 34 equate: {"char *" => <c-string>}, 35 36 rename: { 37 "sp_recv" => %sp-recv, 38 "sp_send" => %sp-send, 39 "sp_setsockopt" => %sp-setsockopt 40 }; 41 42 function "sp_version", 43 output-argument: 1, 44 output-argument: 2, 45 output-argument: 3; 46 47 function "sp_send", 48 map-argument: { 2 => <C-buffer-offset> }; 49 50 function "sp_recv", 51 map-argument: { 2 => <C-buffer-offset> }; 52 53end interface; 54 55// Function for adding the base address of the repeated slots of a <buffer> 56// to an offset and returning the result as a <machine-word>. This is 57// necessary for passing <buffer> contents across the FFI. 58 59define function buffer-offset 60 (the-buffer :: <buffer>, data-offset :: <integer>) 61 => (result-offset :: <machine-word>) 62 u%+(data-offset, 63 primitive-wrap-machine-word 64 (primitive-repeated-slot-as-raw 65 (the-buffer, primitive-repeated-slot-offset(the-buffer)))) 66end function; 67 68define inline function sp-send (socket :: <integer>, data :: <buffer>, flags :: <integer>) => (res :: <integer>) 69 %sp-send(socket, buffer-offset(data, 0), data.size, flags) 70end; 71 72define inline function sp-recv (socket :: <integer>, data :: <buffer>, flags :: <integer>) => (res :: <integer>) 73 %sp-recv(socket, buffer-offset(data, 0), data.size, flags); 74end; 75 76define inline method sp-setsockopt (socket :: <integer>, level :: <integer>, option :: <integer>, value :: <integer>) 77 with-stack-structure (int :: <C-int*>) 78 pointer-value(int) := value; 79 let setsockopt-result = 80 %sp-setsockopt(socket, level, option, int, size-of(<C-int*>)); 81 if (setsockopt-result < 0) 82 // Check error! 83 end; 84 setsockopt-result 85 end; 86end; 87 88define inline method sp-setsockopt (socket :: <integer>, level :: <integer>, option :: <integer>, data :: <byte-string>) 89 let setsockopt-result = 90 %sp-setsockopt(socket, level, option, as(<c-string>, data), data.size); 91 if (setsockopt-result < 0) 92 // Check error! 93 end; 94 setsockopt-result 95end; 96