From a555d7d9a703d0e53b22259fe3b604ee59284ccd Mon Sep 17 00:00:00 2001 From: "Franklin \"Snaipe\" Mathieu" Date: Sun, 6 Nov 2016 22:48:01 +0100 Subject: [PATCH] dsl: Allow usage of `_` as a name for anonymous hidden fields. Fixes #10. --- src/wssdl/core.lua | 4 ++-- src/wssdl/placeholder.lua | 24 +++++++++++++++++------- src/wssdl/wireshark.lua | 13 ++++++++++--- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/wssdl/core.lua b/src/wssdl/core.lua index 3d1aba4..18f8222 100644 --- a/src/wssdl/core.lua +++ b/src/wssdl/core.lua @@ -156,7 +156,7 @@ setmetatable(wssdl._packet, { local out = pkt._create(pkt, ...) for k, v in pairs(wssdl._current_def) do - if k:sub(1,1) ~= '_' then + if type(v) == 'table' then v._pktdef = nil end end @@ -278,7 +278,7 @@ setmetatable(wssdl, { newpacket._properties = newprops setmetatable(newpacket, getmetatable(wssdl._packet)) - wssdl._current_def = { _pktdef = newpacket } + wssdl._current_def = {} -- Switch to the packet definition metatable local env = setmetatable({}, packetdef_metatable) diff --git a/src/wssdl/placeholder.lua b/src/wssdl/placeholder.lua index 22ffb97..d902dec 100644 --- a/src/wssdl/placeholder.lua +++ b/src/wssdl/placeholder.lua @@ -305,14 +305,24 @@ placeholder.metatable = function(defenv, packetdef_metatable, make_pktfield) return nil end - if field._name:sub(1,1) == '_' then - error('wssdl: Invalid identifier for field ' .. utils.quote(field._name) .. ': Fields must not start with an underscore', 3) - end - if wssdl._current_def[field._name] and wssdl._current_def[field._name] ~= field then - error('wssdl: Duplicate field ' .. utils.quote(field._name) .. ' in packet definition.', 3) - end + if wssdl._current_def[field._name] ~= field then + if wssdl._current_def[field._name] then + error('wssdl: Duplicate field ' .. utils.quote(field._name) .. ' in packet definition.', 3) + end - wssdl._current_def[field._name] = field + if field._name ~= '_' then + if field._name:sub(1,1) == '_' then + error('wssdl: Invalid identifier for field ' .. utils.quote(field._name) .. ': Fields must not start with an underscore', 3) + end + else + local i = wssdl._current_def._anonymous_counter or 1 + field._name = '_anonymous_' .. i .. '' + wssdl._current_def._anonymous_counter = i + 1 + field._hidden = true + end + + wssdl._current_def[field._name] = field + end local type = rawget(specifiers.field_types, k) if type == nil then diff --git a/src/wssdl/wireshark.lua b/src/wssdl/wireshark.lua index 079f38a..9b8911c 100644 --- a/src/wssdl/wireshark.lua +++ b/src/wssdl/wireshark.lua @@ -99,7 +99,9 @@ ws.make_fields = function (fields, pkt, prefix) local prefix = prefix or '' for i, field in ipairs(pkt._definition) do - make_field(fields, prefix, field) + if not field._hidden then + make_field(fields, prefix, field) + end end end @@ -225,12 +227,17 @@ ws.dissector = function (pkt, proto) local labels = pktval.label[field._name] or {} local val = pktval.val[field._name] local raw = pktval.buf[field._name] + local node if field._type == 'packet' then local pktval = { buf = raw, label = labels, val = val } - node = tree:add(protofield, raw._self, '', unpack(labels)) + if field._hidden then + node = tree:add(protofield, raw._self, '', '') + else + node = tree:add(protofield, raw._self, '', unpack(labels)) + end tree_add_fields(field._packet, prefix .. field._name .. '.', node, pktval) - else + elseif not field._hidden then node = tree:add(protofield, raw, val, unpack(labels)) end end