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