-- -- 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 . -- dispatch_table = {} dispatch_table.regex_to_handler = { ["%w+%s*\n"] = function(match) command_queue:enqueue(string.match(match , "(%w+)%s*")) end, [".*\n"] = function(match) end } function dispatch_table:load_handler_table_file(filename) local defines = require('defines') if (type(filename) ~= "nil") then if (type(filename) ~= "string") then log.printf(log.ERROR, "filename must be of type 'string' and denote a valid path") return defines.KILL_DAEMON end local chunk, err = loadfile(filename) if (not chunk) then log.printf(log.ERROR, "failed to load dispatch table: %s", err) return defines.KILL_DAEMON end self:register_handler_table(chunk()) log.printf(log.NOTICE, "loaded dispatch table from file %s", filename) end return defines.OK end function dispatch_table:register_handler_table(handler_table) if (type(handler_table) ~= "table") then error("handler_table must be of type 'table'") end self.regex_to_handler = handler_table end function dispatch_table:dispatch(command_buffer) local init = 1 repeat local had_match = false for regex, handler in pairs(self.regex_to_handler) do local match = string.match(command_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(command_buffer, init + 1) end