From 9d3defc47769f04bebdbf3f8ff5a60047be5a360 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Mon, 8 Nov 2010 01:23:11 +0000 Subject: [PATCH] Forgotten library (issue 399) git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1647 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- share/grafx2/scripts/libs/memory.lua | 132 +++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 share/grafx2/scripts/libs/memory.lua diff --git a/share/grafx2/scripts/libs/memory.lua b/share/grafx2/scripts/libs/memory.lua new file mode 100644 index 00000000..22d1ea24 --- /dev/null +++ b/share/grafx2/scripts/libs/memory.lua @@ -0,0 +1,132 @@ +-- Persistence library: +-- Memorize data for current function +-- memory.save(tab) and tab=memory.load() +-- +-- The data will be stored in file called +-- ZZZ.dat +-- in the lua directory +-- +-- Example 1: +-- +-- -- Load initial values or set defaults +-- arg = memory.load({picX=320,picY=200,scale=0}) +-- -- Run an inputbox +-- OK,arg.picX,arg.picY,arg.scale = inputbox("Image Size")", +-- "Width", arg.picX, 1,2048,0, +-- "Height", arg.picY, 1,2048,0, +-- "Scale", arg.scale, 0,1,0); +-- if OK == true then +-- -- Save the selected values +-- memory.save(arg) +-- end + +-- Example 2: +-- +-- -- Load initial values or set defaults +-- arg = memory.load({x=320,y=200,scale=0}) +-- picX=arg.x +-- picY=arg.y +-- scale=arg.scale +-- -- Run an inputbox +-- OK,picX,picY,scale = inputbox("Image Size")", +-- "Width", picX, 1,2048,0, +-- "Height", picY, 1,2048,0, +-- "Scale", scale, 0,1,0); +-- if OK == true then +-- -- Save the selected values +-- memory.save({x=picX,y=picY,scale=scale}) +-- end + + +memory = +{ + serialize = function(o) + if type(o) == "number" then + return tostring(o) + elseif type(o) == "string" then + return string.format("%q", o) + --elseif type(o) == "table" then + -- io.write("{\n") + -- for k,v in pairs(o) do + -- io.write(" ", k, " = ") + -- memory.serialize(v) + -- io.write(",\n") + -- end + -- io.write("}\n") + else + error("cannot serialize a " .. type(o)) + end + end; + + -- Return a string identifying the calling function. + -- Pass 1 for parent, 2 for grandparent etc. + callername = function(level) + local w + local last_slash + local info = debug.getinfo(level+1,"Sn") + local caller=tostring(info.name) + -- Function name if possible + if (caller~="nil") then + return caller + end + -- Otherwise, get file name, without extension + + -- Get part after directory name + last_slash=0 + while true do + local pos = string.find(info.short_src, "/", last_slash+1) + if (pos==nil) then break end + last_slash=pos + end + caller=string.sub(info.short_src, last_slash+1) + + -- Remove file extension + if (string.sub(caller,-4, -1)==".lua") then + caller=string.sub(caller, 1, -5) + end + return caller + end; + + -- Memorize some parameters. + save = function(o) + local caller=memory.callername(2) + --for k, v in pairs(o) do + -- messagebox(tostring(k)) + -- messagebox(tostring(v)) + --end + local f, e = io.open("ZZZ"..caller..".dat", "w"); + if (f ~= nil) then + f:write("Entry {\n") + for k, v in pairs(o) do + if (type(v)=="number") then + f:write(" "..k.."="..memory["serialize"](v)..",\n") + end + end + f:write("}\n") + f:close() + end + end; + + + -- Recover some saved parameters. + load = function(o) + local caller=memory.callername(2) + local i + + function Entry (b) + -- Adds (or replaces) values in arg with those from b + for k, v in pairs(b) do + o[k]=v + end + end + local f = (loadfile("ZZZ"..caller..".dat")) + if (f ~= nil) then + f() + end + + return o + end; + +} + +return memory