Warning: this is an htmlized version!
The original is across this link,
and the conversion rules are here.
-- -*- coding: raw-text-unix -*-
-- This is the file `edrxlib.lua' of dednat4.
-- This file is in the public domain.
-- Author: Eduardo Ochs
-- Version: 2005sep07
-- Latest: <http://angg.twu.net/dednat4/edrxlib.lua>.
-- This should be a copy of <http://angg.twu.net/LUA/lua50init.lua>,
-- with minor changes in the headers.

-- (find-tkdiff "~/blogme/edrxlib.lua" "~/LUA/lua50init.lua")
-- (find-fline "~/LUA/lua50init.lua")

-- «.escripts»		(to "escripts")
-- «.build-lua»		(to "build-lua")
-- «.compat»		(to "compat")
-- «.otherfunctions»	(to "otherfunctions")
-- «.P»			(to "P")
-- «.PP»		(to "PP")
-- «.tests»		(to "tests")
-- «.envsubst»		(to "envsubst")
-- «.readfile»		(to "readfile")
-- «.mytostring»	(to "mytostring")
-- «.split»		(to "split")
-- «.ee_expand»		(to "ee_expand")
-- «.load_rex»		(to "load_rex")
-- «.load_posix»	(to "load_posix")
-- «.load_PP»		(to "load_PP")
-- «.loadswigso»	(to "loadswigso")
-- «.getoutput»		(to "getoutput")



-- «escripts»  (to ".escripts")

-- «compat»  (to ".compat")
-- (find-lua50file "src/lib/lstrlib.c" "{\"find\", str_find},")
-- (find-lua50file "test/compat.lua" "strfind = str.find")
-- (find-lua50file "src/lua/")
-- (find-fline "/usr/share/lua50/compat.lua")
write    = io.write
format   = string.format
gsub     = string.gsub
strfind  = string.find
strlen   = string.len
strsub   = string.sub
concat   = table.concat
foreachi = table.foreachi
getn     = table.getn
tinsert  = table.insert
tremove  = table.remove

-- «otherfunctions»  (to ".otherfunctions")
printf = function (...) write(format(unpack(arg))) end
pack = function (...) return arg end

-- 0-based string functions
-- (find-sh "lua -e \"print(substr0('abcdef', 2, 3)) --> cde\"")
substr0 = function (str, start0, len)
    return string.sub(str, start0 + 1, len and start0 + len)
  end

-- «P»  (to ".P")
P = function (...)
    for i,v in ipairs(arg) do
      if type(v)=="number" then printf(" %d", v)
      elseif type(v)=="string" then printf(" %q", v)
      else printf(" <%s>", type(v))
      end
    end
    print()
  end

-- «PP»  (to ".PP")
PP = function (...)
    for i,v in ipairs(arg) do printf(" %s", mytostring(v)) end
    print()
    return unpack(arg)
  end

-- «tests»  (to ".tests")
--[[
#*
lua50e  'P(1, 3)'
lua50e  'P(string.find("0123456789", "3(45)(67)", 4))'
lua50e 'PP(string.find("0123456789", "3(45)(67)", 4))'
lua50e  'P(string.find("0123456789", "3(45)(67)", 5))'
#*
]]



-- «envsubst»  (to ".envsubst")
-- (find-es "lua5" "envsubst")
setenv_ = {}
setenv = function (varname, value) setenv_[varname] = value end
getenv = function (varname) return setenv_[varname] or os.getenv(varname) end
envsubst = function (str)
     return string.gsub(str, "%$([%a_][%w_]*)", function (e)
         return getenv(e) or ""
       end)
   end

-- «readfile»  (to ".readfile")
-- (find-es "lua5" "readfile")
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

-- «mytostring»  (to ".mytostring")
-- (find-es "lua5" "mytostring")
mysort = function (origtable)
    local tmptable = {}
    for key,val in pairs(origtable) do
      table.insert(tmptable, {key=key, val=val})
    end
    local comp = function (item1, item2)
        local key1, key2 = item1.key, item2.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)
        else
          return type1<type2
        end
      end
    table.sort(tmptable, comp)
    return tmptable
  end
mytostring = function (v)
    local t = type(v)
    if t=="number" then return tostring(v) end
    if t=="string" then return format("%q", v) end
    if t=="table" then
      local tmptable = mysort(v)
      local bigstring = "{"
      local sep = ""
      for i = 1, table.getn(tmptable) do
        local entry = tmptable[i]
        local keystr, valstr = mytostring(entry.key), mytostring(entry.val)
        bigstring = bigstring..sep..keystr.."="..valstr
        sep = ", "
      end
      return bigstring .. "}"
    end
    return "<"..tostring(v)..">"
  end

-- «split»  (to ".split")
-- (find-es "lua5" "split")
split = function (str, pat)
    local arr = {}
    string.gsub(str, pat or "([^%s]+)", function (word)
        table.insert(arr, word)
      end)
    return arr
  end

-- «ee_expand»  (to ".ee_expand")
-- (find-eevfile "eev-dev.el" "defun ee-expand")
ee_expand = function (path)
    path = string.gsub(path, "^~$", "$HOME/", 1)
    path = string.gsub(path, "^~/", "$HOME/", 1)
    path = string.gsub(path, "^%$(%w+)", os.getenv, 1)
    return path
  end


min = function (a, b)
    if a < b then return a else return b end
  end
max = function (a, b)
    if a < b then return b else return a end
  end



-- «load_rex»  (to ".load_rex")
-- (find-es "lua5" "rexlib")
-- Usage: if not rex then load_rex() end
load_rex = function ()
    assert(loadlib(getenv("HOME").."/.lua50/lrexlib.so", "luaopen_rex"))()
    setmetatable(rex,
      {__call = function (self, p, cf, lo) return self.newPOSIX(p, cf, lo) end})
    function rex.find(s, p, st)   return rex(p):match(s, st) end
    function rex.gsub(s, p, f, n) return rex(p):gmatch(s, f, n) end
  end

-- «load_posix»  (to ".load_posix")
-- (find-es "lua5" "load_posix")
-- (find-es "lua5" "posix-install")
load_posix = function ()
    assert(loadlib(getenv("HOME").."/.lua50/lposix.so", "luaopen_posix"))()
  end

-- «load_PP»  (to ".load_PP")
-- (find-angg ".lua50/PP.c")
-- Load PP.so, that defines a C function called PP for inspecting the stack
load_PP = function ()
    assert(loadlib(getenv("HOME").."/.lua50/PP.so", "PP_init"))()
  end

-- «loadswigso»  (to ".loadswigso")
-- (find-es "swig" "myswiglua")
-- Example: loadswigso("C", "./myparser.so", "parser", "countwords")
loadswigso = function (modulename, fname_so, ...)
    assert(loadlib(fname_so, modulename.."_Init"))()
    local module = _G[modulename]
    for i=1,getn(arg) do
      _G[arg[i]] = module[arg[i]]  -- export to the table of globals
    end
  end

-- «getoutput»  (to ".getoutput")
-- (find-es "lua5" "getoutput")
getoutput = function (command)
    local pipe = assert(io.popen(command))
    local output = pipe:read("*a")
    pipe:close()
    return output
  end