mcbot/cmds/calc.lua
author Mikael Berthe <mikael@lilotux.net>
Thu, 15 Apr 2010 18:57:38 +0200
changeset 16 064a50911e05
parent 0 89add07d6fe4
permissions -rw-r--r--
Update command infrastructure
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
064a50911e05 Update command infrastructure
Mikael Berthe <mikael@lilotux.net>
parents: 0
diff changeset
     1
064a50911e05 Update command infrastructure
Mikael Berthe <mikael@lilotux.net>
parents: 0
diff changeset
     2
local dc = { ["desc"] = "RPN calculator" }
064a50911e05 Update command infrastructure
Mikael Berthe <mikael@lilotux.net>
parents: 0
diff changeset
     3
local calc = { ["desc"] = "Calculator" }
0
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
local function sbox (untrusted_code)
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
    -- make environment
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
    local env = {}
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
    -- run code under environment
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
    local untrusted_function, message = loadstring(untrusted_code)
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
    if not untrusted_function then return nil, message end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
    setfenv(untrusted_function, env)
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
    local success, result = pcall(untrusted_function)
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
    if success then
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
        return result
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
    else
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
        return nil, result
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
    end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
-- ---- ----
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
16
064a50911e05 Update command infrastructure
Mikael Berthe <mikael@lilotux.net>
parents: 0
diff changeset
    23
function dc.cmd (args)
0
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
    if not args then return nil, "Give me an expression" end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
    -- Downloaded from http://www.math.bas.bg/bantchev/place/rpn/rpn.lua.html
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
    tb = {}  z = 0
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
    for tk in string.gmatch(args,'%S+') do
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
      if string.find(tk,'^[-+*/]$')  then
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
        if 2>#tb then z = nil break end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
        y,x = table.remove(tb),table.remove(tb)
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
        loadstring('z=x'..tk..'y')()
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
      else
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
        z = tonumber(tk)  if z==nil then break end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
      end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
      table.insert(tb,z)
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
    end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
    n = #tb
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
    if n==1 and z then return z
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
    elseif n>1 or z==nil then return nil, "dc: Error!" end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
16
064a50911e05 Update command infrastructure
Mikael Berthe <mikael@lilotux.net>
parents: 0
diff changeset
    42
function calc.cmd (args)
0
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
    if not args then return nil, "Give me an expression" end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
    local f, msg = sbox("return "..args)
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    45
    if not f then
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
        return nil, "calc: Cannot evaluate expression"
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
    end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
    return tostring(f)
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
end
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
mcbot_register_command("dc", dc)
89add07d6fe4 Initial revision
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
mcbot_register_command("calc", calc)