Software /
code /
prosody
Changeset
2040:ca85461afa6c
util.require: Yes hg, I really did want to remove it, thanks.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 21 Oct 2009 20:30:42 +0100 |
parents | 2039:545c0d6b6bb3 |
children | 2041:8cf9b978ab36 |
files | util/require.lua |
diffstat | 1 files changed, 0 insertions(+), 237 deletions(-) [+] |
line wrap: on
line diff
--- a/util/require.lua Wed Oct 21 16:25:49 2009 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,237 +0,0 @@ --- Prosody IM --- Copyright (C) 2008-2009 Matthew Wild --- Copyright (C) 2008-2009 Waqas Hussain --- --- This project is MIT/X11 licensed. Please see the --- COPYING file in the source package for more information. --- --- Based on Kepler Compat-5.1 code --- Copyright Kepler Project 2004-2006 (http://www.keplerproject.org/compat) --- $Id: compat-5.1.lua,v 1.22 2006/02/20 21:12:47 carregal Exp $ --- - -local LUA_DIRSEP = '/' -local LUA_OFSEP = '_' -local OLD_LUA_OFSEP = '' -local POF = 'luaopen_' -local LUA_PATH_MARK = '?' -local LUA_IGMARK = ':' - -local assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type = assert, error, getfenv, ipairs, loadfile, loadlib, pairs, setfenv, setmetatable, type -local find, format, gfind, gsub, sub = string.find, string.format, string.gfind, string.gsub, string.sub - -if package.nonglobal_module then return; end -package.nonglobal_module = true; - -local _PACKAGE = package -local _LOADED = package.loaded -local _PRELOAD = package.preload - --- --- looks for a file `name' in given path --- -local function findfile (name, pname) - name = gsub (name, "%.", LUA_DIRSEP) - local path = _PACKAGE[pname] - assert (type(path) == "string", format ("package.%s must be a string", pname)) - for c in gfind (path, "[^;]+") do - c = gsub (c, "%"..LUA_PATH_MARK, name) - local f = io.open (c) - if f then - f:close () - return c - end - end - return nil -- not found -end - - --- --- check whether library is already loaded --- -local function loader_preload (name) - assert (type(name) == "string", format ( - "bad argument #1 to `require' (string expected, got %s)", type(name))) - assert (type(_PRELOAD) == "table", "`package.preload' must be a table") - return _PRELOAD[name] -end - - --- --- Lua library loader --- -local function loader_Lua (name) - assert (type(name) == "string", format ( - "bad argument #1 to `require' (string expected, got %s)", type(name))) - local filename = findfile (name, "path") - if not filename then - return false - end - local f, err = loadfile (filename) - if not f then - error (format ("error loading module `%s' (%s)", name, err)) - end - return f -end - - -local function mkfuncname (name) - name = gsub (name, "^.*%"..LUA_IGMARK, "") - name = gsub (name, "%.", LUA_OFSEP) - return POF..name -end - -local function old_mkfuncname (name) - --name = gsub (name, "^.*%"..LUA_IGMARK, "") - name = gsub (name, "%.", OLD_LUA_OFSEP) - return POF..name -end - --- --- C library loader --- -local function loader_C (name) - assert (type(name) == "string", format ( - "bad argument #1 to `require' (string expected, got %s)", type(name))) - local filename = findfile (name, "cpath") - if not filename then - return false - end - local funcname = mkfuncname (name) - local f, err = loadlib (filename, funcname) - if not f then - funcname = old_mkfuncname (name) - f, err = loadlib (filename, funcname) - if not f then - error (format ("error loading module `%s' (%s)", name, err)) - end - end - return f -end - - -local function loader_Croot (name) - local p = gsub (name, "^([^.]*).-$", "%1") - if p == "" then - return - end - local filename = findfile (p, "cpath") - if not filename then - return - end - local funcname = mkfuncname (name) - local f, err, where = loadlib (filename, funcname) - if f then - return f - elseif where ~= "init" then - error (format ("error loading module `%s' (%s)", name, err)) - end -end - --- create `loaders' table -package.loaders = package.loaders or { loader_preload, loader_Lua, loader_C, loader_Croot, } -local _LOADERS = package.loaders - - --- --- iterate over available loaders --- -local function load (name, loaders) - -- iterate over available loaders - assert (type (loaders) == "table", "`package.loaders' must be a table") - for i, loader in ipairs (loaders) do - local f = loader (name) - if f then - return f - end - end - error (format ("module `%s' not found", name)) -end - --- sentinel -local sentinel = function () end - -local old_require = _G.require; -local dep_path = {}; -local current_env = nil; -function _G.require(modname) - --table.insert(dep_path, modname); - --if getfenv(2) == getfenv(0) --[[and rawget(_G, "__locked")]] then - -- print("**** Uh-oh, require called from locked global env at "..table.concat(dep_path, "->"), debug.traceback()); - --end - if not current_env and rawget(_G, "__locked") then - _G.prosody.unlock_globals(); - _G.__locked = false; - end - local old_current_env; - old_current_env, current_env = current_env, getfenv(2); - local ok, ret = pcall(old_require, modname); - current_env = old_current_env; - if not current_env and rawget(_G, "__locked") == false then - _G.prosody.lock_globals(); - end - --table.remove(dep_path); - if not ok then error(ret, 0); end - return ret; -end - - --- findtable -local function findtable (t, f) - assert (type(f)=="string", "not a valid field name ("..tostring(f)..")") - local ff = f.."." - local ok, e, w = find (ff, '(.-)%.', 1) - while ok do - local nt = rawget (t, w) - if not nt then - nt = {} - t[w] = nt - elseif type(t) ~= "table" then - return sub (f, e+1) - end - t = nt - ok, e, w = find (ff, '(.-)%.', e+1) - end - return t -end - --- --- new package.seeall function --- -function _PACKAGE.seeall (module) - local t = type(module) - assert (t == "table", "bad argument #1 to package.seeall (table expected, got "..t..")") - local meta = getmetatable (module) - if not meta then - meta = {} - setmetatable (module, meta) - end - meta.__index = _G -end - - --- --- new module function --- -function _G.module (modname, ...) - local ns = _LOADED[modname]; - if type(ns) ~= "table" then - --if not current_env then - -- print("module outside require for "..modname.." at "..debug.traceback()); - --end - ns = findtable (current_env or getfenv(2), modname); - if not ns then - error (string.format ("name conflict for module '%s'", modname)) - end - _LOADED[modname] = ns - end - if not ns._NAME then - ns._NAME = modname - ns._M = ns - ns._PACKAGE = gsub (modname, "[^.]*$", "") - end - setfenv (2, ns) - for i, f in ipairs (arg) do - f (ns) - end -end