-- -- gcsd -- -- gcsd the generic command sequencer daemon can be used to serialize -- commands sent over various paralell communication channels to a -- single command output. It can be seen as a multiplexer for any -- kind of communication between a single resource and various clients -- which want to submit commands to it or query information from it. -- gcsd is written in C and Lua. The goal is to provide an easy to -- understand high level API based on Lua which can be used to -- implement the business logic of the so formed multiplexer daemon. -- -- -- Copyright (C) 2009-2010 Markus Grueneis -- Christian Pointner -- -- This file is part of gcsd. -- -- gcsd is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- any later version. -- -- gcsd is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with gcsd. If not, see . -- response_table = {} response_table.regex_to_handler = { [".*\n"] = function(match) end } function response_table:register_handler_table(handler_table) if (type(handler_table) ~= "table") then error("response handler_table must be of type 'table'") end self.regex_to_handler = handler_table log.printf(log.DEBUG, "loaded new response handler table") end function response_table:dispatch(response_buffer) local init = 1 repeat local had_match = false local regex = command_queue:get_expected_response() if regex then local match = string.match(response_buffer, "^" .. regex, init) if match then command_queue:command_completed(match) init = init + string.len(match) end end -- TODO: check if ooor's are allowed when there is an expected response for regex, handler in pairs(self.regex_to_handler) do local match = string.match(response_buffer, "^" .. regex, init) if match then handler(match) had_match = true init = init + string.len(match) break end end until (not had_match) return string.sub(response_buffer, init + 1) end