From a5d9c3339ab2e12d66ce71c8d33d749baaf45eaf Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Sat, 18 Dec 2010 22:46:58 +0000 Subject: moved dispatch table to command_table git-svn-id: https://svn.spreadspace.org/gcsd/trunk@67 ac14a137-c7f1-4531-abe0-07747231d213 --- src/Makefile | 2 +- src/command_table.lua | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/dispatch_table.lua | 82 -------------------------------------------------- src/main_loop.lua | 2 +- src/modules/exec.lua | 4 +-- src/modules/stdio.lua | 4 +-- 6 files changed, 88 insertions(+), 88 deletions(-) create mode 100644 src/command_table.lua delete mode 100644 src/dispatch_table.lua diff --git a/src/Makefile b/src/Makefile index 9f73187..8201b72 100644 --- a/src/Makefile +++ b/src/Makefile @@ -57,7 +57,7 @@ C_SRCS := $(C_OBJS:%.o=%.c) LUA_SRCS := client_list.lua \ module_list.lua \ command_queue.lua \ - dispatch_table.lua \ + command_table.lua \ main_loop.lua LUA_BYTECODE := $(EXECUTABLE).lc diff --git a/src/command_table.lua b/src/command_table.lua new file mode 100644 index 0000000..f663df3 --- /dev/null +++ b/src/command_table.lua @@ -0,0 +1,82 @@ +-- +-- 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 . +-- + +command_table = {} +command_table.regex_to_handler = { + ["%w+%s*\n"] = function(match) + command_queue:enqueue(string.match(match , "(%w+)%s*")) + end, + [".*\n"] = function(match) end +} + +function command_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 command_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 command_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 diff --git a/src/dispatch_table.lua b/src/dispatch_table.lua deleted file mode 100644 index 1b74624..0000000 --- a/src/dispatch_table.lua +++ /dev/null @@ -1,82 +0,0 @@ --- --- 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 diff --git a/src/main_loop.lua b/src/main_loop.lua index 28bd1af..b512dd2 100644 --- a/src/main_loop.lua +++ b/src/main_loop.lua @@ -74,7 +74,7 @@ function main_loop(opt) log.printf(log.NOTICE, "main_loop started") local sig = signal.init() - local return_value = dispatch_table:load_handler_table_file(opt.lua_code) + local return_value = command_table:load_handler_table_file(opt.lua_code) if (return_value == defines.KILL_DAEMON) then return_value = -1 else diff --git a/src/modules/exec.lua b/src/modules/exec.lua index 61eb34c..9ec082a 100644 --- a/src/modules/exec.lua +++ b/src/modules/exec.lua @@ -86,7 +86,7 @@ function exec:new(config, runtype) self.in_buffer = self.in_buffer .. buffer if(inst.config.runtype == defines.IN_MODULE) then - self.in_buffer = dispatch_table:dispatch(self.in_buffer) + self.in_buffer = command_table:dispatch(self.in_buffer) else -- TODO: part of expected response handling command_queue:command_completed() @@ -111,7 +111,7 @@ function exec:new(config, runtype) else self.out_buffer = string.sub(self.out_buffer, len+1) end - if(self.out_buffer == "") then + if(inst.config.runtype == defines.OUT_MODULE and self.out_buffer == "") then command_queue:command_sent() end return defines.OK diff --git a/src/modules/stdio.lua b/src/modules/stdio.lua index 597386b..943b6c5 100644 --- a/src/modules/stdio.lua +++ b/src/modules/stdio.lua @@ -64,7 +64,7 @@ function stdio:new(config, runtype) self.in_buffer = self.in_buffer .. buffer if(inst.config.runtype == defines.IN_MODULE) then - self.in_buffer = dispatch_table:dispatch(self.in_buffer) + self.in_buffer = command_table:dispatch(self.in_buffer) else -- TODO: part of expected response handling command_queue:command_completed() @@ -89,7 +89,7 @@ function stdio:new(config, runtype) else self.out_buffer = string.sub(self.out_buffer, len+1) end - if(self.out_buffer == "") then + if(inst.config.runtype == defines.OUT_MODULE and self.out_buffer == "") then command_queue:command_sent() end return defines.OK -- cgit v1.2.3