|
Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
-- common.lua: functions from my LUA_INIT file.
-- This file:
-- http://angg.twu.net/dednat5/common.lua.html
-- http://angg.twu.net/dednat5/common.lua
-- (find-dn5 "common.lua")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
-- Version: 2011dec03
-- License: GPL3
-- (find-blogme4 "common.lua")
-- (find-angg "LUA/lua50init.lua" "PP")
-- «.readfile» (to "readfile")
-- «.writefile» (to "writefile")
-- «.split» (to "split")
-- «.untabify» (to "untabify")
-- «.printf» (to "printf")
-- «.PP» (to "PP")
-- «.pack-and-unpack» (to "pack-and-unpack")
-- «.guill» (to "guill")
-- «.gformat» (to "gformat")
-- «.ee_template» (to "ee_template")
-- «.errors» (to "errors")
-- «readfile» (to ".readfile")
-- «writefile» (to ".writefile")
-- (find-angg "LUA/lua50init.lua" "readfile")
-- (find-angg "LUA/lua50init.lua" "writefile")
readfile = function (fname)
local f = assert(io.open(fname, "r"))
local bigstr = f:read("*a")
f:close()
return bigstr
end
writefile = function (fname, bigstr)
local f = assert(io.open(fname, "w+"))
f:write(bigstr)
f:close()
end
-- (find-angg "LUA/lua50init.lua" "mapconcat")
map = function (f, arr, n)
local brr = {}
for i=1,(n or #arr) do table.insert(brr, f(arr[i])) end
return brr
end
mapconcat = function (f, tbl, sep) return table.concat(map(f, tbl), sep) end
nop = function () end
id = function (...) return ... end
-- (find-luamanualw3m "#pdf-table.sort")
sorted = function (tbl, lt) table.sort(tbl, lt); return tbl end
-- «split» (to ".split")
-- (find-angg "LUA/lua50init.lua" "split")
split = function (str, pat)
local arr = {}
string.gsub(str, pat or "([^%s]+)", function (word)
table.insert(arr, word)
end)
return arr
end
-- «untabify» (to ".untabify")
-- (find-angg "LUA/lua50init.lua" "untabify")
-- Note: to untabify strings in encodings where chars can be more than
-- 1-byte long, change the "#" below... (I never had to do that,
-- though).
untabify_table =
{" ", " ", " ", " ", " ", " ", " ", " "}
--{"--------", "-------", "------", "-----", "----", "---", "--", "-"}
untabify_strtab = function (strbeforetab)
return strbeforetab ..
untabify_table[math.fmod(#strbeforetab, 8) + 1]
end
untabify = function (str)
return (gsub(str, "([^\t\r\n]*)\t", untabify_strtab))
end
-- (find-angg "LUA/lua50init.lua" "mytostring")
tos_compare_pairs = function (pair1, pair2)
local key1, key2 = pair1.key, pair2.key
local type1, type2 = type(key1), type(key2)
if type1 == type2 then
if type1 == "number" then return key1 < key2 end
if type1 == "string" then return key1 < key2 end
return tostring(key1) < tostring(key2) -- fast
else
return type1 < type2 -- numbers before strings before tables, etc
end
end
tos_sorted_pairs = function (T)
local Tpairs = {}
for key,val in pairs(T) do
table.insert(Tpairs, {key=key, val=val})
end
return sorted(Tpairs, tos_compare_pairs)
end
tos_table_orig = function (T, sep)
return "{"..mapconcat(tos_pair, tos_sorted_pairs(T), sep or ", ").."}"
end
tos_table = tos_table_orig
tos = function (o)
local t = type(o)
if t=="number" then return tostring(o) end
if t=="string" then return string.format("%q", o) end
if t=="table" then return tos_table(o) end
return "<"..tostring(o)..">"
end
tos_key = tos -- change this to print string keys differently
tos_pair = function (pair)
return tos_key(pair.key).."="..tos(pair.val)
end
mysort = tos_sorted_pairs -- compatibility
mytostring = tos -- compatibility
mytostring_arg = function (T, sep)
return mapconcat(tos, T, sep or " ", T.n)
end
-- Tools for building extensions
tos_good_string_key = function (key)
return type(key) == "string" and key:match("^[A-Za-z_][A-Za-z_0-9]*$")
end
tos_has_tostring = function (o)
return getmetatable(T) and getmetatable(T).__tostring
end
tos_has_eootype = function (o)
return type(o) == "table" and getmetatable(o) and getmetatable(o).type
end
-- «printf» (to ".printf")
-- (find-angg "LUA/lua50init.lua" "printf")
printf = function (...) io.write(string.format(...)) end
-- «PP» (to ".PP")
-- (find-angg "LUA/lua50init.lua" "PP")
-- Examples:
-- PP(nil, true, false, 22, "22", "a\nb", print, nil)
--> <nil> <true> <false> 22 "22" "a\
-- b" <function: 0x806b388> <nil>
--
-- PP({44, 55, nil, 77, [{a=11}]={[22]="b"}, [{}]={}, [{}]={}})
--> {1=44, 2=55, 4=77, {"a"=11}={22="b"}, {}={}, {}={}}
--
PP = function (...)
-- local arg = arg or pack(...) -- for Lua 5.2
local arg = pack(...) -- for Lua 5.2
for i=1,arg.n do printf(" %s", mytostring(arg[i])) end
printf("\n")
return myunpack(arg) -- todo: change to "..." (a 5.1-ism)
end
-- «pack-and-unpack» (to ".pack-and-unpack")
-- (find-angg "LUA/lua50init.lua" "pack-and-unpack")
-- (find-luamanualw3m "#pdf-unpack")
-- pack = table.pack or function (...) return arg end
pack = table.pack or function (...) return {n=select("#", ...), ...} end
unpack = unpack or table.unpack
myunpack = function (arg) return unpack(arg, 1, arg.n) end
-- «guill» (to ".guill")
-- «gformat» (to ".gformat")
-- «ee_template» (to ".ee_template")
-- (find-angg "LUA/lua50init.lua" "gformat")
-- (find-angg "LUA/lua50init.lua" "ee_template")
-- These are mostly for build.lua...
guill = function (str) return (str:gsub("<<", "\171"):gsub(">>", "\187")) end
gformat = function (fmt, pat)
return function (str)
return (str:gsub((pat or "^.*$"), fmt))
end
end
ee_template = function (pairs, templatestr)
return (string.gsub(templatestr, "{([^{}]+)}", pairs))
end
-- «errors» (to ".errors")
-- (find-dn5 "errors.lua")
-- dump-to: tests
--[==[
--]==]
-- Local Variables:
-- coding: raw-text-unix
-- ee-anchor-format: "«%s»"
-- End: