if not modules then modules = { } end modules ['luat-exe'] = {
    version   = 1.001,
    comment   = "companion to luat-lib.mkiv",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

-- this module needs checking (very old and never really used, not even enabled)

local match, find, gmatch = string.match, string.find, string.gmatch
local concat = table.concat

local report_executers = logs.reporter("system","executers")

resolvers.executers = resolvers.executers or { }
local executers     = resolvers.executers

local permitted     = { }

local osexecute     = os.execute
local osexec        = os.exec
local osspawn       = os.spawn
local iopopen       = io.popen

local execute       = osexecute
local exec          = osexec
local spawn         = osspawn
local popen         = iopopen

local function register(...)
    local t = { ... }
    for k=1,#t do
        local v = t[k]
        permitted[#permitted+1] = (v == "*" and ".*") or v
    end
end

local function prepare(...)
    -- todo: make more clever first split
    local t = { ... }
    local one = t[1]
    if #t == 1 then
        if type(one) == 'table' then
            return one, concat(t," ",2,#t)
        else
            local name, arguments = match(one,"^(.-)%s+(.+)$")
            if name and arguments then
                return name, arguments
            else
                return one, ""
            end
        end
    else
        return one, concat(t," ",2,#t)
    end
end

local function executer(action)
    return function(...)
        local name, arguments = prepare(...)
        for k=1,#permitted do
            local v = permitted[k]
            if find(name,v) then
                return action(name .. " " .. arguments)
            --  print("executed: " .. name .. " " .. arguments)
            else
                report_executers("not permitted: %s %s",name,arguments)
            end
        end
        return action("")
    end
end

local function finalize() -- todo: os.exec, todo: report ipv print
    execute = executer(osexecute)
    exec    = executer(osexec)
    spawn   = executer(osspawn)
    popen   = executer(iopopen)
    finalize = function()
        report_executers("already finalized")
    end
    register = function()
        report_executers("already finalized, no registration permitted")
    end
    os.execute = execute
    os.exec    = exec
    os.spawn   = spawn
    io.popen   = popen
end

executers.finalize = function(...) return finalize(...) end
executers.register = function(...) return register(...) end
executers.execute  = function(...) return execute (...) end
executers.exec     = function(...) return exec    (...) end
executers.spawn    = function(...) return spawn   (...) end
executers.popen    = function(...) return popen   (...) end

local execution_mode  directives.register("system.executionmode", function(v) execution_mode = v end)
local execution_list  directives.register("system.executionlist", function(v) execution_list = v end)

function executers.check()
    if execution_mode == "none" then
        finalize()
    elseif execution_mode == "list" and execution_list ~= "" then
        for s in gmatch("[^%s,]",execution_list) do
            register(s)
        end
        finalize()
    else
        -- all
    end
end

--~ resolvers.executers.register('.*')
--~ resolvers.executers.register('*')
--~ resolvers.executers.register('dir','ls')
--~ resolvers.executers.register('dir')

--~ resolvers.executers.finalize()
--~ resolvers.executers.execute('dir',"*.tex")
--~ resolvers.executers.execute("dir *.tex")
--~ resolvers.executers.execute("ls *.tex")
--~ os.execute('ls')

--~ resolvers.executers.check()
