Add partial work on generating socket option code.

zmq3.0
Robert G. Jakabosky 15 years ago
parent b1157e3aaa
commit 29ac928f78

@ -18,6 +18,217 @@
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-- THE SOFTWARE.
local OPT_TYPES = {
NONE = "NONE",
INT = "int",
UINT32 = "uint32_t",
UINT64 = "uint64_t",
INT64 = "int64_t",
BLOB = "const char *",
FD = "int",
}
local get_set_prefix = {
rw = { c_get = "lzmq_socket_", get='', c_set = "lzmq_socket_set_", set='set_' },
r = { c_get = "lzmq_socket_", get='' },
w = { c_set = "lzmq_socket_", set='' },
}
local socket_options = {
{ ver_def = 'VERSION_2_0',
[1] = { name="hwm", otype="UINT64", mode="rw", ltype="int" },
[2] = { },
[3] = { name="swap", otype="INT64", mode="rw", ltype="int" },
[4] = { name="affinity", otype="UINT64", mode="rw", ltype="uint64_t" },
[5] = { name="identity", otype="BLOB", mode="rw", ltype="const char *" },
[6] = { name="subscribe", otype="BLOB", mode="w", ltype="const char *" },
[7] = { name="unsubscribe", otype="BLOB", mode="w", ltype="const char *" },
[8] = { name="rate", otype="INT64", mode="rw", ltype="int" },
[9] = { name="recovery_ivl", otype="INT64", mode="rw", ltype="int" },
[10] = { name="mcast_loop", otype="INT64", mode="rw", ltype="int" },
[11] = { name="sndbuf", otype="UINT64", mode="rw", ltype="int" },
[12] = { name="rcvbuf", otype="UINT64", mode="rw", ltype="int" },
[13] = { name="rcvmore", otype="INT64", mode="r", ltype="int" },
},
{ ver_def = 'version_2_1',
[14] = { name="fd", otype="FD", mode="r", ltype="int" },
[15] = { name="events", otype="UINT32", mode="r", ltype="int" },
[16] = { name="type", otype="INT", mode="r", ltype="int" },
[17] = { name="linger", otype="INT", mode="rw", ltype="int" },
[18] = { name="reconnect_ivl", otype="INT", mode="rw", ltype="int" },
[19] = { name="backlog", otype="INT", mode="rw", ltype="int" },
[20] = { name="recovery_ivl_msec", otype="INT64", mode="rw", ltype="int64_t" },
[21] = { name="reconnect_ivl_max", otype="INT", mode="rw", ltype="int" },
},
{ ver_def = 'VERSION_3_0',
[1] = { name="hwm", otype="INT", mode="rw",
custom = [[
ZMQ_Error lzmq_socket_set_hwm(ZMQ_Socket *sock, int value) {
int val;
int rc;
val = (int)value;
rc = zmq_setsockopt(sock, ZMQ_SNDHWM, &value, sizeof(value));
if(-1 == rc) return rc;
val = (int)value;
return zmq_setsockopt(sock, ZMQ_RCVHWM, &value, sizeof(value));
}
ZMQ_Error lzmq_socket_hwm(ZMQ_Socket *sock, int *value) {
size_t val_len;
int rc;
val_len = sizeof(value);
rc = zmq_getsockopt(sock, ZMQ_SNDHWM, value, &val_len);
if(-1 == rc) return rc;
val_len = sizeof(value);
return zmq_getsockopt(sock, ZMQ_RCVHWM, value, &val_len);
}
]] },
[2] = { },
[3] = { },
[4] = { name="affinity", otype="UINT64", mode="rw", ltype="uint64_t" },
[5] = { name="identity", otype="BLOB", mode="rw", ltype="const char *" },
[6] = { name="subscribe", otype="BLOB", mode="w", ltype="const char *" },
[7] = { name="unsubscribe", otype="BLOB", mode="w", ltype="const char *" },
[8] = { name="rate", otype="INT", mode="rw", ltype="int" },
[9] = { name="recovery_ivl", otype="INT", mode="rw", ltype="int" },
[10] = { name="mcast_loop", otype="INT", mode="rw", ltype="int" },
[11] = { name="sndbuf", otype="INT", mode="rw", ltype="int" },
[12] = { name="rcvbuf", otype="INT", mode="rw", ltype="int" },
[13] = { name="rcvmore", otype="INT", mode="r", ltype="int" },
[14] = { name="fd", otype="FD", mode="r", ltype="int" },
[15] = { name="events", otype="INT", mode="r", ltype="int" },
[16] = { name="type", otype="INT", mode="r", ltype="int" },
[17] = { name="linger", otype="INT", mode="rw", ltype="int" },
[18] = { name="reconnect_ivl", otype="INT", mode="rw", ltype="int" },
[19] = { name="backlog", otype="INT", mode="rw", ltype="int" },
[20] = { },
[21] = { name="reconnect_ivl_max", otype="INT", mode="rw", ltype="int" },
[22] = { name="maxmsgsize", otype="INT64", mode="rw", ltype="int64" },
[23] = { name="sndhwm", otype="INT", mode="rw", ltype="int" },
[24] = { name="rcvhwm", otype="INT", mode="rw", ltype="int" },
[25] = { name="multicast_hops", otype="INT", mode="rw", ltype="int" },
[26] = { },
[27] = { name="rcvtimeo", otype="INT", mode="rw", ltype="int" },
[28] = { name="sndtimeo", otype="INT", mode="rw", ltype="int" },
[29] = { name="rcvlabel", otype="INT", mode="rw", ltype="int" },
},
}
local function foreach_opt(func)
for i=1,#socket_options do
local ver_opts = socket_options[i]
for num,opt in pairs(ver_opts) do
if type(num) == 'number' and opt.name then
func(num, opt, ver_opts)
end
end
end
end
local function template(data, templ)
return templ:gsub("%${(.-)}", data)
end
-- do pre-processing of options.
foreach_opt(function(num, opt)
opt.num = num
opt.DEF = "ZMQ_" .. opt.name:upper()
-- ctype & ffi_type
local ctype = OPT_TYPES[opt.otype]
opt.ctype = ctype
if opt.otype == 'BLOB' then
opt.ffi_type = 'string'
opt.set_len_param = ', size_t value_len'
opt.set_val_name = 'value'
opt.set_len_name = 'value_len'
elseif ctype ~= 'NONE' then
opt.ffi_type = ctype .. '[1]'
opt.set_len_param = ''
opt.set_val_name = '&value'
opt.set_len_name = 'sizeof(value)'
end
-- getter/setter names
for meth,prefix in pairs(get_set_prefix[opt.mode]) do
opt[meth] = prefix .. opt.name
end
end)
local add=function(t,val) return table.insert(t,val) end
local options_c_code = {}
local function endif(t, def)
return add(t, "#endif /* #if " .. def .. " */\n")
end
-- build C code for socket options setters/getters
local last_ver
foreach_opt(function(num, opt, ver)
if ver ~= last_ver then
if last_ver then
endif(options_c_code, last_ver.ver_def)
end
last_ver = ver
add(options_c_code, "#if " .. ver.ver_def .. "\n")
end
-- generate setter
local set = ''
local get = ''
if opt.c_set then
if opt.otype == 'BLOB' then
set = [[
ZMQ_Error ${c_set}(ZMQ_Socket *sock, const char *value, size_t str_len) {
return zmq_setsockopt(sock, ${DEF}, value, str_len);
]]
elseif opt.ctype == opt.ltype then
set = [[
ZMQ_Error ${c_set}(ZMQ_Socket *sock, ${ltype} value) {
return zmq_setsockopt(sock, ${DEF}, &value, sizeof(value));
]]
else
set = [[
ZMQ_Error ${c_set}(ZMQ_Socket *sock, ${ltype} value) {
${ctype} val = (${ctype})value;
return zmq_setsockopt(sock, ${DEF}, &val, sizeof(val));
]]
end
set = set .. "}\n\n"
end
-- generate getter
if opt.c_get then
if opt.otype == 'BLOB' then
get = [[
ZMQ_Error ${c_get}(ZMQ_Socket *sock, char *value, size_t *len) {
return zmq_getsockopt(sock, ${DEF}, value, len);
]]
elseif opt.ctype == opt.ltype then
get = [[
ZMQ_Error ${c_get}(ZMQ_Socket *sock, ${ltype} *value) {
size_t val_len = sizeof(${ltype});
return zmq_getsockopt(sock, ${DEF}, value, &val_len);
]]
else
get = [[
ZMQ_Error ${c_get}(ZMQ_Socket *sock, ${ltype} *value) {
${ctype} val;
size_t val_len = sizeof(val);
int rc = zmq_getsockopt(sock, ${DEF}, &val, &val_len);
*value = (${ltype})val;
return rc;
]]
end
get = get .. "}\n\n"
end
local templ
if opt.custom then
templ = opt.custom
else
templ = set .. get
end
add(options_c_code, template(opt,templ))
end)
endif(options_c_code, last_ver.ver_def)
options_c_code = table.concat(options_c_code)
print(options_c_code)
object "ZMQ_Socket" {
error_on_null = "get_zmq_strerror()",
c_source [[

Loading…
Cancel
Save