Warning: this is an htmlized version!
The original is here, and the conversion rules are here. |
--- inc.lua - my (edrx) standard "include file" for Lua, with several --- important utility functions. -- «.p» (to "p") -- «.px» (to "px") -- «.split» (to "split") -- «.split1» (to "split1") -- «.split_at_first» (to "split_at_first") -- «.split_at_last» (to "split_at_last") -- «.untabify_line» (to "untabify_line") -- «.file_functions» (to "file_functions") -- «.loadextension» (to "loadextension") -- «.expandfname» (to "expandfname") -- «.copy» (to "copy") -- (find-es "lua") -- (find-luafile "") -- (find-luafile "src/lib/") -- (find-luafile "src/lib/liolib.c" "\"getenv\"") -- dofile(getenv("HOME").."/LUA/inc.lua") -- (find-fline "~/tmp/lua-manual.txt") function printf(...) write(call(format, arg)) end --##### --# --# "p", a function based on savevar that can show almost any object --# --##### -- «p» (to ".p") -- (find-fline "/usr/doc/lua/examples/") -- (find-fline "/usr/doc/lua/examples/save.lua") function savevar (n,v) if v == nil then return end if type(v)=="userdata" then return end -- if type(v)=="userdata" or type(v)=="function" then return end -- if type(v)=="userdata" or type(v)=="function" then write("\t-- ") end write(n,"=") if type(v) == "string" then write(format("%q",v)) elseif type(v) == "table" then if v.__visited__ ~= nil then write(v.__visited__) else write("{}\n") -- v.__visited__ = n for r,f in v do if r ~= "__visited__" then if type(r) == 'string' then savevar(n.."."..r,f) else savevar(n.."["..r.."]",f) end end end end else write(tostring(v)) end write("\n") end function pp(vname, v) savevar(vname, v) return v end function p (value, vname) savevar(vname or "_", value) return value end --##### --# --# px, a "p" for when the arrays have only integer indices --# --##### -- «px» (to ".px") function arrtostr(a, s0, s1, s2, imager, s00) s0 = s0 or "{" s1 = s1 or ", " s2 = s2 or "}" imager = imager or xtostr s00 = s00 or s0 .. s2 local s, i local n = getn(a) if n == 0 then return s00 end s = s0 .. imager(a[1]) for i = 2, n do s = s .. s1 .. imager(a[i]) end return s .. s2 end function xtostr(x) if type(x) == "string" then return format("%q", x) elseif type(x) == "number" then return x elseif type(x) == "table" then return arrtostr(x, "{", ", ", "}", xtostr, "{}") end return "?" .. type(x) end function id(x) return x end function join(a, sep, f) sep = sep or " " f = f or id return arrtostr(a, "", sep, "", f) end -- function px(x) print(xtostr(x)) end function px(...) print(join(arg, " ", xtostr)) end function sx(...) return join(arg, " ", xtostr) end function values(t) local value local a = {} for _, value in t do tinsert(a, value) end return a end --##### --# --# two functions to split strings --# --##### -- «split» (to ".split") function split(s) local a={}; local found, first while 1 do found, _, first, s = strfind(s, "^[%s]*([^%s]+)[%s]*(.*)") if not found then return a; end tinsert(a, first) end end -- luae ' p(split("foo bar plic")) ' -- «split1» (to ".split1") function split1(str, c) local arr, pos1, pos2 = {}, 0 c = c or " " while 1 do pos2 = strfind(str, c, pos1+1, 1) if pos2 then tinsert(arr, strsub(str, pos1+1, pos2-1)) pos1 = pos2 else tinsert(arr, strsub(str, pos1+1)) return arr end end end -- luae ' p(split1("indio bororo", "o")) ' -- luae ' p(split1("indio bororo")) ' -- luae ' p(split(" indio b oro")) ' function split(s) local t = {} gsub(s, '(%S+)', function (str) tinsert(%t, str) end) return t end -- «split_at_first» (to ".split_at_first") function split_at_first(str, delim, d1, d2, d3) local posbeg, posend = strfind(str, delim, 1, 1) if posbeg then return strsub(str, 1, posbeg-1), delim, strsub(str, posend+1, -1) else return d1, d2, d3 end end -- «split_at_last» (to ".split_at_last") function split_at_last(str, delim, d1, d2, d3) local posbeg, posend = strfind(str, delim, 1, 1) if not posbeg then return d1, d2, d3 end local posbeg2, posend2 while 1 do posbeg2, posend2 = strfind(str, delim, posend+1, 1) if posbeg2 then posbeg, posend = posbeg2, posend2 else return strsub(str, 1, posbeg-1), delim, strsub(str, posend+1, -1) end end end -- px(stem_and_version("/var/cache/apt/archives/gcc_1%3a2.95.2-12_i386.deb")) -- «untabify_line» (to ".untabify_line") function untabify_line(str) local reps, p reps = {" ", " ", " ", " ", " ", " ", " ", " "} --reps = {"--------", "-------", "------", "-----", "----", "---", "--", "-"} while 1 do p = strfind(str, "\t") if not p then return str end str = strsub(str, 1, p-1) .. reps[mod(p-1,8)+1] .. strsub(str, p+1) end end --##### --# --# file functions --# «file_functions» (to ".file_functions") --# --##### -- (find-angg "TCL/inc.tcl") -- (find-luanode "openfile") function readfile(fname) local f, s f = openfile(fname, "r") s = read(f, "*a") closefile(f) return s end function writefile(fname, bigstr) local f, s f = openfile(fname, "w+") write(f, bigstr) closefile(f) end -- «loadextension» (to ".loadextension") -- (find-luafile "src/libdllua/loadlib.c") function loadextension(libfname, initfunctionname) local libhandle, err = loadlib(libfname) if err then printf("loadlib_init(%q, %q) error: %s\n", libfname, initfunctionname, err) end callfromlib(libhandle, initfunctionname) end -- «expandfname» (to ".expandfname") -- (find-elnode "File Name Expansion") function expandfname(fname) return gsub(fname, "%$([A-Za-z0-9_]+)", getenv) end -- «copy» (to ".copy") -- bug: it does no typechecking and works only for tables function copy(arr) local newarr, key, val = {} for key,val in arr do newarr[key] = arr[key] end return newarr end -- Local Variables: -- coding: no-conversion -- ee-anchor-format: "«%s»" -- ee-charset-indicator: "Ñ" -- End: